/*
* Created on Oct 27, 2004
*
*/
package hk.hku.cecid.ebms.admin.listener;
import hk.hku.cecid.ebms.spa.EbmsProcessor;
import hk.hku.cecid.piazza.commons.module.ActiveMonitor;
import hk.hku.cecid.piazza.commons.module.ActiveTaskModule;
import hk.hku.cecid.piazza.commons.module.ComponentException;
import hk.hku.cecid.piazza.commons.util.PropertySheet;
import hk.hku.cecid.piazza.commons.util.PropertyTree;
import hk.hku.cecid.piazza.commons.util.UtilitiesException;
import hk.hku.cecid.piazza.corvus.admin.listener.AdminPageletAdaptor;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.Enumeration;
import javax.servlet.http.HttpServletRequest;
import javax.xml.transform.Source;
/**
* @author Donahue Sze
*
*/
public class EbmsPropertiesPageletAdaptor extends AdminPageletAdaptor {
private static final String REQ_PARAM_PROPERTY = "property:";
private String XPATH_DELIVERY_MANAGER = "/ebms/delivery_manager";
private String XPATH_OUTBOX_DELIVERY_MANAGER = "/outbox_delivery_manager";
private String XPATH_INBOX_DELIVERY_MANAGER = "/inbox_delivery_manager";
private String XPATH_DELIVERY_MANAGER_INTERVAL = "/delivery_manager_interval";
private String XPATH_MAX_NUM_THREAD_LIST = "/max_thread_count";
private String XPATH_DIGITAL_SIGNATURE = "/ebms/digital_signature";
private String XPATH_USERNAME = "/username";
private String XPATH_PASSWORD = "/password";
private String XPATH_KEY_STORE_LOCATION = "/key_store_location";
private String XPATH_STORE_TYPE = "/store_type";
private String XPATH_PROVIDER = "/provider";
private String XPATH_MAIL = "/ebms/mail";
private String XPATH_SMTP = "/smtp";
private String XPATH_POP = "/pop";
private String XPATH_HOST = "/host";
private String XPATH_FROM_MAIL_ADDRESS = "/from_mail_address";
private String XPATH_PROTOCOL = "/protocol";
private String XPATH_PORT = "/port";
private String XPATH_FOLDER = "/folder";
private String XPATH_SMIME = "/smime";
private String XPATH_DECRYPTION = "/decryption";
private String XPATH_KEY_STORE_PASSWORD = "/key_store_password";
private String XPATH_ALIAS = "/alias";
private String XPATH_KEY_PASSWORD = "/key_password";
private PropertyTree outboxProperties;
private PropertyTree inboxProperties;
private PropertyTree mailProperties;
private PropertyTree systemProperties;
/*
* (non-Javadoc)
*
* @see hk.hku.cecid.piazza.commons.pagelet.xslt.BorderLayoutPageletAdaptor#getCenterSource(javax.servlet.http.HttpServletRequest)
*/
protected Source getCenterSource(HttpServletRequest request) {
PropertySheet props;
PropertyTree resultDom = new PropertyTree();
try {
URL systemPropertiesUrl = EbmsProcessor.getModuleGroup()
.getSystemModule().getDescriptor();
systemProperties = new PropertyTree(systemPropertiesUrl);
URL outboxPropertiesUrl = EbmsProcessor.getModuleGroup().getModule(
EbmsProcessor.ACTIVE_MODULE_OUTBOX_COLLECTOR)
.getDescriptor();
outboxProperties = new PropertyTree(outboxPropertiesUrl);
URL inboxPropertiesUrl = EbmsProcessor.getModuleGroup().getModule(
EbmsProcessor.ACTIVE_MODULE_INBOX_COLLECTOR)
.getDescriptor();
inboxProperties = new PropertyTree(inboxPropertiesUrl);
URL mailPropertiesUrl = EbmsProcessor.getModuleGroup().getModule(
EbmsProcessor.ACTIVE_MODULE_MAIL_COLLECTOR).getDescriptor();
mailProperties = new PropertyTree(mailPropertiesUrl);
props = getEbmsProperties();
updateEbmsProperties(request, props);
resultDom = getProperties(props);
} catch (Exception e) {
request.setAttribute(ATTR_MESSAGE,
"Unable to process the request: " + e.getMessage());
throw new RuntimeException(
"Error in processing ebms properties pagelet", e);
}
return resultDom.getSource();
}
/**
* @param request
* @throws Exception
*/
private void updateEbmsProperties(HttpServletRequest request,
PropertySheet props) throws Exception {
String requestAction = request.getParameter(REQ_PARAM_ACTION);
if (request.getMethod().equalsIgnoreCase("post")) {
if ("update".equalsIgnoreCase(requestAction)) {
// outbox
String outboxInterval = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DELIVERY_MANAGER
+ XPATH_OUTBOX_DELIVERY_MANAGER
+ XPATH_DELIVERY_MANAGER_INTERVAL);
if (outboxInterval.equals("")) {
request.setAttribute(ATTR_MESSAGE,
"Outbox Collection Interval cannot be empty");
return;
} else if (!isInteger(outboxInterval)) {
request.setAttribute(ATTR_MESSAGE,
"Outbox Collection Interval must be integer");
return;
} else {
outboxProperties
.setProperty(
"/module/parameters/parameter[@name='execution-interval']/@value",
outboxInterval);
}
String outboxMaxThread = request
.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DELIVERY_MANAGER
+ XPATH_OUTBOX_DELIVERY_MANAGER
+ XPATH_MAX_NUM_THREAD_LIST);
if (outboxMaxThread.equals("")) {
request.setAttribute(ATTR_MESSAGE,
"Outbox Maximum Number of Threads cannot be empty");
return;
} else if (!isInteger(outboxMaxThread)) {
request.setAttribute(ATTR_MESSAGE,
"Outbox Maximum Number of Threads must be integer");
return;
} else {
outboxProperties
.setProperty(
"/module/component/parameter[@name='max-thread-count']/@value",
outboxMaxThread);
}
// inbox
String inboxInterval = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DELIVERY_MANAGER + XPATH_INBOX_DELIVERY_MANAGER
+ XPATH_DELIVERY_MANAGER_INTERVAL);
if (inboxInterval.equals("")) {
request.setAttribute(ATTR_MESSAGE,
"Inbox Collection Interval cannot be empty");
return;
} else if (!isInteger(inboxInterval)) {
request.setAttribute(ATTR_MESSAGE,
"Inbox Collection Interval must be integer");
return;
} else {
inboxProperties
.setProperty(
"/module/parameters/parameter[@name='execution-interval']/@value",
inboxInterval);
}
// digital signature
String digitalSignatureKeyStoreLocation = request
.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DIGITAL_SIGNATURE
+ XPATH_KEY_STORE_LOCATION);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-location']/@value",
digitalSignatureKeyStoreLocation);
String digitalSignatureUsername = request
.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DIGITAL_SIGNATURE + XPATH_USERNAME);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-signature']/parameter[@name='key-alias']/@value",
digitalSignatureUsername);
String digitalSignaturePassword = request
.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DIGITAL_SIGNATURE + XPATH_PASSWORD);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-password']/@value",
digitalSignaturePassword);
String digitalSignatureStoreType = request
.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DIGITAL_SIGNATURE + XPATH_STORE_TYPE);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-type']/@value",
digitalSignatureStoreType);
String digitalSignatureProvider = request
.getParameter(REQ_PARAM_PROPERTY
+ XPATH_DIGITAL_SIGNATURE + XPATH_PROVIDER);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-provider']/@value",
digitalSignatureProvider);
// smtp
String smtpHost = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMTP + XPATH_HOST);
props.setProperty(XPATH_MAIL + XPATH_SMTP + XPATH_HOST,
smtpHost);
String smtpProtocol = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMTP + XPATH_PROTOCOL);
props.setProperty(XPATH_MAIL + XPATH_SMTP + XPATH_PROTOCOL,
smtpProtocol);
String smtpPort = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMTP + XPATH_PORT);
if (!smtpPort.equals("")) {
if (!isInteger(smtpPort)) {
request.setAttribute(ATTR_MESSAGE,
"SMTP Port must be integer");
return;
} else {
props.setProperty(XPATH_MAIL + XPATH_SMTP + XPATH_PORT,
smtpPort);
}
}
String smtpFromMailAddress = request
.getParameter(REQ_PARAM_PROPERTY + XPATH_MAIL
+ XPATH_SMTP + XPATH_FROM_MAIL_ADDRESS);
props.setProperty(XPATH_MAIL + XPATH_SMTP
+ XPATH_FROM_MAIL_ADDRESS, smtpFromMailAddress);
String smtpUserName = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMTP + XPATH_USERNAME);
props.setProperty(XPATH_MAIL + XPATH_SMTP + XPATH_USERNAME,
smtpUserName);
String smtpPassword = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMTP + XPATH_PASSWORD);
props.setProperty(XPATH_MAIL + XPATH_SMTP + XPATH_PASSWORD,
smtpPassword);
// pop
String popHost = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP + XPATH_HOST);
props.setProperty(XPATH_MAIL + XPATH_POP + XPATH_HOST, popHost);
String popProtocol = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP + XPATH_PROTOCOL);
props.setProperty(XPATH_MAIL + XPATH_POP + XPATH_PROTOCOL,
popProtocol);
String popPort = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP + XPATH_PORT);
if (!popPort.equals("")) {
if (!isInteger(popPort)) {
request.setAttribute(ATTR_MESSAGE,
"POP Port must be integer");
return;
} else {
props.setProperty(XPATH_MAIL + XPATH_POP + XPATH_PORT,
popPort);
}
}
String popFolder = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP + XPATH_FOLDER);
props.setProperty(XPATH_MAIL + XPATH_POP + XPATH_FOLDER,
popFolder);
String popUserName = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP + XPATH_USERNAME);
props.setProperty(XPATH_MAIL + XPATH_POP + XPATH_USERNAME,
popUserName);
String popPassword = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP + XPATH_PASSWORD);
props.setProperty(XPATH_MAIL + XPATH_POP + XPATH_PASSWORD,
popPassword);
String mailInterval = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_POP
+ XPATH_DELIVERY_MANAGER_INTERVAL);
if (mailInterval.equals("")) {
request.setAttribute(ATTR_MESSAGE,
"POP Mail Polling Interval cannot be empty");
return;
} else if (!isInteger(mailInterval)) {
request.setAttribute(ATTR_MESSAGE,
"POP Mail Polling Interval must be integer");
return;
} else {
mailProperties
.setProperty(
"/module/parameters/parameter[@name='execution-interval']/@value",
mailInterval);
}
// smime decryption
String smimeKeyStoreLocation = request
.getParameter(REQ_PARAM_PROPERTY + XPATH_MAIL
+ XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_KEY_STORE_LOCATION);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-location']/@value",
smimeKeyStoreLocation);
String smimeKeyStorePassword = request
.getParameter(REQ_PARAM_PROPERTY + XPATH_MAIL
+ XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_KEY_STORE_PASSWORD);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-password']/@value",
smimeKeyStorePassword);
String smimeAlias = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_ALIAS);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-decryption']/parameter[@name='key-alias']/@value",
smimeAlias);
String smimeKeyPassword = request
.getParameter(REQ_PARAM_PROPERTY + XPATH_MAIL
+ XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_KEY_PASSWORD);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-decryption']/parameter[@name='key-password']/@value",
smimeKeyPassword);
String smimeStoreType = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_STORE_TYPE);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-type']/@value",
smimeStoreType);
String smimeProvider = request.getParameter(REQ_PARAM_PROPERTY
+ XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_PROVIDER);
systemProperties
.setProperty(
"/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-provider']/@value",
smimeProvider);
if ("update".equalsIgnoreCase(requestAction)) {
outboxProperties.store();
inboxProperties.store();
mailProperties.store();
systemProperties.store();
props.store();
request.setAttribute(ATTR_MESSAGE,
"Ebms properties updated successfully");
}
}
}
}
/**
* @param dom
*/
private PropertyTree getProperties(PropertySheet props) {
// construct the return xml from ebms.properties.xml and
// set current thread count & peek thread count to the return xml
// this two elements will not saved on the ebms.properties.xml
PropertyTree resultDom = new PropertyTree();
Enumeration names = props.propertyNames();
while (names.hasMoreElements()) {
String name = names.nextElement().toString();
resultDom.setProperty(name, props.getProperty(name));
}
String outboxMaxThread = outboxProperties
.getProperty("/module/component/parameter[@name='max-thread-count']/@value");
resultDom.setProperty(XPATH_DELIVERY_MANAGER
+ XPATH_OUTBOX_DELIVERY_MANAGER + XPATH_MAX_NUM_THREAD_LIST,
outboxMaxThread);
String outboxInterval = outboxProperties
.getProperty("/module/parameters/parameter[@name='execution-interval']/@value");
resultDom.setProperty(XPATH_DELIVERY_MANAGER
+ XPATH_OUTBOX_DELIVERY_MANAGER
+ XPATH_DELIVERY_MANAGER_INTERVAL, outboxInterval);
String inboxInterval = inboxProperties
.getProperty("/module/parameters/parameter[@name='execution-interval']/@value");
resultDom.setProperty(XPATH_DELIVERY_MANAGER
+ XPATH_INBOX_DELIVERY_MANAGER
+ XPATH_DELIVERY_MANAGER_INTERVAL, inboxInterval);
String mailInterval = mailProperties
.getProperty("/module/parameters/parameter[@name='execution-interval']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_POP
+ XPATH_DELIVERY_MANAGER_INTERVAL, mailInterval);
// digital signature
String digitalSignatureKeyStoreLocation = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-location']/@value");
resultDom.setProperty(XPATH_DIGITAL_SIGNATURE
+ XPATH_KEY_STORE_LOCATION, digitalSignatureKeyStoreLocation);
String digitalSignatureUsername = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-signature']/parameter[@name='key-alias']/@value");
resultDom.setProperty(XPATH_DIGITAL_SIGNATURE + XPATH_USERNAME,
digitalSignatureUsername);
String digitalSignaturePassword = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-password']/@value");
resultDom.setProperty(XPATH_DIGITAL_SIGNATURE + XPATH_PASSWORD,
digitalSignaturePassword);
String digitalSignatureStoreType = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-type']/@value");
resultDom.setProperty(XPATH_DIGITAL_SIGNATURE + XPATH_STORE_TYPE,
digitalSignatureStoreType);
String digitalSignatureProvider = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-signature']/parameter[@name='keystore-provider']/@value");
resultDom.setProperty(XPATH_DIGITAL_SIGNATURE + XPATH_PROVIDER,
digitalSignatureProvider);
// smime decryption
String smimeKeyStoreLocation = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-location']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_KEY_STORE_LOCATION, smimeKeyStoreLocation);
String smimeKeyStorePassword = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-password']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_KEY_STORE_PASSWORD, smimeKeyStorePassword);
String smimeAlias = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-decryption']/parameter[@name='key-alias']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_ALIAS, smimeAlias);
String smimeKeyPassword = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-decryption']/parameter[@name='key-password']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_KEY_PASSWORD, smimeKeyPassword);
String smimeStoreType = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-type']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_STORE_TYPE, smimeStoreType);
String smimeProvider = systemProperties
.getProperty("/module/component[@id='keystore-manager-for-decryption']/parameter[@name='keystore-provider']/@value");
resultDom.setProperty(XPATH_MAIL + XPATH_SMIME + XPATH_DECRYPTION
+ XPATH_PROVIDER, smimeProvider);
// dynamic information
ActiveMonitor outboxMonitor = ((ActiveTaskModule) EbmsProcessor
.getModuleGroup().getModule("ebms.outbox-collector"))
.getMonitor();
String currentThreadCount = String.valueOf(outboxMonitor
.getThreadCount());
String peekThreadCount = String.valueOf(outboxMonitor
.getPeekThreadCount());
resultDom.setProperty(XPATH_DELIVERY_MANAGER
+ XPATH_OUTBOX_DELIVERY_MANAGER + "/current_thread_count",
currentThreadCount);
resultDom.setProperty(XPATH_DELIVERY_MANAGER
+ XPATH_OUTBOX_DELIVERY_MANAGER + "/peek_thread_count",
peekThreadCount);
return resultDom;
}
/**
* @return
* @throws UtilitiesException
* @throws ComponentException
* @throws MalformedURLException
*/
private PropertySheet getEbmsProperties() throws UtilitiesException,
ComponentException, MalformedURLException {
String ebmsPropertiesPath = EbmsProcessor.getModuleGroup()
.getSystemModule().getComponent("properties").getParameters()
.getProperty("config");
URL url = EbmsProcessor.core.getResource(ebmsPropertiesPath);
PropertySheet propertySheet = new PropertyTree(url);
return propertySheet;
}
/**
* @param value
* @return
*/
private boolean isInteger(String value) {
try {
Integer.valueOf(value);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}