blob: 6016c8f394e98e27dedb86120156f331eb5a7e04 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.axis2.jaxws.runtime.description.marshal.impl;
import org.apache.axis2.jaxws.ExceptionFactory;
import org.apache.axis2.jaxws.description.FaultDescription;
import org.apache.axis2.jaxws.description.OperationDescription;
import org.apache.axis2.jaxws.description.ServiceDescription;
import org.apache.axis2.jaxws.message.factory.MessageFactory;
import org.apache.axis2.jaxws.registry.FactoryRegistry;
import org.apache.axis2.jaxws.runtime.description.marshal.AnnotationDesc;
import org.apache.axis2.jaxws.runtime.description.marshal.FaultBeanDesc;
import org.apache.axis2.jaxws.runtime.description.marshal.MarshalServiceRuntimeDescription;
import org.apache.axis2.jaxws.utility.PropertyDescriptorPlus;
import org.apache.axis2.jaxws.utility.XMLRootElementUtil;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeSet;
public class MarshalServiceRuntimeDescriptionImpl implements
MarshalServiceRuntimeDescription {
private ServiceDescription serviceDesc;
private String key;
private TreeSet<String> packages;
private String packagesKey;
private Map<String, AnnotationDesc> annotationMap = null;
private Map<Class, Map<String, PropertyDescriptorPlus>> pdMapCache = null;
private Map<OperationDescription, String> requestWrapperMap = null;
private Map<OperationDescription, String> responseWrapperMap = null;
private Map<FaultDescription, FaultBeanDesc> faultBeanDescMap = null;
private MessageFactory messageFactory =
(MessageFactory)FactoryRegistry.getFactory(MessageFactory.class);
protected MarshalServiceRuntimeDescriptionImpl(String key,
ServiceDescription serviceDesc) {
this.serviceDesc = serviceDesc;
this.key = key;
}
public ServiceDescription getServiceDescription() {
return serviceDesc;
}
public String getKey() {
return key;
}
public TreeSet<String> getPackages() {
return packages;
}
public String getPackagesKey() {
return packagesKey;
}
void setPackages(TreeSet<String> packages) {
this.packages = packages;
this.packagesKey = packages.toString(); // Unique key for searches
}
public AnnotationDesc getAnnotationDesc(Class cls) {
String className = cls.getCanonicalName();
AnnotationDesc aDesc = annotationMap.get(className);
if (aDesc != null) {
// Cache hit
return aDesc;
}
// Cache miss...we cannot update the map because we don't want to introduce a sync call.
aDesc = AnnotationDescImpl.create(cls);
return aDesc;
}
void setAnnotationMap(Map<String, AnnotationDesc> map) {
this.annotationMap = map;
}
public Map<String, PropertyDescriptorPlus> getPropertyDescriptorMap(Class cls) {
// We are caching by class.
Map<String, PropertyDescriptorPlus> pdMap = pdMapCache.get(cls);
if (pdMap != null) {
// Cache hit
return pdMap;
}
// Cache miss...this can occur if the classloader changed.
// We cannot add this new pdMap at this point due to sync issues.
try {
pdMap = XMLRootElementUtil.createPropertyDescriptorMap(cls);
} catch (Throwable t) {
throw ExceptionFactory.makeWebServiceException(t);
}
return pdMap;
}
void setPropertyDescriptorMapCache(Map<Class, Map<String, PropertyDescriptorPlus>> cache) {
this.pdMapCache = cache;
}
public String getRequestWrapperClassName(OperationDescription operationDesc) {
return requestWrapperMap.get(operationDesc);
}
void setRequestWrapperMap(Map<OperationDescription, String> map) {
requestWrapperMap = map;
}
public String getResponseWrapperClassName(OperationDescription operationDesc) {
return responseWrapperMap.get(operationDesc);
}
void setResponseWrapperMap(Map<OperationDescription, String> map) {
responseWrapperMap = map;
}
public FaultBeanDesc getFaultBeanDesc(FaultDescription faultDesc) {
return faultBeanDescMap.get(faultDesc);
}
void setFaultBeanDescMap(Map<FaultDescription, FaultBeanDesc> map) {
faultBeanDescMap = map;
}
public String toString() {
final String newline = "\n";
final String sameline = " ";
StringBuffer string = new StringBuffer();
string.append(newline);
string.append(" MarshalServiceRuntime:" + getKey());
string.append(newline);
string.append(" Packages = " + getPackages().toString());
for (Entry<String, AnnotationDesc> entry : this.annotationMap.entrySet()) {
string.append(newline);
string.append(" AnnotationDesc cached for:" + entry.getKey());
string.append(entry.getValue().toString());
}
for (Entry<Class, Map<String, PropertyDescriptorPlus>> entry : this.pdMapCache.entrySet()) {
string.append(newline);
string.append(" PropertyDescriptorPlus Map cached for:" +
entry.getKey().getCanonicalName());
for (PropertyDescriptorPlus pdp : entry.getValue().values()) {
string.append(newline);
string.append(" propertyName =" + pdp.getPropertyName());
string.append(newline);
string.append(" xmlName =" + pdp.getXmlName());
string.append(newline);
string.append(" propertyType =" + pdp.getPropertyType().getCanonicalName());
string.append(newline);
}
}
string.append(" RequestWrappers");
for (Entry<OperationDescription, String> entry : this.requestWrapperMap.entrySet()) {
string.append(newline);
string.append(" Operation:" + entry.getKey().getJavaMethodName() +
" RequestWrapper:" + entry.getValue());
}
string.append(" ResponseWrappers");
for (Entry<OperationDescription, String> entry : this.responseWrapperMap.entrySet()) {
string.append(newline);
string.append(" Operation:" + entry.getKey().getJavaMethodName() +
" ResponseWrapper:" + entry.getValue());
}
string.append(" FaultBeanDesc");
for (Entry<FaultDescription, FaultBeanDesc> entry : this.faultBeanDescMap.entrySet()) {
string.append(newline);
string.append(" FaultException:" + entry.getKey().getExceptionClassName());
string.append(newline);
string.append(entry.getValue().toString());
}
return string.toString();
}
public MessageFactory getMessageFactory() {
return messageFactory;
}
}