sDefPID = Server.getPID(sDefPID).toString();
long initStartTime = new Date().getTime();
long startTime = new Date().getTime();
long stopTime;
long interval;
ServiceDeploymentReader deploymentReader = null;
DOReader reader =
m_manager.getReader(asOfDateTime == null, context, PID);
String authzAux_objState = reader.GetObjectState();
// DYNAMIC!! If service deployment is defined as dynamic, then
// perform the dissemination via the DynamicAccess module.
if (m_dynamicAccess.isDynamicService(context, PID, sDefPID)) {
m_authorizationModule.enforceGetDissemination(context,
PID,
sDefPID,
methodName,
asOfDateTime,
authzAux_objState,
"A",
"fedora-system:4",
"A",
"A");
MIMETypedStream retVal =
m_dynamicAccess.getDissemination(context,
PID,
sDefPID,
methodName,
userParms,
asOfDateTime);
stopTime = new Date().getTime();
interval = stopTime - startTime;
logger.debug("Roundtrip DynamicDisseminator: " + interval
+ " milliseconds.");
return retVal;
}
/*
* Find the service deployment that is contractor for a model this
* object has, and deploys the requested service. If object<->model
* mappings are ever stored in the registry, this may be simplified.
*/
String serviceDeploymentPID = null;
for (String cModelURI: reader.getContentModels()){
String cModelPID = cModelURI.substring("info:fedora/".length());
/*
for (RelationshipTuple rel : reader.getRelationships(MODEL.HAS_MODEL,
null)) {
String cModelPID = rel.getObjectPID();
*/
String foundDeploymentPID =
m_manager.lookupDeploymentForCModel(cModelPID, sDefPID);
if (foundDeploymentPID != null) {
if (serviceDeploymentPID != null
&& !foundDeploymentPID.equals(serviceDeploymentPID)) {
throw new DisseminationException("More than one deployment ("
+ foundDeploymentPID
+ ", "
+ serviceDeploymentPID
+ ") found for service "
+ sDefPID
+ " in model "
+ cModelPID);
}
serviceDeploymentPID = foundDeploymentPID;
} else {
logger.debug("No deployment for (" + cModelPID + ", " + sDefPID
+ ")");
}
}
if (serviceDeploymentPID != null) {
deploymentReader =
m_manager.getServiceDeploymentReader(false,
context,
serviceDeploymentPID);
}
ServiceDefinitionReader sDefReader =
m_manager.getServiceDefinitionReader(asOfDateTime == null,
context,
sDefPID);
String authzAux_sdefState = sDefReader.GetObjectState();
String authzAux_dissState = "unknown";
/*
* if reader is null, it means that no suitable deployments have been
* found. This can happen if (a), the object does not have any models
* that have that service, or (b) the object has a suitable model, but
* no implementation of that service has been deployed. We do a bit of
* checking here to determine which case this represents, as the error
* message could be very useful.
*/
if (deploymentReader == null) {
boolean suitableModelFound = false;
String cModelPID = null;
String message = null;
/*
models: for (RelationshipTuple rel : reader
.getRelationships(MODEL.HAS_MODEL, null)) {
cModelPID = rel.getObjectPID();
*/
models: for (String cm:reader.getContentModels()){
cModelPID = cm.substring(12);
/* Skip over system models */
if (Models.contains("info:fedora/" + cModelPID)) {
continue;
}
/* Open up each model and peek at its sDefs for a match */
for (RelationshipTuple r : m_manager.getReader(false,
context,
cModelPID)
.getRelationships(MODEL.HAS_SERVICE, null)) {
if (sDefPID.equals(r.getObjectPID())) {
suitableModelFound = true;
break models;
}
}
}
if (suitableModelFound) {
message =
"Unable to find deployment for service " + sDefPID
+ " on " + reader.GetObjectPID() + " in model "
+ cModelPID;
} else {
message =
reader.GetObjectPID()
+ " does not have a model with service "
+ sDefPID;
}
throw new DisseminatorNotFoundException(message);
}
stopTime = new Date().getTime();
interval = stopTime - startTime;
logger.debug("Roundtrip Looping Diss: " + interval + " milliseconds.");
// Check deployment object state
String authzAux_sDepState = deploymentReader.GetObjectState();
String authzAux_sDepPID = deploymentReader.GetObjectPID();
m_authorizationModule.enforceGetDissemination(context,
PID,
sDefPID,
methodName,
asOfDateTime,
authzAux_objState,
authzAux_sdefState,
authzAux_sDepPID,
authzAux_sDepState,
authzAux_dissState);
// Get method parms
Hashtable<String, String> h_userParms = new Hashtable<String, String>();
MIMETypedStream dissemination = null;
MethodParmDef[] defaultMethodParms = null;
startTime = new Date().getTime();
// Put any user-supplied method parameters into hash table
if (userParms != null) {
for (Property element : userParms) {
h_userParms.put(element.name, element.value);
}
}
// Validate user-supplied parameters
validateUserParms(context,
PID,
sDefPID,
deploymentReader,
methodName,
h_userParms,
asOfDateTime);
stopTime = new Date().getTime();
interval = stopTime - startTime;
logger.debug("Roundtrip Get/Validate User Parms: " + interval
+ " milliseconds.");
startTime = new Date().getTime();
// SDP: GET INFO FROM DEPLOYMENT READER:
// Add any default method parameters to validated user parm list
defaultMethodParms =
deploymentReader
.getServiceMethodParms(methodName, asOfDateTime);
for (int i = 0; i < defaultMethodParms.length; i++) {
if (!defaultMethodParms[i].parmType
.equals(MethodParmDef.DATASTREAM_INPUT)) {
if (!h_userParms.containsKey(defaultMethodParms[i].parmName)) {