public static void generateWrapper(ParameterMetaData pmd, boolean addTypeMapping)
{
List<WrappedParameter> wrappedParameters = pmd.getWrappedParameters();
OperationMetaData operationMetaData = pmd.getOperationMetaData();
EndpointMetaData endpointMetaData = operationMetaData.getEndpointMetaData();
ServiceMetaData serviceMetaData = endpointMetaData.getServiceMetaData();
ClassLoader loader = serviceMetaData.getUnifiedMetaData().getClassLoader();
if (operationMetaData.isDocumentWrapped() == false)
throw new WSException("Operation is not document/literal (wrapped)");
if (wrappedParameters == null)
throw new WSException("Cannot generate a type when their is no wrapped parameters");
String serviceName = serviceMetaData.getServiceName().getLocalPart();
String parameterName = pmd.getXmlName().getLocalPart();
String endpointName = endpointMetaData.getPortName().getLocalPart();
String packageName = endpointMetaData.getServiceEndpointInterface().getPackage().getName();
String wrapperName = packageName + "._JBossWS_" + serviceName + "_" + endpointName + "_" + parameterName;
if(log.isDebugEnabled()) log.debug("Generating wrapper: " + wrapperName);
Class wrapperType;
try
{
ClassPool pool = new ClassPool(true);
pool.appendClassPath(new LoaderClassPath(loader));
CtClass clazz = pool.makeClass(wrapperName);
clazz.setSuperclass(pool.get(WrapperType.class.getName()));
for (WrappedParameter param : wrappedParameters)
{
CtField field = new CtField(pool.get(param.getType()), param.getVariable(), clazz);
field.setModifiers(Modifier.PRIVATE);
clazz.addField(field);
clazz.addMethod(CtNewMethod.getter("get" + JavaUtils.capitalize(param.getVariable()), field));
clazz.addMethod(CtNewMethod.setter("set" + JavaUtils.capitalize(param.getVariable()), field));
}
wrapperType = (Class)pool.toClass(clazz, loader);
}
catch (Exception e)
{
throw new WSException("Could not generate wrapper type: " + wrapperName, e);
}
// Register type mapping if needed
if (addTypeMapping)
{
QName xmlType = pmd.getXmlType();
TypesMetaData typesMetaData = serviceMetaData.getTypesMetaData();
TypeMappingMetaData tmMetaData = new TypeMappingMetaData(typesMetaData, xmlType, wrapperName);
typesMetaData.addTypeMapping(tmMetaData);
TypeMappingImpl typeMapping = serviceMetaData.getTypeMapping();
typeMapping.register(wrapperType, xmlType, new JBossXBSerializerFactory(), new JBossXBDeserializerFactory());
}
pmd.setJavaTypeName(wrapperName);
}