/**
* Mule Development Kit
* Copyright 2010-2011 (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
*
* 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.mule.devkit.model.schema;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.mule.devkit.model.code.CodeWriter;
import org.mule.util.IOUtils;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public final class SchemaModel {
private CodeWriter codeWriter;
private List<SchemaLocation> schemaLocations;
public SchemaModel(CodeWriter codeWriter) {
this.codeWriter = codeWriter;
this.schemaLocations = new ArrayList<SchemaLocation>();
}
public void addSchemaLocation(SchemaLocation schemaLocation) {
schemaLocations.add(schemaLocation);
}
public void build() throws IOException {
try {
if (!schemaLocations.isEmpty()) {
for (SchemaLocation schemaLocation : schemaLocations) {
if (schemaLocation.getSchema() != null) {
buildSchema(schemaLocation);
}
}
buildSpringHandlersFile();
buildSpringSchemasFile();
}
} catch (JAXBException e) {
throw new IOException(e);
} catch (UnsupportedEncodingException e) {
throw new IOException(e);
}
}
private void buildSchema(SchemaLocation schemaLocation) throws JAXBException, IOException {
OutputStream schemaStream = null;
try {
JAXBContext jaxbContext = JAXBContext.newInstance(Schema.class);
Marshaller marshaller = jaxbContext.createMarshaller();
NamespaceFilter outFilter = new NamespaceFilter("mule", "http://www.mulesoft.org/schema/mule/core", true);
OutputFormat format = new OutputFormat();
format.setIndent(true);
format.setNewlines(true);
schemaStream = codeWriter.openBinary(null, schemaLocation.getFileName());
XMLWriter writer = new XMLWriter(schemaStream, format);
outFilter.setContentHandler(writer);
marshaller.marshal(schemaLocation.getSchema(), outFilter);
} finally {
IOUtils.closeQuietly(schemaStream);
}
}
private void buildSpringHandlersFile() throws IOException {
OutputStreamWriter outputStreamWriter = null;
try {
Set<String> targetNamespaces = new HashSet<String>();
OutputStream outputStream = codeWriter.openBinary(null, "META-INF/spring.handlers");
outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
for (SchemaLocation schemaLocation : schemaLocations) {
if (schemaLocation.getNamespaceHandler() != null) {
String targetNamespace = schemaLocation.getTargetNamespace().replace("://", "\\://");
if (!targetNamespaces.contains(targetNamespace)) {
outputStreamWriter.write(targetNamespace + "=" + schemaLocation.getNamespaceHandler() + "\n");
targetNamespaces.add(targetNamespace);
}
}
}
outputStreamWriter.flush();
} finally {
IOUtils.closeQuietly(outputStreamWriter);
}
}
private void buildSpringSchemasFile() throws IOException {
OutputStreamWriter outputStreamWriter = null;
try {
OutputStream outputStream = codeWriter.openBinary(null, "META-INF/spring.schemas");
outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");
for (SchemaLocation schemaLocation : schemaLocations) {
if (schemaLocation.getFileName() != null && schemaLocation.getLocation() != null) {
outputStreamWriter.write(schemaLocation.getLocation().replace("://", "\\://") + "=" + schemaLocation.getFileName() + "\n");
}
}
outputStreamWriter.flush();
} finally {
IOUtils.closeQuietly(outputStreamWriter);
}
}
public List<SchemaLocation> getSchemaLocations() {
return schemaLocations;
}
}