Author: davsclaus
Date: Sat May  5 13:55:54 2012
New Revision: 1334423

URL: http://svn.apache.org/viewvc?rev=1334423&view=rev
Log:
CAMEL-5243: Added support for binary format in jt400 program call. Thanks to 
Joao Loureiro for the patch.

Modified:
    
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmEndpoint.java
    
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmProducer.java
    
camel/trunk/components/camel-jt400/src/test/java/org/apache/camel/component/jt400/Jt400PgmEndpointTest.java

Modified: 
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmEndpoint.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmEndpoint.java?rev=1334423&r1=1334422&r2=1334423&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmEndpoint.java
 (original)
+++ 
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmEndpoint.java
 Sat May  5 13:55:54 2012
@@ -21,7 +21,6 @@ import java.net.URI;
 import java.net.URISyntaxException;
 import java.util.Arrays;
 import java.util.Map;
-
 import javax.naming.OperationNotSupportedException;
 
 import com.ibm.as400.access.AS400;
@@ -30,6 +29,7 @@ import org.apache.camel.CamelException;
 import org.apache.camel.Consumer;
 import org.apache.camel.Processor;
 import org.apache.camel.Producer;
+import org.apache.camel.component.jt400.Jt400DataQueueEndpoint.Format;
 import org.apache.camel.impl.DefaultEndpoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -43,6 +43,7 @@ public class Jt400PgmEndpoint extends De
     private Integer[] outputFieldsLengthArray;
 
     private AS400 iSeries;
+    private Format format = Format.text;
 
     /**
      * Creates a new AS/400 PGM CALL endpoint
@@ -81,6 +82,7 @@ public class Jt400PgmEndpoint extends De
     }
 
     public boolean isSingleton() {
+        // cannot be singleton as we store an AS400 instance on this endpoint
         return false;
     }
 
@@ -131,6 +133,14 @@ public class Jt400PgmEndpoint extends De
         }
     }
 
+    public void setFormat(Format format) {
+        this.format = format;
+    }
+
+    public Format getFormat() {
+        return format;
+    }
+
     public void setGuiAvailable(boolean guiAvailable) throws 
PropertyVetoException {
         this.iSeries.setGuiAvailable(guiAvailable);
     }

Modified: 
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmProducer.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmProducer.java?rev=1334423&r1=1334422&r2=1334423&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmProducer.java
 (original)
+++ 
camel/trunk/components/camel-jt400/src/main/java/org/apache/camel/component/jt400/Jt400PgmProducer.java
 Sat May  5 13:55:54 2012
@@ -16,18 +16,21 @@
  */
 package org.apache.camel.component.jt400;
 
+import java.beans.PropertyVetoException;
 import java.util.ArrayList;
 import java.util.List;
 
 import com.ibm.as400.access.AS400;
+import com.ibm.as400.access.AS400ByteArray;
+import com.ibm.as400.access.AS400DataType;
 import com.ibm.as400.access.AS400Message;
 import com.ibm.as400.access.AS400Text;
 import com.ibm.as400.access.ProgramCall;
 import com.ibm.as400.access.ProgramParameter;
 import org.apache.camel.Exchange;
 import org.apache.camel.InvalidPayloadException;
+import org.apache.camel.component.jt400.Jt400DataQueueEndpoint.Format;
 import org.apache.camel.impl.DefaultProducer;
-import org.apache.camel.util.ExchangeHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -72,37 +75,60 @@ public class Jt400PgmProducer extends De
         }
     }
 
