}
final Map schemaToInputSourceMap = new HashMap();
//create the type mapper
JavaTypeMapper mapper = new JavaTypeMapper();
String baseURI = cgconfig.getBaseURI();
if (!baseURI.endsWith("/")){
baseURI = baseURI + "/";
}
for (int i = 0; i < schemas.size(); i++) {
XmlSchema schema = (XmlSchema)schemas.get(i);
InputSource inputSource =
new InputSource(new StringReader(getSchemaAsString(schema)));
//here we have to set a proper system ID. otherwise when processing the
// included schaemas for this schema we have a problem
// it creates the system ID using this target namespace value
inputSource.setSystemId(baseURI + "xsd" + i + ".xsd");
inputSource.setPublicId(schema.getTargetNamespace());
schemaToInputSourceMap.put(schema,inputSource);
}
File outputDir = new File(cgconfig.getOutputLocation(), "src");
outputDir.mkdir();
Map nsMap = cgconfig.getUri2PackageNameMap();
EntityResolver resolver = new EntityResolver() {
public InputSource resolveEntity(String publicId, String systemId) throws SAXException, IOException {
InputSource returnInputSource = null;
XmlSchema key = null;
for (Iterator iter = schemaToInputSourceMap.keySet().iterator();iter.hasNext();) {
key = (XmlSchema) iter.next();
String nsp = key.getTargetNamespace();
if (nsp != null && nsp.equals(publicId)) {
// when returning the input stream we have to always return a new
// input stream.
// sinc jaxbri internally consumes the input stream it gives an
// exception.
returnInputSource = new InputSource(new StringReader(getSchemaAsString(key)));
InputSource existingInputSource = (InputSource) schemaToInputSourceMap.get(key);
returnInputSource.setSystemId(existingInputSource.getSystemId());
returnInputSource.setPublicId(existingInputSource.getPublicId());
break;
}
}
if (returnInputSource == null){
// then we have to find this using the file system
if (systemId != null){
returnInputSource = new InputSource(systemId);
returnInputSource.setSystemId(systemId);
}
}
return returnInputSource;
}
};
Map properties = cgconfig.getProperties();
String bindingFileName = (String) properties.get(BINDING_FILE_NAME);
XmlSchema key = null;
for (Iterator schemaIter = schemaToInputSourceMap.keySet().iterator();
schemaIter.hasNext();) {
SchemaCompiler sc = XJC.createSchemaCompiler();
if (bindingFileName != null){
if (bindingFileName.endsWith(".jar")) {
scanEpisodeFile(new File(bindingFileName), sc);
} else {
InputSource inputSoruce = new InputSource(new FileInputStream(bindingFileName));
inputSoruce.setSystemId(new File(bindingFileName).toURI().toString());
sc.getOptions().addBindFile(inputSoruce);
}
}
key = (XmlSchema) schemaIter.next();
if (nsMap != null) {
Iterator iterator = nsMap.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry entry = (Map.Entry) iterator.next();
String namespace = (String) entry.getKey();
String pkg = (String)nsMap.get(namespace);
registerNamespace(sc, namespace, pkg);
}
}
sc.setEntityResolver(resolver);
sc.setErrorListener(new ErrorListener(){
public void error(SAXParseException saxParseException) {
log.error(saxParseException.getMessage());
log.debug(saxParseException.getMessage(), saxParseException);
}
public void fatalError(SAXParseException saxParseException) {
log.error(saxParseException.getMessage());
log.debug(saxParseException.getMessage(), saxParseException);
}
public void warning(SAXParseException saxParseException) {
log.warn(saxParseException.getMessage());
log.debug(saxParseException.getMessage(), saxParseException);
}
public void info(SAXParseException saxParseException) {
log.info(saxParseException.getMessage());
log.debug(saxParseException.getMessage(), saxParseException);
}
});
sc.parseSchema((InputSource) schemaToInputSourceMap.get(key));
// Bind the XML
S2JJAXBModel jaxbModel = sc.bind();
if(jaxbModel == null){
throw new RuntimeException("Unable to generate code using jaxbri");
}
// Emit the code artifacts
JCodeModel codeModel = jaxbModel.generateCode(null, null);
FileCodeWriter writer = new FileCodeWriter(outputDir);
codeModel.build(writer);
Collection mappings = jaxbModel.getMappings();
Iterator iter = mappings.iterator();
while (iter.hasNext()) {
Mapping mapping = (Mapping)iter.next();
QName qn = mapping.getElement();
String typeName = mapping.getType().getTypeClass().fullName();
mapper.addTypeMappingName(qn, typeName);
}
//process the unwrapped parameters
if (!cgconfig.isParametersWrapped()) {
//figure out the unwrapped operations
List axisServices = cgconfig.getAxisServices();
for (Iterator servicesIter = axisServices.iterator(); servicesIter.hasNext();) {
AxisService axisService = (AxisService)servicesIter.next();
for (Iterator operations = axisService.getOperations();
operations.hasNext();) {
AxisOperation op = (AxisOperation)operations.next();
if (WSDLUtil.isInputPresentForMEP(op.getMessageExchangePattern())) {
AxisMessage message = op.getMessage(
WSDLConstants.MESSAGE_LABEL_IN_VALUE);
if (message != null &&
message.getParameter(Constants.UNWRAPPED_KEY) != null) {
Mapping mapping = jaxbModel.get(message.getElementQName());
List elementProperties = mapping.getWrapperStyleDrilldown();
for(int j = 0; j < elementProperties.size(); j++){
Property elementProperty = (Property) elementProperties.get(j);
QName partQName =
WSDLUtil.getPartQName(op.getName().getLocalPart(),
WSDLConstants.INPUT_PART_QNAME_SUFFIX,
elementProperty.elementName().getLocalPart());
//this type is based on a primitive type- use the
//primitive type name in this case
String fullJaveName =
elementProperty.type().fullName();
if (elementProperty.type().isArray()) {
fullJaveName = fullJaveName.concat("[]");
}
mapper.addTypeMappingName(partQName, fullJaveName);
if (elementProperty.type().isPrimitive()) {
mapper.addTypeMappingStatus(partQName, Boolean.TRUE);
}
if (elementProperty.type().isArray()) {
mapper.addTypeMappingStatus(partQName,
Constants.ARRAY_TYPE);
}
}
}
}
if (WSDLUtil.isOutputPresentForMEP(op.getMessageExchangePattern())) {
AxisMessage message = op.getMessage(
WSDLConstants.MESSAGE_LABEL_OUT_VALUE);
if (message != null &&
message.getParameter(Constants.UNWRAPPED_KEY) != null) {
Mapping mapping = jaxbModel.get(message.getElementQName());
List elementProperties = mapping.getWrapperStyleDrilldown();
for(int j = 0; j < elementProperties.size(); j++){
Property elementProperty = (Property) elementProperties.get(j);
QName partQName =
WSDLUtil.getPartQName(op.getName().getLocalPart(),
WSDLConstants.OUTPUT_PART_QNAME_SUFFIX,
elementProperty.elementName().getLocalPart());
//this type is based on a primitive type- use the
//primitive type name in this case
String fullJaveName =
elementProperty.type().fullName();
if (elementProperty.type().isArray()) {
fullJaveName = fullJaveName.concat("[]");
}
mapper.addTypeMappingName(partQName, fullJaveName);
if (elementProperty.type().isPrimitive()) {
mapper.addTypeMappingStatus(partQName, Boolean.TRUE);
}
if (elementProperty.type().isArray()) {
mapper.addTypeMappingStatus(partQName,
Constants.ARRAY_TYPE);
}
}
}
}