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/07 23:05:13 UTC

svn commit: r683714 - in /cxf/trunk: distribution/src/main/release/samples/corba/bank_ws_addressing/ 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/co...

Author: dkulp
Date: Thu Aug  7 14:05:12 2008
New Revision: 683714

URL: http://svn.apache.org/viewvc?rev=683714&view=rev
Log:
Bunches of updates to CORBA binding to enhance performance a bit as well as abstract out 
some more of the stuff that is ORB specific.  Make some more stuff visible to possible 
orb specific subclasses and such.

Added:
    cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/wsdl/WSDLExtensionRegister.java
Modified:
    cxf/trunk/distribution/src/main/release/samples/corba/bank_ws_addressing/BankWS-corba.wsdl
    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/CorbaConduit.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/CorbaServerConduit.java
    cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultOutInterceptor.java
    cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamInInterceptor.java
    cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/SystemExceptionHelper.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/CorbaObjectReader.java
    cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectWriter.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/HandlerIterator.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/main/resources/META-INF/cxf/cxf-extension-corba.xml
    cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/CorbaBindingFactoryTest.java

Modified: cxf/trunk/distribution/src/main/release/samples/corba/bank_ws_addressing/BankWS-corba.wsdl
URL: http://svn.apache.org/viewvc/cxf/trunk/distribution/src/main/release/samples/corba/bank_ws_addressing/BankWS-corba.wsdl?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/distribution/src/main/release/samples/corba/bank_ws_addressing/BankWS-corba.wsdl (original)
+++ cxf/trunk/distribution/src/main/release/samples/corba/bank_ws_addressing/BankWS-corba.wsdl Thu Aug  7 14:05:12 2008
@@ -384,7 +384,7 @@
     <wsdl:service name="BankCORBAService">
         <wsdl:port name="BankCORBAPort" binding="tns:BankCORBABinding">
             <corba:address location="corbaname::localhost:1050#Bank" />
-            <corba:policy poaname="Bank" serviceid="Bank" persistent="true" />
+            <corba:policy poaname="Bank" serviceid="Bank" persistent="false" />
         </wsdl:port>
     </wsdl:service>
 </wsdl:definitions>

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -23,9 +23,7 @@
 import java.util.List;
 import java.util.Set;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
-import javax.xml.bind.JAXBException;
 
 import org.apache.cxf.binding.AbstractBindingFactory;
 import org.apache.cxf.binding.Binding;
@@ -43,56 +41,21 @@
 import org.apache.cxf.transport.Destination;
 import org.apache.cxf.transport.DestinationFactory;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
-import org.apache.cxf.wsdl.JAXBExtensionHelper;
-import org.apache.cxf.wsdl.TExtensibilityElementImpl;
-import org.apache.cxf.wsdl.WSDLManager;
 
 public class CorbaBindingFactory extends AbstractBindingFactory
     implements ConduitInitiator, DestinationFactory {
     
-    private static final String YOKO_NAMESPACE = "http://schemas.apache.org/yoko/bindings/corba";
+    protected List<String> transportIds;
+    protected OrbConfig orbConfig = new OrbConfig();
 
-    private List<String> transportIds;
-    private OrbConfig orbConfig = new OrbConfig();
-
-    @Resource(name = "orbClass")
     public void setOrbClass(String cls) {
         orbConfig.setOrbClass(cls);
     }
     
-    @Resource(name = "orbSingletonClass")
     public void setOrbSingletonClass(String cls) {
         orbConfig.setOrbSingletonClass(cls);
     }
-    
-    @PostConstruct
-    void registerYokoCompatibleExtensors() {
-        WSDLManager manager = this.getBus().getExtension(WSDLManager.class);
-        createCompatExtensor(manager, javax.wsdl.Binding.class,
-                             org.apache.cxf.binding.corba.wsdl.BindingType.class);
-        createCompatExtensor(manager, javax.wsdl.BindingOperation.class,
-                             org.apache.cxf.binding.corba.wsdl.OperationType.class);
-        createCompatExtensor(manager, javax.wsdl.Definition.class,
-                             org.apache.cxf.binding.corba.wsdl.TypeMappingType.class);
-        createCompatExtensor(manager, javax.wsdl.Port.class,
-                             org.apache.cxf.binding.corba.wsdl.AddressType.class);
-        createCompatExtensor(manager, javax.wsdl.Port.class,
-                             org.apache.cxf.binding.corba.wsdl.PolicyType.class);
-    }
-
-    private void createCompatExtensor(WSDLManager manager,
-                                      Class<?> parentType,
-                                      Class<? extends TExtensibilityElementImpl> elementType) {
-        try {
-            JAXBExtensionHelper.addExtensions(manager.getExtensionRegistry(),
-                                              parentType, 
-                                              elementType,
-                                              YOKO_NAMESPACE);
-        } catch (JAXBException e) {
-            //ignore, just won't support the yoko extensors
-        }
-        
-    }
+   
 
     public Binding createBinding(BindingInfo bindingInfo) {
         CorbaBinding binding = new CorbaBinding();
@@ -131,7 +94,6 @@
         transportIds = ids;
     }
 
-    @Resource
     public void setOrbArgs(List<String> args) {
         orbConfig.setOrbArgs(args);
     }

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaConduit.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaConduit.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaConduit.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaConduit.java Thu Aug  7 14:05:12 2008
@@ -177,7 +177,7 @@
         return endpointInfo.getAddress();
     }
         
-    protected void buildRequest(CorbaMessage message, OperationType opType) throws Exception {        
+    public void buildRequest(CorbaMessage message, OperationType opType) throws Exception {        
         ServiceInfo service = message.getExchange().get(ServiceInfo.class);
         NVList nvlist = getArguments(message);
         NamedValue ret = getReturn(message);
@@ -221,7 +221,7 @@
         }
     }
        
