|
1 /* |
|
2 * Copyright (c) 2017, Oracle and/or its affiliates. All rights reserved. |
|
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
4 * |
|
5 * This code is free software; you can redistribute it and/or modify it |
|
6 * under the terms of the GNU General Public License version 2 only, as |
|
7 * published by the Free Software Foundation. Oracle designates this |
|
8 * particular file as subject to the "Classpath" exception as provided |
|
9 * by Oracle in the LICENSE file that accompanied this code. |
|
10 * |
|
11 * This code is distributed in the hope that it will be useful, but WITHOUT |
|
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
14 * version 2 for more details (a copy is included in the LICENSE file that |
|
15 * accompanied this code). |
|
16 * |
|
17 * You should have received a copy of the GNU General Public License version |
|
18 * 2 along with this work; if not, write to the Free Software Foundation, |
|
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
20 * |
|
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
22 * or visit www.oracle.com if you need additional information or have any |
|
23 * questions. |
|
24 */ |
|
25 |
|
26 package com.sun.corba.se.impl.ior; |
|
27 |
|
28 import java.util.Set; |
|
29 |
|
30 import com.sun.corba.se.impl.orbutil.ORBUtility; |
|
31 import com.sun.corba.se.spi.ior.IORTypeCheckRegistry; |
|
32 import com.sun.corba.se.spi.orb.ORB; |
|
33 |
|
34 public class IORTypeCheckRegistryImpl implements IORTypeCheckRegistry { |
|
35 |
|
36 private final Set<String> iorTypeNames; |
|
37 private static final Set<String> builtinIorTypeNames; |
|
38 private ORB theOrb; |
|
39 |
|
40 static { |
|
41 builtinIorTypeNames = initBuiltinIorTypeNames(); |
|
42 } |
|
43 |
|
44 public IORTypeCheckRegistryImpl( String filterProperties, ORB orb) { |
|
45 theOrb = orb; |
|
46 iorTypeNames = parseIorClassNameList(filterProperties); |
|
47 } |
|
48 |
|
49 /* |
|
50 * |
|
51 * A note on the validation flow: |
|
52 * 1. against the filter class name list |
|
53 * 2. against the builtin class name list |
|
54 */ |
|
55 |
|
56 @Override |
|
57 public boolean isValidIORType(String iorClassName) { |
|
58 dprintTransport(".isValidIORType : iorClassName == " + iorClassName); |
|
59 return validateIorTypeByName(iorClassName); |
|
60 } |
|
61 |
|
62 |
|
63 private boolean validateIorTypeByName(String iorClassName) { |
|
64 dprintTransport(".validateIorTypeByName : iorClassName == " + iorClassName); |
|
65 boolean isValidType; |
|
66 |
|
67 isValidType = checkIorTypeNames(iorClassName); |
|
68 |
|
69 if (!isValidType) { |
|
70 isValidType = checkBuiltinClassNames(iorClassName); |
|
71 } |
|
72 |
|
73 dprintTransport(".validateIorTypeByName : isValidType == " + isValidType); |
|
74 return isValidType; |
|
75 } |
|
76 |
|
77 |
|
78 /* |
|
79 * check if the class name corresponding to an IOR Type name |
|
80 * is in the ior class name list as generated from the filter property. |
|
81 * So if the IOR type is recorded in the registry then allow the creation of the |
|
82 * stub factory and let it resolve and load the class. That is if current |
|
83 * type check deliberation permits. |
|
84 * IOR Type names are configured by the filter property |
|
85 */ |
|
86 |
|
87 private boolean checkIorTypeNames( |
|
88 String theIorClassName) { |
|
89 return (iorTypeNames != null) && (iorTypeNames.contains(theIorClassName)); |
|
90 } |
|
91 |
|
92 /* |
|
93 * Check the IOR interface class name against the set of |
|
94 * class names that correspond to the builtin JDK IDL stub classes. |
|
95 */ |
|
96 |
|
97 private boolean checkBuiltinClassNames( |
|
98 String theIorClassName) { |
|
99 return builtinIorTypeNames.contains(theIorClassName); |
|
100 } |
|
101 |
|
102 |
|
103 private Set<String> parseIorClassNameList(String filterProperty) { |
|
104 Set<String> _iorTypeNames = null; |
|
105 if (filterProperty != null) { |
|
106 String[] tempIorClassNames = filterProperty.split(";"); |
|
107 _iorTypeNames = Set.<String>of(tempIorClassNames); |
|
108 if (theOrb.orbInitDebugFlag) { |
|
109 dprintConfiguredIorTypeNames(); |
|
110 } |
|
111 } |
|
112 return _iorTypeNames; |
|
113 } |
|
114 |
|
115 |
|
116 private static Set<String> initBuiltinIorTypeNames() { |
|
117 Set<Class<?>> builtInCorbaStubTypes = initBuiltInCorbaStubTypes(); |
|
118 String [] tempBuiltinIorTypeNames = new String[builtInCorbaStubTypes.size()]; |
|
119 int i = 0; |
|
120 for (Class<?> _stubClass: builtInCorbaStubTypes) { |
|
121 tempBuiltinIorTypeNames[i++] = _stubClass.getName(); |
|
122 } |
|
123 return Set.<String>of(tempBuiltinIorTypeNames); |
|
124 } |
|
125 |
|
126 private static Set<Class<?>> initBuiltInCorbaStubTypes() { |
|
127 Class<?> tempBuiltinCorbaStubTypes[] = { |
|
128 com.sun.corba.se.spi.activation.Activator.class, |
|
129 com.sun.corba.se.spi.activation._ActivatorStub.class, |
|
130 com.sun.corba.se.spi.activation._InitialNameServiceStub.class, |
|
131 com.sun.corba.se.spi.activation._LocatorStub.class, |
|
132 com.sun.corba.se.spi.activation._RepositoryStub.class, |
|
133 com.sun.corba.se.spi.activation._ServerManagerStub.class, |
|
134 com.sun.corba.se.spi.activation._ServerStub.class, |
|
135 org.omg.CosNaming.BindingIterator.class, |
|
136 org.omg.CosNaming._BindingIteratorStub.class, |
|
137 org.omg.CosNaming.NamingContextExt.class, |
|
138 org.omg.CosNaming._NamingContextExtStub.class, |
|
139 org.omg.CosNaming.NamingContext.class, |
|
140 org.omg.CosNaming._NamingContextStub.class, |
|
141 org.omg.DynamicAny.DynAnyFactory.class, |
|
142 org.omg.DynamicAny._DynAnyFactoryStub.class, |
|
143 org.omg.DynamicAny.DynAny.class, |
|
144 org.omg.DynamicAny._DynAnyStub.class, |
|
145 org.omg.DynamicAny.DynArray.class, |
|
146 org.omg.DynamicAny._DynArrayStub.class, |
|
147 org.omg.DynamicAny.DynEnum.class, |
|
148 org.omg.DynamicAny._DynEnumStub.class, |
|
149 org.omg.DynamicAny.DynFixed.class, |
|
150 org.omg.DynamicAny._DynFixedStub.class, |
|
151 org.omg.DynamicAny.DynSequence.class, |
|
152 org.omg.DynamicAny._DynSequenceStub.class, |
|
153 org.omg.DynamicAny.DynStruct.class, |
|
154 org.omg.DynamicAny._DynStructStub.class, |
|
155 org.omg.DynamicAny.DynUnion.class, |
|
156 org.omg.DynamicAny._DynUnionStub.class, |
|
157 org.omg.DynamicAny._DynValueStub.class, |
|
158 org.omg.DynamicAny.DynValue.class, |
|
159 org.omg.PortableServer.ServantActivator.class, |
|
160 org.omg.PortableServer._ServantActivatorStub.class, |
|
161 org.omg.PortableServer.ServantLocator.class, |
|
162 org.omg.PortableServer._ServantLocatorStub.class }; |
|
163 return Set.<Class<?>>of(tempBuiltinCorbaStubTypes); |
|
164 } |
|
165 |
|
166 private void dprintConfiguredIorTypeNames() { |
|
167 if (iorTypeNames != null) { |
|
168 for (String iorTypeName : iorTypeNames) { |
|
169 ORBUtility.dprint(this, ".dprintConfiguredIorTypeNames: " + iorTypeName); |
|
170 } |
|
171 } |
|
172 } |
|
173 |
|
174 private void dprintTransport(String msg) { |
|
175 if (theOrb.transportDebugFlag) { |
|
176 ORBUtility.dprint(this, msg); |
|
177 } |
|
178 } |
|
179 } |