package hk.hku.cecid.edi.sfrm.spa;
import java.util.HashMap;
import java.util.List;
import hk.hku.cecid.piazza.commons.module.ModuleException;
import hk.hku.cecid.piazza.commons.module.ModuleGroup;
import hk.hku.cecid.piazza.commons.module.PluginProcessor;
import hk.hku.cecid.piazza.commons.os.OSManager;
import hk.hku.cecid.piazza.commons.security.KeyStoreManager;
import hk.hku.cecid.piazza.commons.spa.Plugin;
import hk.hku.cecid.piazza.commons.spa.PluginException;
import hk.hku.cecid.edi.sfrm.handler.AcknowledgementHandler;
import hk.hku.cecid.edi.sfrm.handler.MessageStatusQueryHandler;
import hk.hku.cecid.edi.sfrm.handler.SFRMExternalRequestHandler;
import hk.hku.cecid.edi.sfrm.handler.SFRMMessageHandler;
import hk.hku.cecid.edi.sfrm.handler.SFRMMessageSegmentHandler;
import hk.hku.cecid.edi.sfrm.handler.SFRMPartnershipHandler;
import hk.hku.cecid.edi.sfrm.handler.IncomingMessageHandler;
import hk.hku.cecid.edi.sfrm.pkg.SFRMConstant;
import hk.hku.cecid.edi.sfrm.com.PackagedPayloadsRepository;
import hk.hku.cecid.edi.sfrm.com.PayloadsRepository;
import hk.hku.cecid.edi.sfrm.dao.SFRMMessageDVO;
/**
* The SFRM SPA plugin processor for initiating and containing the references to all SFRM components.<br><br>
*
* Creation Date: 27/9/2006
*
* @author Twinsen, Philip
* @version 2.0.0
* @since 1.5
*/
public class SFRMProcessor extends PluginProcessor {
protected static ModuleGroup moduleGroup;
private static SFRMProcessor processor;
public static SFRMProcessor getInstance() throws ModuleException{
if (processor == null)
throw new ModuleException("SFRMProcessor didn't initialized");
return processor;
}
protected ModuleGroup getModuleGroupImpl(){
return moduleGroup;
}
protected void setModuleGroupImpl(ModuleGroup mg){
moduleGroup = mg;
}
public void processActivation(Plugin plugin) throws PluginException {
processor = this;
super.processActivation(plugin);
// suspendProcessingMessage();
// adjust();
}
/**
* Suspend the message which is in processing and segmenting status in the previous SFRM running session
* @throws PluginException
*/
private void suspendProcessingMessage() throws PluginException{
getLogger().debug("enter the suspend message");
//Retrieve the processing message
SFRMMessageHandler msgHandler = getMessageHandler();
try{
List psMsgs = msgHandler.retrieveMessages(SFRMConstant.MSGBOX_OUT, SFRMConstant.MSGS_PROCESSING);
List msgs = msgHandler.retrieveMessages(SFRMConstant.MSGBOX_OUT, SFRMConstant.MSGS_SEGMENTING);
msgs.addAll(psMsgs);
SFRMExternalRequestHandler reqHandler = getExternalRequestHandler();
for(int i=0; msgs.size() > i ;i++){
SFRMMessageDVO msgDVO = (SFRMMessageDVO) msgs.get(i);
SFRMProcessor.getInstance().getLogger().debug("msg id: " + msgDVO.getMessageId() + " need to be suspend");
reqHandler.suspendMessage(msgDVO.getMessageId());
}
}catch(Exception e){
throw new PluginException("Error when suspending the processing and segmenting message from previous SFRM session", e);
}
}
public SFRMMessageHandler getMessageHandler() {
return (SFRMMessageHandler)getSystemComponent("message-handler");
}
public SFRMMessageSegmentHandler getMessageSegmentHandler(){
return (SFRMMessageSegmentHandler)getSystemComponent("message-segment-handler");
}
public IncomingMessageHandler getIncomingMessageHandler(){
return (IncomingMessageHandler)getSystemComponent("incoming-message-handler");
}
public AcknowledgementHandler getAcknowledgementHandler(){
return (AcknowledgementHandler)getSystemComponent("acknowledgement-handler");
}
public SFRMExternalRequestHandler getExternalRequestHandler(){
return (SFRMExternalRequestHandler)getSystemComponent("external-request-handler");
}
public MessageStatusQueryHandler getMessageSpeedQueryHandler(){
return (MessageStatusQueryHandler)getSystemComponent("message-status-query-handler");
}
public PayloadsRepository getIncomingRepository() {
return (PayloadsRepository)getSystemComponent("incoming-payload-repository");
}
public PackagedPayloadsRepository getOutgoingRepository() {
return (PackagedPayloadsRepository)getSystemComponent("outgoing-payload-repository");
}
public KeyStoreManager getKeyStoreManager() {
return (KeyStoreManager)getSystemComponent("keystore-manager");
}
public SFRMPartnershipHandler getPartnershipHandler() {
return (SFRMPartnershipHandler)getSystemComponent("partnership-handler");
}
public OSManager getOSManager(){
return (OSManager)getSystemComponent("os-manager");
}
//TODO: will review the need of locking mechanism
/**
* The internal guard lock for each message.
*/
private static transient HashMap guardLock = new HashMap();
/**
* [@SYNCRHONIZED] Create a Global lock for a particular key.<br/><br/>
*
* @param key
*/
public static synchronized Object createLock(String key){
Object obj = new Object();
guardLock.put(key, obj);
return obj;
}
/**
* [@SYNCRHONIZED] Get a global lock for a particular key.
*/
public static synchronized Object getLock(String key){
return guardLock.get(key);
}
/**
* [@SYNCRHONIZED] Remove a global lock for a particular key.
*
* @param key
*/
public static synchronized void removeLock(String key){
guardLock.remove(key);
}
// private void adjust(){
// ActiveTaskModule am = (ActiveTaskModule) this.getModuleGroup().getModule("sfrm.outgoing.segment.collector");
// long segmentSize = SFRMProperties.getPayloadSegmentSize();
// long maxSpeed = SFRMProperties.getSpeedMaximum();
// int threadCount = StringUtilities.parseInt(am.getComponent("task-list").getParameters().getProperty("max-thread-count"), 5);
// long expectedExecInterval = ((segmentSize/1024)*threadCount)/maxSpeed;
// am.setExecutionInterval(expectedExecInterval);
// }
}