/**
* 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.Map;
import com.ibm.as400.access.AS400ConnectionPool;
import org.apache.camel.Endpoint;
import org.apache.camel.impl.UriEndpointComponent;
import org.apache.camel.spi.Metadata;
import org.apache.camel.util.EndpointHelper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* {@link org.apache.camel.Component} to provide integration with AS/400 objects.
*
* Current implementation supports working with data queues (*DTAQ) and Program calls (*PGM)
*/
public class Jt400Component extends UriEndpointComponent {
/**
* Name of the connection pool URI option.
*/
static final String CONNECTION_POOL = "connectionPool";
/**
* Logging tool used by this class.
*/
private static final Logger LOG = LoggerFactory.getLogger(Jt400Component.class);
/**
* Default connection pool used by the component. Note that this pool is
* lazily initialized. This is because in a scenario where the user always
* provides a pool, it would be wasteful for Camel to initialize and keep an
* idle pool.
*/
@Metadata(label = "advanced")
private AS400ConnectionPool connectionPool;
public Jt400Component() {
super(Jt400Endpoint.class);
}
@Override
protected Endpoint createEndpoint(String uri, String remaining, Map<String, Object> properties) throws Exception {
AS400ConnectionPool connectionPool;
if (properties.containsKey(CONNECTION_POOL)) {
LOG.trace("AS400ConnectionPool instance specified in the URI - will look it up.");
// We have chosen to handle the connectionPool option ourselves, so
// we must remove it from the given parameter list (see
// http://camel.apache.org/writing-components.html)
String poolId = properties.remove(CONNECTION_POOL).toString();
connectionPool = EndpointHelper.resolveReferenceParameter(getCamelContext(), poolId, AS400ConnectionPool.class, true);
} else {
LOG.trace("No AS400ConnectionPool instance specified in the URI - one will be provided.");
connectionPool = getConnectionPool();
}
String type = remaining.substring(remaining.lastIndexOf(".") + 1).toUpperCase();
Jt400Endpoint endpoint = new Jt400Endpoint(uri, this, connectionPool);
setProperties(endpoint, properties);
endpoint.setType(Jt400Type.valueOf(type));
return endpoint;
}
/**
* Returns the default connection pool used by this component.
*
* @return the default connection pool used by this component
*/
public synchronized AS400ConnectionPool getConnectionPool() {
if (connectionPool == null) {
LOG.info("Instantiating the default connection pool ...");
connectionPool = new AS400ConnectionPool();
}
return connectionPool;
}
public void setConnectionPool(AS400ConnectionPool connectionPool) {
this.connectionPool = connectionPool;
}
@Override
protected void doShutdown() throws Exception {
super.doShutdown();
if (connectionPool != null) {
LOG.info("Shutting down the default connection pool " + connectionPool + " ...");
connectionPool.close();
connectionPool = null;
}
}
}