blob: ace0d795d15b3388581cb74294ee90410c590c86 [file] [log] [blame]
/*
* 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 ;
}
}