package at.gv.egovernment.moa.spss.server.transaction;
import iaik.ixsil.util.URI;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Vector;
import java.util.Map.Entry;
import org.apache.axis.attachments.ManagedMemoryDataSource;
import org.w3c.dom.Element;
import at.gv.egovernment.moa.spss.MOAApplicationException;
import at.gv.egovernment.moa.spss.server.config.ConfigurationProvider;
/**
* Contains information about the current request.
*
* @author Stefan Knirsch
* @author Patrick Peck
*/
public class TransactionContext {
/** The client certificate. */
private X509Certificate[] clientCertificate = null;
/** The transaction ID. */
private String transactionID = null;
/** The name of the request. */
private String requestName = null;
/** The SOAP embedded request */
private Element request;
/** The response which is to embed by SOAP */
private Element response;
/** The map pointing to SOAP attachments needed by the request. */
private HashMap attachments = null;
/** The configuration to use throughout the request. */
private ConfigurationProvider configuration = null;
/**
* Create a TransactionContext
object.
*
* @param transactionID A unique ID for this TransactionContext
.
* @param clientCertificate The client certificate chain.
* @param configuration The MOA configuration to use for this transaction.
*/
public TransactionContext(
String transactionID,
X509Certificate[] clientCertificate,
ConfigurationProvider configuration) {
this.transactionID = transactionID;
this.clientCertificate = clientCertificate;
this.configuration = configuration;
}
/**
* Create a TransactionContext
object.
*
* @param transactionID A unique ID for this TransactionContext
.
* @param clientCertificate The client certificate chain.
* @param configuration The MOA configuration to use for this transaction.
* @param attachments to use for this transaction.
*/
public TransactionContext(
String transactionID,
X509Certificate[] clientCertificate,
ConfigurationProvider configuration,
Element request,
HashMap attachments) {
this.transactionID = transactionID;
this.clientCertificate = clientCertificate;
this.configuration = configuration;
this.request = request;
this.attachments = attachments;
}
/**
* Returns the client certificate.
*
* @return The client certificate chain, if SSL client authentication has been
* configured in the web server and has been used by the client. The 0th
* element of the array contains the client certificate. null
* otherwise.
*/
public X509Certificate[] getClientCertificate() {
return clientCertificate;
}
/**
* Returns the unique transaction ID.
*
* @return The transaction ID.
*/
public String getTransactionID() {
return transactionID;
}
/**
* Returns the name of the request.
*
* @return The name of the request.
*/
public String getRequestName() {
return requestName;
}
/**
* Sets the name of the request.
*
* @param requestName The request name to set.
*/
public void setRequestName(String requestName) {
this.requestName = requestName;
}
/**
* Sets the the request.
*
* @param request The request to set.
*/
public void setRequest(Element request) {
this.request = request;
}
/**
* Returns the request.
*
* @return The request.
*/
public Element getRequest() {
return request;
}
/**
* Sets the the response.
*
* @param response The response to set.
*/
public void setResponse(Element response) {
this.response = response;
}
/**
* Returns the response.
*
* @return The response.
*/
public Element getResponse() {
return response;
}
/**
* Adds an attachment to the transactions list of SOAP attachments.
*
* @param referenceId Identification value for the SOAP attachment.
* @param contentType MIME type of the SOAP attachment.
* @param is Handle to the ManagedMemoryDataSource of the SOAP attachment.
*/
public void addAttachment(String referenceId, String contentType, ManagedMemoryDataSource is) {
if (this.attachments == null) this.attachments = new HashMap();
Vector entry = new Vector(2);
entry.add(contentType);
entry.add(is);
this.attachments.put(referenceId, entry);
}
/**
* Returns the ManagedMemoryDataSource to a specific SOAP attachment identified by referenceId.
*
* @param referenceId Identification value for the SOAP attachment.
*/
public ManagedMemoryDataSource getAttachment(String referenceId) {
if (attachments==null) {
return null;
}
Vector entry = (Vector) attachments.get(referenceId);
if (entry==null) {
return null;
}
//return (InputStream) ( ((ManagedMemoryDataSource)entry.get(1)).getInputStream());
return (ManagedMemoryDataSource) entry.get(1);
}
/**
* Returns the InputStream to a specific SOAP attachment identified by uri.
*
* @param uri Identification value for the SOAP attachment.
*/
public InputStream getAttachmentInputStream(URI uri) throws MOAApplicationException {
if (attachments==null) {
return null;
}
String referenceId = uri.getPath();
Vector entry = (Vector) attachments.get(referenceId);
if (entry==null) {
return null;
}
InputStream attachmentIs = null;
try {
attachmentIs = (InputStream) ( ((ManagedMemoryDataSource)entry.get(1)).getInputStream());
} catch (IOException e) {
throw new MOAApplicationException("2208", new Object[] { uri }, e);
}
return attachmentIs;
//If we would return the whole mmds: return (ManagedMemoryDataSource) entry.get(1);
}
/**
* Returns the content type to a specific SOAP attachment identified by referenceId.
*
* @param referenceId Identification value for the SOAP attachment.
*/
public String getAttachmentContentType(String referenceId) {
Vector entry = (Vector) attachments.get(referenceId);
if (entry==null) {
return null;
}
return (String) entry.get(0);
}
/**
* Delete the temporary attachment files.
*/
public void cleanAttachmentCache() {
if (null==attachments) {
return;
}
Iterator iterator = attachments.entrySet().iterator();
while (iterator.hasNext()) {
Entry hmEntry = (Entry) iterator.next();
Vector entry = (Vector)hmEntry.getValue();
ManagedMemoryDataSource mmds = (ManagedMemoryDataSource)entry.get(1);
try {
if (mmds!=null) {
InputStream is = mmds.getInputStream();
if (is!=null) is.close();
File f = mmds.getDiskCacheFile();
if (f!=null) f.delete();
mmds.delete();
}
} catch (IOException e) {
// ok to do nothing here
}
}
}
/**
* Returns the ConfigurationProvider
associated with this
* transaction.
*
* @return The ConfigurationProvider associated with this transaction.
*/
public ConfigurationProvider getConfiguration() {
return configuration;
}
}