com.legstar.host.invoke.AbstractProgramInvoker Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of legstar-invoker Show documentation
Show all versions of legstar-invoker Show documentation
Provide remote procedure call to mainframe programs.
/*******************************************************************************
* Copyright (c) 2010 LegSem.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the GNU Lesser Public License v2.1
* which accompanies this distribution, and is available at
* http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*
* Contributors:
* LegSem - initial API and implementation
******************************************************************************/
package com.legstar.host.invoke;
import java.util.Map.Entry;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import com.legstar.host.invoke.model.HostProgram;
import com.legstar.host.invoke.model.HostProgramException;
import com.legstar.messaging.LegStarAddress;
/**
* Generic code shared by all program invoker implementations. Such invokers
* have the capability to invoke a mainframe program.
*
* Typically Adapters will implement such an invoker for each operation that
* maps to a mainframe program.
*
*/
public abstract class AbstractProgramInvoker {
/** The operation name.*/
private String mOperationName;
/** Host program properties for operation. */
private String mProgramProperties;
/** Host program associated with operation. */
private HostProgram mHostProgram;
/** Each target address needs its own host invoker. There is a serious
* performance hit each time we create a host invoker so we use this
* cache to improve that. */
private ConcurrentMap < LegStarAddress, HostInvoker > _hostInvokersCache;
/** The invoker configuration file name. */
private String mConfigFileName;
/** Logger. */
private final Log _log = LogFactory.getLog(getClass());
/**
* Operation invoker constructor.
* @param configFileName host invoker configuration file name
* @param operationName operation name
* @param programProperties host program properties
* throws IllegalArgumentException if properties file not found or invalid
*/
public AbstractProgramInvoker(
final String configFileName,
final String operationName,
final String programProperties) {
this(configFileName, operationName, (HostProgram) null);
try {
mHostProgram = new HostProgramProperties(programProperties);
} catch (HostProgramException e) {
throw new IllegalArgumentException(e);
}
mProgramProperties = programProperties;
}
/**
* Operation invoker constructor.
* @param configFileName host invoker configuration file name
* @param operationName operation name
* @param hostProgram host program bean associated with operation
*/
public AbstractProgramInvoker(
final String configFileName,
final String operationName,
final HostProgram hostProgram) {
mConfigFileName = configFileName;
mOperationName = operationName;
mHostProgram = hostProgram;
_hostInvokersCache = new ConcurrentHashMap < LegStarAddress, HostInvoker >();
}
/** {@inheritDoc} */
public String toString() {
StringBuffer details = new StringBuffer();
details.append("Operation=" + getOperationName());
details.append(", Program properties=" + getHostProgram());
details.append(", Config file name=" + getConfigFileName());
for (Entry < LegStarAddress, HostInvoker > entry : _hostInvokersCache.entrySet()) {
details.append(", " + entry.getValue().toString());
}
return details.toString();
}
/**
* Creates a new host invoker either because there is none yet or because something
* in the request supersedes the previous address parameters.
* @param address the target host address (potentially null, meaning the default
* configuration endpoint is to be used).
* @return a host invoker
* @throws HostInvokerException if invoker cannot be created
*/
public HostInvoker getHostInvoker(final LegStarAddress address) throws HostInvokerException {
/* Concurrent hash map does not like null value as a key so key with empty
* address instead of null. */
LegStarAddress keyAddress = (address == null) ? new LegStarAddress((String) null) : address;
HostInvoker hostInvoker = _hostInvokersCache.get(keyAddress);
if (hostInvoker == null) {
if (_log.isDebugEnabled()) {
_log.debug("Creating new host invoker for keyAddress: " + keyAddress);
}
HostInvoker newHostInvoker = HostInvokerFactory.createHostInvoker(
getConfigFileName(), keyAddress, getHostProgram());
hostInvoker = _hostInvokersCache.putIfAbsent(keyAddress, newHostInvoker);
if (hostInvoker == null) {
hostInvoker = newHostInvoker;
}
}
return hostInvoker;
}
/**
* @return the invoker configuration file name
*/
public String getConfigFileName() {
return mConfigFileName;
}
/**
* @deprecated
* @return the host program properties for operation
*/
public String getProgramProperties() {
return mProgramProperties;
}
/**
* @return the host program properties for operation
*/
public HostProgram getHostProgram() {
return mHostProgram;
}
/**
* @return the operation name
*/
public String getOperationName() {
return mOperationName;
}
}