diff -r 000000000000 -r 7ef37b2cdcad src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java Wed Apr 27 01:21:28 2016 +0800 @@ -0,0 +1,122 @@ +/* + * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +package com.sun.corba.se.impl.orb ; + +import org.omg.CORBA.INITIALIZE ; + +import java.util.Properties ; +import java.util.List ; +import java.util.LinkedList ; +import java.util.Iterator ; + +import java.lang.reflect.Array ; + +import com.sun.corba.se.spi.orb.Operation ; +import com.sun.corba.se.spi.orb.StringPair ; +import com.sun.corba.se.spi.logging.CORBALogDomains ; + +import com.sun.corba.se.impl.orbutil.ObjectUtility ; +import com.sun.corba.se.impl.logging.ORBUtilSystemException ; + +public class PrefixParserAction extends ParserActionBase { + private Class componentType ; + private ORBUtilSystemException wrapper ; + + public PrefixParserAction( String propertyName, + Operation operation, String fieldName, Class componentType ) + { + super( propertyName, true, operation, fieldName ) ; + this.componentType = componentType ; + this.wrapper = ORBUtilSystemException.get( + CORBALogDomains.ORB_LIFECYCLE ) ; + } + + /** For each String s that matches the prefix given by getPropertyName(), + * apply getOperation() to { suffix( s ), value } + * and add the result to an Object[] + * which forms the result of apply. Returns null if there are no + * matches. + */ + public Object apply( Properties props ) + { + String prefix = getPropertyName() ; + int prefixLength = prefix.length() ; + if (prefix.charAt( prefixLength - 1 ) != '.') { + prefix += '.' ; + prefixLength++ ; + } + + List matches = new LinkedList() ; + + // Find all keys in props that start with propertyName + Iterator iter = props.keySet().iterator() ; + while (iter.hasNext()) { + String key = (String)(iter.next()) ; + if (key.startsWith( prefix )) { + String suffix = key.substring( prefixLength ) ; + String value = props.getProperty( key ) ; + StringPair data = new StringPair( suffix, value ) ; + Object result = getOperation().operate( data ) ; + matches.add( result ) ; + } + } + + int size = matches.size() ; + if (size > 0) { + // Convert the list into an array of the proper type. + // An Object[] as a result does NOT work. Also report + // any errors carefully, as errors here or in parsers that + // use this Operation often show up at ORB.init(). + Object result = null ; + try { + result = Array.newInstance( componentType, size ) ; + } catch (Throwable thr) { + throw wrapper.couldNotCreateArray( thr, + getPropertyName(), componentType, + new Integer( size ) ) ; + } + + Iterator iter2 = matches.iterator() ; + int ctr = 0 ; + while (iter2.hasNext()) { + Object obj = iter2.next() ; + + try { + Array.set( result, ctr, obj ) ; + } catch (Throwable thr) { + throw wrapper.couldNotSetArray( thr, + getPropertyName(), new Integer(ctr), + componentType, new Integer(size), + obj.toString() ) ; + } + ctr++ ; + } + + return result ; + } else + return null ; + } +}