/*******************************************************************************
* Copyright (c) 2005 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.bpel.model.util;
import javax.xml.namespace.QName;
import org.eclipse.bpel.model.BPELPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EClass;
public final class BPELProxyURI {
/** The resource that can resolve this proxy URI. */
private URI baseURI = null;
/** The optional proxy "mime" type. */
private String proxyType = null;
/** The Java type referenced by this proxy URI */
private EClass type = null;
private String typeName = null;
/** The qName that identifies the referenced element. */
private QName qName = null;
private String optionalID = null;
public BPELProxyURI(String proxyType, EClass type, URI baseURI, QName qName) {
this(type, baseURI, qName);
this.proxyType = proxyType;
}
public BPELProxyURI(EClass type, URI baseURI, QName qName) {
this.type = type;
this.typeName = type.getName();
this.baseURI = baseURI;
this.qName = qName;
if (qName == null || qName.getNamespaceURI() == null
|| qName.getNamespaceURI().equals("")) {
// System.err.println("BPELProxyURI expects a QName with a
// namespace: " + qName);
}
}
public BPELProxyURI(EClass type, URI baseURI, QName qName, String optionalID) {
this(type, baseURI, qName);
this.optionalID = optionalID;
}
public BPELProxyURI(String uriFragment) {
// The format of the uriFragment is:
// [optionalProxyType:]typeName{namespace}localPart[:optionalID]
//
// The format of the qname {namespace}localPart is dependent upon the
// implementation of QName.toString()
// and the {namespace} part is optional so in theory this may not always
// parse correctly.
// The URIs we are dealing with may not have a namespace, so take this
// into account.
int qNameLHS = uriFragment.indexOf('{');
int qNameRHS = uriFragment.indexOf('}', qNameLHS);
int idLHS = uriFragment.indexOf(':', qNameRHS);
if (qNameLHS > 0 && qNameRHS > qNameLHS) {
int alRHS = uriFragment.substring(0, qNameLHS).indexOf(':');
if (alRHS > 0) {
this.proxyType = uriFragment.substring(0, alRHS);
this.typeName = uriFragment.substring(alRHS + 1, qNameLHS);
} else {
this.typeName = uriFragment.substring(0, qNameLHS);
}
if (idLHS > 0) {
this.qName = parseQName(uriFragment.substring(qNameLHS, idLHS));
this.optionalID = uriFragment.substring(idLHS + 1);
} else {
this.qName = parseQName(uriFragment.substring(qNameLHS));
}
}
}
@SuppressWarnings("nls")
private QName parseQName(String qNameAsString) {
if (qNameAsString == null) {
throw new IllegalArgumentException("QName cannot be null");
}
// We have to take care of the specification with null-namespace
// {}localPart - which is used in BPELProxyURI
try {
int qNameLHS = qNameAsString.indexOf('{');
int qNameRHS = qNameAsString.indexOf('}');
// if we find a null-namespace, we have to preprocess it and strip
// the {}, thus passing only the localPart to the
// QName.valueOf() method.
if (qNameRHS != -1 && qNameLHS != -1 && qNameRHS > qNameLHS) {
String namespace = qNameAsString.substring(qNameLHS+1, qNameRHS);
if (namespace == null || namespace.trim().equals("")) {
return QName.valueOf(qNameAsString.substring(qNameRHS+1));
}
return QName.valueOf(qNameAsString);
}
} catch (Exception e) {
BPELPlugin.log("Error parsing QName " + qNameAsString, e);
}
return null;
}
public String getProxyType() {
return proxyType;
}
public String getTypeName() {
return typeName;
}
public QName getQName() {
return qName;
}
public String getID() {
return optionalID;
}
public String getFragment() {
// The qname may or may not have a namespace. In the case that it
// doesn't,
// we still need the fragment URI string to contain {} so that our
// parsing
// algorithm works correctly. If necessary, insert it now.
String fragmentQName = qName.toString();
if (qName.getNamespaceURI() == null
|| qName.getNamespaceURI().length() == 0) {
fragmentQName = "{}" + fragmentQName;
}
return (proxyType == null ? "" : proxyType + ":") + typeName
+ fragmentQName + (optionalID == null ? "" : ":" + optionalID);
}
public URI getProxyURI() {
return baseURI.appendFragment(getFragment());
}
@Override
public String toString() {
return super.toString() + "[baseURI=" + baseURI + ", proxyType="
+ proxyType + ", typeName=" + typeName + ", qName=" + qName
+ ", optionalID=" + optionalID + "]";
}
}