src/share/classes/com/sun/corba/se/impl/orb/PrefixParserAction.java

Mon, 28 May 2018 10:29:43 +0800

author
aoqi
date
Mon, 28 May 2018 10:29:43 +0800
changeset 1655
bfd167e38830
parent 748
6845b95cba6b
permissions
-rw-r--r--

Merge

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 2002, 2010, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 4 *
aoqi@0 5 * This code is free software; you can redistribute it and/or modify it
aoqi@0 6 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 7 * published by the Free Software Foundation. Oracle designates this
aoqi@0 8 * particular file as subject to the "Classpath" exception as provided
aoqi@0 9 * by Oracle in the LICENSE file that accompanied this code.
aoqi@0 10 *
aoqi@0 11 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 14 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 15 * accompanied this code).
aoqi@0 16 *
aoqi@0 17 * You should have received a copy of the GNU General Public License version
aoqi@0 18 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 20 *
aoqi@0 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 22 * or visit www.oracle.com if you need additional information or have any
aoqi@0 23 * questions.
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 package com.sun.corba.se.impl.orb ;
aoqi@0 27
aoqi@0 28 import org.omg.CORBA.INITIALIZE ;
aoqi@0 29
aoqi@0 30 import java.util.Properties ;
aoqi@0 31 import java.util.List ;
aoqi@0 32 import java.util.LinkedList ;
aoqi@0 33 import java.util.Iterator ;
aoqi@0 34
aoqi@0 35 import java.lang.reflect.Array ;
aoqi@0 36
aoqi@0 37 import com.sun.corba.se.spi.orb.Operation ;
aoqi@0 38 import com.sun.corba.se.spi.orb.StringPair ;
aoqi@0 39 import com.sun.corba.se.spi.logging.CORBALogDomains ;
aoqi@0 40
aoqi@0 41 import com.sun.corba.se.impl.orbutil.ObjectUtility ;
aoqi@0 42 import com.sun.corba.se.impl.logging.ORBUtilSystemException ;
aoqi@0 43
aoqi@0 44 public class PrefixParserAction extends ParserActionBase {
aoqi@0 45 private Class componentType ;
aoqi@0 46 private ORBUtilSystemException wrapper ;
aoqi@0 47
aoqi@0 48 public PrefixParserAction( String propertyName,
aoqi@0 49 Operation operation, String fieldName, Class componentType )
aoqi@0 50 {
aoqi@0 51 super( propertyName, true, operation, fieldName ) ;
aoqi@0 52 this.componentType = componentType ;
aoqi@0 53 this.wrapper = ORBUtilSystemException.get(
aoqi@0 54 CORBALogDomains.ORB_LIFECYCLE ) ;
aoqi@0 55 }
aoqi@0 56
aoqi@0 57 /** For each String s that matches the prefix given by getPropertyName(),
aoqi@0 58 * apply getOperation() to { suffix( s ), value }
aoqi@0 59 * and add the result to an Object[]
aoqi@0 60 * which forms the result of apply. Returns null if there are no
aoqi@0 61 * matches.
aoqi@0 62 */
aoqi@0 63 public Object apply( Properties props )
aoqi@0 64 {
aoqi@0 65 String prefix = getPropertyName() ;
aoqi@0 66 int prefixLength = prefix.length() ;
aoqi@0 67 if (prefix.charAt( prefixLength - 1 ) != '.') {
aoqi@0 68 prefix += '.' ;
aoqi@0 69 prefixLength++ ;
aoqi@0 70 }
aoqi@0 71
aoqi@0 72 List matches = new LinkedList() ;
aoqi@0 73
aoqi@0 74 // Find all keys in props that start with propertyName
aoqi@0 75 Iterator iter = props.keySet().iterator() ;
aoqi@0 76 while (iter.hasNext()) {
aoqi@0 77 String key = (String)(iter.next()) ;
aoqi@0 78 if (key.startsWith( prefix )) {
aoqi@0 79 String suffix = key.substring( prefixLength ) ;
aoqi@0 80 String value = props.getProperty( key ) ;
aoqi@0 81 StringPair data = new StringPair( suffix, value ) ;
aoqi@0 82 Object result = getOperation().operate( data ) ;
aoqi@0 83 matches.add( result ) ;
aoqi@0 84 }
aoqi@0 85 }
aoqi@0 86
aoqi@0 87 int size = matches.size() ;
aoqi@0 88 if (size > 0) {
aoqi@0 89 // Convert the list into an array of the proper type.
aoqi@0 90 // An Object[] as a result does NOT work. Also report
aoqi@0 91 // any errors carefully, as errors here or in parsers that
aoqi@0 92 // use this Operation often show up at ORB.init().
aoqi@0 93 Object result = null ;
aoqi@0 94 try {
aoqi@0 95 result = Array.newInstance( componentType, size ) ;
aoqi@0 96 } catch (Throwable thr) {
aoqi@0 97 throw wrapper.couldNotCreateArray( thr,
aoqi@0 98 getPropertyName(), componentType,
aoqi@0 99 new Integer( size ) ) ;
aoqi@0 100 }
aoqi@0 101
aoqi@0 102 Iterator iter2 = matches.iterator() ;
aoqi@0 103 int ctr = 0 ;
aoqi@0 104 while (iter2.hasNext()) {
aoqi@0 105 Object obj = iter2.next() ;
aoqi@0 106
aoqi@0 107 try {
aoqi@0 108 Array.set( result, ctr, obj ) ;
aoqi@0 109 } catch (Throwable thr) {
aoqi@0 110 throw wrapper.couldNotSetArray( thr,
aoqi@0 111 getPropertyName(), new Integer(ctr),
aoqi@0 112 componentType, new Integer(size),
aoqi@0 113 obj.toString() ) ;
aoqi@0 114 }
aoqi@0 115 ctr++ ;
aoqi@0 116 }
aoqi@0 117
aoqi@0 118 return result ;
aoqi@0 119 } else
aoqi@0 120 return null ;
aoqi@0 121 }
aoqi@0 122 }

mercurial