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;
- }
}