/**
* 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.cxf.binding.corba.utils;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.wsdl.Binding;
import javax.wsdl.Definition;
import javax.wsdl.Import;
import javax.wsdl.Port;
import javax.wsdl.Service;
import javax.xml.bind.DatatypeConverter;
import javax.xml.namespace.QName;
import org.apache.cxf.binding.corba.wsdl.BindingType;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.helpers.CastUtils;
import org.omg.CORBA.Object;
public final class CorbaObjectReferenceHelper {
public static final String WSDLI_NAMESPACE_URI = "http://www.w3.org/2006/01/wsdl-instance";
public static final String ADDRESSING_NAMESPACE_URI = "http://www.w3.org/2005/08/addressing";
public static final String ADDRESSING_WSDL_NAMESPACE_URI = "http://www.w3.org/2006/05/addressing/wsdl";
private static final Logger LOG = LogUtils.getL7dLogger(CorbaObjectReferenceHelper.class);
private CorbaObjectReferenceHelper() {
//utility class
}
public static String getWSDLLocation(Definition wsdlDef) {
return wsdlDef.getDocumentBaseURI();
}
public static QName getServiceName(Binding binding, Definition wsdlDef) {
LOG.log(Level.FINE, "Getting service name for an object reference");
Collection<Service> services = CastUtils.cast(wsdlDef.getServices().values());
for (Service serv : services) {
Collection<Port> ports = CastUtils.cast(serv.getPorts().values());
for (Port pt : ports) {
if (pt.getBinding().equals(binding)) {
return serv.getQName();
}
}
}
return null;
}
public static String getEndpointName(Binding binding, Definition wsdlDef) {
LOG.log(Level.FINE, "Getting endpoint name for an object reference");
Collection<Service> services = CastUtils.cast(wsdlDef.getServices().values());
for (Service serv : services) {
Collection<Port> ports = CastUtils.cast(serv.getPorts().values());
for (Port pt : ports) {
if (pt.getBinding().equals(binding)) {
return pt.getName();
}
}
}
return null;
}
public static Binding getDefaultBinding(Object obj, Definition wsdlDef) {
LOG.log(Level.FINEST, "Getting binding for a default object reference");
Collection<Binding> bindings = CastUtils.cast(wsdlDef.getBindings().values());
for (Binding b : bindings) {
List<?> extElements = b.getExtensibilityElements();
// Get the list of all extensibility elements
for (Iterator<?> extIter = extElements.iterator(); extIter.hasNext();) {
java.lang.Object element = extIter.next();
// Find a binding type so we can check against its repository ID
if (element instanceof BindingType) {
BindingType type = (BindingType)element;
if (obj._is_a(type.getRepositoryID())) {
return b;
}
}
}
}
return null;
}
public static EprMetaData getBindingForTypeId(String repId, Definition wsdlDef) {
LOG.log(Level.FINE, "RepositoryId " + repId
+ ", wsdl namespace " + wsdlDef.getTargetNamespace());
EprMetaData ret = new EprMetaData();
Collection<Binding> bindings = CastUtils.cast(wsdlDef.getBindings().values());
for (Binding b : bindings) {
List<?> extElements = b.getExtensibilityElements();
// Get the list of all extensibility elements
for (Iterator<?> extIter = extElements.iterator(); extIter.hasNext();) {
java.lang.Object element = extIter.next();
// Find a binding type so we can check against its repository ID
if (element instanceof BindingType) {
BindingType type = (BindingType)element;
if (repId.equals(type.getRepositoryID())) {
ret.setCandidateWsdlDef(wsdlDef);
ret.setBinding(b);
return ret;
}
}
}
}
if (!ret.isValid()) {
// recursivly check imports
Iterator<?> importLists = wsdlDef.getImports().values().iterator();
while (importLists.hasNext()) {
List<?> imports = (List<?>) importLists.next();
for (java.lang.Object imp : imports) {
if (imp instanceof Import) {
Definition importDef = ((Import)imp).getDefinition();
LOG.log(Level.INFO, "Following import " + importDef.getDocumentBaseURI());
ret = getBindingForTypeId(repId, importDef);
if (ret.isValid()) {
return ret;
}
}
}
}
}
return ret;
}
public static String extractTypeIdFromIOR(String url) {
String ret = "";
byte data[] = DatatypeConverter.parseHexBinary(url.substring(4));
if (data.length > 0) {
// parse out type_id from IOR CDR encapsulation
boolean bigIndian = !(data[0] > 0);
int typeIdStringSize = readIntFromAlignedCDREncaps(data, 4, bigIndian);
if (typeIdStringSize > 1) {
ret = readStringFromAlignedCDREncaps(data, 8, typeIdStringSize - 1);
}
}
return ret;
}
private static String readStringFromAlignedCDREncaps(byte[] data, int startIndex, int length) {
char[] arr = new char[length];
for (int i = 0; i < length; i++) {
arr[i] = (char) (data[startIndex + i] & 0xff);
}
return new String(arr);
}
public static int readIntFromAlignedCDREncaps(byte[] data, int index, boolean bigEndian) {
if (bigEndian) {
int partial = ((data[index] << 24) & 0xff000000)
| ((data[index + 1] << 16) & 0x00ff0000);
return partial | ((data[index + 2] << 8) & 0x0000ff00)
| ((data[index + 3]) & 0x000000ff);
} else {
int partial = ((data[index]) & 0x000000ff)
| ((data[index + 1] << 8) & 0x0000ff00);
return partial | ((data[index + 2] << 16) & 0x00ff0000)
| ((data[index + 3] << 24) & 0xff000000);
}
}
public static void populateEprInfo(EprMetaData info) {
if (!info.isValid()) {
return;
}
Binding match = info.getBinding();
Definition wsdlDef = info.getCandidateWsdlDef();
Collection<Service> services = CastUtils.cast(wsdlDef.getServices().values());
for (Service serv : services) {
Collection<Port> ports = CastUtils.cast(serv.getPorts().values());
for (Port pt : ports) {
if (pt.getBinding().equals(match)) {
info.setPortName(pt.getName());
info.setServiceQName(serv.getQName());
break;
}
}
}
if (info.getServiceQName() == null) {
Iterator<?> importLists = wsdlDef.getImports().values().iterator();
while (info.getServiceQName() == null && importLists.hasNext()) {
List<?> imports = (List<?>) importLists.next();
for (java.lang.Object imp : imports) {
if (imp instanceof Import) {
Definition importDef = ((Import)imp).getDefinition();
LOG.log(Level.FINE, "following wsdl import " + importDef.getDocumentBaseURI());
info.setCandidateWsdlDef(importDef);
populateEprInfo(info);
if (info.getServiceQName() != null) {
break;
}
}
}
}
}
}
}