1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46 package org.seasar.axis.server.deployment;
47
48 import java.util.HashMap;
49 import java.util.Iterator;
50 import java.util.Map;
51
52 import javax.xml.namespace.QName;
53
54 import org.apache.axis.Constants;
55 import org.apache.axis.deployment.wsdd.WSDDConstants;
56 import org.apache.axis.deployment.wsdd.WSDDException;
57 import org.apache.axis.deployment.wsdd.WSDDService;
58 import org.apache.axis.deployment.wsdd.WSDDTypeMapping;
59 import org.apache.axis.description.JavaServiceDesc;
60 import org.apache.axis.encoding.TypeMappingRegistry;
61 import org.apache.axis.providers.java.JavaProvider;
62 import org.apache.axis.wsdl.fromJava.Namespaces;
63 import org.apache.axis.wsdl.fromJava.Types;
64 import org.seasar.axis.S2AxisConstants;
65 import org.seasar.axis.encoding.AutoRegisterTypeMappingImpl;
66 import org.seasar.axis.server.ServiceDef;
67 import org.seasar.axis.server.TypeMappingDef;
68 import org.seasar.framework.container.ComponentDef;
69 import org.seasar.framework.message.MessageFormatter;
70 import org.seasar.framework.util.StringUtil;
71 import org.w3c.dom.Element;
72
73 /***
74 * S2によりインスタンス管理されるサービスのWSDDによる表現です。
75 *
76 * @author koichik
77 */
78 public class WSDDS2Service extends WSDDService {
79
80 protected static final Map providerMapping = new HashMap();
81 static {
82 providerMapping.put(PROVIDER_RPC, S2AxisConstants.PROVIDER_S2RPC);
83 providerMapping.put(PROVIDER_RPC, S2AxisConstants.PROVIDER_S2RPC);
84 }
85
86
87 protected ComponentDef componentDef;
88
89 /***
90 * コンポーネント定義からインスタンスを構築します。
91 *
92 * @param componentDef
93 * コンポーネント定義
94 * @throws WSDDException
95 * インスタンスの構築に失敗した場合にスローされます。
96 */
97 public WSDDS2Service(final ComponentDef componentDef) throws WSDDException {
98 this(componentDef, new ServiceDef());
99 }
100
101 /***
102 * コンポーネント定義とサービス定義からインスタンスを構築します。
103 *
104 * @param componentDef
105 * コンポーネント定義
106 * @param serviceDef
107 * サービス定義
108 * @throws WSDDException
109 * インスタンスの構築に失敗した場合にスローされます。
110 */
111 public WSDDS2Service(final ComponentDef componentDef, final ServiceDef serviceDef)
112 throws WSDDException {
113 this.componentDef = componentDef;
114
115 final String name = getName();
116 setQName(new QName(name));
117
118 final JavaServiceDesc serviceDesc = (JavaServiceDesc) getServiceDesc();
119 serviceDesc.setName(name);
120
121 Class serviceType = serviceDef.getServiceType();
122 if (serviceType == null) {
123 serviceType = componentDef.getComponentClass();
124 }
125 if (serviceType == null) {
126 throw new WSDDException(MessageFormatter.getSimpleMessage("EAXS0006",
127 new Object[] { name }));
128 }
129 setParameter(JavaProvider.OPTION_CLASSNAME, serviceType.getName());
130
131 setProviderQName(new QName(WSDDConstants.URI_WSDD_JAVA, getS2Provider(serviceDef
132 .getProvider())));
133
134 final String allowedMethods = serviceDef.getAllowedMethods();
135 if (!StringUtil.isEmpty(allowedMethods)) {
136 setParameter(JavaProvider.OPTION_ALLOWEDMETHODS, allowedMethods);
137 }
138
139 final Iterator typeMappingDefs = serviceDef.getTypeMappings();
140 while (typeMappingDefs.hasNext()) {
141 final TypeMappingDef typeMappingDef = (TypeMappingDef) typeMappingDefs.next();
142 addTypeMapping(createWSDDTypeMapping(typeMappingDef));
143 }
144
145 initTMR();
146 validateDescriptors();
147
148 final TypeMappingRegistry tmr = serviceDesc.getTypeMappingRegistry();
149 final AutoRegisterTypeMappingImpl autoTM = new AutoRegisterTypeMappingImpl(null);
150 tmr.register(getUse().getEncoding(), autoTM);
151 serviceDesc.setTypeMapping(autoTM);
152 }
153
154 /***
155 * コンポーネント定義とWSDDファイル(XML)のDOMツリーからインスタンスを構築します。 <br>
156 * WSDD中の <code><service></code> 要素の <code>provider</code>
157 * 属性で指定されたプロバイダを対応するS2Axisのプロバイダに変更します。
158 *
159 * @param componentDef
160 * コンポーネント定義
161 * @param serviceElement
162 * WSDDファイル(XML)のDOMツリー
163 * @throws WSDDException
164 * インスタンスの構築に失敗した場合にスローされます。
165 */
166 public WSDDS2Service(final ComponentDef componentDef, final Element serviceElement)
167 throws WSDDException {
168 super(serviceElement);
169 this.componentDef = componentDef;
170 final String provider = getProviderQName().getLocalPart();
171 setProviderQName(new QName(WSDDConstants.URI_WSDD_JAVA, getS2Provider(provider)));
172 }
173
174 /***
175 * コンポーネント定義を返します。
176 *
177 * @return コンポーネント定義
178 */
179 public ComponentDef getComponentDef() {
180 return componentDef;
181 }
182
183 /***
184 * サービス名を返します。 <br>
185 * サービス名は、コンポーネント定義に名前空間が指定されていれば"名前空間/コンポーネント名"、そうでなければ"コンポーネント名"になります。
186 *
187 * @return サービス名
188 */
189 protected String getName() {
190 final String namespace = componentDef.getContainer().getNamespace();
191 final String componentName = componentDef.getComponentName();
192 if (StringUtil.isEmpty(namespace)) {
193 return componentName;
194 }
195 return namespace + "/" + componentName;
196 }
197
198 /***
199 * サービスの型を返します。 <br>
200 * サービスの型は、サービス定義に型が指定されていればその型、そうでなければコンポーネントの型になります。
201 *
202 * @param serviceDef
203 * サービス定義
204 * @return サービスの型
205 */
206 protected Class getServiceClass(final ServiceDef serviceDef) {
207 Class serviceType = null;
208 serviceType = serviceDef.getServiceType();
209 if (serviceType == null) {
210 serviceType = componentDef.getComponentClass();
211 }
212 return serviceType;
213 }
214
215 /***
216 * Axisのプロバイダ名に対応するS2Axis用のプロバイダ名を返します。
217 *
218 * @param provider Axis標準のプロバイダ名
219 * @return S2Axis用のプロバイダ名
220 * @throws WSDDException Axisのプロバイダ名対応するS2Axisのプロバイダがない場合にスローされます
221 */
222 protected String getS2Provider(final String provider) throws WSDDException {
223 final String s2Provider = (String) providerMapping.get(provider);
224 if (s2Provider == null) {
225 throw new WSDDException(provider);
226 }
227 return s2Provider;
228 }
229
230 /***
231 * WSDDタイプマッピングを作成して返します。
232 *
233 * @param typeMappingDef タイプマッピング定義
234 * @return WSDDタイプマッピング
235 */
236 protected WSDDTypeMapping createWSDDTypeMapping(final TypeMappingDef typeMappingDef) {
237 final WSDDTypeMapping wsddTypeMapping = new WSDDTypeMapping();
238
239 final Class type = typeMappingDef.getType();
240 wsddTypeMapping.setLanguageSpecificType(typeMappingDef.getType());
241
242 wsddTypeMapping.setQName(createQNameOfType(type, typeMappingDef.getNamespaceURI(),
243 typeMappingDef.getLocalPart(), typeMappingDef.getNamespacePrefix()));
244
245 if (typeMappingDef.getSerializer() != null) {
246 wsddTypeMapping.setSerializer(typeMappingDef.getSerializer());
247 }
248 if (typeMappingDef.getDeserializer() != null) {
249 wsddTypeMapping.setDeserializer(typeMappingDef.getDeserializer());
250 }
251
252 if (typeMappingDef.getEncodingStyle() == null) {
253 wsddTypeMapping.setEncodingStyle(Constants.URI_DEFAULT_SOAP_ENC);
254 }
255 else {
256 wsddTypeMapping.setEncodingStyle(typeMappingDef.getEncodingStyle());
257 }
258
259 return wsddTypeMapping;
260 }
261
262 /***
263 * XML型のQNameを作成して返します。
264 *
265 * @param type Java型
266 * @param namespaceURI XML型の名前空間URI。省略するとJava型のパッケージ名から導出されます
267 * @param localPart XML型のローカル名。省略するとJava型のクラス名が使われます
268 * @param namespacePrefix XML型の名前空間接頭辞。省略するとデフォルト名前空間になります
269 * @return XML型のQName
270 */
271 protected QName createQNameOfType(final Class type, String namespaceURI, String localPart,
272 final String namespacePrefix) {
273 if (StringUtil.isEmpty(namespaceURI)) {
274 namespaceURI = Namespaces.makeNamespace(type.getName());
275 }
276
277 if (StringUtil.isEmpty(localPart)) {
278 localPart = Types.getLocalNameFromFullName(type.getName());
279 }
280
281 return new QName(namespaceURI, localPart, namespacePrefix);
282 }
283 }