blob: 42c871875616fc9b0617dfae07551140e1a68abc [file] [log] [blame]
/*
* Copyright 2006 The Apache Software Foundation.
*
* Licensed 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.jaxbri;
import com.sun.codemodel.JCodeModel;
import com.sun.codemodel.writer.FileCodeWriter;
import com.sun.tools.xjc.api.Mapping;
import com.sun.tools.xjc.api.S2JJAXBModel;
import com.sun.tools.xjc.api.SchemaCompiler;
import com.sun.tools.xjc.api.XJC;
import org.apache.axis2.util.URLProcessor;
import org.apache.axis2.util.SchemaUtil;
import org.apache.axis2.wsdl.codegen.CodeGenConfiguration;
import org.apache.axis2.wsdl.databinding.DefaultTypeMapper;
import org.apache.axis2.wsdl.databinding.JavaTypeMapper;
import org.apache.axis2.wsdl.databinding.TypeMapper;
import org.apache.ws.commons.schema.XmlSchema;
import org.w3c.dom.Element;
import org.xml.sax.InputSource;
import javax.xml.namespace.QName;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.StringReader;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Vector;
public class CodeGenerationUtility {
/**
*
* @param additionalSchemas
* @throws RuntimeException
*/
public static TypeMapper processSchemas(List schemas,
Element[] additionalSchemas,
CodeGenConfiguration cgconfig)
throws RuntimeException
{
try {
//check for the imported types. Any imported types are supposed to be here also
if (schemas == null || schemas.isEmpty()) {
//there are no types to be code generated
//However if the type mapper is left empty it will be a problem for the other
//processes. Hence the default type mapper is set to the configuration
return new DefaultTypeMapper();
}
Vector xmlObjectsVector = new Vector();
//create the type mapper
JavaTypeMapper mapper = new JavaTypeMapper();
String baseURI = cgconfig.getBaseURI();
for (int i = 0; i < schemas.size(); i++) {
XmlSchema schema = (XmlSchema) schemas.get(i);
InputSource inputSource = new InputSource(new StringReader(getSchemaAsString(schema)));
inputSource.setSystemId(baseURI);
xmlObjectsVector.add(inputSource);
}
File outputDir = new File(cgconfig.getOutputLocation(), "src");
outputDir.mkdir();
Map nsMap = cgconfig.getUri2PackageNameMap();
for (int i = 0; i < xmlObjectsVector.size(); i++) {
SchemaCompiler sc = XJC.createSchemaCompiler();
XmlSchema schema = (XmlSchema) schemas.get(i);
String pkg = null;
if(nsMap != null) {
pkg = (String) nsMap.get(schema.getTargetNamespace());
}
if (pkg == null) {
pkg = extractNamespace(schema);
}
sc.setDefaultPackageName(pkg);
sc.parseSchema((InputSource) xmlObjectsVector.elementAt(i));
// Bind the XML
S2JJAXBModel jaxbModel = sc.bind();
// 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 );
}
}
// Return the type mapper
return mapper;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String extractNamespace(XmlSchema schema) {
String pkg;
pkg = schema.getTargetNamespace();
if (pkg == null) {
XmlSchema[] schemas2 = SchemaUtil.getAllSchemas(schema);
for (int j = 0; schemas2 != null && j < schemas2.length; j++) {
pkg = schemas2[j].getTargetNamespace();
if (pkg != null)
break;
}
}
if (pkg == null) {
pkg = URLProcessor.DEFAULT_PACKAGE;
}
pkg = URLProcessor.makePackageName(pkg);
return pkg;
}
private static String getSchemaAsString(XmlSchema schema) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
schema.write(baos);
return baos.toString();
}
}