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 13:05:10 UTC

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

Author: bravi
Date: Tue May 22 06:05:09 2007
New Revision: 540573

URL: http://svn.apache.org/viewvc?view=rev&rev=540573
Log:
[YOKO-366] - Adding support for more types in the perf branch.

Added:
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java   (with props)
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaFaultStreamWriter.java   (with props)
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaPrimitiveSequenceEventProducer.java   (with props)
Modified:
    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/runtime/CorbaStreamReader.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/AbstractStartEndEventProducer.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaHandlerUtils.java
    incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaSequenceEventProducer.java

Added: 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=auto&rev=540573
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/interceptors/CorbaStreamFaultOutInterceptor.java Tue May 22 06:05:09 2007
@@ -0,0 +1,235 @@
+/**
+ * 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.InvocationTargetException;
+import java.lang.reflect.Method;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamWriter;
+import javax.xml.ws.WebFault;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.databinding.DataWriter;
+import org.apache.cxf.jaxb.io.XMLStreamDataWriter;
+import org.apache.cxf.message.Exchange;
+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.BindingInfo;
+import org.apache.cxf.service.model.BindingOperationInfo;
+import org.apache.cxf.service.model.FaultInfo;
+import org.apache.cxf.service.model.InterfaceInfo;
+import org.apache.cxf.service.model.MessagePartInfo;
+import org.apache.cxf.service.model.OperationInfo;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.cxf.service.model.ServiceModelUtil;
+import org.apache.schemas.yoko.bindings.corba.OperationType;
+import org.apache.schemas.yoko.bindings.corba.RaisesType;
+
+import org.apache.yoko.bindings.corba.CorbaBindingException;
+import org.apache.yoko.bindings.corba.CorbaDestination;
+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.CorbaFaultStreamWriter;
+import org.apache.yoko.bindings.corba.types.CorbaObjectHandler;
+
+import org.apache.yoko.wsdl.CorbaConstants;
+
+import org.omg.CORBA.Any;
+import org.omg.CORBA.ORB;
+import org.omg.CORBA.ServerRequest;
+import org.omg.CORBA.SystemException;
+import org.omg.CORBA.SystemExceptionHelper;
+
+public class CorbaStreamFaultOutInterceptor extends AbstractPhaseInterceptor<Message> {
+
+    private static final Logger LOG = LogUtils.getL7dLogger(CorbaStreamFaultOutInterceptor.class);
+    private CorbaTypeMap typeMap;
+    private ServiceInfo service;
+    private ORB orb;
+
+    public CorbaStreamFaultOutInterceptor() {
+        super();
+        setPhase(Phase.MARSHAL);
+    }
+
+    public void handleMessage(Message msg) {
+        CorbaMessage message = (CorbaMessage) msg;
+        Exchange exchange = message.getExchange();
+        CorbaDestination destination;
+        if (message.getDestination() != null) {
+            destination = (CorbaDestination)message.getDestination();
+        } else {
+            destination = (CorbaDestination)exchange.getDestination();
+        }
+
+        orb = (ORB) message.get(CorbaConstants.ORB);
+        if (orb == null) {
+            orb = (ORB) exchange.get(ORB.class); 
+        }
+
+        service = exchange.get(ServiceInfo.class);
+        typeMap = message.getCorbaTypeMap();
+        
+        XMLStreamDataWriter writer = (XMLStreamDataWriter) getDataWriter(message);
+
+        Throwable ex = message.getContent(Exception.class);
+        ex = ex.getCause();
+        if (ex instanceof InvocationTargetException) {
+            ex = ex.getCause();
+        }
+
+        if (ex instanceof SystemException) {
+            setSystemException(message, ex);
+            return;
+        }
+
+        //REVISIT, we should not have to depend on WebFault annotation
+        //Try changing the fault name to the proper mangled java exception classname.
+        WebFault fault = ex.getClass().getAnnotation(WebFault.class);
+        if (fault == null) {
+            throw new CorbaBindingException(ex);
+        }
+        String exClassName = fault.name();
+
+        // Get information about the operation being invoked from the WSDL
+        // definition.
+        // We need this to marshal data correctly
+
+        BindingInfo bInfo = destination.getBindingInfo();
+        InterfaceInfo info = bInfo.getInterface();        
+        
+        String opName = message.getExchange().get(String.class);
+                
+        Iterator iter = bInfo.getOperations().iterator();
+
+        BindingOperationInfo bopInfo = null;
+        OperationType opType = null;           
+        while (iter.hasNext()) {
+            bopInfo = (BindingOperationInfo)iter.next();
+            if (bopInfo.getName().getLocalPart().equals(opName)) {
+                opType = bopInfo.getExtensor(OperationType.class);
+                break;
+            }
+        }
+        if (opType == null) {
+            throw new CorbaBindingException("Unable to find binding operation for " + opName);
+        }
+
+        OperationInfo opInfo = bopInfo.getOperationInfo();
+
+        RaisesType exType = null;
+        List<RaisesType> exList = opType.getRaises();
+        for (Iterator<RaisesType> i = exList.iterator(); i.hasNext();) {
+            // REVISIT: Note that this assumes that exception names need to
+            // be unique. We should make
+            // sure that this is really the case.
+            RaisesType raises = i.next();
+            if (raises.getException().getLocalPart().equals(exClassName)) {
+                exType = raises;
+                break;
+            }
+        }
+        try {
+            if (exType != null) {
+                setUserException(message, ex, exType, opInfo, writer);
+            } else {
+                throw new CorbaBindingException(ex);
+            }
+        } catch (Exception exp) {
+            throw new CorbaBindingException(exp);
+        }
+    }
+
+    protected void setSystemException(CorbaMessage message,
+                                      Throwable ex) {
+        SystemException sysEx = (SystemException)ex;
+        message.setSystemException(sysEx);
+        ServerRequest request  = message.getExchange().get(ServerRequest.class);
+        Any exAny = orb.create_any();
+        SystemExceptionHelper.insert(exAny, sysEx);
+        request.set_exception(exAny);
+    }
+
+    protected void setUserException(CorbaMessage message,
+                                    Throwable ex,
+                                    RaisesType exType,
+                                    OperationInfo opInfo,
+                                    XMLStreamDataWriter writer)
+        throws Exception {
+        QName exIdlType = exType.getException();
+        QName elName = new QName("", exIdlType.getLocalPart());
+        MessagePartInfo faultPart = getFaultMessagePartInfo(opInfo, elName);
+        if (faultPart == null) {
+            throw new CorbaBindingException("Coulnd't find the message fault part : " + elName);
+        }
+
+        Method faultMethod = ex.getClass().getMethod("getFaultInfo");
+        if (faultMethod == null) {
+            return;
+        }
+        Object fault = faultMethod.invoke(ex);
+
+        // This creates a default instance of the class representing the exception schema type if
+        // one has not been created on the servant side which throws the UserException.
+        if (fault == null) {
+            Class faultClass = faultMethod.getReturnType();
+            fault = faultClass.newInstance();
+        }
+
+        CorbaFaultStreamWriter faultWriter = new CorbaFaultStreamWriter(orb, exType, typeMap, service);
+        writer.write(fault, faultPart, faultWriter);
+
+        CorbaObjectHandler[] objs = faultWriter.getCorbaObjects();      
+        CorbaStreamable streamable = message.createStreamableObject(objs[0], elName);
+        message.setStreamableException(streamable);
+    }
+
+    protected DataWriter<XMLStreamWriter> getDataWriter(CorbaMessage message) {
+        Service serviceModel = ServiceModelUtil.getService(message.getExchange());
+
+        DataWriter<XMLStreamWriter> dataWriter = 
+            serviceModel.getDataBinding().createWriter(XMLStreamWriter.class);
+        if (dataWriter == null) {
+            throw new CorbaBindingException("Couldn't create data writer for outgoing fault message");
+        }
+        return dataWriter;
+    }
+
+    protected MessagePartInfo getFaultMessagePartInfo(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.getMessageParts().get(0);
+            }
+        }
+        return null;
+    }
+    
+
+}

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

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

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=540573&r1=540572&r2=540573
==============================================================================
--- 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 06:05:09 2007
@@ -64,6 +64,8 @@
     private ORB orb;
     private ServiceInfo service;
     private CorbaTypeMap typeMap;
+    private CorbaDestination destination;
+
 
     public CorbaStreamInInterceptor() {
         super();
@@ -79,6 +81,13 @@
     }
 
     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 {
@@ -127,13 +136,6 @@
 
         CorbaMessage message = (CorbaMessage) msg;
 
-        CorbaDestination destination = null;
-        if (message.getDestination() != null) {
-            destination = (CorbaDestination)message.getDestination();
-        } else {
-            destination = (CorbaDestination)message.getExchange().getDestination();
-        }
-        service = destination.getBindingInfo().getService();
         Exchange exchange = message.getExchange();
 
         typeMap = message.getCorbaTypeMap();
@@ -161,7 +163,7 @@
         orb = (ORB)exchange.get(ORB.class);
 
         ServerRequest request = exchange.get(ServerRequest.class);
-        NVList list = prepareArguments(message, destination, info, opType, opQName);
+        NVList list = prepareArguments(message, info, opType, opQName);
         request.arguments(list);
         message.setList(list);
 
@@ -186,7 +188,6 @@
     }
 
     protected NVList prepareArguments(CorbaMessage corbaMsg,
-                                      CorbaDestination destination,
                                       InterfaceInfo info,
                                       OperationType opType,
                                       QName opQName) {        

Added: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaFaultStreamWriter.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaFaultStreamWriter.java?view=auto&rev=540573
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaFaultStreamWriter.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaFaultStreamWriter.java Tue May 22 06:05:09 2007
@@ -0,0 +1,59 @@
+/**
+ * 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.runtime;
+
+import java.util.logging.Logger;
+
+import javax.xml.namespace.QName;
+import javax.xml.stream.XMLStreamException;
+
+import org.apache.cxf.common.logging.LogUtils;
+import org.apache.cxf.service.model.ServiceInfo;
+import org.apache.schemas.yoko.bindings.corba.RaisesType;
+
+import org.apache.yoko.bindings.corba.CorbaTypeMap;
+
+import org.apache.yoko.bindings.corba.types.CorbaHandlerUtils;
+import org.apache.yoko.bindings.corba.types.CorbaTypeListener;
+
+import org.omg.CORBA.ORB;
+
+public class CorbaFaultStreamWriter extends CorbaStreamWriter {
+
+    private static final Logger LOG = LogUtils.getL7dLogger(CorbaFaultStreamWriter.class);
+
+    private RaisesType exType;
+
+    public CorbaFaultStreamWriter(ORB orbRef,
+                                  RaisesType raisesType,
+                                  CorbaTypeMap map,
+                                  ServiceInfo sinfo) {
+        super(orbRef, map, sinfo);
+        exType = raisesType;
+        listeners = new CorbaTypeListener[1];
+    }
+
+    protected void setCurrentTypeListener(QName name) throws XMLStreamException {
+        QName idlType = exType.getException();
+        currentTypeListener = CorbaHandlerUtils.getTypeListener(name, idlType, typeMap, orb);
+        listeners[0] = currentTypeListener;
+    }
+
+}

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

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

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamReader.java?view=diff&rev=540573&r1=540572&r2=540573
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamReader.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/runtime/CorbaStreamReader.java Tue May 22 06:05:09 2007
@@ -40,7 +40,8 @@
     }
 
     public QName getName() {
-        return eventProducer.getName();
+        final QName ret = eventProducer.getName();
+        return ret;
     }
 
     public char[] getTextCharacters() {
@@ -61,16 +62,25 @@
     }
 
     public boolean hasNext() throws XMLStreamException {
-        return eventProducer.hasNext();
+        if (currentState == XMLStreamReader.START_DOCUMENT) {
+            return true;
+        }
+        boolean hasNextEvent = eventProducer.hasNext();
+        if (!hasNextEvent && currentState != XMLStreamReader.END_DOCUMENT) {
+            currentState = XMLStreamReader.END_DOCUMENT;
+            hasNextEvent = true;
+        }
+        return hasNextEvent;
     }
 
     public int next() throws XMLStreamException {
         if (currentState == XMLStreamReader.START_DOCUMENT) {
-            currentState = XMLStreamReader.END_DOCUMENT;
+            currentState = 0;
             return XMLStreamReader.START_DOCUMENT;
         }
-        currentState = XMLStreamReader.END_DOCUMENT;
-        if (eventProducer.hasNext()) {
+        hasNext();
+        // ensure we catch end_document state
+        if (currentState != XMLStreamReader.END_DOCUMENT) {
             currentState = eventProducer.next();
         }
         return currentState;
@@ -222,7 +232,7 @@
 
     public int getTextCharacters(int arg0, char[] arg1, int arg2, int arg3) throws XMLStreamException {
         // TODO Auto-generated method stub
-        return 0;
+        throw new RuntimeException("Not implemented");
     }
 
     public int getTextStart() {
@@ -236,13 +246,12 @@
     }
 
     public boolean hasName() {
-        // TODO Auto-generated method stub
-        return false;
+        throw new RuntimeException("Not Implemented");
     }
 
     public boolean hasText() {
         // TODO Auto-generated method stub
-        return false;
+        throw new RuntimeException("Not implemented");
     }
 
     public boolean isAttributeSpecified(int arg0) {
@@ -251,13 +260,11 @@
     }
 
     public boolean isCharacters() {
-        // TODO Auto-generated method stub
-        return false;
+        throw new RuntimeException("Not Implemented");
     }
 
     public boolean isEndElement() {
-        // TODO Auto-generated method stub
-        return false;
+        throw new RuntimeException("Not Implemented");
     }
 
     public boolean isStandalone() {
@@ -266,8 +273,7 @@
     }
 
     public boolean isStartElement() {
-        // TODO Auto-generated method stub
-        return false;
+        throw new RuntimeException("Not Implemented");
     }
 
     public boolean isWhiteSpace() {
@@ -276,8 +282,7 @@
     }
 
     public int nextTag() throws XMLStreamException {
-        // TODO Auto-generated method stub
-        return 0;
+        throw new RuntimeException("Not Implemented");
     }
 
     public void require(int arg0, String arg1, String arg2) throws XMLStreamException {

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=540573&r1=540572&r2=540573
==============================================================================
--- 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 06:05:09 2007
@@ -45,32 +45,39 @@
 
     private static final Logger LOG = LogUtils.getL7dLogger(CorbaStreamWriter.class);
 
-    private String defaultNS = "";
-    private boolean skipWrap;
-    private ServiceInfo serviceInfo;
-    private CorbaTypeMap typeMap;
+    protected String defaultNS = "";
+    protected CorbaTypeListener[] listeners;
+    protected ServiceInfo serviceInfo;
+    protected CorbaTypeMap typeMap;
+    protected ORB orb;
+    protected CorbaTypeListener currentTypeListener;
+
     private List<ArgType> params;
     private int paramCounter;
-    private ORB orb;
-    private CorbaTypeListener[] listeners;
-    private CorbaTypeListener currentTypeListener;
 
-    private Stack<QName> elements;
+    private Stack<QName> elements = new Stack<QName>();
     private QName paramElement;
     private QName wrapElementName;    
 
+    private boolean skipWrap;
+
+    public CorbaStreamWriter(ORB orbRef,
+                             CorbaTypeMap map,
+                             ServiceInfo sinfo) {
+        orb = orbRef;
+        typeMap = map;
+        serviceInfo = sinfo;
+    }
+
     public CorbaStreamWriter(ORB orbRef,
                              List<ArgType> paramTypes,
                              CorbaTypeMap map,
                              ServiceInfo sinfo,
                              boolean wrap) {
-        orb = orbRef;
+        this(orbRef, map, sinfo);
         params = paramTypes;
-        typeMap = map;
-        serviceInfo = sinfo;
         skipWrap = wrap;
         listeners = new CorbaTypeListener[paramTypes.size()];
-        elements = new Stack<QName>();
     }
 
     public CorbaObjectHandler[] getCorbaObjects() {
@@ -117,22 +124,27 @@
         if (!skipWrap) {
             if (currentTypeListener == null) {
                 paramElement = name;
-                ArgType param = params.get(paramCounter);
-                QName idlType = param.getIdltype();
-                if (localName.equals(param.getName())) {
-                    currentTypeListener = CorbaHandlerUtils.getTypeListener(name, idlType, typeMap, orb);
-                    listeners[paramCounter] = currentTypeListener;
-                    paramCounter++;
-                } else {
-                    throw new XMLStreamException("Expected element not found: " + param.getName()
-                                                 + " (Found " + localName + ")");
-                }
+                setCurrentTypeListener(name);
             } else {
                 currentTypeListener.processStartElement(name);
             }
         } else {
             wrapElementName = name;
             skipWrap = false;
+        }
+    }
+
+    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())) {
+            currentTypeListener = CorbaHandlerUtils.getTypeListener(name, idlType, typeMap, orb);
+            listeners[paramCounter] = currentTypeListener;
+            paramCounter++;
+        } else {
+            throw new XMLStreamException("Expected element not found: " + param.getName()
+                                         + " (Found " + name.getLocalPart() + ")");
         }
     }
 

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/AbstractStartEndEventProducer.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/AbstractStartEndEventProducer.java?view=diff&rev=540573&r1=540572&r2=540573
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/AbstractStartEndEventProducer.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/AbstractStartEndEventProducer.java Tue May 22 06:05:09 2007
@@ -58,7 +58,7 @@
     }
 
     public boolean hasNext() {
-        return state < states.length - 1;
+        return state < states.length;
     }
 
     public int next() { 
@@ -74,6 +74,7 @@
         } else {
             // all done with content, move past state 0
             event = states[++state];
+            state++;
             currentEventProducer = null;
         }
         return event;

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=540573&r1=540572&r2=540573
==============================================================================
--- 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 06:05:09 2007
@@ -537,7 +537,11 @@
                 break;
             case TCKind._tk_sequence:
                 LOG.log(Level.INFO, "Reading sequence type from XML reader");
-                result = new CorbaSequenceEventProducer(handler, typeMap, serviceInfo, orb);
+                if (isPrimitiveIDLTypeSequence(handler)) {
+                    result = new CorbaPrimitiveSequenceEventProducer(handler, typeMap, serviceInfo, orb);
+                } else {
+                    result = new CorbaSequenceEventProducer(handler, typeMap, serviceInfo, orb);
+                }
                 break;
             case TCKind._tk_string:
             case TCKind._tk_wstring:
@@ -553,7 +557,7 @@
                 break;
             case TCKind._tk_objref:
                 LOG.log(Level.INFO, "Reading object reference from XML reader");
-                result = new CorbaObjectReferenceEventProducer(handler, serviceInfo, orb);
+                //result = new CorbaObjectReferenceEventProducer(handler, serviceInfo, orb);
                 break;
             default:
                 throw new CorbaBindingException("Unsupported complex type "
@@ -561,5 +565,18 @@
             }
         }
         return result;
+    }
+
+    private static boolean isPrimitiveIDLTypeSequence(CorbaObjectHandler handler) {
+        CorbaTypeImpl seqType = handler.getType();
+        QName seqElementType;
+        if (seqType instanceof Anonsequence) {
+            Anonsequence anonSeqType = (Anonsequence) seqType;
+            seqElementType = anonSeqType.getElemtype();
+        } else {
+            Sequence type = (Sequence) seqType;
+            seqElementType = type.getElemtype();
+        }
+        return CorbaUtils.isPrimitiveIdlType(seqElementType);
     }
 }

Added: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaPrimitiveSequenceEventProducer.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaPrimitiveSequenceEventProducer.java?view=auto&rev=540573
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaPrimitiveSequenceEventProducer.java (added)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaPrimitiveSequenceEventProducer.java Tue May 22 06:05:09 2007
@@ -0,0 +1,63 @@
+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 CorbaPrimitiveSequenceEventProducer implements CorbaTypeEventProducer {
+    
+    protected CorbaTypeEventProducer currentEventProducer;
+    protected Iterator<CorbaObjectHandler> iterator;
+    private CorbaTypeMap typeMap;
+    private ServiceInfo serviceInfo;
+    private ORB orb;
+
+    // No start and end elements for the sequence
+    public CorbaPrimitiveSequenceEventProducer(CorbaObjectHandler h,
+                                               CorbaTypeMap tm,
+                                               ServiceInfo service,
+                                               ORB orbRef) {
+        CorbaSequenceHandler handler = (CorbaSequenceHandler)h;
+        iterator = handler.getElements().iterator();
+        typeMap = tm;
+        orb = orbRef;
+        serviceInfo = service;
+    }
+
+    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/CorbaPrimitiveSequenceEventProducer.java
------------------------------------------------------------------------------
    svn:eol-style = native

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

Modified: incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaSequenceEventProducer.java
URL: http://svn.apache.org/viewvc/incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaSequenceEventProducer.java?view=diff&rev=540573&r1=540572&r2=540573
==============================================================================
--- incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaSequenceEventProducer.java (original)
+++ incubator/yoko/branches/perf/src/main/java/org/apache/yoko/bindings/corba/types/CorbaSequenceEventProducer.java Tue May 22 06:05:09 2007
@@ -18,16 +18,10 @@
  */
 package org.apache.yoko.bindings.corba.types;
 
