org.apache.cxf.tools.corba.common.WSDLCorbaWriterImpl Maven / Gradle / Ivy
The newest version!
/**
* 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.cxf.tools.corba.common;
import java.io.OutputStream;
import java.io.Writer;
import java.util.List;
import java.util.Map;
import javax.wsdl.Definition;
import javax.wsdl.Types;
import javax.wsdl.WSDLException;
import javax.wsdl.extensions.ExtensibilityElement;
import javax.wsdl.extensions.schema.Schema;
import javax.wsdl.xml.WSDLWriter;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.stream.XMLStreamException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.apache.cxf.common.util.StringUtils;
import org.apache.cxf.helpers.CastUtils;
import org.apache.cxf.helpers.DOMUtils;
import org.apache.cxf.staxutils.StaxUtils;
/*
* This class is extending the wsdl4j RI class to print out the
* extensibility elements at the top of a generated wsdl file.
*
*/
public class WSDLCorbaWriterImpl implements WSDLWriter {
public static final int DEFAULT_INDENT_LEVEL = 2;
final WSDLWriter wrapped;
public WSDLCorbaWriterImpl(WSDLWriter orig) {
wrapped = orig;
}
public void setFeature(String name, boolean value) throws IllegalArgumentException {
wrapped.setFeature(name, value);
}
public boolean getFeature(String name) throws IllegalArgumentException {
return wrapped.getFeature(name);
}
public Document getDocument(Definition wsdlDef) throws WSDLException {
try {
fixTypes(wsdlDef);
} catch (Exception ex) {
throw new WSDLException(WSDLException.PARSER_ERROR, ex.getMessage(), ex);
}
Document doc = wrapped.getDocument(wsdlDef);
Element imp = null;
Element child = DOMUtils.getFirstElement(doc.getDocumentElement());
//move extensability things to the top
while (child != null) {
if (child.getNamespaceURI().equals(doc.getDocumentElement().getNamespaceURI())) {
//wsdl node
if (imp == null) {
imp = child;
}
} else if (imp != null) {
doc.getDocumentElement().removeChild(child);
doc.getDocumentElement().insertBefore(child, imp);
}
child = DOMUtils.getNextElement(child);
}
return doc;
}
private void fixTypes(Definition wsdlDef) throws ParserConfigurationException {
Types t = wsdlDef.getTypes();
if (t == null) {
return;
}
List l = CastUtils.cast(t.getExtensibilityElements());
if (l == null) {
return;
}
for (ExtensibilityElement e : l) {
if (e instanceof Schema) {
Schema sc = (Schema)e;
String pfx = wsdlDef.getPrefix(sc.getElementType().getNamespaceURI());
if (StringUtils.isEmpty(pfx)) {
pfx = "xsd";
String ns = wsdlDef.getNamespace(pfx);
int count = 1;
while (!StringUtils.isEmpty(ns)) {
pfx = "xsd" + count++;
ns = wsdlDef.getNamespace(pfx);
}
wsdlDef.addNamespace(pfx, sc.getElementType().getNamespaceURI());
}
if (sc.getElement() == null) {
fixSchema(sc, pfx);
}
}
}
}
private void fixSchema(Schema sc, String pfx) throws ParserConfigurationException {
Document doc = DOMUtils.newDocument();
Element el = doc.createElementNS(sc.getElementType().getNamespaceURI(),
pfx + ":" + sc.getElementType().getLocalPart());
sc.setElement(el);
Map> mp = CastUtils.cast(sc.getImports());
for (Map.Entry> ent : mp.entrySet()) {
Element imp = doc.createElementNS(sc.getElementType().getNamespaceURI(),
pfx + ":import");
el.appendChild(imp);
imp.setAttribute("namespace", ent.getKey());
}
}
public void writeWSDL(Definition wsdlDef, Writer sink) throws WSDLException {
try {
StaxUtils.writeTo(getDocument(wsdlDef), sink, 2);
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
}
public void writeWSDL(Definition wsdlDef, OutputStream sink) throws WSDLException {
try {
StaxUtils.writeTo(getDocument(wsdlDef), sink, 2);
} catch (XMLStreamException e) {
throw new RuntimeException(e);
}
}
}