package org.ariadne_eu.service;
import javax.servlet.http.HttpServletRequest;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.transport.http.HTTPConstants;
import org.apache.axis2.transport.http.TransportHeaders;
import org.apache.log4j.Logger;
import org.ariadne.config.PropertiesManager;
import org.ariadne_eu.content.insert.InsertContentFactory;
import org.ariadne_eu.metadata.delete.DeleteMetadataFactory;
import org.ariadne_eu.metadata.insert.InsertMetadataException;
import org.ariadne_eu.metadata.insert.InsertMetadataFactory;
import org.ariadne_eu.spi.CreateIdentifier;
import org.ariadne_eu.spi.CreateIdentifierResponse;
import org.ariadne_eu.spi.DeleteMetadataRecord;
import org.ariadne_eu.spi.DeleteResource;
import org.ariadne_eu.spi.FaultCodeType;
import org.ariadne_eu.spi.SPISkeleton;
import org.ariadne_eu.spi.SpiFault;
import org.ariadne_eu.spi.SpiFaultException;
import org.ariadne_eu.spi.SubmitMetadataRecord;
import org.ariadne_eu.spi.SubmitResource;
import org.ariadne_eu.utils.config.RepositoryConstants;
import org.safehaus.uuid.EthernetAddress;
import org.safehaus.uuid.UUID;
import org.safehaus.uuid.UUIDGenerator;
import be.cenorm.www.SessionExpiredException;
import be.cenorm.www.Ticket;
/**
* Created by ben
* Date: 6-jan-2007
* Time: 17:18:57
* To change this template use File | Settings | File Templates.
*/
public class SPIImplementation extends SPISkeleton {
private static Logger log = Logger.getLogger(SPIImplementation.class);
public void deleteResource(DeleteResource deleteResource)
throws SpiFaultException {
log.info("deleteResource:identifier="+deleteResource.getGlobalIdentifier()+",sessionID="+deleteResource.getTargetSessionID());
SpiFault fault = new SpiFault();
// fault.setSpiFaultCode(SpiFaultCodeType.SPI_00000);
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("Method not supported: deleteResource");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
}
public void deleteMetadataRecord(DeleteMetadataRecord deleteMetadataRecord) throws SpiFaultException {
try {
log.info("deleteMetadataRecord:identifier=" + deleteMetadataRecord.getGlobalIdentifier() + ",sessionID=" + deleteMetadataRecord.getTargetSessionID());
Ticket ticket = Ticket.getTicket(deleteMetadataRecord.getTargetSessionID());
checkValidTicket(ticket);
DeleteMetadataFactory.deleteMetadata(deleteMetadataRecord.getGlobalIdentifier());
} catch (SessionExpiredException e) {
log.error("deleteMetadataRecord:identifier=" + deleteMetadataRecord.getGlobalIdentifier() + ",sessionID=" + deleteMetadataRecord.getTargetSessionID());
SpiFault fault = new SpiFault();
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("The given session ID is invalid");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public CreateIdentifierResponse createIdentifier(CreateIdentifier createIdentifier) throws SpiFaultException {
try {
log.info("createIdentifier:sessionID="+createIdentifier.getTargetSessionID());
Ticket ticket = Ticket.getTicket(createIdentifier.getTargetSessionID()); //throws exception if no valid ticket exists
checkValidTicket(ticket);
UUIDGenerator uuidGenerator = UUIDGenerator.getInstance();
EthernetAddress ethernetAddress = uuidGenerator.getDummyAddress();
UUID uuid = uuidGenerator.generateTimeBasedUUID(ethernetAddress);
CreateIdentifierResponse response = new CreateIdentifierResponse();
response.setLocalIdentifier(uuid.toString());
log.info("createIdentifier:identifier="+response.getLocalIdentifier()+",sessionID="+createIdentifier.getTargetSessionID());
return response;
} catch (SessionExpiredException e) {
log.error("createIdentifier: ", e);
SpiFault fault = new SpiFault();
// fault.setSpiFaultCode(SpiFaultCodeType.SPI_00000);
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("The given session ID is invalid");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void submitResource(SubmitResource submitResource) throws SpiFaultException {
try {
String fIP = ((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)).getRemoteAddr();
String oIP = remoteAddr(((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)));
TransportHeaders th = (TransportHeaders)(MessageContext.getCurrentMessageContext().getProperty("TRANSPORT_HEADERS"));
String userAgent = (String) th.get("user-agent");
String host = (String) th.get("host");
log.info("submitResource:identifier="+submitResource.getGlobalIdentifier()+",sessionID="+submitResource.getTargetSessionID()+",Forwarding IP="+fIP+",Original IP="+oIP+",User-Agent="+userAgent+",Host="+host);
Ticket ticket = Ticket.getTicket(submitResource.getTargetSessionID()); //throws exception if no valid ticket exists
checkValidTicket(ticket);
/*boolean success = */InsertContentFactory.insertContent(submitResource.getGlobalIdentifier(), submitResource.getBinaryData().getBase64Binary(), "", "");
// if (!success) {
// log.warn("submitResource:identifier="+submitResource.getGlobalIdentifier()+",sessionID="+submitResource.getTargetSessionID()+ " submit failed");
// SpiFault fault = new SpiFault();
// fault.setSpiFaultCode(SpiFaultCodeType.SPI_00000);
// fault.setMessage("Method not supported: submitResource");
// SpiFaultException exception = new SpiFaultException();
// exception.setFaultMessage(fault);
// throw exception;
// }
} catch (SessionExpiredException e) {
log.error("submitResource: ", e);
SpiFault fault = new SpiFault();
// fault.setSpiFaultCode(SpiFaultCodeType.SPI_00000);
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("The given session ID is invalid");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void submitMetadataRecord(SubmitMetadataRecord submitMetadataRecord) throws SpiFaultException {
try {
String fIP = ((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)).getRemoteAddr();
String oIP = remoteAddr(((HttpServletRequest)MessageContext.getCurrentMessageContext().getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST)));
TransportHeaders th = (TransportHeaders)(MessageContext.getCurrentMessageContext().getProperty("TRANSPORT_HEADERS"));
String userAgent = (String) th.get("user-agent");
String host = (String) th.get("host");
log.info("submitMetadataRecord:identifier="+submitMetadataRecord.getGlobalIdentifier()+",sessionID="+submitMetadataRecord.getTargetSessionID()+",Forwarding IP="+fIP+",Original IP="+oIP+",User-Agent="+userAgent+",Host="+host);
Ticket ticket = Ticket.getTicket(submitMetadataRecord.getTargetSessionID()); //throws exception if no valid ticket exists
checkValidTicket(ticket);
log.debug("submitMetadataRecord:metadata="+submitMetadataRecord.getMetadata());
InsertMetadataFactory.insertMetadata(submitMetadataRecord.getGlobalIdentifier(), submitMetadataRecord.getMetadata(),"ARIADNE");
} catch (SessionExpiredException e) {
log.error("submitMetadataRecord: ", e);
SpiFault fault = new SpiFault();
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("The given session ID is invalid");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
} catch (InsertMetadataException e) {
log.error("submitMetadataRecord: ", e);
SpiFault fault = new SpiFault();
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("Insertion has not been executed");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
public void setDataFormat(java.lang.String targetSessionID, java.lang.String dataFormatID) throws SpiFaultException {
}
private void checkValidTicket(Ticket ticket) throws SpiFaultException {
if (ticket.getParameter("username") == null ||
!ticket.getParameter("username").equalsIgnoreCase(PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().REPO_USERNAME)) ||
ticket.getParameter("password") == null ||
!ticket.getParameter("password").equalsIgnoreCase(PropertiesManager.getInstance().getProperty(RepositoryConstants.getInstance().REPO_PASSWORD))) {
SpiFault fault = new SpiFault();
// fault.setSpiFaultCode(SpiFaultCodeType.SPI_00000);
fault.setSpiFaultCode(FaultCodeType.SPI_00000);
fault.setMessage("The given session ID is invalid");
SpiFaultException exception = new SpiFaultException();
exception.setFaultMessage(fault);
throw exception;
}
}
private String remoteAddr(HttpServletRequest request) {
String remoteAddr = request.getRemoteAddr();
String x;
if ((x = request.getHeader(RepositoryConstants.getInstance().HEADER_X_FORWARDED_FOR)) != null) {
remoteAddr = x;
int idx = remoteAddr.indexOf(',');
if (idx > -1) {
remoteAddr = remoteAddr.substring(0, idx);
}
}
return remoteAddr;
}
}