/**
* 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.beans.PropertyVetoException;
import java.net.URI;
import java.net.URISyntaxException;
import com.ibm.as400.access.AS400;
import com.ibm.as400.access.AS400ConnectionPool;
import com.ibm.as400.access.ConnectionPoolException;
import org.apache.camel.RuntimeCamelException;
import org.apache.camel.spi.Metadata;
import org.apache.camel.spi.UriParam;
import org.apache.camel.spi.UriParams;
import org.apache.camel.spi.UriPath;
import org.apache.camel.util.ObjectHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@UriParams
public class Jt400Configuration {
/**
* SearchTypes for reading from Keyed Data Queues
*/
public enum SearchType {
EQ, NE, LT, LE, GT, GE
}
/**
* Enumeration of supported data formats
*/
public enum Format {
/**
* Using <code>String</code> for transferring data
*/
text,
/**
* Using <code>byte[]</code> for transferring data
*/
binary
}
/**
* Logging tool.
*/
private static final Logger LOG = LoggerFactory.getLogger(Jt400Configuration.class);
/**
* Constant used to specify that the default system CCSID be used (a
* negative CCSID is otherwise invalid).
*/
private static final int DEFAULT_SYSTEM_CCSID = -1;
private final AS400ConnectionPool connectionPool;
@UriPath @Metadata(required = "true", secret = true)
private String userID;
@UriPath @Metadata(required = "true", secret = true)
private String password;
@UriPath @Metadata(required = "true")
private String systemName;
@UriPath @Metadata(required = "true")
private String objectPath;
@UriPath @Metadata(required = "true")
private Jt400Type type;
@UriParam
private int ccsid = DEFAULT_SYSTEM_CCSID;
@UriParam(defaultValue = "text")
private Format format = Format.text;
@UriParam
private boolean guiAvailable;
@UriParam
private boolean keyed;
@UriParam
private String searchKey;
@UriParam(defaultValue = "EQ")
private SearchType searchType = SearchType.EQ;
@UriParam(label = "security")
private boolean secured;
@UriParam
private Integer[] outputFieldsIdxArray;
@UriParam
private Integer[] outputFieldsLengthArray;
@UriParam(label = "consumer", defaultValue = "30000")
private int readTimeout = 30000;
public Jt400Configuration(String endpointUri, AS400ConnectionPool connectionPool) throws URISyntaxException {
ObjectHelper.notNull(endpointUri, "endpointUri", this);
ObjectHelper.notNull(connectionPool, "connectionPool", this);
URI uri = new URI(endpointUri);
String[] credentials = uri.getUserInfo().split(":");
systemName = uri.getHost();
userID = credentials[0];
password = credentials[1];
objectPath = uri.getPath();
this.connectionPool = connectionPool;
}
public Jt400Type getType() {
return type;
}
/**
* Whether to work with data queues or remote program call
*/
public void setType(Jt400Type type) {
this.type = type;
}
/**
* Returns the name of the AS/400 system.
*/
public String getSystemName() {
return systemName;
}
public void setSystemName(String systemName) {
this.systemName = systemName;
}
/**
* Returns the ID of the AS/400 user.
*/
public String getUserID() {
return userID;
}
public void setUserID(String userID) {
this.userID = userID;
}
/**
* Returns the password of the AS/400 user.
*/
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
/**
* Returns the fully qualified integrated file system path name of the
* target object of this endpoint.
*/
public String getObjectPath() {
return objectPath;
}
public void setObjectPath(String objectPath) {
this.objectPath = objectPath;
}
// Options
/**
* Returns the CCSID to use for the connection with the AS/400 system.
* Returns -1 if the CCSID to use is the default system CCSID.
*/
public int getCssid() {
return ccsid;
}
/**
* Sets the CCSID to use for the connection with the AS/400 system.
*/
public void setCcsid(int ccsid) {
this.ccsid = (ccsid < 0) ? DEFAULT_SYSTEM_CCSID : ccsid;
}
/**
* Returns the data format for sending messages.
*/
public Format getFormat() {
return format;
}
/**
* Sets the data format for sending messages.
*/
public void setFormat(Format format) {
ObjectHelper.notNull(format, "format", this);
this.format = format;
}
/**
* Returns whether AS/400 prompting is enabled in the environment running
* Camel.
*/
public boolean isGuiAvailable() {
return guiAvailable;
}
/**
* Sets whether AS/400 prompting is enabled in the environment running
* Camel.
*/
public void setGuiAvailable(boolean guiAvailable) {
this.guiAvailable = guiAvailable;
}
public int getCcsid() {
return ccsid;
}
public boolean isKeyed() {
return keyed;
}
/**
* Whether to use keyed or non-keyed data queues.
*/
public void setKeyed(boolean keyed) {
this.keyed = keyed;
}
public String getSearchKey() {
return searchKey;
}
/**
* Search key for keyed data queues.
*/
public void setSearchKey(String searchKey) {
this.searchKey = searchKey;
}
public SearchType getSearchType() {
return searchType;
}
/**
* Search type such as EQ for equal etc.
*/
public void setSearchType(SearchType searchType) {
this.searchType = searchType;
}
public Integer[] getOutputFieldsIdxArray() {
return outputFieldsIdxArray;
}
public boolean isSecured() {
return secured;
}
/**
* Whether connections to AS/400 are secured with SSL.
*/
public void setSecured(boolean secured) {
this.secured = secured;
}
/**
* Specifies which fields (program parameters) are output parameters.
*/
public void setOutputFieldsIdxArray(Integer[] outputFieldsIdxArray) {
this.outputFieldsIdxArray = outputFieldsIdxArray;
}
public Integer[] getOutputFieldsLengthArray() {
return outputFieldsLengthArray;
}
/**
* Specifies the fields (program parameters) length as in the AS/400 program definition.
*/
public void setOutputFieldsLengthArray(Integer[] outputFieldsLengthArray) {
this.outputFieldsLengthArray = outputFieldsLengthArray;
}
public int getReadTimeout() {
return readTimeout;
}
/**
* Timeout in millis the consumer will wait while trying to read a new message of the data queue.
*/
public void setReadTimeout(int readTimeout) {
this.readTimeout = readTimeout;
}
public void setOutputFieldsIdx(String outputFieldsIdx) {
if (outputFieldsIdx != null) {
String[] outputArray = outputFieldsIdx.split(",");
outputFieldsIdxArray = new Integer[outputArray.length];
for (int i = 0; i < outputArray.length; i++) {
String str = outputArray[i];
outputFieldsIdxArray[i] = Integer.parseInt(str);
}
}
}
public void setFieldsLength(String fieldsLength) {
if (fieldsLength != null) {
String[] outputArray = fieldsLength.split(",");
outputFieldsLengthArray = new Integer[outputArray.length];
for (int i = 0; i < outputArray.length; i++) {
String str = outputArray[i];
outputFieldsLengthArray[i] = Integer.parseInt(str);
}
}
}
// AS400 connections
/**
* Obtains an {@code AS400} object that connects to this endpoint. Since
* these objects represent limited resources, clients have the
* responsibility of {@link #releaseConnection(AS400) releasing them} when
* done.
*
* @return an {@code AS400} object that connects to this endpoint
*/
public AS400 getConnection() {
AS400 system = null;
try {
if (LOG.isDebugEnabled()) {
LOG.debug("Getting an AS400 object for '{}' from {}.", systemName + '/' + userID, connectionPool);
}
if (isSecured()) {
system = connectionPool.getSecureConnection(systemName, userID, password);
} else {
system = connectionPool.getConnection(systemName, userID, password);
}
if (ccsid != DEFAULT_SYSTEM_CCSID) {
system.setCcsid(ccsid);
}
try {
system.setGuiAvailable(guiAvailable);
} catch (PropertyVetoException e) {
LOG.warn("Failed to disable AS/400 prompting in the environment running Camel. This exception will be ignored.", e);
}
return system; // Not null here.
} catch (ConnectionPoolException e) {
throw new RuntimeCamelException(String.format("Unable to obtain an AS/400 connection for system name '%s' and user ID '%s'", systemName, userID), e);
} catch (PropertyVetoException e) {
throw new RuntimeCamelException("Unable to set the CSSID to use with " + system, e);
}
}
/**
* Releases a previously obtained {@code AS400} object from use.
*
* @param connection a previously obtained {@code AS400} object to release
*/
public void releaseConnection(AS400 connection) {
ObjectHelper.notNull(connection, "connection", this);
connectionPool.returnConnectionToPool(connection);
}
}