- /*
- * @(#)ParserImplBase.java 1.19 03/12/19
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
- package com.sun.corba.se.spi.orb ;
-
- import java.util.Map ;
- import java.util.Set ;
- import java.util.Iterator ;
- import java.util.Properties ;
-
- import java.security.PrivilegedExceptionAction ;
- import java.security.PrivilegedActionException ;
- import java.security.AccessController ;
-
- import java.lang.reflect.Field ;
-
- import org.omg.CORBA.INTERNAL ;
-
- import com.sun.corba.se.spi.logging.CORBALogDomains ;
-
- import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
-
- import com.sun.corba.se.impl.orbutil.ObjectUtility ;
-
- // XXX This could probably be further extended by using more reflection and
- // a dynamic proxy that satisfies the interfaces that are inherited by the
- // more derived class. Do we want to go that far?
- public abstract class ParserImplBase {
- private ORBUtilSystemException wrapper ;
-
- protected abstract PropertyParser makeParser() ;
-
- /** Override this method if there is some needed initialization
- * that takes place after argument parsing. It is always called
- * at the end of setFields.
- */
- protected void complete()
- {
- }
-
- public ParserImplBase()
- {
- // Do nothing in this case: no parsing takes place
- wrapper = ORBUtilSystemException.get(
- CORBALogDomains.ORB_LIFECYCLE ) ;
- }
-
- public void init( DataCollector coll )
- {
- PropertyParser parser = makeParser() ;
- coll.setParser( parser ) ;
- Properties props = coll.getProperties() ;
- Map map = parser.parse( props ) ;
- setFields( map ) ;
- }
-
- private Field getAnyField( String name )
- {
- Field result = null ;
-
- try {
- Class cls = this.getClass() ;
- result = cls.getDeclaredField( name ) ;
- while (result == null) {
- cls = cls.getSuperclass() ;
- if (cls == null)
- break ;
-
- result = cls.getDeclaredField( name ) ;
- }
- } catch (Exception exc) {
- throw wrapper.fieldNotFound( exc, name ) ;
- }
-
- if (result == null)
- throw wrapper.fieldNotFound( name ) ;
-
- return result ;
- }
-
- protected void setFields( Map map )
- {
- Set entries = map.entrySet() ;
- Iterator iter = entries.iterator() ;
- while (iter.hasNext()) {
- java.util.Map.Entry entry = (java.util.Map.Entry)(iter.next()) ;
- final String name = (String)(entry.getKey()) ;
- final Object value = entry.getValue() ;
-
- try {
- AccessController.doPrivileged(
- new PrivilegedExceptionAction() {
- public Object run() throws IllegalAccessException,
- IllegalArgumentException
- {
- Field field = getAnyField( name ) ;
- field.setAccessible( true ) ;
- field.set( ParserImplBase.this, value ) ;
- return null ;
- }
- }
- ) ;
- } catch (PrivilegedActionException exc) {
- // Since exc wraps the actual exception, use exc.getCause()
- // instead of exc.
- throw wrapper.errorSettingField( exc.getCause(), name,
- ObjectUtility.compactObjectToString(value) ) ;
- }
- }
-
- // Make sure that any extra initialization takes place after all the
- // fields are set from the map.
- complete() ;
- }
- }