datacollectorbase.java

来自「JAVA 所有包」· Java 代码 · 共 456 行

JAVA
456
字号
/* * @(#)DataCollectorBase.java	1.20 05/11/17 *  * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.corba.se.impl.orb ;import com.sun.corba.se.impl.orbutil.GetPropertyAction ;import java.security.PrivilegedAction ;import java.security.AccessController ;import java.applet.Applet ;import java.util.Properties ;import java.util.Vector ;import java.util.Set ;import java.util.HashSet ;import java.util.Enumeration ;import java.util.Iterator ;import java.util.StringTokenizer ;import java.net.URL ;import java.security.AccessController ;import java.io.File ;import java.io.FileInputStream ;import com.sun.corba.se.spi.orb.DataCollector ;import com.sun.corba.se.spi.orb.PropertyParser ;import com.sun.corba.se.impl.orbutil.ORBConstants ;import com.sun.corba.se.impl.orbutil.ORBUtility;public abstract class DataCollectorBase implements DataCollector {    private PropertyParser parser ;    private Set propertyNames ;    private Set propertyPrefixes ;    private Set URLPropertyNames ;    protected String localHostName ;    protected String configurationHostName ;    private boolean setParserCalled ;    private Properties originalProps ;    private Properties resultProps ;    public DataCollectorBase( Properties props, String localHostName,	String configurationHostName )    {	// XXX This is fully initialized here.  So do we ever want to 	// generalize this (or perhaps this is the wrong place for this?)	URLPropertyNames = new HashSet() ;	URLPropertyNames.add( ORBConstants.INITIAL_SERVICES_PROPERTY ) ;	propertyNames = new HashSet() ;	// Make sure that we are ready to handle -ORBInitRef.  This is special	// due to the need to handle multiple -ORBInitRef args as prefix	// parsing.	propertyNames.add( ORBConstants.ORB_INIT_REF_PROPERTY ) ;	propertyPrefixes = new HashSet() ;	this.originalProps = props ;	this.localHostName = localHostName ;	this.configurationHostName = configurationHostName ;	setParserCalled = false ;	resultProps = new Properties() ;    }//////////////////////////////////////////////////////////// Public interface defined in DataCollector//////////////////////////////////////////////////////////    public boolean initialHostIsLocal()    {	checkSetParserCalled() ;	return localHostName.equals( resultProps.getProperty( 	    ORBConstants.INITIAL_HOST_PROPERTY ) ) ;    }    public void setParser( PropertyParser parser )    {	Iterator iter = parser.iterator() ;	while (iter.hasNext()) {	    ParserAction pa = (ParserAction)(iter.next()) ;	    if (pa.isPrefix())		propertyPrefixes.add( pa.getPropertyName() ) ;	    else		propertyNames.add( pa.getPropertyName() ) ;	}	collect() ;	setParserCalled = true ;    }    public Properties getProperties()    {	checkSetParserCalled() ;	return resultProps ;    }//////////////////////////////////////////////////////////// public interface from DataCollector that must be defined// in subclasses//////////////////////////////////////////////////////////    public abstract boolean isApplet() ;//////////////////////////////////////////////////////////// Implementation methods needed in subclasses//////////////////////////////////////////////////////////    protected abstract void collect() ;//////////////////////////////////////////////////////////// methods for use by subclasses//////////////////////////////////////////////////////////    protected void checkPropertyDefaults()    {        String host =            resultProps.getProperty( ORBConstants.INITIAL_HOST_PROPERTY ) ;        if ((host == null) || (host.equals("")))             setProperty( ORBConstants.INITIAL_HOST_PROPERTY, 		configurationHostName );        String serverHost =            resultProps.getProperty( ORBConstants.SERVER_HOST_PROPERTY ) ;        if (serverHost == null || 	    serverHost.equals("") ||	    serverHost.equals("0.0.0.0") ||	    serverHost.equals("::") ||	    serverHost.toLowerCase().equals("::ffff:0.0.0.0"))	{            setProperty(ORBConstants.SERVER_HOST_PROPERTY,			localHostName);	    setProperty(ORBConstants.LISTEN_ON_ALL_INTERFACES,			ORBConstants.LISTEN_ON_ALL_INTERFACES);	}    }    protected void findPropertiesFromArgs( String[] params )    {        if (params == null)            return;        // All command-line args are of the form "-ORBkey value".        // The key is mapped to <prefix>.ORBkey.        String name ;        String value ;        for ( int i=0; i<params.length; i++ ) {            value = null ;            name = null ;            if ( params[i] != null && params[i].startsWith("-ORB") ) {                String argName = params[i].substring( 1 ) ;                name = findMatchingPropertyName( propertyNames, argName ) ;                if (name != null)                    if ( i+1 < params.length && params[i+1] != null ) {                        value = params[++i];                    }            }            if (value != null) {		setProperty( name, value ) ;            }        }    }    protected void findPropertiesFromApplet( final Applet app )    {        // Cannot use propertyPrefixes here, since there is no	// way to fetch properties by prefix from an Applet.        if (app == null)            return;        PropertyCallback callback = new PropertyCallback() {	    public String get(String name) {		return app.getParameter(name);	    }	} ;	findPropertiesByName( propertyNames.iterator(), callback ) ;            // Special Case:        //        // Convert any applet parameter relative URLs to an        // absolute URL based on the Document Root. This is so HTML 	// URLs can be kept relative which is sometimes useful for 	// managing the Document Root layout.	PropertyCallback URLCallback = new PropertyCallback() {	    public String get( String name ) {		String value = resultProps.getProperty(name);		if (value == null)		    return null ;		try {		    URL url = new URL( app.getDocumentBase(), value ) ;		    return url.toExternalForm() ;		} catch (java.net.MalformedURLException exc) {		    // Just preserve the original (malformed) value:		    // the error will be handled later.		    return value ;		}	    }	} ;	findPropertiesByName( URLPropertyNames.iterator(), 	    URLCallback ) ;    }    private void doProperties( final Properties props )     {        PropertyCallback callback =  new PropertyCallback() {	    public String get(String name) {		return props.getProperty(name);	    }	} ;		findPropertiesByName( propertyNames.iterator(), callback ) ;        findPropertiesByPrefix( propertyPrefixes, 	    makeIterator( props.propertyNames()), callback );    }    protected void findPropertiesFromFile()    {        final Properties fileProps = getFileProperties() ;        if (fileProps==null)            return ;	doProperties( fileProps ) ;    }    protected void findPropertiesFromProperties()    {        if (originalProps == null)            return;	doProperties( originalProps ) ;    }    //    // Map System properties to ORB properties.    // Security bug fix 4278205:    // Only allow reading of system properties with ORB prefixes.    // Previously a malicious subclass was able to read ANY system property.    // Note that other prefixes are fine in other contexts; it is only    // system properties that should impose a restriction.    protected void findPropertiesFromSystem()    {	Set normalNames = getCORBAPrefixes( propertyNames ) ;	Set prefixNames = getCORBAPrefixes( propertyPrefixes ) ;	PropertyCallback callback = new PropertyCallback() {	    public String get(String name) {		return getSystemProperty(name);	    }	} ;	findPropertiesByName( normalNames.iterator(), callback ) ;        findPropertiesByPrefix( prefixNames,	    getSystemPropertyNames(), callback ) ;    }//////////////////////////////////////////////////////////// internal implementation//////////////////////////////////////////////////////////    // Store name, value in resultProps, with special     // treatment of ORBInitRef.  All updates to resultProps    // must happen through this method.    private void setProperty( String name, String value )    {	if( name.equals( ORBConstants.ORB_INIT_REF_PROPERTY ) ) {	    // Value is <name>=<URL>	    StringTokenizer st = new StringTokenizer( value, "=" ) ;	    if (st.countTokens() != 2)		throw new IllegalArgumentException() ;	    String refName = st.nextToken() ;	    String refValue = st.nextToken() ;	    resultProps.setProperty( name + "." + refName, refValue ) ;	} else {	    resultProps.setProperty( name, value ) ;	}    }    private void checkSetParserCalled()    {	if (!setParserCalled)	    throw new IllegalStateException( "setParser not called." ) ;    }    // For each prefix in prefixes, For each name in propertyNames,    // if (prefix is a prefix of name) get value from getProperties and    // setProperty (name, value).    private void findPropertiesByPrefix( Set prefixes, 	Iterator propertyNames, PropertyCallback getProperty )    {	while (propertyNames.hasNext()) {	    String name = (String)(propertyNames.next()) ;	    Iterator iter = prefixes.iterator() ;	    while (iter.hasNext()) {		String prefix = (String)(iter.next()) ;		if (name.startsWith( prefix )) {		    String value = getProperty.get( name ) ;                    // Note: do a put even if value is null since just                    // the presence of the property may be significant.		    setProperty( name, value ) ;		}	    }	}    }    // For each prefix in names, get the corresponding property    // value from the callback, and store the name/value pair in    // the result.    private void findPropertiesByName( Iterator names, 	PropertyCallback getProperty )    {	while (names.hasNext()) {	    String name = (String)(names.next()) ;	    String value = getProperty.get( name ) ;	    if (value != null)		setProperty( name, value ) ;	}    }    private static String getSystemProperty(final String name)    {        return (String)AccessController.doPrivileged(	    new GetPropertyAction(name));    }    // Map command-line arguments to ORB properties.    //    private String findMatchingPropertyName( Set names,	String suffix )     {	Iterator iter = names.iterator() ;	while (iter.hasNext()) {	    String name = (String)(iter.next()) ;	    if (name.endsWith( suffix ))		return name ;	}	return null ;    }    private static Iterator makeIterator( final Enumeration enumeration )    {	return new Iterator() {	    public boolean hasNext() { return enumeration.hasMoreElements() ; }	    public Object next() { return enumeration.nextElement() ; }	    public void remove() { throw new UnsupportedOperationException() ; }	} ;    }    private static Iterator getSystemPropertyNames()    {        // This will not throw a SecurityException because this        // class was loaded from rt.jar using the bootstrap classloader.        Enumeration enumeration = (Enumeration)            AccessController.doPrivileged(                new PrivilegedAction() {                      public java.lang.Object run() {                          return System.getProperties().propertyNames();                      }                }	    );	return makeIterator( enumeration ) ;    }    private void getPropertiesFromFile( Properties props, String fileName )    {        try {	    File file = new File( fileName ) ;	    if (!file.exists())		return ;            FileInputStream in = new FileInputStream( file ) ;	    	    try {		props.load( in ) ;	    } finally {		in.close() ;	    }        } catch (Exception exc) {            // if (ORBInitDebug)                // dprint( "ORB properties file " + fileName + " not found: " + 		    // exc) ;        }    }    private Properties getFileProperties()    {        Properties defaults = new Properties() ;	String javaHome = getSystemProperty( "java.home" ) ;	String fileName = javaHome + File.separator + "lib" + File.separator +	    "orb.properties" ;	getPropertiesFromFile( defaults, fileName ) ;	Properties results = new Properties( defaults ) ;        String userHome = getSystemProperty( "user.home" ) ;        fileName = userHome + File.separator + "orb.properties" ;	getPropertiesFromFile( results, fileName ) ;	return results ;    }    private boolean hasCORBAPrefix( String prefix )    {	return prefix.startsWith( ORBConstants.ORG_OMG_PREFIX ) ||	    prefix.startsWith( ORBConstants.SUN_PREFIX ) ||	    prefix.startsWith( ORBConstants.SUN_LC_PREFIX ) ||	    prefix.startsWith( ORBConstants.SUN_LC_VERSION_PREFIX ) ;    }    // Return only those element of prefixes for which hasCORBAPrefix     // is true.      private Set getCORBAPrefixes( final Set prefixes )    {	Set result = new HashSet() ;	Iterator iter = prefixes.iterator() ;	while (iter.hasNext()) {	    String element = (String)(iter.next()) ;	    if (hasCORBAPrefix( element )) 		result.add( element ) ;	}	return result ;    }}// Used to collect properties from various sources.abstract class PropertyCallback{    abstract public String get(String name);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?