blob: f7b469289d9c8fdd97bdda3bc0756d386f83c39b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008 IBM Corporation, University of Stuttgart (IAAS) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation, University of Stuttgart (IAAS) - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.apache.ode.deploy.model.dd.util;
import java.util.List;
import java.util.StringTokenizer;
import javax.wsdl.PortType;
import javax.xml.namespace.QName;
import org.eclipse.emf.ecore.EDataType;
import org.eclipse.emf.ecore.EFactory;
import org.eclipse.emf.ecore.EPackage;
import org.eclipse.emf.ecore.xmi.XMLResource;
import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl;
public class DDXMLHelperImpl extends XMLHelperImpl {
protected boolean bIsNewQName = false;
protected QName m_qName = null;
public DDXMLHelperImpl() {
super();
}
public DDXMLHelperImpl(XMLResource resource) {
super(resource);
}
protected Object createFromString(EFactory eFactory, EDataType eDataType, String value) {
Object obj = eFactory.createFromString(eDataType, value);
if (extendedMetaData != null)
{
if (obj instanceof List)
{
@SuppressWarnings("unchecked")
List<Object> list = (List<Object>)obj;
for (int i = 0; i < list.size(); i++)
{
Object item = list.get(i);
Object replacement = updateQNameURI(item);
if (replacement != item)
{
list.set(i, replacement);
}
}
}
else
{
obj = updateQNameURI(obj);
}
}
if (bIsNewQName) {
bIsNewQName = false;
return m_qName;
} else
return obj;
}
protected String updateQNamePrefix(EFactory factory, EDataType dataType, Object value, boolean list) {
if (value instanceof PortType) {
QName qname = ((PortType) value).getQName();
return handleQName(list, qname);
}
if (value instanceof QName) {
return handleQName(list, (QName) value);
}
if (list == false) {
return factory.convertToString(dataType, value);
} else {
return null;
}
}
private String handleQName(boolean list, QName qname) {
String namespace = qname.getNamespaceURI();
if (namespace.length() == 0) {
return qname.getLocalPart();
}
EPackage ePackage = extendedMetaData.getPackage(namespace);
if (ePackage == null) {
ePackage = extendedMetaData.demandPackage(namespace);
}
String prefix = getPrefix(ePackage, true);
if (!packages.containsKey(ePackage)) {
packages.put(ePackage, prefix);
}
if (list == false) {
//generate a string out of prefix and local Part, separated by :
String qNameString = new StringBuffer(prefix).append(":").append(qname.getLocalPart()).toString();
return qNameString;
} else
return null;
}
protected Object updateQNameURI(Object value)
{
int i=1;
String strPrefix = null;
String strLocalName = null;
String strNamespace = null;
if ( value instanceof QName )
{
QName qname = (QName) value;
strLocalName = qname.getLocalPart();
strPrefix = qname.getPrefix();
if (strPrefix == null) {
//try to parse the prefix get Prefix
StringTokenizer tokenizer = new StringTokenizer(strLocalName, ":");
if (tokenizer.countTokens() > 1)
{
while (tokenizer.hasMoreTokens())
{
String tmp = tokenizer.nextToken();
if (i == 1)
strPrefix = tmp;
else
strLocalName = tmp;
i++;
}
}
}
if (strPrefix == null) {
//the string that got passed in does not have a prefix ... and we couldn't parse it... let's see if there is a default XML namespace defined that we could use
String defaultXMLNamespace = (String) prefixesToURIs.get("");
if (defaultXMLNamespace != null)
{
if (!(defaultXMLNamespace.equalsIgnoreCase(org.eclipse.bpel.apache.ode.deploy.model.dd.ddPackage.eNS_URI)))
{
//a default XML namespace exists, and it is NOT set to the ODE DeploymentDescriptor.eNS_URI -
//lets try to use this as namespace URI for the QName to properly support null namespaces
strNamespace = defaultXMLNamespace;
strPrefix = "DEFAULT_NS";
}
}
}
// it should always be null, except in cases where no WSDL prefix has been defined
if (strNamespace == null)
{
strNamespace = getURI(strPrefix);
}
m_qName = new QName(strNamespace, strLocalName);
bIsNewQName = true;
if (strPrefix.length() >0 && m_qName.getNamespaceURI().length() == 0)
{
throw new IllegalArgumentException("The prefix '" + strPrefix + "' is not declared for the QName '" + qname.toString() + "'");
}
if (strNamespace == null)
{
seenEmptyStringMapping = true;
String uri = (String)prefixesToURIs.get("");
if (uri != null) {
prefixesToURIs.put("", strNamespace);
addNSDeclaration("", uri);
}
}
return qname;
}
else {
return value;
}
}
}