-
-import javax.xml.namespace.QName;
 import org.apache.cxf.service.model.ServiceInfo;
 
-import org.apache.schemas.yoko.bindings.corba.Anonsequence;
-import org.apache.schemas.yoko.bindings.corba.Sequence;
-
 import org.apache.yoko.bindings.corba.CorbaTypeMap;
 import org.apache.yoko.bindings.corba.utils.CorbaUtils;
-import org.apache.yoko.wsdl.CorbaTypeImpl;
 
 import org.omg.CORBA.ORB;
 
@@ -45,44 +39,6 @@
         typeMap = tm;
         serviceInfo = service;
         orb = orbRef;
-        CorbaTypeImpl seqType = handler.getType();
-        QName seqElementType;
-        if (seqType instanceof Anonsequence) {
-            Anonsequence anonSeqType = (Anonsequence) seqType;
-            seqElementType = anonSeqType.getElemtype();
-        } else {
-            Sequence type = (Sequence) seqType;
-            seqElementType = type.getElemtype();
-        }
-        isPrimitiveIdlType = CorbaUtils.isPrimitiveIdlType(seqElementType);
     }
-
-    public boolean hasNext() {
-        if (isPrimitiveIdlType) {
-            return ((currentEventProducer != null) && (currentEventProducer.hasNext()))
-                || iterator.hasNext();
-        } else {
-            return super.hasNext();
-        }
-    }
-
-    public int next() {
-        int event = -1;
-        if (isPrimitiveIdlType) {
-            //No need to start & end element
-            if (currentEventProducer != null && currentEventProducer.hasNext()) {
-                event = currentEventProducer.next();
-            } else if (iterator.hasNext()) {
-                currentEventProducer = CorbaHandlerUtils.getTypeEventProducer(iterator.next(),
-                                                                              typeMap,
-                                                                              serviceInfo,
-                                                                              orb);
-                event = currentEventProducer.next();
-            }
-        } else {
-            event = super.next();
-        }
-        return event;
-    }    
 
 }