blob: f055c380bc4159efe5f14fd3d41fec6890fda362 [file] [log] [blame]
/**
* 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.camel.component.jt400;
import java.util.ArrayList;
import java.util.List;
import com.ibm.as400.access.AS400;
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.impl.DefaultProducer;
import org.apache.camel.util.ExchangeHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Jt400PgmProducer extends DefaultProducer {
private static final Logger LOG = LoggerFactory.getLogger(Jt400PgmProducer.class);
public Jt400PgmProducer(Jt400PgmEndpoint endpoint) {
super(endpoint);
}
private Jt400PgmEndpoint getISeriesEndpoint() {
return (Jt400PgmEndpoint) super.getEndpoint();
}
public void process(Exchange exchange) throws Exception {
AS400 iSeries = getISeriesEndpoint().getiSeries();
String commandStr = getISeriesEndpoint().getProgramToExecute();
ProgramParameter[] parameterList = getParameterList(exchange);
ProgramCall pgmCall = new ProgramCall(iSeries);
pgmCall.setProgram(commandStr);
pgmCall.setParameterList(parameterList);
if (LOG.isDebugEnabled()) {
LOG.trace("Starting to call PGM '{}' in host '{}' authentication with the user '{}'",
new Object[]{commandStr, iSeries.getSystemName(), iSeries.getUserId()});
}
boolean result = pgmCall.run();
if (LOG.isTraceEnabled()) {
LOG.trace("Executed PGM '{}' in host '{}'. Success? {}", new Object[]{commandStr, iSeries.getSystemName(), result});
}
if (result) {
handlePGMOutput(exchange, pgmCall, parameterList);
} else {
throw new Jt400PgmCallException(getOutputMessages(pgmCall));
}
}
private ProgramParameter[] getParameterList(Exchange exchange) throws InvalidPayloadException {
Object body = ExchangeHelper.getMandatoryInBody(exchange);
String[] params = (String[]) 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);
byte[] inputData = null;
int outputLength = -1;
if (input) {
String value = (String) param;
inputData = new AS400Text(value.length()).toBytes(value);
}
if (output) {
outputLength = getISeriesEndpoint().getOutputFieldLength(i);
}
if (input && output) {
parameterList[i] = new ProgramParameter(inputData, outputLength);
}
if (input) {
parameterList[i] = new ProgramParameter(inputData);
}
if (output) {
parameterList[i] = new ProgramParameter(outputLength);
}
}
return parameterList;
}
private void handlePGMOutput(Exchange exchange, ProgramCall pgmCall, ProgramParameter[] inputs) throws InvalidPayloadException {
Object bodyIN = ExchangeHelper.getMandatoryInBody(exchange);
String[] params = (String[]) bodyIN;
List<String> results = new ArrayList<String>();
int i = 1;
for (ProgramParameter pgmParam : pgmCall.getParameterList()) {
byte[] output = pgmParam.getOutputData();
String value = params[i - 1];
if (output != null) {
int length = pgmParam.getOutputDataLength();
AS400Text text = new AS400Text(length);
value = (String) text.toObject(output);
}
results.add(value);
i++;
}
String[] bodyOUT = new String[results.size()];
bodyOUT = results.toArray(bodyOUT);
exchange.getOut().setBody(bodyOUT);
}
private String getOutputMessages(ProgramCall pgmCall) throws Exception {
StringBuilder outputMsg = new StringBuilder();
// Show messages.
AS400Message[] messageList = pgmCall.getMessageList();
for (int i = 0; i < messageList.length; ++i) {
// Load additional message information.
messageList[i].load();
outputMsg.append(i + ") ");
outputMsg.append(messageList[i].getText());
outputMsg.append(" - ");
outputMsg.append(messageList[i].getHelp());
outputMsg.append("\n");
}
return outputMsg.toString();
}
@Override
protected void doStart() throws Exception {
if (!getISeriesEndpoint().getiSeries().isConnected()) {
LOG.info("Connecting to " + getISeriesEndpoint());
getISeriesEndpoint().getiSeries().connectService(AS400.COMMAND);
}
}
@Override
protected void doStop() throws Exception {
if (getISeriesEndpoint().getiSeries().isConnected()) {
LOG.info("Disconnecting from " + getISeriesEndpoint());
getISeriesEndpoint().getiSeries().disconnectAllServices();
}
}
}