You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cxf.apache.org by dk...@apache.org on 2008/08/01 05:13:56 UTC
svn commit: r681597 - in /cxf/trunk:
rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/
rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/
rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/
rt/bindi...
Author: dkulp
Date: Thu Jul 31 20:13:55 2008
New Revision: 681597
URL: http://svn.apache.org/viewvc?rev=681597&view=rev
Log:
Some CORBA cleanups, fix problems with unsigned types, start exploring how to support derived types.
Removed:
cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaStreamWriterTest.java
Modified:
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaBindingFactory.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaDestination.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultInInterceptor.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServant.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaFaultStreamWriter.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReader.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaStreamWriter.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/AbstractCorbaTypeListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaAnyListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaArrayListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaExceptionListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaObjectReferenceEventProducer.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaPrimitiveHandler.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaSequenceListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaStructListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaTypeListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaUnionListener.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaBindingHelper.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaUtils.java
cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/OrbConfig.java
cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServantTest.java
cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReaderTest.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient3.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient4.java
cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/corba/CORBADocLitClientTypeTest.java
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaBindingFactory.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaBindingFactory.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaBindingFactory.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaBindingFactory.java Thu Jul 31 20:13:55 2008
@@ -109,4 +109,9 @@
uriPrefixes.add("corba");
return uriPrefixes;
}
+
+ public OrbConfig getOrbConfig() {
+ return orbConfig;
+ }
+
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaDestination.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaDestination.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaDestination.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaDestination.java Thu Jul 31 20:13:55 2008
@@ -20,8 +20,9 @@
package org.apache.cxf.binding.corba;
import java.io.IOException;
-import java.lang.reflect.Method;
import java.net.URI;
+import java.util.ArrayList;
+import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -30,6 +31,7 @@
import org.apache.cxf.binding.corba.utils.CorbaUtils;
import org.apache.cxf.binding.corba.utils.OrbConfig;
import org.apache.cxf.binding.corba.wsdl.AddressType;
+import org.apache.cxf.binding.corba.wsdl.PolicyType;
import org.apache.cxf.common.logging.LogUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.service.model.BindingInfo;
@@ -40,19 +42,19 @@
import org.apache.cxf.ws.addressing.AttributedURIType;
import org.apache.cxf.ws.addressing.EndpointReferenceType;
import org.omg.CORBA.ORB;
-import org.omg.CORBA.Object;
import org.omg.CORBA.Policy;
-import org.omg.CosNaming.NameComponent;
-import org.omg.CosNaming.NamingContextExt;
-import org.omg.CosNaming.NamingContextExtHelper;
+import org.omg.PortableServer.IdAssignmentPolicyValue;
+import org.omg.PortableServer.LifespanPolicyValue;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManager;
+import org.omg.PortableServer.ThreadPolicyValue;
public class CorbaDestination implements Destination {
-
+ private static final String IOR_SHARED_KEY = "ior:shared-key";
private static final Logger LOG = LogUtils.getL7dLogger(CorbaDestination.class);
+
private AddressType address;
private EndpointReferenceType reference;
private ORB orb;
@@ -63,6 +65,9 @@
private CorbaTypeMap typeMap;
private byte[] objectId;
private POA bindingPOA;
+ private String poaName;
+ private String serviceId;
+ private boolean isPersistent;
private org.omg.CORBA.Object obj;
public CorbaDestination(EndpointInfo ei, OrbConfig config) {
@@ -83,6 +88,13 @@
} else {
typeMap = TypeMapCache.get(binding.getService());
}
+ isPersistent = orbConfig.isPersistentPoa();
+ PolicyType policy = ei.getExtensor(PolicyType.class);
+ if (policy != null) {
+ poaName = policy.getPoaname();
+ isPersistent = policy.isPersistent();
+ serviceId = policy.getServiceid();
+ }
}
public OrbConfig getOrbConfig() {
@@ -116,9 +128,14 @@
public void shutdown() {
if (orb != null) {
try {
- // Indicate that we are done with the ORB. We'll ask for it to be destroyed but it
- // someone else is using it, it really won't be (just its use count decremented)
- CorbaBindingHelper.destroyORB(getDestinationAddress(), orb);
+ // Ask for the ORB to be destroyed. If another destination is using it, we'll
+ // simply decrement a use count, but not destroy the ORB so that we don't break the
+ // other CorbaDestination.
+ if (CorbaUtils.isIOR(getDestinationAddress())) {
+ CorbaBindingHelper.destroyORB(IOR_SHARED_KEY, orb);
+ } else {
+ CorbaBindingHelper.destroyORB(getDestinationAddress(), orb);
+ }
} catch (Exception ex) {
throw new CorbaBindingException(ex);
}
@@ -126,6 +143,29 @@
}
}
+ public ORB getORB(List<String> orbArgs,
+ String location,
+ java.util.Properties props) {
+ // See if an ORB has already been created for the given address. If so,
+ // we'll simply use it
+ // so that we don't try re-create another ORB on the same host and port.
+ if (CorbaUtils.isIOR(location)) {
+ location = IOR_SHARED_KEY;
+ }
+ orb = CorbaBindingHelper.getAddressSpecificORB(location);
+ if (orb == null) {
+ orb = ORB.init(orbArgs.toArray(new String[orbArgs.size()]), props);
+ CorbaBindingHelper.addAddressSpecificORB(location, orb);
+ }
+
+ // Get the binding helper to remember that we need this ORB kept alive, even if another
+ // destination tries to destroy it.
+ CorbaBindingHelper.keepORBAlive(location);
+
+ return orb;
+
+ }
+
protected ORB getOrb() {
return orb;
}
@@ -151,10 +191,66 @@
}
public void activate() {
+ java.util.Properties props = new java.util.Properties();
+ if (orbConfig.getOrbClass() != null) {
+ props.put("org.omg.CORBA.ORBClass", orbConfig.getOrbClass());
+ }
+ if (orbConfig.getOrbSingletonClass() != null) {
+ props.put("org.omg.CORBA.ORBSingletonClass", orbConfig
+ .getOrbSingletonClass());
+ }
+
String location = getDestinationAddress();
+
+ if (!CorbaUtils.isValidURL(location)) {
+ throw new CorbaBindingException(
+ "Invalid addressing specified for CORBA port location");
+ }
+
LOG.info("Service address retrieved: " + location);
- orb = CorbaBindingHelper.getAddressSpecificORB(location);
+
+ URI addressURI = null;
+ try {
+ addressURI = new URI(location);
+ } catch (java.net.URISyntaxException ex) {
+ throw new CorbaBindingException(
+ "Unable to create ORB with address " + address);
+ }
+
+
+ List<String> orbArgs = new ArrayList<String>(orbConfig.getOrbArgs());
+
+ String scheme = addressURI.getScheme();
+ // A corbaloc address gives us host and port information to use when
+ // setting up the
+ // endpoint for the ORB. Other types of references will just create ORBs
+ // on the
+ // host and port used when no preference has been specified.
+ if (poaName != null) {
+ poaName = poaName.replace('.', '_');
+ }
+ if ("corbaloc".equals(scheme)) {
+ if (poaName == null) {
+ poaName = getEndPointInfo().getName().getLocalPart().replace('.', '_');
+ }
+ setCorbaLocArgs(addressURI, orbArgs);
+ }
+
+ if (isPersistent) {
+ if (poaName == null) {
+ throw new CorbaBindingException(
+ "POA name missing for corba port "
+ + "with a persistent policy");
+ }
+ } else {
+ poaName = CorbaUtils.getUniquePOAName(getEndPointInfo()
+ .getService().getName(), getEndPointInfo().getName()
+ .getLocalPart(), poaName).replace('.', '_');
+ }
+
+ orb = getORB(orbArgs, location, props);
+
if (orb == null) {
LOG.log(Level.INFO, "Creating ORB with address " + location);
orb = CorbaBindingHelper.createAddressSpecificORB(location, orbConfig);
@@ -165,52 +261,52 @@
try {
POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
POAManager poaManager = rootPOA.the_POAManager();
-
try {
- bindingPOA = rootPOA.find_POA("BindingPOA", true);
+ bindingPOA = rootPOA.find_POA(poaName, false);
} catch (org.omg.PortableServer.POAPackage.AdapterNonExistent ex) {
- // An AdapterNonExistent exception will be thrown if the POA does not exist. If
- // this is the case, then we'll create one.
- Policy[] policies = new Policy[ orbConfig.isPersistentPoa() ? 3 : 2];
- policies[0] = rootPOA
- .create_id_uniqueness_policy(
- org.omg.PortableServer.IdUniquenessPolicyValue.UNIQUE_ID);
- policies[1] = rootPOA
- .create_implicit_activation_policy(
- org.omg.PortableServer.ImplicitActivationPolicyValue.NO_IMPLICIT_ACTIVATION);
- if (orbConfig.isPersistentPoa()) {
- policies[2] = rootPOA
- .create_lifespan_policy(org.omg.PortableServer.LifespanPolicyValue.PERSISTENT);
- }
- bindingPOA = rootPOA.create_POA("BindingPOA", poaManager, policies);
+ // do nothing
}
-
+
+ // When using object references, we can run into a situation where
+ // we are implementing
+ // multiple instances of the same port type such that we would end
+ // up using the same
+ // poaname for each when persistance is used. Handle this case by
+ // not throwing an
+ // exception at this point during the activation, we should see an
+ // exception if we try
+ // an activate two objects with the same servant ID instead.
+ if (bindingPOA != null && !isPersistent) {
+ throw new CorbaBindingException(
+ "Corba Port activation failed because the poa "
+ + poaName + " already exists");
+ } else if (bindingPOA == null) {
+ bindingPOA = createPOA(poaName, rootPOA, poaManager);
+ }
+
if (bindingPOA == null) {
throw new CorbaBindingException("Unable to create CXF CORBA Binding POA");
}
CorbaDSIServant servant = new CorbaDSIServant();
servant.init(orb, bindingPOA, this, incomingObserver, typeMap);
- objectId = bindingPOA.activate_object(servant);
+ if (serviceId != null) {
+ objectId = serviceId.getBytes();
+ try {
+ bindingPOA.activate_object_with_id(objectId, servant);
+ } catch (org.omg.PortableServer.POAPackage.ObjectAlreadyActive ex) {
+ if (!isPersistent) {
+ throw new CorbaBindingException("Object "
+ + serviceId
+ + " already active for non-persistent poa");
+ }
+ }
+ } else {
+ objectId = bindingPOA.activate_object(servant);
+ }
obj = bindingPOA.id_to_reference(objectId);
+ CorbaUtils.exportObjectReference(orb, obj, location, address);
- if (location.startsWith("relfile:")) {
- URI iorFile = new URI(location.substring(3));
- CorbaUtils.exportObjectReferenceToFile(obj, orb, iorFile);
- } else if (location.startsWith("file:")) {
- URI uri = new URI(location);
- CorbaUtils.exportObjectReferenceToFile(obj, orb, uri);
- } else if (location.startsWith("corbaloc")) {
- // Try add the key to the boot manager. This is required for a corbaloc
- addKeyToBootManager(location, obj);
- } else if (location.startsWith("corbaname")) {
- addKeyToNameservice(location, obj);
- } else {
- String ior = orb.object_to_string(obj);
- address.setLocation(ior);
- URI uri = new URI("endpoint.ior");
- CorbaUtils.exportObjectReferenceToFile(obj, orb, uri);
- }
populateEpr(orb.object_to_string(obj));
LOG.info("Object Reference: " + orb.object_to_string(obj));
// TODO: Provide other export mechanisms?
@@ -220,17 +316,6 @@
}
}
- private void addKeyToNameservice(String location, Object ref) throws Exception {
- int idx = location.indexOf("#");
- String name = location.substring(idx + 1);
-
- //Register in NameService
- org.omg.CORBA.Object nsObj = orb.resolve_initial_references("NameService");
- NamingContextExt rootContext = NamingContextExtHelper.narrow(nsObj);
- NameComponent[] nc = rootContext.to_name(name);
- rootContext.rebind(nc, ref);
- }
-
private void populateEpr(String ior) {
AttributedURIType addr = new AttributedURIType();
addr.setValue(ior);
@@ -272,27 +357,65 @@
}
}
}
+
+ private void setCorbaLocArgs(URI addressURI, List<String> orbArgs) {
+ String schemeSpecificPart = addressURI.getSchemeSpecificPart();
+ int keyIndex = schemeSpecificPart.indexOf('/');
+ String corbaAddr = schemeSpecificPart.substring(0, keyIndex);
+ String key = schemeSpecificPart.substring(keyIndex + 1);
+
+ int index = corbaAddr.indexOf(':');
+ String protocol = "iiop";
+ if (index != 0) {
+ protocol = corbaAddr.substring(0, index);
+ }
+ int oldIndex = index;
+ index = corbaAddr.indexOf(':', oldIndex + 1);
+ String host = corbaAddr.substring(oldIndex + 1, index);
+ String port = corbaAddr.substring(index + 1);
+
+ orbArgs.add("-ORB" + key + ":" + protocol + ":host");
+ orbArgs.add(host);
+ orbArgs.add("-ORB" + key + ":" + protocol + ":port");
+ orbArgs.add(port);
+ orbArgs.add("-ORBpoa:" + poaName + ":direct_persistent");
+ orbArgs.add("true");
+ orbArgs.add("-ORBpoa:" + poaName + ":well_known_address");
+ orbArgs.add(key);
+ isPersistent = true;
+ serviceId = key;
+ }
+
+ protected POA createPOA(String name, POA parentPOA, POAManager poaManager) {
+ List<Policy> policies = new ArrayList<Policy>();
+
+
+ policies.add(parentPOA
+ .create_thread_policy(ThreadPolicyValue.ORB_CTRL_MODEL));
+
+ if (isPersistent) {
+ policies.add(parentPOA
+ .create_lifespan_policy(LifespanPolicyValue.PERSISTENT));
+ } else {
+ policies.add(parentPOA
+ .create_lifespan_policy(LifespanPolicyValue.TRANSIENT));
+ }
+
+ if (serviceId != null) {
+ policies.add(parentPOA
+ .create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID));
+ }
+
+
+ policies.addAll(orbConfig.getExtraPolicies());
+
+ Policy[] policyList = (Policy[])policies.toArray(new Policy[policies.size()]);
- private void addKeyToBootManager(String location, org.omg.CORBA.Object value) {
- int keyIndex = location.indexOf('/');
- String key = location.substring(keyIndex + 1);
try {
- Class<?> bootMgrHelperClass = Class.forName("org.apache.yoko.orb.OB.BootManagerHelper");
- Class<?> bootMgrClass = Class.forName("org.apache.yoko.orb.OB.BootManager");
- Method narrowMethod =
- bootMgrHelperClass.getMethod("narrow", org.omg.CORBA.Object.class);
- java.lang.Object bootMgr = narrowMethod.invoke(null,
- orb.resolve_initial_references("BootManager"));
- Method addBindingMethod =
- bootMgrClass.getMethod("add_binding", byte[].class, org.omg.CORBA.Object.class);
- addBindingMethod.invoke(bootMgr, key.getBytes(), value);
- LOG.info("Added key " + key + " to bootmanager");
- } catch (ClassNotFoundException ex) {
- //Not supported by the orb. skip it.
- } catch (java.lang.reflect.InvocationTargetException ex) {
- //Not supported by the orb. skip it.
+ return parentPOA.create_POA(name, poaManager, policyList);
} catch (Exception ex) {
- throw new CorbaBindingException(ex);
+ throw new CorbaBindingException(
+ "Could not create POA during activation", ex);
}
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultInInterceptor.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultInInterceptor.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultInInterceptor.java Thu Jul 31 20:13:55 2008
@@ -107,9 +107,13 @@
Class<?> exClass = fault.getProperty(Class.class.getName(), Class.class);
if (exClass != null) {
Class<?> beanClass = e.getClass();
- Constructor constructor =
+ Constructor<?> constructor =
exClass.getConstructor(new Class[]{String.class, beanClass});
- e = constructor.newInstance(new Object[]{"", e});
+
+ String repId = (message.getStreamableException()._type().id() != null)
+ ? message.getStreamableException()._type().id()
+ : "";
+ e = constructor.newInstance(new Object[]{repId, e});
} else {
// Get the Fault
Fault faultEx = (Fault) message.getContent(Exception.class);
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServant.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServant.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServant.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServant.java Thu Jul 31 20:13:55 2008
@@ -39,6 +39,7 @@
import org.apache.cxf.message.ExchangeImpl;
import org.apache.cxf.message.MessageImpl;
import org.apache.cxf.service.model.BindingInfo;
+import org.apache.cxf.service.model.BindingMessageInfo;
import org.apache.cxf.service.model.BindingOperationInfo;
import org.apache.cxf.transport.MessageObserver;
import org.omg.CORBA.ORB;
@@ -142,15 +143,34 @@
}
public void invoke(ServerRequest request) throws CorbaBindingException {
+ String opName = request.operation();
+ QName requestOperation = operationMap.get(opName);
+
MessageImpl msgImpl = new MessageImpl();
msgImpl.setDestination(getDestination());
Exchange exg = new ExchangeImpl();
- exg.put(String.class, operationMap.get(request.operation()).getLocalPart());
+ exg.put(String.class, requestOperation.getLocalPart());
exg.put(ORB.class, getOrb());
exg.put(ServerRequest.class, request);
msgImpl.setExchange(exg);
CorbaMessage msg = new CorbaMessage(msgImpl);
msg.setCorbaTypeMap(typeMap);
+
+ // If there's no output message part in our operation then it's a oneway op
+ BindingMessageInfo bindingMsgOutputInfo = null;
+ BindingOperationInfo bindingOpInfo = null;
+ try {
+ bindingOpInfo = this.destination.getEndPointInfo().getBinding().getOperation(requestOperation);
+ } catch (Exception ex) {
+ throw new CorbaBindingException("Invalid Request. Operation unknown: " + opName);
+ }
+ if (bindingOpInfo != null) {
+ bindingMsgOutputInfo = bindingOpInfo.getOutput();
+ if (bindingMsgOutputInfo == null) {
+ exg.setOneWay(true);
+ }
+ }
+
// invokes the interceptors
getObserver().onMessage(msg);
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaFaultStreamWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaFaultStreamWriter.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaFaultStreamWriter.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaFaultStreamWriter.java Thu Jul 31 20:13:55 2008
@@ -46,6 +46,7 @@
protected void setCurrentTypeListener(QName name) throws XMLStreamException {
QName idlType = exType.getException();
currentTypeListener = CorbaHandlerUtils.getTypeListener(name, idlType, typeMap, orb, serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
listeners[0] = currentTypeListener;
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReader.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReader.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReader.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReader.java Thu Jul 31 20:13:55 2008
@@ -18,6 +18,8 @@
*/
package org.apache.cxf.binding.corba.runtime;
+
+import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.math.BigInteger;
import java.util.ArrayList;
@@ -189,7 +191,7 @@
public Integer readUShort() throws CorbaBindingException {
try {
- Integer result = new Integer(stream.read_ushort());
+ int result = stream.read_ushort();
if (result < 0) {
result = (result - Short.MIN_VALUE) - Short.MIN_VALUE;
}
@@ -212,7 +214,9 @@
public BigInteger readULong() throws CorbaBindingException {
try {
- return new BigInteger(stream.read_ulong() + "");
+ long l = stream.read_ulong();
+ l &= 0xffffffffL;
+ return BigInteger.valueOf(l);
} catch (org.omg.CORBA.MARSHAL ex) {
LOG.log(Level.SEVERE, "CorbaObjectReader: could not read unsigned long");
throw new CorbaBindingException("CorbaObjectReader: readULong MARSHAL exception", ex);
@@ -230,7 +234,16 @@
public BigInteger readULongLong() throws CorbaBindingException {
try {
- return new BigInteger(stream.read_ulonglong() + "");
+ long l = stream.read_ulonglong();
+ if (l < 0) {
+ long l2 = l & 0x7FFFFFFFFFFFFFL;
+ BigInteger i = BigInteger.valueOf(l2);
+ BigInteger i2 = BigInteger.valueOf(0);
+ i2.setBit(63);
+ i = i.or(i2);
+ return i;
+ }
+ return BigInteger.valueOf(l);
} catch (org.omg.CORBA.MARSHAL ex) {
LOG.log(Level.SEVERE, "CorbaObjectReader: could not read unsigned long long");
throw new CorbaBindingException("CorbaObjectReader: readULongLong MARSHAL exception", ex);
@@ -384,11 +397,96 @@
CorbaArrayHandler arrayObj = (CorbaArrayHandler)obj;
List<CorbaObjectHandler> arrayElements = arrayObj.getElements();
- for (int i = 0; i < arrayElements.size(); ++i) {
- this.read(arrayElements.get(i));
+ Object val = null;
+ int arraySize = arrayElements.size();
+ if (arraySize > 0) {
+ switch(arrayElements.get(0).getTypeCodeKind().value()) {
+ case TCKind._tk_boolean: {
+ boolean[] values = new boolean[arraySize];
+ stream.read_boolean_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_char: {
+ char[] values = new char[arraySize];
+ stream.read_char_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_wchar: {
+ char[] values = new char[arraySize];
+ stream.read_wchar_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_octet: {
+ byte[] values = new byte[arraySize];
+ stream.read_octet_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_short: {
+ short[] values = new short[arraySize];
+ stream.read_short_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_ushort: {
+ short[] values = new short[arraySize];
+ stream.read_ushort_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_long: {
+ int[] values = new int[arraySize];
+ stream.read_long_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_ulong: {
+ int[] values = new int[arraySize];
+ stream.read_ulong_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_longlong: {
+ long[] values = new long[arraySize];
+ stream.read_longlong_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_ulonglong: {
+ long[] values = new long[arraySize];
+ stream.read_ulonglong_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_float: {
+ float[] values = new float[arraySize];
+ stream.read_float_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ case TCKind._tk_double: {
+ double[] values = new double[arraySize];
+ stream.read_double_array(values, 0, arraySize);
+ val = values;
+ break;
+ }
+ default:
+ for (int i = 0; i < arrayElements.size(); ++i) {
+ this.read(arrayElements.get(i));
+ }
+ }
+ if (val != null) {
+ int sz = Array.getLength(val);
+ for (int i = 0; i < sz; i++) {
+ ((CorbaPrimitiveHandler)arrayElements.get(i)).setValue(Array.get(val, i));
+ }
+ }
}
}
-
+
public void readSequence(CorbaObjectHandler obj) throws CorbaBindingException {
if (obj instanceof CorbaOctetSequenceHandler) {
int length = stream.read_ulong();
@@ -405,7 +503,6 @@
// existance of template, which will be present for all unbounded sequences and for bound
// sequences with recursive type elements. Use the template element to construct each
// object that is in the input stream.
- //if (bound == 0) {
if (sequenceObj.getTemplateElement() != null) {
sequenceObj.clear();
CorbaObjectHandler template = sequenceObj.getTemplateElement();
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaStreamWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaStreamWriter.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaStreamWriter.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaStreamWriter.java Thu Jul 31 20:13:55 2008
@@ -19,7 +19,12 @@
package org.apache.cxf.binding.corba.runtime;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.Stack;
import javax.xml.namespace.NamespaceContext;
@@ -44,6 +49,7 @@
protected CorbaTypeMap typeMap;
protected ORB orb;
protected CorbaTypeListener currentTypeListener;
+ protected CorbaNamespaceContext ctx = new CorbaNamespaceContext();
private List<ArgType> params;
private int paramCounter;
@@ -54,7 +60,6 @@
private boolean skipWrap;
- private NamespaceContext ctx;
public CorbaStreamWriter(ORB orbRef,
CorbaTypeMap map,
@@ -104,6 +109,7 @@
currentTypeListener.processEndElement(name);
}
}
+ ctx.pop();
}
public void writeStartElement(java.lang.String localName)
@@ -114,7 +120,8 @@
public void writeStartElement(java.lang.String prefix,
java.lang.String localName,
java.lang.String namespaceURI)
- throws XMLStreamException {
+ throws XMLStreamException {
+ ctx.push();
if (prefix != null) {
setPrefix(prefix, namespaceURI);
}
@@ -138,6 +145,7 @@
QName idlType = param.getIdltype();
if (!skipWrap || (name.getLocalPart().equals(param.getName()))) {
currentTypeListener = CorbaHandlerUtils.getTypeListener(name, idlType, typeMap, orb, serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
listeners[paramCounter] = currentTypeListener;
paramCounter++;
} else {
@@ -268,14 +276,13 @@
public java.lang.String getPrefix(java.lang.String uri)
throws XMLStreamException {
- //return ctx.getPrefix(uri);
- return null;
+ return ctx.getPrefix(uri);
}
public void setPrefix(java.lang.String prefix,
java.lang.String uri)
throws XMLStreamException {
- //ctx.setPrefix(prefix, uri);
+ ctx.setPrefix(prefix, uri);
}
public void setDefaultNamespace(java.lang.String uri)
@@ -285,7 +292,7 @@
public void setNamespaceContext(NamespaceContext context)
throws XMLStreamException {
- this.ctx = context;
+ //ignore
}
public NamespaceContext getNamespaceContext() {
@@ -297,4 +304,73 @@
return null;
}
+
+
+ public class CorbaNamespaceContext implements NamespaceContext {
+
+ private Map<String, String> map;
+ private CorbaNamespaceContext parent;
+
+ public CorbaNamespaceContext() {
+ this.map = new HashMap<String, String>();
+ }
+
+ private CorbaNamespaceContext(Map<String, String> map, CorbaNamespaceContext p) {
+ this.map = map;
+ this.parent = p;
+ }
+
+ public void push() {
+ parent = new CorbaNamespaceContext(map, parent);
+ map = new HashMap<String, String>();
+ }
+ public void pop() {
+ if (parent != null) {
+ map = parent.map;
+ parent = parent.parent;
+ }
+ }
+
+ public void setPrefix(String pfx, String ns) {
+ map.put(pfx, ns);
+ }
+ public String getNamespaceURI(String prefix) {
+ String answer = (String) map.get(prefix);
+ if (answer == null && parent != null) {
+ return parent.getNamespaceURI(prefix);
+ }
+ return answer;
+ }
+
+ public String getPrefix(String namespaceURI) {
+ for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) {
+ Map.Entry entry = (Map.Entry) iter.next();
+ if (namespaceURI.equals(entry.getValue())) {
+ return (String) entry.getKey();
+ }
+ }
+ if (parent != null) {
+ return parent.getPrefix(namespaceURI);
+ }
+ return null;
+ }
+
+ public Iterator getPrefixes(String namespaceURI) {
+ Set<String> set = new HashSet<String>();
+ for (Map.Entry<String, String> entry : map.entrySet()) {
+ if (namespaceURI.equals(entry.getValue())) {
+ set.add(entry.getKey());
+ }
+ }
+ if (parent != null) {
+ Iterator iter = parent.getPrefixes(namespaceURI);
+ while (iter.hasNext()) {
+ set.add((String)iter.next());
+ }
+ }
+ return set.iterator();
+ }
+ }
+
+
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/AbstractCorbaTypeListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/AbstractCorbaTypeListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/AbstractCorbaTypeListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/AbstractCorbaTypeListener.java Thu Jul 31 20:13:55 2008
@@ -19,17 +19,23 @@
package org.apache.cxf.binding.corba.types;
+import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
public abstract class AbstractCorbaTypeListener implements CorbaTypeListener {
protected QName currentElement;
- protected final CorbaObjectHandler handler;
+ protected CorbaObjectHandler handler;
+ protected NamespaceContext ctx;
+
public AbstractCorbaTypeListener(CorbaObjectHandler h) {
handler = h;
}
+ public void setNamespaceContext(NamespaceContext n) {
+ ctx = n;
+ }
public void processStartElement(QName name) {
currentElement = name;
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaAnyListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaAnyListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaAnyListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaAnyListener.java Thu Jul 31 20:13:55 2008
@@ -19,9 +19,6 @@
package org.apache.cxf.binding.corba.types;
-import java.util.HashMap;
-import java.util.Map;
-
import javax.xml.namespace.QName;
import org.apache.cxf.binding.corba.CorbaTypeMap;
@@ -38,7 +35,6 @@
private ServiceInfo serviceInfo;
private CorbaTypeListener currentTypeListener;
private QName containedType;
- private Map<String, String> namespaceMap;
public CorbaAnyListener(CorbaObjectHandler h,
CorbaTypeMap map,
@@ -48,8 +44,6 @@
orb = orbRef;
typeMap = map;
serviceInfo = info;
-
- namespaceMap = new HashMap<String, String>();
}
public void processStartElement(QName name) {
@@ -62,6 +56,7 @@
orb,
serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
CorbaAnyHandler anyHandler = (CorbaAnyHandler)handler;
// We need an any during the write. Since we don't have the orb in the writer, create
// the any here and use it later.
@@ -92,6 +87,7 @@
typeMap,
orb,
serviceInfo);
+ primitiveListener.setNamespaceContext(ctx);
primitiveListener.processCharacters(text);
CorbaObjectHandler obj = primitiveListener.getCorbaObject();
@@ -111,7 +107,7 @@
int index = value.lastIndexOf(':');
if (index != -1) {
String pfx = value.substring(0, index);
- String ns = namespaceMap.get(pfx);
+ String ns = ctx.getNamespaceURI(pfx);
containedType = new QName(ns, value.substring(index + 1), pfx);
} else {
containedType = new QName(value);
@@ -119,9 +115,6 @@
}
}
- public void processWriteNamespace(String prefix, String namespaceURI) {
- namespaceMap.put(prefix, namespaceURI);
- }
private QName convertSchemaToIdlType(QName schemaType) {
QName idlType = null;
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaArrayListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaArrayListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaArrayListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaArrayListener.java Thu Jul 31 20:13:55 2008
@@ -63,6 +63,7 @@
typeMap,
orb,
serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
value.addElement(currentTypeListener.getCorbaObject());
} else {
currentTypeListener.processStartElement(name);
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaExceptionListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaExceptionListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaExceptionListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaExceptionListener.java Thu Jul 31 20:13:55 2008
@@ -60,6 +60,7 @@
typeMap,
orb,
sInfo);
+ currentTypeListener.setNamespaceContext(ctx);
((CorbaExceptionHandler)handler).addMember(currentTypeListener.getCorbaObject());
memberCount++;
} else {
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaObjectReferenceEventProducer.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaObjectReferenceEventProducer.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaObjectReferenceEventProducer.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaObjectReferenceEventProducer.java Thu Jul 31 20:13:55 2008
@@ -92,7 +92,7 @@
eprInfo = getEprMetadataForTypeId(wsdlDef, typeId);
} else {
LOG.log(Level.SEVERE, "For binding with value \"" + INFER_FROM_TYPE_ID
- + "\" the type_id of the object reference IOR must be set to it's most"
+ + "\" the type_id of the object reference IOR must be set to its most"
+ " derived type. It is currently null indicating CORBA:Object."
+ " Address Url=" + address);
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaPrimitiveHandler.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaPrimitiveHandler.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaPrimitiveHandler.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaPrimitiveHandler.java Thu Jul 31 20:13:55 2008
@@ -191,7 +191,7 @@
obj = new Character(data.charAt(0));
break;
case TCKind._tk_octet:
- obj = new Byte(data);
+ obj = new Short(data).byteValue();
break;
case TCKind._tk_short:
obj = new Short(data);
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaSequenceListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaSequenceListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaSequenceListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaSequenceListener.java Thu Jul 31 20:13:55 2008
@@ -75,6 +75,7 @@
typeMap,
orb,
serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
value.addElement(currentTypeListener.getCorbaObject());
} else {
currentTypeListener.processStartElement(name);
@@ -100,6 +101,7 @@
typeMap,
orb,
serviceInfo);
+ primitiveListener.setNamespaceContext(ctx);
value.addElement(primitiveListener.getCorbaObject());
primitiveListener.processCharacters(text);
} else {
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaStructListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaStructListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaStructListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaStructListener.java Thu Jul 31 20:13:55 2008
@@ -31,9 +31,9 @@
public class CorbaStructListener extends AbstractCorbaTypeListener {
- private final List<MemberType> structMembers;
private final CorbaTypeMap typeMap;
private final ORB orb;
+ private List<MemberType> structMembers;
private int memberCount;
private CorbaTypeListener currentTypeListener;
private ServiceInfo serviceInfo;
@@ -71,6 +71,7 @@
typeMap,
orb,
serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
((CorbaStructHandler)handler).addMember(currentTypeListener.getCorbaObject());
memberCount++;
if (anonType) {
@@ -96,6 +97,22 @@
public void processWriteAttribute(String prefix, String namespaceURI, String localName, String value) {
if (currentTypeListener != null) {
currentTypeListener.processWriteAttribute(prefix, namespaceURI, localName, value);
+ } else {
+ if ("type".equals(localName)
+ && "http://www.w3.org/2001/XMLSchema-instance".equals(namespaceURI)) {
+
+ String pfx = value.substring(0, value.indexOf(":"));
+ String ns = ctx.getNamespaceURI(pfx);
+ QName qn = new QName(ns,
+ value.substring(value.indexOf(":") + 1));
+ CorbaTypeListener l = CorbaHandlerUtils.getTypeListener(qn,
+ qn,
+ typeMap,
+ orb,
+ serviceInfo);
+ this.handler = l.getCorbaObject();
+ structMembers = ((Struct) handler.getType()).getMember();
+ }
}
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaTypeListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaTypeListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaTypeListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaTypeListener.java Thu Jul 31 20:13:55 2008
@@ -19,10 +19,13 @@
package org.apache.cxf.binding.corba.types;
+import javax.xml.namespace.NamespaceContext;
import javax.xml.namespace.QName;
public interface CorbaTypeListener {
+ void setNamespaceContext(NamespaceContext ctx);
+
void processStartElement(QName name);
void processEndElement(QName name);
void processCharacters(String text);
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaUnionListener.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaUnionListener.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaUnionListener.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/CorbaUnionListener.java Thu Jul 31 20:13:55 2008
@@ -78,6 +78,7 @@
typeMap,
orb,
serviceInfo);
+ currentTypeListener.setNamespaceContext(ctx);
content = currentTypeListener.getCorbaObject();
((CorbaUnionHandler)handler).setValue(branchName, content);
if (unionType.isSetNillable() && unionType.isNillable()) {
@@ -117,6 +118,7 @@
typeMap,
orb,
serviceInfo);
+ typeListener.setNamespaceContext(ctx);
((CorbaUnionHandler)handler).setValue("value", typeListener.getCorbaObject());
typeListener.processCharacters(text);
}
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaBindingHelper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaBindingHelper.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaBindingHelper.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaBindingHelper.java Thu Jul 31 20:13:55 2008
@@ -21,10 +21,10 @@
import java.net.URI;
import java.net.URISyntaxException;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.logging.Logger;
import org.apache.cxf.binding.corba.CorbaBindingException;
@@ -34,15 +34,15 @@
public final class CorbaBindingHelper {
private static final Logger LOG = LogUtils.getL7dLogger(CorbaBindingHelper.class);
- private static Map<String, ORB> orbList = new HashMap<String, ORB>();
- private static Map<String, Integer> orbUseCount = new HashMap<String, Integer>();
+ private static Map<String, ORB> orbList = new ConcurrentHashMap<String, ORB>();
+ private static Map<String, Integer> orbUseCount = new ConcurrentHashMap<String, Integer>();
private static ORB defaultORB;
private CorbaBindingHelper() {
//utility class
}
- public static ORB getDefaultORB(OrbConfig config) {
+ public static synchronized ORB getDefaultORB(OrbConfig config) {
if (defaultORB == null) {
Properties props = System.getProperties();
if (config.getOrbClass() != null) {
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaUtils.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaUtils.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaUtils.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/CorbaUtils.java Thu Jul 31 20:13:55 2008
@@ -22,13 +22,16 @@
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
+import java.lang.reflect.Method;
import java.net.URI;
+import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Stack;
+import java.util.StringTokenizer;
import java.util.logging.Logger;
import javax.xml.namespace.QName;
@@ -36,6 +39,7 @@
import org.apache.cxf.binding.corba.CorbaBindingException;
import org.apache.cxf.binding.corba.CorbaStreamable;
import org.apache.cxf.binding.corba.CorbaTypeMap;
+import org.apache.cxf.binding.corba.wsdl.AddressType;
import org.apache.cxf.binding.corba.wsdl.Alias;
import org.apache.cxf.binding.corba.wsdl.Anonarray;
import org.apache.cxf.binding.corba.wsdl.Anonfixed;
@@ -73,6 +77,9 @@
import org.omg.CORBA.TCKind;
import org.omg.CORBA.TypeCode;
import org.omg.CORBA.UnionMember;
+import org.omg.CosNaming.NameComponent;
+import org.omg.CosNaming.NamingContext;
+import org.omg.CosNaming.NamingContextHelper;
public final class CorbaUtils {
@@ -458,8 +465,105 @@
return map;
}
- public static void exportObjectReferenceToFile(org.omg.CORBA.Object obj, ORB orb,
- URI iorFile)
+
+
+ public static boolean isValidURL(String url) {
+ if ((url.startsWith("ior:")) || (url.startsWith("IOR:"))) {
+ return true;
+ } else if (url.startsWith("file:")) {
+ return true;
+ } else if (url.startsWith("corbaloc:")) {
+ return true;
+ } else if (url.startsWith("corbaname:")) {
+ return true;
+ }
+ return false;
+ }
+
+ public static String getUniquePOAName(QName serviceName, String portName, String poaName) {
+ //Create a unique name of the form
+ //"{namespace_uri}service_name#port_name#user_provided_name"
+ //The last part is only appended if it is non empty
+ //
+ String result = "{" + serviceName.getNamespaceURI() + "}"
+ + serviceName.getLocalPart() + "#" + portName;
+
+ if (poaName != null) {
+ result += "#" + poaName;
+ }
+
+ return result;
+ }
+
+ public static boolean isIOR(String location) {
+ if ((location.startsWith("ior:")) || (location.startsWith("IOR:"))) {
+ return true;
+ }
+ return false;
+ }
+
+
+ public static String exportObjectReference(org.omg.CORBA.Object obj, ORB orb) {
+ String ior = orb.object_to_string(obj);
+ LAST_EXPORT_CACHE.set(new LastExport(ior, obj));
+ return ior;
+ }
+
+ public static void exportObjectReference(ORB orb,
+ org.omg.CORBA.Object ref,
+ String url,
+ AddressType address)
+ throws URISyntaxException, IOException {
+
+ if ((url.startsWith("ior:")) || (url.startsWith("IOR:"))) {
+ // make use of Thread cache of last exported IOR
+ String ior = exportObjectReference(ref, orb);
+ address.setLocation(ior);
+ } else if (url.startsWith("file:")) {
+ URI uri = new URI(url);
+ exportObjectReferenceToFile(orb, ref, uri);
+ } else if (url.startsWith("relfile:")) {
+ URI uri = new URI(url.substring(3));
+ exportObjectReferenceToFile(orb, ref, uri);
+ } else if (url.startsWith("corbaloc:")) {
+ exportObjectReferenceToCorbaloc(orb, ref, url);
+ } else if (url.startsWith("corbaname:")) {
+ int hashPos = url.lastIndexOf("#");
+
+ String namingServiceLocation;
+ String path;
+
+ if (hashPos == -1) {
+ namingServiceLocation = "corbaloc:" + url.substring(10);
+ path = url;
+ } else {
+ namingServiceLocation = "corbaloc:" + url.substring(10, hashPos - 12);
+ path = url.substring(hashPos + 1);
+ }
+
+ int nameServiceObjectKeyPos = namingServiceLocation.indexOf("/NameService");
+
+ if (nameServiceObjectKeyPos == -1
+ || nameServiceObjectKeyPos != namingServiceLocation.length() - 12) {
+ namingServiceLocation += "/NameService";
+ }
+
+ exportObjectReferenceToNamingService(orb,
+ namingServiceLocation,
+ ref,
+ path);
+ } else {
+ String ior = orb.object_to_string(ref);
+ address.setLocation(ior);
+ URI uri = new URI("endpoint.ior");
+ CorbaUtils.exportObjectReferenceToFile(orb, ref, uri);
+ }
+ }
+
+
+ public static void exportObjectReferenceToFile(ORB orb,
+ org.omg.CORBA.Object obj,
+ URI iorFile)
throws IOException {
String ref = orb.object_to_string(obj);
File f = null;
@@ -475,13 +579,109 @@
file.close();
}
+ private static void exportObjectReferenceToNamingService(NamingContext namingService,
+ org.omg.CORBA.Object object,
+ String path) {
+ NameComponent[] names = namingServiceStringToNameComponents(path);
- public static String exportObjectReference(org.omg.CORBA.Object obj, ORB orb) {
- String ior = orb.object_to_string(obj);
- LAST_EXPORT_CACHE.set(new LastExport(ior, obj));
- return ior;
+
+ // (re)bind the object into the Naming Service
+ //
+ try {
+ namingService.rebind(names, object);
+ } catch (Throwable t) {
+ throw new RuntimeException(t);
+ }
}
+ private static NameComponent[] namingServiceStringToNameComponents(String str) {
+ if ("".equals(str)) {
+ return new NameComponent[0];
+ }
+
+ // Split the string into NameComponents, delimited by '/'
+ //
+ StringTokenizer components = new StringTokenizer(str, "/");
+ if (!components.hasMoreTokens()) {
+ return new NameComponent[0];
+ }
+
+ // Allocate space for the result
+ //
+ NameComponent[] result = new NameComponent[components.countTokens()];
+
+ if (components.countTokens() == 1) {
+ result[0] = new NameComponent(str, "");
+ return result;
+ }
+
+ // Iterate over all the components, splitting each into
+ // its "id" and "kind" fields, and copying into "result".
+ //
+ int count = 0;
+ while (components.hasMoreTokens()) {
+ StringTokenizer idAndKind = new StringTokenizer(components.nextToken(), ".");
+ if (!idAndKind.hasMoreTokens()) {
+ return new NameComponent[0];
+ }
+ if (idAndKind.countTokens() > 2) {
+ return new NameComponent[0];
+ }
+ result[count] = new NameComponent();
+ result[count].id = idAndKind.nextToken().replaceAll("\\", "");
+ if (idAndKind.hasMoreTokens()) {
+ result[count].kind = idAndKind.nextToken().replaceAll("\\", "");
+ } else {
+ result[count].kind = "";
+ }
+ count++;
+ }
+
+ return result;
+ }
+
+
+ private static void exportObjectReferenceToNamingService(ORB orb,
+ String namingServiceLocation,
+ org.omg.CORBA.Object object,
+ String path) {
+ org.omg.CORBA.Object obj = orb.string_to_object(namingServiceLocation);
+ NamingContext namingService = NamingContextHelper.narrow(obj);
+ if (namingService == null) {
+ throw new RuntimeException("NamingContext for " + namingServiceLocation + " not found");
+ }
+ exportObjectReferenceToNamingService(namingService,
+ object,
+ path);
+ }
+
+
+ private static void exportObjectReferenceToCorbaloc(ORB orb,
+ org.omg.CORBA.Object object,
+ String location) {
+ int keyIndex = location.indexOf('/');
+ String key = location.substring(keyIndex + 1);
+ try {
+ Class<?> bootMgrHelperClass = Class.forName("org.apache.yoko.orb.OB.BootManagerHelper");
+ Class<?> bootMgrClass = Class.forName("org.apache.yoko.orb.OB.BootManager");
+ Method narrowMethod =
+ bootMgrHelperClass.getMethod("narrow", org.omg.CORBA.Object.class);
+ java.lang.Object bootMgr = narrowMethod.invoke(null,
+ orb.resolve_initial_references("BootManager"));
+ Method addBindingMethod =
+ bootMgrClass.getMethod("add_binding", byte[].class, org.omg.CORBA.Object.class);
+ addBindingMethod.invoke(bootMgr, key.getBytes(), object);
+ LOG.info("Added key " + key + " to bootmanager");
+ } catch (ClassNotFoundException ex) {
+ //Not supported by the orb. skip it.
+ } catch (java.lang.reflect.InvocationTargetException ex) {
+ //Not supported by the orb. skip it.
+ } catch (java.lang.Exception ex) {
+ throw new CorbaBindingException(ex.getMessage(), ex);
+ }
+ }
+
+
public static org.omg.CORBA.Object importObjectReference(ORB orb,
String url) {
org.omg.CORBA.Object result;
Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/OrbConfig.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/OrbConfig.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/OrbConfig.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/utils/OrbConfig.java Thu Jul 31 20:13:55 2008
@@ -22,11 +22,14 @@
import java.util.ArrayList;
import java.util.List;
+import org.omg.CORBA.Policy;
+
public class OrbConfig {
String orbClass;
String orbSingletonClass;
List<String> orbArgs = new ArrayList<String>();
+ List<Policy> policies = new ArrayList<Policy>();
boolean persistentPoa;
@@ -64,5 +67,9 @@
public boolean isPersistentPoa() {
return persistentPoa;
}
+
+ public List<Policy> getExtraPolicies() {
+ return policies;
+ }
}
Modified: cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServantTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServantTest.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServantTest.java (original)
+++ cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaDSIServantTest.java Thu Jul 31 20:13:55 2008
@@ -27,14 +27,15 @@
import org.apache.cxf.Bus;
import org.apache.cxf.BusFactory;
+import org.apache.cxf.binding.corba.CorbaDestination;
+import org.apache.cxf.binding.corba.TestUtils;
import org.apache.cxf.message.Message;
import org.apache.cxf.transport.MessageObserver;
-import org.easymock.classextension.EasyMock;
-import org.easymock.classextension.IMocksControl;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
+import org.omg.CORBA.Context;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ServerRequest;
@@ -98,26 +99,31 @@
@Test
public void testInvoke() throws Exception {
- CorbaDSIServant dsiServant = new CorbaDSIServant();
- IMocksControl control = EasyMock.createNiceControl();
- ServerRequest request = EasyMock.createMock(ServerRequest.class);
- String opName = "greetMe";
- EasyMock.expect(request.operation()).andReturn(opName);
+
+ CorbaDestination dest = new TestUtils().getComplexTypesTestDestination();
+
+
+ CorbaDSIServant dsiServant = new CorbaDSIServant();
+ dsiServant.init(orb, null, dest, null);
+ ServerRequest request = new ServerRequest() {
+ public String operation() {
+ return "greetMe";
+ }
+ public Context ctx() {
+ return null;
+ }
+
+ };
+
MessageObserver incomingObserver = new TestObserver();
dsiServant.setObserver(incomingObserver);
Map<String, QName> map = new HashMap<String, QName>(2);
- // REVISIT: Something is not setup quite right with this test. In
- // the DSI Servant, we don't get the expected request operation name
- // that we set above. Instead, we get a null value. For now, just
- // add null to the operation map until we know how to fix the test.
+
map.put("greetMe", new QName("greetMe"));
- map.put(null, new QName("greetMe"));
dsiServant.setOperationMapping(map);
- control.replay();
dsiServant.invoke(request);
- control.verify();
}
class TestObserver implements MessageObserver {
Modified: cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReaderTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReaderTest.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReaderTest.java (original)
+++ cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/runtime/CorbaObjectReaderTest.java Thu Jul 31 20:13:55 2008
@@ -190,13 +190,13 @@
@Test
public void testReadULongLong() {
OutputStream oStream = orb.create_output_stream();
- oStream.write_ulonglong(-1000000000);
+ oStream.write_ulonglong(-1000000000L);
InputStream iStream = oStream.create_input_stream();
CorbaObjectReader reader = new CorbaObjectReader(iStream);
BigInteger ulonglongValue = reader.readULongLong();
- assertTrue(ulonglongValue.longValue() == -1000000000);
+ assertEquals(1, ulonglongValue.signum());
}
@Test
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient.java Thu Jul 31 20:13:55 2008
@@ -277,7 +277,7 @@
if (!shouldRunTest("UnsignedInt")) {
return;
}
- long valueSets[][] = {{11, 20}, {1, 0}, {0, ((long)Integer.MAX_VALUE) * 2 + 1}};
+ long valueSets[][] = {{0, ((long)Integer.MAX_VALUE) * 2 + 1}, {11, 20}, {1, 0}};
for (int i = 0; i < valueSets.length; i++) {
long x = valueSets[i][0];
@@ -294,7 +294,8 @@
ret = rpcClient.testUnsignedInt(x, y, z);
}
if (!perfTestOnly) {
- assertEquals("testUnsignedInt(): Incorrect value for inout param", Long.valueOf(x), y.value);
+ assertEquals("testUnsignedInt(): Incorrect value for inout param",
+ Long.valueOf(x), y.value);
assertEquals("testUnsignedInt(): Incorrect value for out param",
Long.valueOf(yOrig), z.value);
assertEquals("testUnsignedInt(): Incorrect return value", x, ret);
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient3.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient3.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient3.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient3.java Thu Jul 31 20:13:55 2008
@@ -544,6 +544,10 @@
assertNotNull(y.value);
assertNotNull(z.value);
assertNotNull(ret);
+
+ assertTrue(y.value instanceof DerivedEmptyBaseEmptyAll);
+ assertTrue(z.value instanceof DerivedEmptyBaseEmptyAll);
+ assertTrue(ret instanceof DerivedEmptyBaseEmptyAll);
}
//org.apache.type_test.types1.DerivedEmptyBaseEmptyChoice
@@ -569,6 +573,10 @@
assertNotNull(y.value);
assertNotNull(z.value);
assertNotNull(ret);
+
+ assertTrue(y.value instanceof DerivedEmptyBaseEmptyChoice);
+ assertTrue(z.value instanceof DerivedEmptyBaseEmptyChoice);
+ assertTrue(ret instanceof DerivedEmptyBaseEmptyChoice);
}
//org.apache.type_test.types1.RestrictedChoiceBaseChoice
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient4.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient4.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient4.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/AbstractTypeTestClient4.java Thu Jul 31 20:13:55 2008
@@ -2168,5 +2168,9 @@
assertNotNull("testInheritanceEmptyAllDerivedEmpty()", y.value);
assertNotNull("testInheritanceEmptyAllDerivedEmpty()", z.value);
assertNotNull("testInheritanceEmptyAllDerivedEmpty()", ret);
+
+ assertTrue(y.value.getClass().getName(), y.value instanceof DerivedEmptyBaseEmptyAll);
+ assertTrue(z.value.getClass().getName(), z.value instanceof DerivedEmptyBaseEmptyAll);
+ assertTrue(ret.getClass().getName(), ret instanceof DerivedEmptyBaseEmptyAll);
}
}
Modified: cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/corba/CORBADocLitClientTypeTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/corba/CORBADocLitClientTypeTest.java?rev=681597&r1=681596&r2=681597&view=diff
==============================================================================
--- cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/corba/CORBADocLitClientTypeTest.java (original)
+++ cxf/trunk/systests/src/test/java/org/apache/cxf/systest/type_test/corba/CORBADocLitClientTypeTest.java Thu Jul 31 20:13:55 2008
@@ -45,7 +45,7 @@
private static final Set<String> NOT_RUN_TESTS = new HashSet<String>();
static {
String working[] = new String[] {
- "InheritanceEmptyAllDerivedEmpty",
+ //"InheritanceEmptyAllDerivedEmpty",
"DerivedEmptyBaseEmptyAll",
"DerivedEmptyBaseEmptyChoice",
"MultipleOccursSequenceInSequence",
@@ -68,7 +68,7 @@
"Short",
"UnsignedShort",
"Int",
- //"UnsignedInt",
+ "UnsignedInt",
"Long",
"UnsignedLong",
"Float",
@@ -122,11 +122,11 @@
initClient(AbstractTypeTestClient5.class, SERVICE_NAME, PORT_NAME, WSDL_PATH);
}
@AfterClass
- public static void printNotRun() throws Exception {
+ public static void deleteRefFile() throws Exception {
File file = new File("./TypeTest.ref");
file.delete();
//for (String s : NOT_RUN_TESTS) {
- //System.out.println(s);
+ // System.out.println(s);
//}
}
@@ -134,6 +134,7 @@
if (!WORKING_TESTS.contains(name)) {
NOT_RUN_TESTS.add(name);
return false;
+ //return true;
}
return true;
}