You are viewing a plain text version of this content. The canonical link for it is here.
Posted to yoko-commits@incubator.apache.org by br...@apache.org on 2007/05/22 18:14:03 UTC

svn commit: r540676 - in /incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba: ./ interceptors/ runtime/ types/

Author: bravi
Date: Tue May 22 11:14:02 2007
New Revision: 540676

URL: http://svn.apache.org/viewvc?view=rev&rev=540676
Log:
[YOKO-366] - Adding exception support.

Added:
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java   (with props)
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java   (with props)
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java   (with props)
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java   (with props)
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/WrappedParameterSequenceEventProducer.java
      - copied, changed from r540203, incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterSequenceEventProducer.java
Removed:
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterSequenceEventProducer.java
Modified:
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingFactory.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaConduit.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamInInterceptor.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamOutEndingInterceptor.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaObjectWriter.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamWriter.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingFactory.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingFactory.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingFactory.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaBindingFactory.java Tue May 22 11:14:02 2007
@@ -47,9 +47,8 @@
 
 import org.apache.cxf.ws.addressing.EndpointReferenceType;
 
-import org.apache.yoko.bindings.corba.interceptors.CorbaFaultInInterceptor;
-import org.apache.yoko.bindings.corba.interceptors.CorbaFaultOutInterceptor;
-import org.apache.yoko.bindings.corba.interceptors.CorbaInInterceptor;
+import org.apache.yoko.bindings.corba.interceptors.CorbaStreamFaultInInterceptor;
+import org.apache.yoko.bindings.corba.interceptors.CorbaStreamFaultOutInterceptor;
 import org.apache.yoko.bindings.corba.interceptors.CorbaStreamInInterceptor;
 import org.apache.yoko.bindings.corba.interceptors.CorbaStreamOutInterceptor;
 
@@ -104,17 +103,12 @@
     public Binding createBinding(BindingInfo bindingInfo) {
         CorbaBinding binding = new CorbaBinding();
 
-        binding.getInFaultInterceptors().add(new CorbaFaultInInterceptor());
-        binding.getOutFaultInterceptors().add(new CorbaFaultOutInterceptor());
+        binding.getInFaultInterceptors().add(new CorbaStreamFaultInInterceptor());
+        binding.getOutFaultInterceptors().add(new CorbaStreamFaultOutInterceptor());
         binding.getOutInterceptors().add(new BareOutInterceptor());
         binding.getOutInterceptors().add(new CorbaStreamOutInterceptor());
-        boolean server = Boolean.getBoolean("isServer");
-        if (server) {
-            binding.getInInterceptors().add(new CorbaInInterceptor());
-        } else {      
-            binding.getInInterceptors().add(new BareInInterceptor());
-            binding.getInInterceptors().add(new CorbaStreamInInterceptor());
-        }
+        binding.getInInterceptors().add(new BareInInterceptor());
+        binding.getInInterceptors().add(new CorbaStreamInInterceptor());
         binding.setBindingInfo(bindingInfo);
         return binding;
     }

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaConduit.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaConduit.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaConduit.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/CorbaConduit.java Tue May 22 11:14:02 2007
@@ -112,7 +112,6 @@
             corbaMessage.setCorbaTypeMap(typeMap);
             
         } catch (java.lang.Exception ex) {
-            ex.printStackTrace();
             LOG.log(Level.SEVERE, "Could not resolve target object");
             throw new CorbaBindingException(ex);
         }
@@ -126,7 +125,6 @@
             buildRequest((CorbaMessage)message, opType);            
             message.getContent(OutputStream.class).close();
         } catch (Exception ex) {
-            ex.printStackTrace();
             LOG.log(Level.SEVERE, "Could not build the corba request");
             throw new CorbaBindingException(ex);
         }
@@ -178,11 +176,10 @@
         try {
             request.invoke();
         } catch (SystemException ex) {
-            message.setContent(Exception.class, new Fault(ex));
+            message.setContent(Exception.class, ex);
             message.setSystemException(ex);
             return;
         }