-    protected NVList getArguments(CorbaMessage message) {
+    public NVList getArguments(CorbaMessage message) {
         if (orb == null) {
             prepareOrb();
         }
@@ -243,7 +243,7 @@
         return list;        
     }
     
-    protected NamedValue getReturn(CorbaMessage message) {
+    public NamedValue getReturn(CorbaMessage message) {
         if (orb == null) {
             prepareOrb();
         }
@@ -262,7 +262,7 @@
         return ret;        
     }
     
-    protected ExceptionList getExceptionList(Map<TypeCode, RaisesType> exceptions,
+    public ExceptionList getExceptionList(Map<TypeCode, RaisesType> exceptions,
                                              CorbaMessage message, 
                                              OperationType opType) {
         if (orb == null) {
@@ -285,7 +285,7 @@
         return exList;
     }
             
-    protected Request getRequest(CorbaMessage message,
+    public Request getRequest(CorbaMessage message,
                                  String opName,
                                  org.omg.CORBA.NVList nvlist, 
                                  org.omg.CORBA.NamedValue ret, 
@@ -311,7 +311,7 @@
         return request;
     }
         
-    protected Map<TypeCode, RaisesType> getOperationExceptions(
+    public Map<TypeCode, RaisesType> getOperationExceptions(
                                          OperationType operation, 
                                          CorbaTypeMap map) {
         if (orb == null) {

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -23,7 +23,7 @@
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.logging.Level;
+import java.util.Map;
 import java.util.logging.Logger;
 
 import org.apache.cxf.binding.corba.runtime.CorbaDSIServant;
@@ -37,20 +37,25 @@
 import org.apache.cxf.service.model.BindingInfo;
 import org.apache.cxf.service.model.EndpointInfo;
 import org.apache.cxf.transport.Conduit;
-import org.apache.cxf.transport.Destination;
 import org.apache.cxf.transport.MessageObserver;
+import org.apache.cxf.transport.MultiplexDestination;
 import org.apache.cxf.ws.addressing.AttributedURIType;
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
+import org.apache.cxf.wsdl.EndpointReferenceUtils;
 import org.omg.CORBA.ORB;
 import org.omg.CORBA.Policy;
+import org.omg.PortableServer.Current;
 import org.omg.PortableServer.IdAssignmentPolicyValue;
+import org.omg.PortableServer.IdUniquenessPolicyValue;
 import org.omg.PortableServer.LifespanPolicyValue;
 import org.omg.PortableServer.POA;
 import org.omg.PortableServer.POAHelper;
 import org.omg.PortableServer.POAManager;
+import org.omg.PortableServer.RequestProcessingPolicyValue;
+import org.omg.PortableServer.Servant;
 import org.omg.PortableServer.ThreadPolicyValue;
 
-public class CorbaDestination implements Destination {
+public class CorbaDestination implements MultiplexDestination {
     
     private static final String IOR_SHARED_KEY = "ior:shared-key";
     private static final Logger LOG = LogUtils.getL7dLogger(CorbaDestination.class);
@@ -88,7 +93,6 @@
         } else {
             typeMap = TypeMapCache.get(binding.getService());
         }
-        isPersistent = orbConfig.isPersistentPoa();
         PolicyType policy = ei.getExtensor(PolicyType.class);
         if (policy != null) {
             poaName = policy.getPoaname();
@@ -152,11 +156,7 @@
         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);
-        }
+        orb = CorbaBindingHelper.getAddressSpecificORB(location, props, orbArgs);
 
         // Get the binding helper to remember that we need this ORB kept alive, even if another
         // destination tries to destroy it.
@@ -235,6 +235,11 @@
                 poaName = getEndPointInfo().getName().getLocalPart().replace('.', '_');                
             }
             setCorbaLocArgs(addressURI, orbArgs);
+        } else if ("corbaname".equals(scheme)) {
+            int idx = location.indexOf("#");
+            if (idx != -1) {
+                serviceId = location.substring(idx + 1);
+            }
         }
 
         if (isPersistent) {
@@ -251,13 +256,7 @@
 
         orb = getORB(orbArgs, location, props);        
         
-        if (orb == null) {
-            LOG.log(Level.INFO, "Creating ORB with address " + location);
-            orb = CorbaBindingHelper.createAddressSpecificORB(location, orbConfig);
-        }
-        // Need to indicate that this ORB can't be destroyed while we are using it
-        CorbaBindingHelper.keepORBAlive(location);
-        
+
         try {
             POA rootPOA = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
             POAManager poaManager = rootPOA.the_POAManager();
@@ -276,7 +275,7 @@
             // 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) {
+            if (bindingPOA != null && !isPersistent && serviceId == null) {
                 throw new CorbaBindingException(
                         "Corba Port activation failed because the poa "
                                 + poaName + " already exists");
@@ -304,8 +303,9 @@
             } else {                
                 objectId = bindingPOA.activate_object(servant);
             }
+            bindingPOA.set_servant(servant);
             obj = bindingPOA.id_to_reference(objectId);
-            CorbaUtils.exportObjectReference(orb, obj, location, address, orbConfig);
+            orbConfig.exportObjectReference(orb, obj, location, address);
             
             populateEpr(orb.object_to_string(obj));
             LOG.info("Object Reference: " + orb.object_to_string(obj));
@@ -388,8 +388,6 @@
 
     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));
 
@@ -403,11 +401,15 @@
 
         if (serviceId != null) {
             policies.add(parentPOA
-                            .create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID));
+                         .create_id_assignment_policy(IdAssignmentPolicyValue.USER_ID));
+            
         }
 
+        policies.add(parentPOA.create_id_uniqueness_policy(IdUniquenessPolicyValue.MULTIPLE_ID));
+        RequestProcessingPolicyValue value = RequestProcessingPolicyValue.USE_DEFAULT_SERVANT;
+        policies.add(parentPOA.create_request_processing_policy(value));        
         
-        policies.addAll(orbConfig.getExtraPolicies());
+        orbConfig.addPOAPolicies(orb, name, parentPOA, poaManager, policies);
         
         Policy[] policyList = (Policy[])policies.toArray(new Policy[policies.size()]);
 
@@ -418,5 +420,45 @@
                     "Could not create POA during activation", ex);
         }
     }
+    public EndpointReferenceType getAddressWithId(String id) {
+        EndpointReferenceType ref = null;
+        if (bindingPOA == null) {
+            throw new CorbaBindingException(
+                 "getAddressWithId failed because the poa is null");
+        }
+        try {
+            Servant servant = bindingPOA.id_to_servant(objectId);
+            org.omg.CORBA.Object objRef 
+                = bindingPOA.create_reference_with_id(id.getBytes(),
+                                               servant._all_interfaces(bindingPOA, objectId)[0]);
+            AddressType addr = new AddressType();
+            orbConfig.exportObjectReference(orb, objRef,
+                                            address.getLocation(),
+                                            addr);
+            ref = EndpointReferenceUtils.getEndpointReference(addr.getLocation());
+            EndpointInfo ei = getEndPointInfo();
+            if (ei.getService() != null) {
+                EndpointReferenceUtils.setServiceAndPortName(ref, ei.getService().getName(), 
+                                                             ei.getName().getLocalPart());
+            }
+        } catch (Exception e) {
+            throw new CorbaBindingException("Failed to getAddressWithId, reason:" + e.toString(), e);
+        }
+        return ref;
+    }
+
+    public String getId(Map contextMap) {
+        String id = null;
+        try {
+            Current currentPoa = (Current) orb
+                .resolve_initial_references("POACurrent");
+            byte[] idBytes = currentPoa.get_object_id();
+            id = new String(idBytes);
+        } catch (Exception e) {
+            throw new CorbaBindingException("Unable to getId, current is unavailable, reason: "
+                                             + e, e);
+        }
+        return id;
+    }
 
 }

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaServerConduit.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaServerConduit.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaServerConduit.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/CorbaServerConduit.java Thu Aug  7 14:05:12 2008
@@ -109,7 +109,7 @@
     }
     
     