-    private ProgramParameter[] getParameterList(Exchange exchange) throws 
InvalidPayloadException {
+    private ProgramParameter[] getParameterList(Exchange exchange) throws 
InvalidPayloadException, PropertyVetoException {
 
-        Object body = ExchangeHelper.getMandatoryInBody(exchange);
+        Object body = exchange.getIn().getMandatoryBody();
 
-        String[] params = (String[]) body;
+        Object[] params = (Object[]) body;
 
         ProgramParameter[] parameterList = new ProgramParameter[params.length];
         for (int i = 0; i < params.length; i++) {
             Object param = params[i];
 
-            boolean input = param != null;
-            boolean output = getISeriesEndpoint().isFieldIdxForOuput(i);
+            boolean input;
+            boolean output;
+            if (getISeriesEndpoint().isFieldIdxForOuput(i)) {
+                output = true;
+                input = param != null;
+            } else {
+                output = false;
+                input = true;
+            }
 
             byte[] inputData = null;
-            int outputLength = -1;
+
+            // XXX Actually, returns any field length, not just output.
+            int length = getISeriesEndpoint().getOutputFieldLength(i);
+
             if (input) {
-                String value = (String) param;
-                inputData = new 
AS400Text(getISeriesEndpoint().getOutputFieldLength(i)).toBytes(value);
-            }
-            if (output) {
-                outputLength = getISeriesEndpoint().getOutputFieldLength(i);
+                if (param != null) {
+                    AS400DataType typeConverter;
+                    if (getISeriesEndpoint().getFormat() == Format.binary) {
+                        typeConverter = new AS400ByteArray(length);
+                    } else {
+                        typeConverter = new AS400Text(length, 
getISeriesEndpoint().getiSeries());
+                    }
+                    inputData = typeConverter.toBytes(param);
+                }
+                // Else, inputData will remain null.
             }
 
             if (input && output) {
-                parameterList[i] = new ProgramParameter(inputData, 
outputLength);
-            }
-            if (input) {
-                parameterList[i] = new ProgramParameter(inputData);
-            }
-            if (output) {
-                parameterList[i] = new ProgramParameter(outputLength);
+                LOG.trace("Parameter {} is both input and output.", i);
+                parameterList[i] = new ProgramParameter(inputData, length);
+            } else if (input) {
+                LOG.trace("Parameter {} is input.", i);
+                if (inputData != null) {
+                    parameterList[i] = new ProgramParameter(inputData);
+                } else {
+                    parameterList[i] = new ProgramParameter();
+                    
parameterList[i].setParameterType(ProgramParameter.PASS_BY_REFERENCE);
+                    parameterList[i].setNullParameter(true); // Just for self 
documentation.
+                }
+            } else {
+                // output
+                LOG.trace("Parameter {} is output.", i);
+                parameterList[i] = new ProgramParameter(length);
             }
         }
 
@@ -111,29 +137,32 @@ public class Jt400PgmProducer extends De
 
     private void handlePGMOutput(Exchange exchange, ProgramCall pgmCall, 
ProgramParameter[] inputs) throws InvalidPayloadException {
 
-        Object bodyIN = ExchangeHelper.getMandatoryInBody(exchange);
-        String[] params = (String[]) bodyIN;
+        Object body = exchange.getIn().getMandatoryBody();
+        Object[] params = (Object[]) body;
 
-        List<String> results = new ArrayList<String>();
+        List<Object> results = new ArrayList<Object>();
 
         int i = 1;
         for (ProgramParameter pgmParam : pgmCall.getParameterList()) {
             byte[] output = pgmParam.getOutputData();
-
-            String value = params[i - 1];
+            Object javaValue = params[i - 1];
 
             if (output != null) {
                 int length = pgmParam.getOutputDataLength();
-
-                AS400Text text = new AS400Text(length);
-                value = (String) text.toObject(output);
+                AS400DataType typeConverter;
+                if (getISeriesEndpoint().getFormat() == Format.binary) {
+                    typeConverter = new AS400ByteArray(length);
+                } else {
+                    typeConverter = new AS400Text(length, 
getISeriesEndpoint().getiSeries());
+                }
+                javaValue = typeConverter.toObject(output);
             }
 
-            results.add(value);
+            results.add(javaValue);
             i++;
         }
 
-        String[] bodyOUT = new String[results.size()];
+        Object[] bodyOUT = new Object[results.size()];
         bodyOUT = results.toArray(bodyOUT);
 
         exchange.getOut().setBody(bodyOUT);
@@ -158,7 +187,7 @@ public class Jt400PgmProducer extends De
     @Override
     protected void doStart() throws Exception {
         if (!getISeriesEndpoint().getiSeries().isConnected()) {
-            LOG.info("Connecting to " + getISeriesEndpoint());
+            LOG.info("Connecting to {}", getISeriesEndpoint());
             getISeriesEndpoint().getiSeries().connectService(AS400.COMMAND);
         }
     }
@@ -166,7 +195,7 @@ public class Jt400PgmProducer extends De
     @Override
     protected void doStop() throws Exception {
         if (getISeriesEndpoint().getiSeries().isConnected()) {
-            LOG.info("Disconnecting from " + getISeriesEndpoint());
+            LOG.info("Disconnecting from {}", getISeriesEndpoint());
             getISeriesEndpoint().getiSeries().disconnectAllServices();
         }
     }

Modified: 
camel/trunk/components/camel-jt400/src/test/java/org/apache/camel/component/jt400/Jt400PgmEndpointTest.java
URL: 
http://svn.apache.org/viewvc/camel/trunk/components/camel-jt400/src/test/java/org/apache/camel/component/jt400/Jt400PgmEndpointTest.java?rev=1334423&r1=1334422&r2=1334423&view=diff
==============================================================================
--- 
camel/trunk/components/camel-jt400/src/test/java/org/apache/camel/component/jt400/Jt400PgmEndpointTest.java
 (original)
+++ 
camel/trunk/components/camel-jt400/src/test/java/org/apache/camel/component/jt400/Jt400PgmEndpointTest.java
 Sat May  5 13:55:54 2012
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.component.jt400;
 
+import org.apache.camel.component.jt400.Jt400DataQueueEndpoint.Format;
 import org.apache.camel.test.junit4.CamelTestSupport;
 import org.junit.Before;
 import org.junit.Test;
@@ -37,7 +38,7 @@ public class Jt400PgmEndpointTest extend
     public void setUp() throws Exception {
         super.setUp();
         endpoint = (Jt400PgmEndpoint)resolveMandatoryEndpoint("jt400://" + 
USER + ":" + PASSWORD
-                                                              + "@" + HOST + 
PGM + "?guiAvailable=true&outputFieldsIdx=1,2&fieldsLength=10,512,255");
+                                                              + "@" + HOST + 
PGM + 
"?guiAvailable=true&format=binary&outputFieldsIdx=1,2&fieldsLength=10,512,255");
     }
 
     /**
@@ -49,6 +50,7 @@ public class Jt400PgmEndpointTest extend
         assertEquals(HOST, endpoint.getiSeries().getSystemName());
         assertEquals(PGM, endpoint.getProgramToExecute());
         assertTrue(endpoint.getiSeries().isGuiAvailable());
+        assertEquals(Format.binary, endpoint.getFormat());
         assertEquals(10, endpoint.getOutputFieldLength(0));
         assertEquals(512, endpoint.getOutputFieldLength(1));
         assertEquals(255, endpoint.getOutputFieldLength(2));


Reply via email to