/*
* Created on : 07-11-2013
* Author : Bastian Weinlich
*/
package de.hpi.i2b2.girix;
import java.io.File;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;
import de.hpi.i2b2.girix.datavo.i2b2message.BodyType;
import de.hpi.i2b2.girix.datavo.i2b2message.MessageHeaderType;
import de.hpi.i2b2.girix.datavo.i2b2message.RequestMessageType;
import de.hpi.i2b2.girix.datavo.i2b2message.ResponseHeaderType;
import de.hpi.i2b2.girix.datavo.i2b2message.ResponseMessageType;
import de.hpi.i2b2.girix.datavo.girixconfig.RscriptletType;
import de.hpi.i2b2.girix.datavo.girixmessages.RScriptletsType;
import edu.harvard.i2b2.common.exception.I2B2Exception;
// This class coordinates the main work for the GetRScriptlets job
public class GetRScriptletsRequestHandler implements RequestHandler{
private static Log log = LogFactory.getLog(GetRScriptletsRequestHandler.class);
public String handleRequest(RequestMessageType input) throws I2B2Exception {
// Request body doesn't matter (and is probably empty). So ignore it
// Build 'RScriptlets' (jaxb) object (to add RScriptlet nodes)
de.hpi.i2b2.girix.datavo.girixmessages.ObjectFactory girixmesFac = new de.hpi.i2b2.girix.datavo.girixmessages.ObjectFactory();
RScriptletsType girixsType = girixmesFac.createRScriptletsType();
// Open scriptlet directory and check for errors
File scriptletdirectory = new File(GIRIXUtil.getRSCRIPTLETPATH());
if (! scriptletdirectory.exists()) {
String scriptletdirerror = "Scriptlet directory error: Does not exist. Path: " + GIRIXUtil.getRSCRIPTLETPATH();
log.error(scriptletdirerror);
throw new I2B2Exception("Error delivered from server: " + scriptletdirerror);
}
if (! scriptletdirectory.isDirectory()) {
String scriptletdirerror = "Scriptlet directory error: Not a directory. Path: " + GIRIXUtil.getRSCRIPTLETPATH();
log.error(scriptletdirerror);
throw new I2B2Exception("Error delivered from server: " + scriptletdirerror);
}
if (! scriptletdirectory.canRead()) {
String scriptletdirerror = "Scriptlet directory error: No access rights for reading. Path: " + GIRIXUtil.getRSCRIPTLETPATH();
log.error(scriptletdirerror);
throw new I2B2Exception("Error delivered from server: " + scriptletdirerror);
}
// For every subdirectory
String faultyConfigFiles = "";
for (File f : scriptletdirectory.listFiles()) {
if ( ! f.isDirectory()) continue;
boolean hasMainScriptFile = false;
for (File s : f.listFiles()) {
hasMainScriptFile |= s.getName().equals("mainscript.r");
}
if (!hasMainScriptFile) continue;
String subdirectorypath = f.getPath();
// Validate config file against XML schema and unmarshall into a JAXB Object
RscriptletType girixType = null;
try {
girixType = GIRIXUtil.validateAndUnmarshallScriptletConfigFile(subdirectorypath, f.getName());
} catch (SAXException e) {
// If config file is invalid -> Append hint to faultyConfigFiles and skip this scriptlet
faultyConfigFiles += f.getName() + "\nError message: " + e.getMessage() + "\n\n";
continue;
}
if (girixType == null) {
String errMsg = "Error during config file validation (girixType==null)";
log.error(errMsg);
throw new I2B2Exception("Error delivered from server " + errMsg);
}
// Error case: <settings> part is missing
if (girixType.getSettings() == null) {
de.hpi.i2b2.girix.datavo.girixconfig.ObjectFactory confmesFac = new de.hpi.i2b2.girix.datavo.girixconfig.ObjectFactory();
girixType.setSettings(confmesFac.createSettingsType());
}
// Add subdirectory name
girixType.getSettings().setSubdirectory(f.getName());
// Add girixscriptlet object to rscriptlets object (=container)
girixsType.getRscriptlet().add(girixType);
}
// Assemble response message and return it
ResponseHeaderType respHeaderType = MessageUtil.createResponseHeaderType("DONE", "Processing completed");
de.hpi.i2b2.girix.datavo.i2b2message.ObjectFactory i2b2mesFac = new de.hpi.i2b2.girix.datavo.i2b2message.ObjectFactory();
BodyType bodType = i2b2mesFac.createBodyType();
girixsType.setFaultyScriptlets(faultyConfigFiles);
bodType.getAny().add(girixmesFac.createRScriptlets(girixsType));
MessageHeaderType mesHead = MessageUtil.createResponseMessageHeaderType(input.getMessageHeader());
ResponseMessageType respMessageType = MessageUtil.createResponseMessageType(mesHead, respHeaderType, bodType);
String response = MessageUtil.convertResponseMessageTypeToXML(respMessageType);
return response;
}
}