-    protected void buildRequestResult(CorbaMessage msg) {        
+    public void buildRequestResult(CorbaMessage msg) {        
         Exchange exg = msg.getExchange();        
         ServerRequest request = exg.get(ServerRequest.class);
         try {

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultOutInterceptor.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultOutInterceptor.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamFaultOutInterceptor.java Thu Aug  7 14:05:12 2008
@@ -112,7 +112,7 @@
         }
 
         if (ex instanceof SystemException) {
-            setSystemException(message, ex);
+            setSystemException(message, ex, destination);
             return;
         }
         
@@ -221,12 +221,12 @@
     }
 
     protected void setSystemException(CorbaMessage message,
-                                      Throwable ex) {
+                                      Throwable ex,
+                                      CorbaDestination dest) {
         SystemException sysEx = (SystemException)ex;
         message.setSystemException(sysEx);
         ServerRequest request  = message.getExchange().get(ServerRequest.class);
-        Any exAny = orb.create_any();
-        SystemExceptionHelper.insert(exAny, sysEx);
+        Any exAny = dest.getOrbConfig().createSystemExceptionAny(orb, sysEx);
         request.set_exception(exAny);
     }
 

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamInInterceptor.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamInInterceptor.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamInInterceptor.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/CorbaStreamInInterceptor.java Thu Aug  7 14:05:12 2008
@@ -64,9 +64,6 @@
 
 public class CorbaStreamInInterceptor extends AbstractPhaseInterceptor<Message> {
 
-    private ORB orb;
-    private ServiceInfo service;
-    private CorbaDestination destination;
 
 
     public CorbaStreamInInterceptor() {
@@ -74,13 +71,6 @@
     }   
 
     public void handleMessage(Message message) throws Fault {
-        if (message.getDestination() != null) {
-            destination = (CorbaDestination)message.getDestination();
-        } else {
-            destination = (CorbaDestination)message.getExchange().getDestination();
-        }
-        service = destination.getBindingInfo().getService();
-
         if (ContextUtils.isRequestor(message)) {
             handleReply(message);
         } else {
@@ -89,6 +79,16 @@
     }
 
     private void handleReply(Message msg) {
+        ORB orb;
+        ServiceInfo service;
+        CorbaDestination destination;
+        if (msg.getDestination() != null) {
+            destination = (CorbaDestination)msg.getDestination();
+        } else {
+            destination = (CorbaDestination)msg.getExchange().getDestination();
+        }
+        service = destination.getBindingInfo().getService();
+
         CorbaMessage message = (CorbaMessage)msg;
         if (message.getStreamableException() != null || message.getSystemException() != null) {
             Endpoint ep = message.getExchange().get(Endpoint.class);
@@ -131,6 +131,15 @@
     }
 
     private void handleRequest(Message msg) {
+        ORB orb;
+        ServiceInfo service;
+        CorbaDestination destination;
+        if (msg.getDestination() != null) {
+            destination = (CorbaDestination)msg.getDestination();
+        } else {
+            destination = (CorbaDestination)msg.getExchange().getDestination();
+        }
+        service = destination.getBindingInfo().getService();
 
         CorbaMessage message = (CorbaMessage) msg;
 
@@ -161,7 +170,9 @@
         orb = (ORB)exchange.get(ORB.class);
 
         ServerRequest request = exchange.get(ServerRequest.class);
-        NVList list = prepareArguments(message, info, opType, opQName, typeMap);
+        NVList list = prepareArguments(message, info, opType, 
+                                       opQName, typeMap,
+                                       destination, service);
         request.arguments(list);
         message.setList(list);
 
@@ -194,7 +205,9 @@
                                       InterfaceInfo info,
                                       OperationType opType,
                                       QName opQName,
-                                      CorbaTypeMap typeMap) {        
+                                      CorbaTypeMap typeMap,
+                                      CorbaDestination destination,
+                                      ServiceInfo service) {        
         BindingInfo bInfo = destination.getBindingInfo();                              
         EndpointInfo eptInfo = destination.getEndPointInfo();
         BindingOperationInfo bOpInfo = bInfo.getOperation(opQName);
@@ -215,7 +228,10 @@
                        
         List<ParamType> paramTypes = opType.getParam();       
         CorbaStreamable[] arguments = new CorbaStreamable[paramTypes.size()];                               
-        NVList list = prepareDIIArgsList(corbaMsg, bOpInfo, arguments, paramTypes, typeMap);         
+        NVList list = prepareDIIArgsList(corbaMsg, bOpInfo, 
+                                         arguments, paramTypes, 
+                                         typeMap,
+                                         exg.get(ORB.class), service);         
         
         return list;
         
@@ -225,7 +241,9 @@
                                         BindingOperationInfo boi,
                                         CorbaStreamable[] streamables, 
                                         List<ParamType> paramTypes,
-                                        CorbaTypeMap map) {
+                                        CorbaTypeMap map,
+                                        ORB orb,
+                                        ServiceInfo service) {
         try {
             // Build the list of DII arguments, returns, and exceptions        
             NVList list = orb.create_list(streamables.length);        

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/SystemExceptionHelper.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/SystemExceptionHelper.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/SystemExceptionHelper.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/interceptors/SystemExceptionHelper.java Thu Aug  7 14:05:12 2008
@@ -19,14 +19,17 @@
 package org.apache.cxf.binding.corba.interceptors;
 
 import org.omg.CORBA.Any;
-import org.omg.CORBA.CompletionStatusHelper;
 import org.omg.CORBA.ORB;
 import org.omg.CORBA.StructMember;
 import org.omg.CORBA.SystemException;
 import org.omg.CORBA.TCKind;
 import org.omg.CORBA.TypeCode;
+import org.omg.CORBA.portable.InputStream;
+import org.omg.CORBA.portable.OutputStream;
 
-public final class SystemExceptionHelper {
+public final class SystemExceptionHelper 
+    implements org.omg.CORBA.portable.Streamable {
+    
     private static final int BAD_CONTEXT = 0;
     private static final int BAD_INV_ORDER = 1;
     private static final int BAD_OPERATION = 2;
@@ -64,41 +67,6 @@
     private static final int TRANSIENT = 34;
     private static final int UNKNOWN = 35;
     
-    
-
-    private static final String[] CLASSES = {
-        "org.omg.CORBA.BAD_CONTEXT", "org.omg.CORBA.BAD_INV_ORDER",
-        "org.omg.CORBA.BAD_OPERATION", "org.omg.CORBA.BAD_PARAM",
-        "org.omg.CORBA.BAD_QOS", "org.omg.CORBA.BAD_TYPECODE",
-        "org.omg.CORBA.CODESET_INCOMPATIBLE", "org.omg.CORBA.COMM_FAILURE",
-        "org.omg.CORBA.DATA_CONVERSION", "org.omg.CORBA.FREE_MEM",
-        "org.omg.CORBA.IMP_LIMIT", "org.omg.CORBA.INITIALIZE",
-        "org.omg.CORBA.INTERNAL", "org.omg.CORBA.INTF_REPOS",
-        "org.omg.CORBA.INVALID_TRANSACTION", "org.omg.CORBA.INV_FLAG",
-        "org.omg.CORBA.INV_IDENT", "org.omg.CORBA.INV_OBJREF",
-        "org.omg.CORBA.INV_POLICY", "org.omg.CORBA.MARSHAL",
-        "org.omg.CORBA.NO_IMPLEMENT", "org.omg.CORBA.NO_MEMORY",
-        "org.omg.CORBA.NO_PERMISSION", "org.omg.CORBA.NO_RESOURCES",
-        "org.omg.CORBA.NO_RESPONSE", "org.omg.CORBA.OBJECT_NOT_EXIST",
-        "org.omg.CORBA.OBJ_ADAPTER", "org.omg.CORBA.PERSIST_STORE",
-        "org.omg.CORBA.REBIND", "org.omg.CORBA.TIMEOUT",
-        "org.omg.CORBA.TRANSACTION_MODE",
-        "org.omg.CORBA.TRANSACTION_REQUIRED",
-        "org.omg.CORBA.TRANSACTION_ROLLEDBACK",
-        "org.omg.CORBA.TRANSACTION_UNAVAILABLE", "org.omg.CORBA.TRANSIENT",
-        "org.omg.CORBA.UNKNOWN"};
-
-    private static final String[] NAMES = {
-        "BAD_CONTEXT", "BAD_INV_ORDER", "BAD_OPERATION", "BAD_PARAM",
-        "BAD_QOS", "BAD_TYPECODE", "CODESET_INCOMPATIBLE", "COMM_FAILURE",
-        "DATA_CONVERSION", "FREE_MEM", "IMP_LIMIT", "INITIALIZE", "INTERNAL",
-        "INTF_REPOS", "INVALID_TRANSACTION", "INV_FLAG", "INV_IDENT",
-        "INV_OBJREF", "INV_POLICY", "MARSHAL", "NO_IMPLEMENT", "NO_MEMORY",
-        "NO_PERMISSION", "NO_RESOURCES", "NO_RESPONSE", "OBJECT_NOT_EXIST",
-        "OBJ_ADAPTER", "PERSIST_STORE", "REBIND", "TIMEOUT",
-        "TRANSACTION_MODE", "TRANSACTION_REQUIRED", "TRANSACTION_ROLLEDBACK",
-        "TRANSACTION_UNAVAILABLE", "TRANSIENT", "UNKNOWN"};
-
     private static final String[] IDS = {
         "IDL:omg.org/CORBA/BAD_CONTEXT:1.0",
         "IDL:omg.org/CORBA/BAD_INV_ORDER:1.0",
@@ -127,11 +95,17 @@
         "IDL:omg.org/CORBA/TRANSACTION_UNAVAILABLE:1.0",
         "IDL:omg.org/CORBA/TRANSIENT:1.0", "IDL:omg.org/CORBA/UNKNOWN:1.0"};
 
-    private static TypeCode typeCode;
 
+    SystemException value;
+    TypeCode typeCode;
+    
     private SystemExceptionHelper() {
-        //utility class
     }
+    private SystemExceptionHelper(SystemException ex) {
+        value = ex;
+    }
+    
+    
 
     private static int binarySearch(String[] arr, String value) {
         int left = 0;
@@ -154,80 +128,13 @@
         return index;
     }
 
-    private static TypeCode createTypeCode(String id, String name) {
-        ORB orb = ORB.init();
-        StructMember[] members = new StructMember[2];
-        members[0] = new StructMember();
-        members[0].name = "minor";
-        members[0].type = orb.get_primitive_tc(TCKind.tk_ulong);
-        members[1] = new StructMember();
-        members[1].name = "completed";
-        members[1].type = CompletionStatusHelper.type();
-        return orb.create_exception_tc(id, name, members);
-    }
-
-    private static void writeImpl(org.omg.CORBA.portable.OutputStream out, 
-                                  SystemException val, String id) {
-        out.write_string(id);
-        out.write_ulong(val.minor);
-        out.write_ulong(val.completed.value());
-    }
 
     public static void insert(Any any, SystemException val) {
-        String className = val.getClass().getName();
-        int index = binarySearch(CLASSES, className);
-
-        String id;
-        if (index == -1) {
-            id = IDS[UNKNOWN];
-        } else {
-            id = IDS[index];
-        }
-
-        org.omg.CORBA.portable.OutputStream out = any.create_output_stream();
-        writeImpl(out, val, id);
-        any.read_value(out.create_input_stream(), createTypeCode(id, NAMES[index]));
-    }
-
-    public static SystemException extract(Any any) {
-        try {
-            TypeCode tc = any.type();
-            String id = tc.id();
-            if (tc.kind() == TCKind.tk_except && (id.length() == 0 || binarySearch(IDS, id) != -1)) {
-                return read(any.create_input_stream());
-            }
-        } catch (org.omg.CORBA.TypeCodePackage.BadKind ex) {
-            //ignore
-        }
-
-        throw new org.omg.CORBA.BAD_OPERATION();
-    }
-
-    public static synchronized TypeCode type() {
-        if (typeCode == null) {
-            typeCode = createTypeCode(id(), "SystemException");
-        }
-
-        return typeCode;
-    }
-
-    public static String id() {
-        return "IDL:omg.org/CORBA/SystemException:1.0";
-    }
-    public static void write(org.omg.CORBA.portable.OutputStream out, SystemException val) {
-        String className = val.getClass().getName();
-        int index = binarySearch(CLASSES, className);
-
-        String id;
-        if (index == -1) {
-            id = IDS[UNKNOWN];
-        } else {
-            id = IDS[index];
-        }
-
-        writeImpl(out, val, id);
+        any.insert_Streamable(new SystemExceptionHelper(val));
     }
 
+    
+    
     //CHECKSTYLE:OFF 
     //NCSS is to high for this due to the massive switch statement
     public static SystemException read(org.omg.CORBA.portable.InputStream in) {
@@ -350,5 +257,56 @@
         }
         return ex;
     }
+    //CHECKSTYLE:ON
+    
+    
+    
+    public void _read(InputStream instream) {
+        value = read(instream);
+    }
+    
+    public TypeCode _type() {
+        if (typeCode == null) {
+            ORB orb = ORB.init();
+            StructMember[] smBuf = new StructMember[2];
+            TypeCode minortc = orb.get_primitive_tc(TCKind.tk_long);
+            smBuf[0] = new StructMember("minor", minortc, null);
+
+            String csLabels[] = {"COMPLETED_YES", "COMPLETED_NO", "COMPLETED_MAYBE"};
+            TypeCode completedtc = orb
+                .create_enum_tc("IDL:omg.org/CORBA/CompletionStatus:1.0",
+                              "CompletionStatus", csLabels);
+
+            smBuf[1] = new StructMember("completed", completedtc, null);
+            String id;
+            String name;
+            if (value == null) {
+                name = "SystemException";
+                id = "IDL:omg.org/CORBA/SystemException:1.0";
+            } else {
+                String className = value.getClass().getName();
+                name = className.substring(className.lastIndexOf('.') + 1);
+                id = "IDL:omg.org/CORBA/" + name + ":1.0";
+            }
+            
+            typeCode = orb.create_exception_tc(id, name, smBuf);
+        }
+        return typeCode;
+    }
+    public void _write(OutputStream outstream) {
+        String id;
+        if (value == null) {
+            value = new org.omg.CORBA.UNKNOWN();
+            id = "IDL:omg.org/CORBA/UNKNOWN";
+        } else {
+            String className = value.getClass().getName();
+            id = "IDL:omg.org/CORBA/" 
+                + className.substring(className.lastIndexOf('.') + 1) + ":1.0";
+        }
+
+        outstream.write_string(id);
+        outstream.write_ulong(value.minor);
+        outstream.write_ulong(value.completed.value());
+    }
 
 }

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -114,15 +114,15 @@
         }
     }
 
-    protected MessageObserver getObserver() {
+    public MessageObserver getObserver() {
         return incomingObserver;
     }
     
-    protected void setObserver(MessageObserver observer) {
+    public void setObserver(MessageObserver observer) {
         incomingObserver = observer;
     }
     
-    protected ORB getOrb() {
+    public ORB getOrb() {
         return orb;
     }
 

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -21,6 +21,8 @@
 
 import java.lang.reflect.Array;
 import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -50,7 +52,9 @@
 import org.apache.cxf.binding.corba.wsdl.Unionbranch;
 import org.apache.cxf.common.logging.LogUtils;
 import org.omg.CORBA.Any;
+import org.omg.CORBA.NO_IMPLEMENT;
 import org.omg.CORBA.TCKind;
+import org.omg.CORBA.TypeCode;
 import org.omg.CORBA.portable.InputStream;
 
 public class CorbaObjectReader {
@@ -232,18 +236,20 @@
         }
     }
 
+    private BigInteger convertLongToULong(long l) {
+        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);
+    }
     public BigInteger readULongLong() throws CorbaBindingException {
         try {
-            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);
+            return convertLongToULong(stream.read_ulonglong());
         } 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);
@@ -328,9 +334,21 @@
     public void readFixed(CorbaObjectHandler obj) throws CorbaBindingException {
         CorbaFixedHandler fixedHandler = (CorbaFixedHandler)obj;
         long scale = fixedHandler.getScale();
-        
-        java.math.BigDecimal fixedValue = stream.read_fixed().movePointLeft((int)scale);
-        fixedHandler.setValue(fixedValue);
+        try {
+            java.math.BigDecimal fixedValue = stream.read_fixed().movePointLeft((int)scale);
+            fixedHandler.setValue(fixedValue);
+        } catch (NO_IMPLEMENT ex) {
+            //the read_fixed method is a "late addition" and not all orbs implement it.
+            //Some of them have a "read_fixed(TypeCode)" method, we'll try that
+            Method m = null;
+            try {
+                m = stream.getClass().getMethod("read_fixed", new Class[] {TypeCode.class});
+                BigDecimal fixedValue = (BigDecimal)m.invoke(stream, new Object[] {obj.getTypeCode()});
+                fixedHandler.setValue(fixedValue);
+            } catch (Throwable e1) {
+                throw ex;
+            }
+        }
     }
 
     public void readEnumDiscriminator(CorbaUnionHandler unionHandler, CorbaEnumHandler disc)
@@ -393,6 +411,7 @@
         }
     }
 
+    //CHECKSTYLE:OFF  -  processing the typecodes in a switch makes this method fairly long/complex
     public void readArray(CorbaObjectHandler obj) throws CorbaBindingException {
         CorbaArrayHandler arrayObj = (CorbaArrayHandler)obj;
         List<CorbaObjectHandler> arrayElements = arrayObj.getElements();
@@ -446,7 +465,12 @@
             case TCKind._tk_ulong: {
                 int[] values = new int[arraySize];
                 stream.read_ulong_array(values, 0, arraySize);
-                val = values;
+                long[] v2 = new long[arraySize];
+                for (int x = 0; x < arraySize; x++) {
+                    v2[x] = values[x];
+                    v2[x] &= 0xFFFFFFFFL;
+                }
+                val = v2;
                 break;
             }
             case TCKind._tk_longlong: {
@@ -458,7 +482,11 @@
             case TCKind._tk_ulonglong: {
                 long[] values = new long[arraySize];
                 stream.read_ulonglong_array(values, 0, arraySize);
-                val = values;
+                BigInteger[] v2 = new BigInteger[arraySize];
+                for (int x = 0; x < arraySize; x++) {
+                    v2[x] = convertLongToULong(values[x]);
+                }
+                val = v2;
                 break;
             }
             case TCKind._tk_float: {
@@ -486,7 +514,8 @@
             }
         }
     }
-    
+    //CHECKSTYLE:ON
+
     public void readSequence(CorbaObjectHandler obj) throws CorbaBindingException {
         if (obj instanceof CorbaOctetSequenceHandler) {
             int length = stream.read_ulong();

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectWriter.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectWriter.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectWriter.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/runtime/CorbaObjectWriter.java Thu Aug  7 14:05:12 2008
@@ -18,6 +18,8 @@
  */
 package org.apache.cxf.binding.corba.runtime;
 
+import java.lang.reflect.Method;
+import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.List;
 
@@ -297,8 +299,18 @@
 
     public void writeFixed(CorbaObjectHandler obj) throws CorbaBindingException {
         CorbaFixedHandler fixedHandler = (CorbaFixedHandler)obj;
-        long scale = fixedHandler.getScale();
-        stream.write_fixed(fixedHandler.getValue().movePointRight((int)scale));
+        short scale = (short)fixedHandler.getScale();
+        short fixed = (short)fixedHandler.getDigits();
+        //the write_fixed method is a "late addition" and not all orbs implement it.
+        //Some of them have a "write_fixed(BigDecimal, short, short)" method, we'll try that
+        try {
+            Method m = stream.getClass().getMethod("write_fixed", new Class[] {BigDecimal.class,
+                                                                               Short.TYPE,
+                                                                               Short.TYPE});
+            m.invoke(stream, fixedHandler.getValue(), fixed, scale);
+        } catch (Throwable e1) {
+            stream.write_fixed(fixedHandler.getValue().movePointRight(scale));
+        }
     }
 
     public void writeUnion(CorbaObjectHandler obj) throws CorbaBindingException {

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -29,6 +29,7 @@
 
     private static final int UNSIGNED_MAX = 256; 
     private Object value;
+    private String valueAsString;
     private boolean objectSet;
     private Any any;
     
@@ -39,6 +40,9 @@
     public Object getValue() {
         return value;
     }
+    public Any getAny() {
+        return any;
+    }
     
     public void setIntoAny(Any val, CorbaStreamable stream, boolean output) {
         any = val;
@@ -108,6 +112,9 @@
         if (!objectSet && any != null) {
             return getDataFromAny();
         }
+        if (valueAsString != null) {
+            return valueAsString;
+        }
         String data = "";
 
         switch (this.typeCode.kind().value()) {
@@ -169,6 +176,7 @@
             // it needs.
             data = value.toString();
         }
+        valueAsString = data;
         return data;
     }
     
@@ -244,6 +252,10 @@
     }
     public String getDataFromAny() {
         String data = "";
+        if (valueAsString != null) {
+            return valueAsString;
+        }
+
         switch (this.typeCode.kind().value()) {
         case TCKind._tk_boolean:
             data = any.extract_boolean() ? "true" : "false";
@@ -305,10 +317,13 @@
             //should not get here
             throw new RuntimeException("Unknown tc: " + this.typeCode);
         }
+        valueAsString = data;
         return data;
     }
     
     public void clear() {
         value = null;
+        objectSet = false;
+        valueAsString = null;
     }
 }

Modified: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/HandlerIterator.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/HandlerIterator.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/HandlerIterator.java (original)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/types/HandlerIterator.java Thu Aug  7 14:05:12 2008
@@ -49,6 +49,12 @@
                     || mode == org.omg.CORBA.ARG_INOUT.value) {
                     next = params[count].getObject();
                 }
+                if (!isServer 
+                    && mode == org.omg.CORBA.ARG_INOUT.value
+                    && next instanceof CorbaPrimitiveHandler) {
+                    CorbaPrimitiveHandler prim = (CorbaPrimitiveHandler)next;
+                    prim.clear();
+                }
                 count++;
             }
         }

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 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,8 +34,8 @@
 public final class CorbaBindingHelper {
 
     private static final Logger LOG = LogUtils.getL7dLogger(CorbaBindingHelper.class);
-    private static Map<String, ORB> orbList = new ConcurrentHashMap<String, ORB>();
-    private static Map<String, Integer> orbUseCount = new ConcurrentHashMap<String, Integer>();
+    private static Map<String, ORB> orbList = new HashMap<String, ORB>();
+    private static Map<String, Integer> orbUseCount = new HashMap<String, Integer>();
     private static ORB defaultORB;
     
     private CorbaBindingHelper() {
@@ -61,7 +61,19 @@
         return defaultORB;
     }
     
-    public static ORB createAddressSpecificORB(String address, OrbConfig config) {
+    public static synchronized ORB getAddressSpecificORB(String address, 
+                                                         Properties props, 
+                                                         List<String> orbArgs) {
+        ORB orb = orbList.get(getORBNameFromAddress(address));
+        if (orb == null) {
+            orb = createAddressSpecificORB(address, props, orbArgs);
+        }
+        return orb;
+    }
+
+    private static ORB createAddressSpecificORB(String address, 
+                                                Properties props, 
+                                                List<String> orbArgs) {
         ORB orb = null;
         
         URI addressURI = null;
@@ -71,15 +83,6 @@
             throw new CorbaBindingException("Unable to create ORB with address " + address);
         }
 
-        Properties props = System.getProperties();
-        if (config.getOrbClass() != null) {
-            props.put("org.omg.CORBA.ORBClass", config.getOrbClass());
-        }
-        if (config.getOrbSingletonClass() != null) {
-            props.put("org.omg.CORBA.ORBSingletonClass", config.getOrbSingletonClass());
-        }
-        List<String> orbArgs = config.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 
@@ -124,15 +127,9 @@
         return orb;
     }
     
-    public static ORB getAddressSpecificORB(String address) {
-        return orbList.get(getORBNameFromAddress(address));
-    }
 
-    public static void addAddressSpecificORB(String address, ORB orb) {
-        orbList.put(getORBNameFromAddress(address), orb);
-    }
     
-    public static String getORBNameFromAddress(String address) {
+    private static String getORBNameFromAddress(String address) {
         String name = null;
        
         URI addressURI = null;
@@ -173,7 +170,7 @@
 
     // This indicates that we need to keep the ORB alive.  This allows multiple objects to share the
     // same ORB and not have one of the objects destroy it while other objects are using it.
-    public static void keepORBAlive(String address) {
+    public static synchronized void keepORBAlive(String address) {
         Integer count = orbUseCount.get(getORBNameFromAddress(address));
 
         if (count == null) {
@@ -186,7 +183,7 @@
     // Signals that the ORB should be tested to see if it can be destroyed.  Actual destruction will
     // only occur if the ORB is not being used by someone else.  If it is, then we simply decrement
     // the count.
-    public static void destroyORB(String address, ORB orb) throws CorbaBindingException {
+    public static synchronized void destroyORB(String address, ORB orb) throws CorbaBindingException {
         Integer count = orbUseCount.get(getORBNameFromAddress(address));
 
         if (count == null) {
@@ -207,7 +204,6 @@
         } else {
             orbUseCount.put(getORBNameFromAddress(address), count);
         }
-
     }
 
 }

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -18,19 +18,12 @@
  */
 package org.apache.cxf.binding.corba.utils;
 
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-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;
@@ -38,7 +31,6 @@
 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;
@@ -76,9 +68,6 @@
 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 {
 
@@ -444,7 +433,7 @@
             map = new CorbaTypeMap(tmType.getTargetNamespace());
 
             List<CorbaTypeImpl> types = tmType.getStructOrExceptionOrUnion();
-            LOG.info("Found " + types.size() + " types defined in the typemap");
+            LOG.fine("Found " + types.size() + " types defined in the typemap");
             for (Iterator<CorbaTypeImpl> it = types.iterator(); it.hasNext();) {
                 CorbaTypeImpl corbaType = it.next();
                 String name = corbaType.getName();
@@ -458,7 +447,7 @@
                 }
                     
                 map.addType(name, corbaType);
-                LOG.info("Adding type " + name);
+                LOG.fine("Adding type " + name);
             }
         }
         return map;
@@ -508,152 +497,6 @@
         return ior;
     }
 
-    public static void exportObjectReference(ORB orb,
-                                             org.omg.CORBA.Object ref,
-                                             String url,
-                                             AddressType address,
-                                             OrbConfig config) 
-        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:")) {
-            config.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;
-        if (iorFile.isOpaque()) {
-            f = new File(iorFile.getSchemeSpecificPart());
-        } else {
-            f = new File(iorFile);
-        }
-        FileOutputStream file = new FileOutputStream(f);
-        PrintWriter out = new PrintWriter(file);
-        out.println(ref);
-        out.flush();
-        file.close();
-    }
-
-    private static void exportObjectReferenceToNamingService(NamingContext namingService,
-                                                             org.omg.CORBA.Object object,
-                                                             String path) {
-        NameComponent[] names = namingServiceStringToNameComponents(path);
-
-
-        // (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);
-    }
 
 
     public static org.omg.CORBA.Object importObjectReference(ORB orb,

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=683714&r1=683713&r2=683714&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 Aug  7 14:05:12 2008
@@ -19,22 +19,34 @@
 
 package org.apache.cxf.binding.corba.utils;
 
+import java.io.File;
+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.ArrayList;
 import java.util.List;
 
 import org.apache.cxf.binding.corba.CorbaBindingException;
+import org.apache.cxf.binding.corba.interceptors.SystemExceptionHelper;
+import org.apache.cxf.binding.corba.wsdl.AddressType;
+import org.omg.CORBA.Any;
 import org.omg.CORBA.ORB;
 import org.omg.CORBA.Policy;
+import org.omg.CORBA.SystemException;
+import org.omg.CosNaming.NameComponent;
+import org.omg.CosNaming.NamingContextExt;
+import org.omg.CosNaming.NamingContextExtHelper;
+import org.omg.PortableServer.POA;
+import org.omg.PortableServer.POAManager;
 
 public class OrbConfig {
 
-    String orbClass;
-    String orbSingletonClass;
-    List<String> orbArgs = new ArrayList<String>();
-    List<Policy> policies = new ArrayList<Policy>();
-    
-    boolean persistentPoa;
+    protected String orbClass;
+    protected String orbSingletonClass;
+    protected List<String> orbArgs = new ArrayList<String>();
     
     public OrbConfig() {
         //nothing
@@ -64,18 +76,67 @@
         return orbArgs;
     }
     
-    public void setPersistentPoa(boolean b) {
-        persistentPoa = b;
-    }
-    public boolean isPersistentPoa() {
-        return persistentPoa;
-    }
     
-    public List<Policy> getExtraPolicies() {
-        return policies;
+    public void addPOAPolicies(ORB orb, 
+                               String poaName,
+                               POA parentPOA,
+                               POAManager poaManager,
+                               List<Policy> policies) {
+        //nothing
     }
     
     
+    public Any createSystemExceptionAny(ORB orb, SystemException sysEx) {
+        Any exAny = orb.create_any();
+        SystemExceptionHelper.insert(exAny, sysEx);
+        return exAny;
+    }
+    
+    public 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 = CorbaUtils.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:")) {
+            exportObjectReferenceToNamingService(orb,
+                                                 ref,
+                                                 url);
+        } else {
+            String ior = orb.object_to_string(ref);
+            address.setLocation(ior);
+            URI uri = new URI("endpoint.ior");
+            exportObjectReferenceToFile(orb, ref, uri);
+        }
+    }
+    public void exportObjectReferenceToNamingService(ORB orb,
+                                                     org.omg.CORBA.Object ref,
+                                                     String location) {
+        int idx = location.indexOf("#");
+        String name = location.substring(idx + 1);
+        
+        //Register in NameService
+        try {
+            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);
+        } catch (Exception ex) {
+            throw new CorbaBindingException(ex);
+        }
+    }
     public void exportObjectReferenceToCorbaloc(ORB orb,
                                                 org.omg.CORBA.Object object,
                                                 String location) {
@@ -100,4 +161,23 @@
         }
     }
 
+
+    public void exportObjectReferenceToFile(ORB orb,
+                                              org.omg.CORBA.Object obj,
+                                              URI iorFile) 
+        throws IOException {
+        String ref = orb.object_to_string(obj);
+        File f = null;
+        if (iorFile.isOpaque()) {
+            f = new File(iorFile.getSchemeSpecificPart());
+        } else {
+            f = new File(iorFile);
+        }
+        FileOutputStream file = new FileOutputStream(f);
+        PrintWriter out = new PrintWriter(file);
+        out.println(ref);
+        out.flush();
+        file.close();
+    }
+
 }

Added: cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/wsdl/WSDLExtensionRegister.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/wsdl/WSDLExtensionRegister.java?rev=683714&view=auto
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/wsdl/WSDLExtensionRegister.java (added)
+++ cxf/trunk/rt/bindings/corba/src/main/java/org/apache/cxf/binding/corba/wsdl/WSDLExtensionRegister.java Thu Aug  7 14:05:12 2008
@@ -0,0 +1,73 @@
+/**
+ * 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.wsdl;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import javax.xml.bind.JAXBException;
+
+import org.apache.cxf.Bus;
+import org.apache.cxf.wsdl.JAXBExtensionHelper;
+import org.apache.cxf.wsdl.TExtensibilityElementImpl;
+import org.apache.cxf.wsdl.WSDLManager;
+
+/**
+ * 
+ */
+public final class WSDLExtensionRegister {
+    private static final String YOKO_NAMESPACE = "http://schemas.apache.org/yoko/bindings/corba";
+
+    Bus bus;
+    
+    @Resource
+    public void setBus(Bus b) {
+        bus = b;
+    }
+    
+    @PostConstruct
+    void registerYokoCompatibleExtensors() {
+        WSDLManager manager = bus.getExtension(WSDLManager.class);
+        createCompatExtensor(manager, javax.wsdl.Binding.class,
+                             org.apache.cxf.binding.corba.wsdl.BindingType.class);
+        createCompatExtensor(manager, javax.wsdl.BindingOperation.class,
+                             org.apache.cxf.binding.corba.wsdl.OperationType.class);
+        createCompatExtensor(manager, javax.wsdl.Definition.class,
+                             org.apache.cxf.binding.corba.wsdl.TypeMappingType.class);
+        createCompatExtensor(manager, javax.wsdl.Port.class,
+                             org.apache.cxf.binding.corba.wsdl.AddressType.class);
+        createCompatExtensor(manager, javax.wsdl.Port.class,
+                             org.apache.cxf.binding.corba.wsdl.PolicyType.class);
+    }
+
+    private void createCompatExtensor(WSDLManager manager,
+                                      Class<?> parentType,
+                                      Class<? extends TExtensibilityElementImpl> elementType) {
+        try {
+            JAXBExtensionHelper.addExtensions(manager.getExtensionRegistry(),
+                                              parentType, 
+                                              elementType,
+                                              YOKO_NAMESPACE);
+        } catch (JAXBException e) {
+            //ignore, just won't support the yoko extensors
+        }
+        
+    }
+
+}

Modified: cxf/trunk/rt/bindings/corba/src/main/resources/META-INF/cxf/cxf-extension-corba.xml
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/main/resources/META-INF/cxf/cxf-extension-corba.xml?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/main/resources/META-INF/cxf/cxf-extension-corba.xml (original)
+++ cxf/trunk/rt/bindings/corba/src/main/resources/META-INF/cxf/cxf-extension-corba.xml Thu Aug  7 14:05:12 2008
@@ -35,10 +35,12 @@
         </property>
         <property name="transportIds">
             <list>
-		        <value>http://cxf.apache.org/bindings/corba</value>
-	            <value>http://schemas.apache.org/yoko/bindings/corba</value>
+		<value>http://cxf.apache.org/bindings/corba</value>
+	        <value>http://schemas.apache.org/yoko/bindings/corba</value>
             </list>
         </property>
     </bean>
+    
+    <bean class="org.apache.cxf.binding.corba.wsdl.WSDLExtensionRegister" lazy-init="false"/>
 
 </beans>

Modified: cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/CorbaBindingFactoryTest.java
URL: http://svn.apache.org/viewvc/cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/CorbaBindingFactoryTest.java?rev=683714&r1=683713&r2=683714&view=diff
==============================================================================
--- cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/CorbaBindingFactoryTest.java (original)
+++ cxf/trunk/rt/bindings/corba/src/test/java/org/apache/cxf/binding/corba/CorbaBindingFactoryTest.java Thu Aug  7 14:05:12 2008
@@ -60,7 +60,6 @@
     
     @Before
     public void setUp() throws Exception {
-        System.setProperty("cxf.config.file", "cxf-extension-corba.xml");
         bus = BusFactory.getDefaultBus();       
         BindingFactoryManager bfm = bus.getExtension(BindingFactoryManager.class);        
         factory = (CorbaBindingFactory)bfm.getBindingFactory("http://cxf.apache.org/bindings/corba");