/**
* 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.utils;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import javax.wsdl.Definition;
import javax.wsdl.factory.WSDLFactory;
import javax.wsdl.xml.WSDLReader;
import javax.wsdl.xml.WSDLWriter;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLStreamReader;
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
import org.apache.cxf.wsdl.WSDLManager;
import org.apache.cxf.wsdl11.CatalogWSDLLocator;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.junit.Assert;
public class WSDLGenerationTester {
private XmlSchemaCollection schemaCol = new XmlSchemaCollection();
public WSDLGenerationTester() {
}
public void compare(XMLStreamReader orig, XMLStreamReader actual)
throws Exception {
boolean origEnd = false;
boolean actualEnd = false;
QName elName = null;
while (orig.hasNext() || actual.hasNext()) {
int origTag = orig.next();
while (!orig.isStartElement() && !orig.isEndElement() && !orig.isCharacters()) {
if (orig.hasNext()) {
origTag = orig.next();
} else {
origEnd = true;
break;
}
}
int actualTag = actual.next();
while (!actual.isStartElement() && !actual.isEndElement() && !actual.isCharacters()) {
if (actual.hasNext()) {
actualTag = actual.next();
} else {
actualEnd = true;
break;
}
}
if (!origEnd && !actualEnd) {
Assert.assertEquals("XML mismatch", origTag, actualTag);
if (orig.isStartElement()) {
elName = orig.getName();
compareStartElement(orig, actual);
} else if (orig.isEndElement()) {
compareEndElement(orig, actual);
} else if (orig.isCharacters()) {
compareCharacters(elName, orig, actual);
}
} else {
break;
}
}
}
private void compareStartElement(XMLStreamReader orig, XMLStreamReader actual)
throws Exception {
Assert.assertEquals("Start element is not matched", orig.getName(), actual.getName());
int origAttrCount = orig.getAttributeCount();
int actualAttrCount = actual.getAttributeCount();
for (int i = 0; i < origAttrCount; i++) {
QName origAttrName = orig.getAttributeName(i);
if ((origAttrName.getLocalPart().equals("location"))
|| (origAttrName.getLocalPart().equals("schemaLocation"))) {
//skip this atribute
origAttrCount--;
} else {
String s1 = orig.getAttributeValue(origAttrName.getNamespaceURI(),
origAttrName.getLocalPart());
String s2 = actual.getAttributeValue(origAttrName.getNamespaceURI(),
origAttrName.getLocalPart());
if (!s1.equals(s2)
&& (s1.contains(":") || s2.contains(":"))) {
s1 = mapToQName(orig, s1);
s2 = mapToQName(actual, s2);
}
Assert.assertEquals("Attribute " + origAttrName + " not found or value not matching",
s1, s2);
}
}
for (int i = 0; i < actualAttrCount; i++) {
QName actualAttrName = actual.getAttributeName(i);
if ((actualAttrName.getLocalPart().equals("location"))
|| (actualAttrName.getLocalPart().equals("schemaLocation"))) {
//skip this atribute
actualAttrCount--;
}
}
Assert.assertEquals("Attribute count is not matched for element " + orig.getName(),
origAttrCount,
actualAttrCount);
}
private String mapToQName(XMLStreamReader reader, String s2) {
int idx = s2.indexOf(':');
String ns = null;
if (idx == -1) {
ns = reader.getNamespaceURI("");
} else {
ns = reader.getNamespaceURI(s2.substring(0, idx));
if (ns == null) {
ns = reader.getNamespaceURI("");
} else {
s2 = s2.substring(idx + 1);
}
}
return new QName(ns, s2).toString();
}
private void compareEndElement(XMLStreamReader orig, XMLStreamReader actual)
throws Exception {
Assert.assertEquals("End element is not matched", orig.getName(), actual.getName());
}
private void compareCharacters(QName elName, XMLStreamReader orig, XMLStreamReader actual)
throws Exception {
Assert.assertEquals("Element Characters not matched " + elName,
orig.getText().trim(), actual.getText().trim());
}
public File writeDefinition(File targetDir, File defnFile) throws Exception {
WSDLManager wm = BusFactory.getThreadDefaultBus().getExtension(WSDLManager.class);
File bkFile = new File(targetDir, "bk_" + defnFile.getName());
FileWriter writer = new FileWriter(bkFile);
WSDLFactory factory
= WSDLFactory.newInstance("org.apache.cxf.tools.corba.utils.TestWSDLCorbaFactoryImpl");
WSDLReader reader = factory.newWSDLReader();
reader.setFeature("javax.wsdl.importDocuments", false);
reader.setExtensionRegistry(wm.getExtensionRegistry());
final String url = defnFile.toString();
CatalogWSDLLocator locator = new CatalogWSDLLocator(url, (Bus)null);
Definition wsdlDefn = reader.readWSDL(locator);
WSDLWriter wsdlWriter = factory.newWSDLWriter();
wsdlWriter.writeWSDL(wsdlDefn, writer);
writer.close();
writer = null;
reader = null;
return bkFile;
}
public File writeSchema(File targetDir, File schemaFile) throws Exception {
File bkFile = new File(targetDir, "bk_" + schemaFile.getName());
FileWriter writer = new FileWriter(bkFile);
FileReader reader = new FileReader(schemaFile);
XmlSchema schema = schemaCol.read(reader);
schema.write(writer);
reader.close();
writer.close();
writer = null;
reader = null;
return bkFile;
}
}