/* * 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 ; } }