blob: 02f43000b46a9932a7040ed9064903436bb2ff69 [file] [log] [blame]
/*
* 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.tuscany.sca.databinding.sdo2om;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMDataSource;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.OMXMLParserWrapper;
import org.apache.axiom.om.impl.builder.StAXBuilder;
import org.apache.tuscany.sca.databinding.TransformationContext;
import org.apache.tuscany.sca.interfacedef.DataType;
import org.apache.tuscany.sca.interfacedef.util.XMLType;
/**
* Helper for AXIOM
*
* @version $Rev$ $Date$
*/
public class AxiomHelper {
private static final String DEFAULT_PREFIX = "_ns_";
private AxiomHelper() {
}
/**
* See http://issues.apache.org/jira/browse/WSCOMMONS-240
* @param om
*/
public static void completeAndClose(OMElement om) {
// Get the builder associated with the om element
OMXMLParserWrapper builder = om.getBuilder();
if (builder != null) {
if (builder instanceof StAXBuilder) {
((StAXBuilder)builder).releaseParserOnClose(true);
}
OMElement document = builder.getDocumentElement();
if (document != null) {
document.build();
}
}
if (builder instanceof StAXBuilder) {
((StAXBuilder)builder).close();
}
}
/**
* This method will close the builder immediately. Any subsequent Axiom objects won't
* be built or accessible.
*/
public static void closeImmediately(OMElement om) {
// Get the builder associated with the om element
OMXMLParserWrapper builder = om.getBuilder();
if (builder != null) {
if (builder instanceof StAXBuilder) {
((StAXBuilder)builder).releaseParserOnClose(true);
((StAXBuilder)builder).close();
}
// builder.close();
}
}
/**
* @param context
* @param element
*/
public static void adjustElementName(TransformationContext context, OMElement element) {
if (context != null) {
DataType dataType = context.getTargetDataType();
Object logical = dataType == null ? null : dataType.getLogical();
if (!(logical instanceof XMLType)) {
return;
}
XMLType xmlType = (XMLType)logical;
if (xmlType.isElement() && !xmlType.getElementName().equals(element.getQName())) {
// FIXME:: Throw exception or switch to the new Element?
OMFactory factory = OMAbstractFactory.getOMFactory();
QName name = xmlType.getElementName();
OMNamespace namespace = factory.createOMNamespace(name.getNamespaceURI(), name.getPrefix());
element.setNamespace(namespace);
element.setLocalName(name.getLocalPart());
}
}
}
public static OMElement createOMElement(OMFactory factory, QName element) {
String localName = element.getLocalPart();
OMNamespace ns = createOMNamespace(factory, element);
return factory.createOMElement(localName, ns);
}
public static OMElement createOMElement(OMFactory factory, QName element, OMDataSource dataSource) {
String localName = element.getLocalPart();
OMNamespace ns = createOMNamespace(factory, element);
return factory.createOMElement(dataSource, localName, ns);
}
/**
* @param factory
* @param name
* @return
*/
public static OMNamespace createOMNamespace(OMFactory factory, QName name) {
String namespaceURI = name.getNamespaceURI();
String prefix = name.getPrefix();
OMNamespace ns = null;
if (namespaceURI.length() != 0) {
// Qualified Element: we need an OMNamespace
if (prefix.length() == 0) {
// The prefix does not appear to be specified, let's create one
prefix = DEFAULT_PREFIX;
}
ns = factory.createOMNamespace(namespaceURI, prefix);
}
return ns;
}
}