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);
}