-        
         Exception ex = request.env().exception();
         if (ex != null) {
             if (ex instanceof UnknownUserException) {

Added: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java?view=auto&rev=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java Tue May 22 11:14:02 2007
@@ -0,0 +1,140 @@
+/**
+ * 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.yoko.bindings.corba.interceptors;
+
+import java.lang.reflect.Constructor;
+
+import java.util.Iterator;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+
+import javax.xml.stream.XMLStreamReader;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.databinding.DataReader;
+import org.apache.cxf.interceptor.ClientFaultConverter;
+import org.apache.cxf.jaxb.io.XMLStreamDataReader;
+import org.apache.cxf.message.Message;
+import org.apache.cxf.phase.AbstractPhaseInterceptor;
+import org.apache.cxf.phase.Phase;
+import org.apache.cxf.service.Service;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.FaultInfo;
+import org.apache.cxf.service.model.OperationInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.service.model.ServiceModelUtil;
+
+import org.apache.yoko.bindings.corba.CorbaBindingException;
+import org.apache.yoko.bindings.corba.CorbaMessage;
+import org.apache.yoko.bindings.corba.CorbaStreamable;
+import org.apache.yoko.bindings.corba.CorbaTypeMap;
+import org.apache.yoko.bindings.corba.runtime.CorbaStreamReader;
+import org.apache.yoko.bindings.corba.types.CorbaHandlerUtils;
+import org.apache.yoko.bindings.corba.types.CorbaTypeEventProducer;
+import org.apache.yoko.wsdl.CorbaConstants;
+
+import org.omg.CORBA.SystemException;
+
+public class CorbaStreamFaultInInterceptor extends AbstractPhaseInterceptor<Message> {
+        
+    private static final Logger LOG = LogUtils.getL7dLogger(CorbaStreamFaultInInterceptor.class);  
+    
+
+    public CorbaStreamFaultInInterceptor() {
+        super();
+        setPhase(Phase.UNMARSHAL);
+        addAfter(ClientFaultConverter.class.getName());
+    }    
+
+    public void handleMessage(Message msg) {
+        CorbaMessage message = (CorbaMessage)msg;
+        try {
+            SystemException sysEx = message.getSystemException();
+            if (sysEx != null) {
+                // TODO: Do we need anything else to handle system exceptions here...i.e. do
+                // we want to add a wrapper around this so that we can add some more information?
+                message.setContent(Exception.class, sysEx);
+                return;
+            }
+
+            CorbaStreamable exStreamable = message.getStreamableException();
+            if (exStreamable != null) {
+                XMLStreamDataReader reader = (XMLStreamDataReader) getDataReader(message);
+
+                BindingOperationInfo bopInfo = message.getExchange().get(BindingOperationInfo.class);
+                OperationInfo opInfo = bopInfo.getOperationInfo();
+
+                ServiceInfo service = message.getExchange().get(ServiceInfo.class);
+                CorbaTypeMap typeMap = message.getCorbaTypeMap();
+
+                org.omg.CORBA.ORB orb = (org.omg.CORBA.ORB) message.get(CorbaConstants.ORB);
+                if (orb == null) {
+                    orb = (org.omg.CORBA.ORB) message.getExchange().get(org.omg.CORBA.ORB.class); 
+                }
+                QName elName = new QName("", exStreamable.getName());
+                FaultInfo fault = getFaultInfo(opInfo, elName);
+                
+                CorbaTypeEventProducer faultEventProducer =
+                    CorbaHandlerUtils.getTypeEventProducer(exStreamable.getObject(),
+                                                           typeMap,
+                                                           service,
+                                                           orb);
+                CorbaStreamReader streamReader = new CorbaStreamReader(faultEventProducer);
+
+                Object e = reader.read(fault.getMessageParts().get(0), streamReader);
+                if (!(e instanceof Exception)) {
+                    Class exClass = fault.getProperty(Class.class.getName(), Class.class);
+                    Class beanClass = e.getClass();
+                    Constructor constructor =
+                        exClass.getConstructor(new Class[]{String.class, beanClass});
+                    e = constructor.newInstance(new Object[]{"", e});
+                }
+                message.setContent(Exception.class, (Exception) e);
+            }
+        } catch (java.lang.Exception ex) {
+            LOG.log(Level.SEVERE, "CORBA unmarshalFault exception", ex);
+            throw new CorbaBindingException("CORBA unmarshalFault exception", ex);
+        }
+
+    }
+
+    protected FaultInfo getFaultInfo(OperationInfo opInfo, QName faultName) {
+        Iterator<FaultInfo> faults = opInfo.getFaults().iterator();
+        while (faults.hasNext()) {
+            FaultInfo fault = faults.next();
+            if (fault.getFaultName().getLocalPart().equals(faultName.getLocalPart())) {
+                return fault;
+            }
+        }
+        return null;
+    }
+
+    protected DataReader<XMLStreamReader> getDataReader(CorbaMessage message) {
+        Service serviceModel = ServiceModelUtil.getService(message.getExchange());
+        DataReader<XMLStreamReader> dataReader = 
+            serviceModel.getDataBinding().createReader(XMLStreamReader.class);
+        if (dataReader == null) {
+            throw new CorbaBindingException("Couldn't create data reader for incoming fault message");
+        }
+        return dataReader;
+    }
+}

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultInInterceptor.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java Tue May 22 11:14:02 2007
@@ -200,7 +200,7 @@
             Class faultClass = faultMethod.getReturnType();
             fault = faultClass.newInstance();
         }
-
+        
         CorbaFaultStreamWriter faultWriter = new CorbaFaultStreamWriter(orb, exType, typeMap, service);
         writer.write(fault, faultPart, faultWriter);
 

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamInInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamInInterceptor.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamInInterceptor.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamInInterceptor.java Tue May 22 11:14:02 2007
@@ -24,6 +24,7 @@
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 
+import org.apache.cxf.endpoint.Endpoint;
 import org.apache.cxf.interceptor.Fault;
 import org.apache.cxf.message.Exchange;
 import org.apache.cxf.message.Message;
@@ -51,7 +52,8 @@
 import org.apache.yoko.bindings.corba.types.CorbaObjectHandler;
 import org.apache.yoko.bindings.corba.types.CorbaTypeEventProducer;
 import org.apache.yoko.bindings.corba.types.HandlerIterator;
-import org.apache.yoko.bindings.corba.types.ParameterSequenceEventProducer;
+import org.apache.yoko.bindings.corba.types.ParameterEventProducer;
+import org.apache.yoko.bindings.corba.types.WrappedParameterSequenceEventProducer;
 import org.apache.yoko.bindings.corba.utils.ContextUtils;
 
 import org.omg.CORBA.Any;
@@ -70,15 +72,7 @@
     public CorbaStreamInInterceptor() {
         super();
         setPhase(Phase.PRE_STREAM);
-    }
-    
-    public void handleFault(Message message) {
-        Exception ex = message.getContent(Exception.class);
-        if (ex != null) {
-            ex.printStackTrace();
-        }
-        throw new RuntimeException("Not implemented");
-    }
+    }   
 
     public void handleMessage(Message message) throws Fault {
         if (message.getDestination() != null) {
@@ -96,18 +90,16 @@
     }
 
     private void handleReply(Message message) {
-        
+
         CorbaMessage outMessage = (CorbaMessage)message.getExchange().getOutMessage();
-        /*
-        if (message.getStreamableException() != null || message.getSystemException() != null) {
+        if (outMessage.getStreamableException() != null || outMessage.getSystemException() != null) {
             Endpoint ep = message.getExchange().get(Endpoint.class);
             message.getInterceptorChain().abort();
             if (ep.getInFaultObserver() != null) {
-                ep.getInFaultObserver().onMessage(message);
+                ep.getInFaultObserver().onMessage(outMessage);
                 return;
             }
         }
-        */
         orb = (ORB)message.getExchange().get(ORB.class);
         HandlerIterator paramIterator = new HandlerIterator(outMessage, false);
 
@@ -116,17 +108,26 @@
         Exchange exchange = message.getExchange();
         BindingOperationInfo bindingOpInfo = exchange.get(BindingOperationInfo.class);  
         BindingMessageInfo msgInfo = bindingOpInfo.getOutput();
-        if (msgInfo.getMessageParts().size() == 1) {
+
+        boolean wrap = false;
+        if (bindingOpInfo.isUnwrappedCapable()) {
+            wrap = true;
+        }
+
+        if (wrap) {
             // wrapper element around our args
             // REVISIT, bravi, message name same as the element name
             QName wrapperElementQName = msgInfo.getMessageInfo().getName();
-            eventProducer = new ParameterSequenceEventProducer(wrapperElementQName,
-                                                               paramIterator,
-                                                               typeMap,
-                                                               service,
-                                                               orb);
+            eventProducer = new WrappedParameterSequenceEventProducer(wrapperElementQName,
+                                                                      paramIterator,
+                                                                      typeMap,
+                                                                      service,
+                                                                      orb);
         } else {
-            throw new RuntimeException("non wrapped parts not implemented");
+            eventProducer = new ParameterEventProducer(paramIterator,
+                                                       typeMap,
+                                                       service,
+                                                       orb);
         }
         CorbaStreamReader reader = new CorbaStreamReader(eventProducer);
         message.setContent(XMLStreamReader.class, reader);
@@ -171,17 +172,24 @@
 
         CorbaTypeEventProducer eventProducer = null;
         BindingMessageInfo msgInfo = bopInfo.getInput();
-        if (msgInfo.getMessageParts().size() == 1) {
+        boolean wrap = false;
+        if (bopInfo.isUnwrappedCapable()) {
+            wrap = true;
+        }
+
+        if (wrap) {
             // wrapper element around our args
-            // REVISIT, bravi, message name same as the element name
             QName wrapperElementQName = msgInfo.getMessageInfo().getName();
-            eventProducer = new ParameterSequenceEventProducer(wrapperElementQName,
-                                                               paramIterator,
-                                                               typeMap,
-                                                               service,
-                                                               orb);
+            eventProducer = new WrappedParameterSequenceEventProducer(wrapperElementQName,
+                                                                      paramIterator,
+                                                                      typeMap,
+                                                                      service,
+                                                                      orb);
         } else {
-            throw new RuntimeException("non wrapped parts not implemented");
+            eventProducer = new ParameterEventProducer(paramIterator,
+                                                       typeMap,
+                                                       service,
+                                                       orb);
         }
         CorbaStreamReader reader = new CorbaStreamReader(eventProducer);
         message.setContent(XMLStreamReader.class, reader);
@@ -231,11 +239,12 @@
                 wrap = true;
             }
             OperationInfo opInfo = boi.getOperationInfo();
+            MessageInfo msgInInfo = opInfo.getInput();
 
             for (int i = 0; i < paramTypes.size(); i++) {           
                 ParamType param = paramTypes.get(i);
                 QName paramIdlType = param.getIdltype();
-                QName paramName = new QName("", param.getName());
+                QName paramName = msgInInfo.getMessagePartQName(param.getName());
                 ModeType paramMode = param.getMode();
                 if (!wrap) {
                     MessagePartInfo part;

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamOutEndingInterceptor.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamOutEndingInterceptor.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamOutEndingInterceptor.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamOutEndingInterceptor.java Tue May 22 11:14:02 2007
@@ -90,17 +90,18 @@
         }
         CorbaStreamWriter writer = (CorbaStreamWriter) message.getContent(XMLStreamWriter.class);
         CorbaObjectHandler[] objs = writer.getCorbaObjects();
+        MessageInfo outMsgInfo = opInfo.getOutput();
         int count = 0;
         for (Iterator<ParamType> iter = paramTypes.iterator(); iter.hasNext();) {
             ParamType param = iter.next();
             QName idlType = param.getIdltype();
-            MessageInfo msgInfo = opInfo.getOutput();
-            QName paramName = new QName(msgInfo.getName().getNamespaceURI(), param.getName());
+            
+            QName paramName = outMsgInfo.getMessagePartQName(param.getName());
             CorbaObjectHandler obj = null;
             if (param.getMode().equals(ModeType.OUT)) {
                 if (!wrap) {
-                    MessagePartInfo part =
-                        getOutputMessagePartInfo(opInfo, param.getName());
+                    MessagePartInfo part = outMsgInfo.getMessagePart(paramName);
+                        //getOutputMessagePartInfo(opInfo, param.getName());
                     if (part != null && part.isElement()) {
                         paramName = part.getElementQName();
                     }
@@ -125,8 +126,8 @@
 
         ArgType returnParam = opType.getReturn();
         if (returnParam != null) {
+            QName retName = outMsgInfo.getMessagePartQName(returnParam.getName());
             QName retIdlType = returnParam.getIdltype();
-            QName retName = new QName("", returnParam.getName());
             CorbaObjectHandler obj = CorbaHandlerUtils
                 .initializeObjectHandler(orb, retName, retIdlType, typeMap, service);
             CorbaStreamable streamable = message.createStreamableObject(obj, retName);
@@ -147,21 +148,21 @@
         int count = 0;
         ArgType returnParam = opType.getReturn();
         if (returnParam != null) {
-            QName retName = new QName("", returnParam.getName());
+            MessageInfo msgOutInfo = opInfo.getOutput();
+            QName retName = msgOutInfo.getMessagePartQName(returnParam.getName());
             CorbaObjectHandler obj = objs[count++];
             CorbaStreamable streamable = message.createStreamableObject(obj, retName);
             message.setStreamableReturn(streamable);
         }
+        MessageInfo msgInfo = opInfo.getInput();
         for (Iterator<ParamType> iter = paramTypes.iterator(); iter.hasNext();) {
             ParamType param = iter.next();
             QName idlType = param.getIdltype();
-            MessageInfo msgInfo = opInfo.getInput();
-            QName paramName = new QName(msgInfo.getName().getNamespaceURI(), param.getName());
+            QName paramName = msgInfo.getMessagePartQName(param.getName());
             CorbaObjectHandler obj = null;
             if (param.getMode().equals(ModeType.IN)) {
                 if (!wrap) {
-                    MessagePartInfo part =
-                        getInputMessagePartInfo(opInfo, param.getName()); 
+                    MessagePartInfo part = msgInfo.getMessagePart(paramName);
                     if (part != null && part.isElement()) {
                         paramName = part.getElementQName();
                     }              
@@ -188,25 +189,4 @@
         
     }
 
-    protected MessagePartInfo getOutputMessagePartInfo(OperationInfo opInfo, String partName) {
-        MessageInfo msgInfo = opInfo.getOutput();
-        List<MessagePartInfo> parts = msgInfo.getMessageParts();
-        for (int i = 0; i < parts.size(); i++) {
-            if (parts.get(i).getName().getLocalPart().equals(partName)) {
-                return parts.get(i);
-            }
-        }
-        return null;
-    }
-
-    protected MessagePartInfo getInputMessagePartInfo(OperationInfo opInfo, String partName) {
-        MessageInfo msgInfo = opInfo.getInput();
-        List<MessagePartInfo> parts = msgInfo.getMessageParts();
-        for (int i = 0; i < parts.size(); i++) {
-            if (parts.get(i).getName().getLocalPart().equals(partName)) {
-                return parts.get(i);
-            }
-        }
-        return null;
-    }
 }

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaObjectWriter.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaObjectWriter.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaObjectWriter.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaObjectWriter.java Tue May 22 11:14:02 2007
@@ -277,7 +277,6 @@
         CorbaExceptionHandler exHandler = (CorbaExceptionHandler)obj;
         Exception exType = (Exception)exHandler.getType();
         List<CorbaObjectHandler> exMembers = exHandler.getMembers();
-    
         stream.write_string(exType.getRepositoryID());
         for (int i = 0; i < exMembers.size(); ++i) {
             this.write(exMembers.get(i));

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamWriter.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamWriter.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamWriter.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamWriter.java Tue May 22 11:14:02 2007
@@ -137,8 +137,7 @@
     protected void setCurrentTypeListener(QName name) throws XMLStreamException {
         ArgType param = params.get(paramCounter);
         QName idlType = param.getIdltype();
-        System.out.println("setting curren type listener " + name + "-" + idlType + "-" + param.getName());
-        if (name.getLocalPart().equals(param.getName())) {
+        if (!skipWrap || (name.getLocalPart().equals(param.getName()))) {
             currentTypeListener = CorbaHandlerUtils.getTypeListener(name, idlType, typeMap, orb);
             listeners[paramCounter] = currentTypeListener;
             paramCounter++;

Added: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java?view=auto&rev=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java Tue May 22 11:14:02 2007
@@ -0,0 +1,39 @@
+/**
+ * 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.yoko.bindings.corba.types;
+
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.yoko.bindings.corba.CorbaTypeMap;
+
+import org.omg.CORBA.ORB;
+
+public class CorbaExceptionEventProducer extends AbstractStartEndEventProducer {
+
+    public CorbaExceptionEventProducer(CorbaObjectHandler h,
+                                       CorbaTypeMap tm,
+                                       ServiceInfo service,
+                                       ORB orbRef) {
+        CorbaExceptionHandler handler = (CorbaExceptionHandler) h;
+        name = handler.getName();
+        iterator = handler.members.iterator();
+        typeMap = tm;
+        serviceInfo = service;
+        orb = orbRef;
+    }
+}

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionEventProducer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Added: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java?view=auto&rev=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java Tue May 22 11:14:02 2007
@@ -0,0 +1,86 @@
+/**
+ * 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.yoko.bindings.corba.types;
+
+import java.util.List;
+import javax.xml.namespace.QName;
+
+import org.apache.schemas.yoko.bindings.corba.Exception;
+import org.apache.schemas.yoko.bindings.corba.MemberType;
+import org.apache.yoko.bindings.corba.CorbaTypeMap;
+
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.TypeCode;
+
+public class CorbaExceptionListener implements CorbaTypeListener {
+
+    private CorbaExceptionHandler value;
+    private int memberCount;
+    private List<MemberType> exMembers;
+    private CorbaTypeListener currentTypeListener;
+    private QName memberElement;
+    private CorbaTypeMap typeMap;
+    private ORB orb;
+
+    public CorbaExceptionListener(QName exName,
+                                  QName exIdlType,
+                                  TypeCode exTC,
+                                  Object exType,
+                                  CorbaTypeMap map,
+                                  ORB orbRef) {
+        value = new CorbaExceptionHandler(exName, exIdlType, exTC, exType);
+        orb = orbRef;
+        typeMap = map;
+        exMembers = ((Exception) exType).getMember();
+    }
+
+    public void processStartElement(QName name) {
+        //REVISIT, assume only elements not attrs
+        if (currentTypeListener == null) {
+            memberElement = name;
+            currentTypeListener =
+                CorbaHandlerUtils.getTypeListener(name,
+                                                  exMembers.get(memberCount).getIdltype(),
+                                                  typeMap,
+                                                  orb);
+            value.addMember(currentTypeListener.getCorbaObject());
+            memberCount++;
+        } else {
+            currentTypeListener.processStartElement(name);
+        }
+    }
+
+    public void processEndElement(QName name) {
+        if (currentTypeListener != null) {
+            currentTypeListener.processEndElement(name);
+        }
+        if (memberElement.equals(name)) {
+            currentTypeListener = null;
+        }
+    }
+
+    public void processCharacters(String text) {
+        currentTypeListener.processCharacters(text);
+    }
+
+    public CorbaObjectHandler getCorbaObject() {
+        return value;
+    }
+
+}

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaExceptionListener.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java?view=diff&rev=540676&r1=540675&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java Tue May 22 11:14:02 2007
@@ -475,6 +475,7 @@
                 break;
             case TCKind._tk_except:
                 LOG.log(Level.INFO, "Reading exception type from XML reader");
+                result = new CorbaExceptionListener(name, idlType, tc, type, typeMap, orb);
                 break;
             case TCKind._tk_fixed:
                 LOG.log(Level.INFO, "Reading fixed type from XML reader");
@@ -531,6 +532,7 @@
                 break;
             case TCKind._tk_except:
                 LOG.log(Level.INFO, "Reading exception type from XML reader");
+                result = new CorbaExceptionEventProducer(handler, typeMap, serviceInfo, orb);
                 break;
             case TCKind._tk_fixed:
                 LOG.log(Level.INFO, "Reading fixed type from XML reader");

Added: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java?view=auto&rev=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java Tue May 22 11:14:02 2007
@@ -0,0 +1,81 @@
+/**
+ * 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.yoko.bindings.corba.types;
+
+import java.util.Iterator;
+
+import javax.xml.namespace.QName;
+
+import org.apache.cxf.service.model.ServiceInfo;
+
+import org.apache.yoko.bindings.corba.CorbaTypeMap;
+
+import org.omg.CORBA.ORB;
+
+public class ParameterEventProducer implements CorbaTypeEventProducer {
+
+    protected CorbaTypeEventProducer currentEventProducer;
+    protected Iterator<CorbaObjectHandler> iterator;
+    private CorbaTypeMap typeMap;
+    private ServiceInfo serviceInfo;
+    private ORB orb;
+
+    public ParameterEventProducer(HandlerIterator paramIterator,
+                                  CorbaTypeMap map,
+                                  ServiceInfo service,
+                                  ORB orbRef) {
+        iterator = paramIterator;
+        typeMap = map;
+        serviceInfo = service;
+        orb = orbRef;
+    }
+
+    public String getLocalName() {
+        return currentEventProducer != null ? currentEventProducer.getLocalName() : null;
+    }
+
+    public QName getName() {
+        return currentEventProducer != null ? currentEventProducer.getName() : null;
+    }
+
+    public String getText() {
+        return currentEventProducer != null ? currentEventProducer.getText() : null;
+    }
+
+    public boolean hasNext() {
+        return (currentEventProducer != null
+                ? currentEventProducer.hasNext() : false)
+            || (iterator != null ? iterator.hasNext() : false); 
+    }
+
+    public int next() {
+        int event = -1;
+        if (currentEventProducer != null && currentEventProducer.hasNext()) {
+            event = currentEventProducer.next();
+        } else if (iterator != null && iterator.hasNext()) {
+            CorbaObjectHandler obj = iterator.next();
+            currentEventProducer = CorbaHandlerUtils.getTypeEventProducer(obj, typeMap, serviceInfo, orb);
+            event =  currentEventProducer.next();
+        } else {
+            throw new RuntimeException("hasNext reported in error as there is no next event");
+        }
+        return event;
+    }
+
+}

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterEventProducer.java
------------------------------------------------------------------------------
    svn:keywords = Rev Date

Copied: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/WrappedParameterSequenceEventProducer.java (from r540203, incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterSequenceEventProducer.java)
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/WrappedParameterSequenceEventProducer.java?view=diff&rev=540676&p1=incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterSequenceEventProducer.java&r1=540203&p2=incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/WrappedParameterSequenceEventProducer.java&r2=540676
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/ParameterSequenceEventProducer.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/WrappedParameterSequenceEventProducer.java Tue May 22 11:14:02 2007
@@ -26,13 +26,13 @@
 
 import org.omg.CORBA.ORB;
 
-public class ParameterSequenceEventProducer extends AbstractStartEndEventProducer {
+public class WrappedParameterSequenceEventProducer extends AbstractStartEndEventProducer {
 
-    public ParameterSequenceEventProducer(QName wrapperElementQName,
-                                          HandlerIterator paramIterator,
-                                          CorbaTypeMap typeMap,
-                                          ServiceInfo service,
-                                          ORB orbRef) {
+    public WrappedParameterSequenceEventProducer(QName wrapperElementQName,
+                                                 HandlerIterator paramIterator,
+                                                 CorbaTypeMap typeMap,
+                                                 ServiceInfo service,
+                                                 ORB orbRef) {
         name = wrapperElementQName;
         iterator = paramIterator;
         this.typeMap = typeMap;