/**
* Copyright 2007-2010 非也
* All rights reserved.
*
* This library is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License v3 as published by the Free Software
* Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along
* with this library; if not, see http://www.gnu.org/licenses/lgpl.html.
*
*/
package org.firesoa.common.schema;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.URL;
import java.sql.Connection;
import javax.sql.DataSource;
import javax.xml.XMLConstants;
import javax.xml.namespace.QName;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.apache.ws.commons.schema.XmlSchema;
import org.apache.ws.commons.schema.XmlSchemaCollection;
import org.junit.Assert;
import org.junit.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
import org.w3c.dom.Document;
/**
*
* @author 非也 nychen2000@163.com
* Fire Workflow 官方网站:www.firesoa.com 或者 www.fireflow.org
*
*/
@SuppressWarnings("unused")
//hibernate
@ContextConfiguration(locations = { "classpath:/applicationContext.xml"})
public class DOMInitializerTest extends AbstractJUnit4SpringContextTests{
private boolean validateGeneratedDOM(Document dom ,URL schemaUrl){
try{
//验证生成的xml是否符合Schema约束
String language = XMLConstants.W3C_XML_SCHEMA_NS_URI;
SchemaFactory factory = SchemaFactory.newInstance(language);
javax.xml.validation.Schema schema = factory.newSchema(schemaUrl);//Schema.xml改成您的schema文件名 后缀可以为xsd
Validator validator=schema.newValidator();
validator.validate(new DOMSource(dom));//patterns.xml改为您要验证的xml文件名
return true;
}catch(Exception e){
e.printStackTrace();
return false;
}
}
@Test
public void testQualified_Schema()throws Exception{
System.out.println("=====testQualified_Schema()================================================");
String nsUri = "http://www.example.org/Qualified_Schema";
URL url = DOMInitializerTest.class.getResource("Qualified_Schema.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("Qualified_Schema.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Person")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Person"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
@Test
public void testUnqualified_Schema()throws Exception{
System.out.println("=====testUnqualified_Schema()================================================");
String nsUri = "http://www.example.org/Unqualified_Schema";
URL url = DOMInitializerTest.class.getResource("Unqualified_Schema.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("Unqualified_Schema.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Foo")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Foo"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
@Test
public void testQualified_Unqualified()throws Exception{
System.out.println("=====testQualified_Unqualified()================================================");
String nsUri = "http://www.example.org/Qualified_UnQualified_Schema";
URL url = DOMInitializerTest.class.getResource("Qualified_UnQualified_Schema.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("Qualified_UnQualified_Schema.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Person")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Person"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
@Test
public void testUnQualified_Qualified_1()throws Exception{
System.out.println("=====testUnQualified_Qualified_1()================================================");
String nsUri = "http://www.example.org/UnQualified_Qualified_Schema";
URL url = DOMInitializerTest.class.getResource("UnQualified_Qualified_Schema.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("UnQualified_Qualified_Schema.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Bar")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Bar"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
@Test
public void testUnQualified_Qualified_2()throws Exception{
System.out.println("=====testUnQualified_Qualified_2()================================================");
String nsUri = "http://www.example.org/UnQualified_Qualified_Schema";
URL url = DOMInitializerTest.class.getResource("UnQualified_Qualified_Schema.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("UnQualified_Qualified_Schema.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Foo")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Foo"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
@Test
public void testUnQualified_Unqualified()throws Exception{
System.out.println("=====testUnQualified_Unqualified()================================================");
String nsUri = "http://www.example.org/UnQualified_Unqualified_Schema";
URL url = DOMInitializerTest.class.getResource("Unqualified_unqualified_Schema.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("Unqualified_unqualified_Schema.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Bar")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Bar"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
@Test
public void testUnqualified_Circular_reference1()throws Exception{
System.out.println("=====Unqualified_Circular_reference1()================================================");
String nsUri = "http://www.example.org/Unqualified_Circular_reference1";
URL url = DOMInitializerTest.class.getResource("Unqualified_Circular_reference1.xsd");
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("Unqualified_Circular_reference1.xsd");
StreamSource source = new StreamSource(inStream);
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.setBaseUri(url.toExternalForm());
schemaCollection.read(source);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
schema.write(System.out);
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,"Bar1")));
}
}
}
Document generated = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,"Bar1"), false);
Assert.assertTrue(validateGeneratedDOM(generated,url));
System.out.println( DOMInitializer.dom2String(generated));
}
/**
* Test method for {@link org.firesoa.common.schema.DOMInitializer#generateDocument(org.apache.ws.commons.schema.XmlSchemaCollection, javax.xml.namespace.QName, boolean)}.
*/
public void testGenerateDocument()throws Exception {
DataSource ds = (DataSource)this.applicationContext.getBean("MyDataSource");
Connection conn = ds.getConnection();
String nsUri = "http://test/";
String sql = "update t_ff_rt_workitem set created_time=?,end_time=?,owner_id='testUser' , owner_type=? where id='123' and (owner_id like ? or created_time>? or state=? )";
XmlSchemaCollection schemaCollection =
SQLSchemaGenerator.generateXmlSchemaCollectionForSQL(sql, nsUri, conn);
XmlSchema[] schemas = schemaCollection.getXmlSchemas();
if (schemas!=null){
for (XmlSchema schema :schemas){
if (schema.getTargetNamespace().equals(nsUri)){
// schema.write(System.out);
Assert.assertNull(schema.getElementByName(new QName(nsUri,SQLSchemaGenerator.WHERE_ELEMENT)));
Assert.assertNull(schema.getElementByName(new QName(nsUri,SQLSchemaGenerator.SET_ELEMENT)));
Assert.assertNotNull(schema.getElementByName(new QName(nsUri,SQLSchemaGenerator.UPDATE_ELEMENT)));
}
}
}
Document doc = DOMInitializer.generateDocument(schemaCollection, new QName(nsUri,SQLSchemaGenerator.UPDATE_ELEMENT), false);
System.out.println( DOMInitializer.dom2String(doc));
}
public void testGenerateDocument2()throws Exception {
InputStream inStream = DOMInitializerTest.class.getResourceAsStream("WorkflowProcessSchema-2.0.xsd");
XmlSchemaCollection schemaCollection = new XmlSchemaCollection();
schemaCollection.read(new StreamSource(inStream));
QName workflowProcessQName = new QName("http://www.fireflow.org/schema/workflowprocess","workflow-process");
Document doc = DOMInitializer.generateDocument(schemaCollection,workflowProcessQName, false);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.setOutputProperty(OutputKeys.ENCODING,"GB2312");
transformer.setOutputProperty(OutputKeys.INDENT,"yes");
transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//transformer.transform()方法 将 XML Source转换为 Result
transformer.transform(new DOMSource(doc), new StreamResult(outputStream));
System.out.println( outputStream.toString() );
}
}