Merge pull request #3 from mchid/develop

Adding fix for Map of science visualization problem
This commit is contained in:
Jim Blake 2013-06-14 09:58:39 -07:00
commit 9ada4eb84f
2 changed files with 58 additions and 15 deletions

View file

@ -9,9 +9,14 @@ import edu.cornell.mannlib.vitro.webapp.visualization.modelconstructor.Organizat
import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.ConstructedModelTracker; import edu.cornell.mannlib.vitro.webapp.visualization.valueobjects.ConstructedModelTracker;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.ModelConstructor; import edu.cornell.mannlib.vitro.webapp.visualization.visutils.ModelConstructor;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.logging.Log;
import java.util.concurrent.locks.Lock;
import edu.cornell.mannlib.vitro.webapp.visualization.visutils.CustomLock;
public class OrganizationToPublicationsForSubOrganizationsFactory implements public class OrganizationToPublicationsForSubOrganizationsFactory implements
ModelFactoryInterface { ModelFactoryInterface {
private static final Log log = LogFactory.getLog(OrganizationToPublicationsForSubOrganizationsFactory.class.getName());
@Override @Override
public Model getOrCreateModel(String uri, Dataset dataset) public Model getOrCreateModel(String uri, Dataset dataset)
throws MalformedQueryParametersException { throws MalformedQueryParametersException {
@ -21,26 +26,36 @@ public class OrganizationToPublicationsForSubOrganizationsFactory implements
.generateModelIdentifier( .generateModelIdentifier(
uri, uri,
OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE)); OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE));
if (candidateModel != null) { if (candidateModel != null) {
return candidateModel; return candidateModel;
} else { } else {
Lock customLock = CustomLock.getInstance().getLock();
ModelConstructor model = new OrganizationToPublicationsForSubOrganizationsModelConstructor(uri, dataset); if (customLock.tryLock()) //Acquiring lock if available to construct the model
{
Model constructedModel = model.getConstructedModel(); customLock.lock();
ConstructedModelTracker.trackModel( ModelConstructor model = new OrganizationToPublicationsForSubOrganizationsModelConstructor(uri, dataset);
ConstructedModelTracker
.generateModelIdentifier( Model constructedModel = model.getConstructedModel();
uri, ConstructedModelTracker.trackModel(
OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE), ConstructedModelTracker
constructedModel); .generateModelIdentifier(
uri,
return constructedModel; OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE),
constructedModel);
customLock.unlock();
return constructedModel;
}
else
{
log.info("The Model construction process is going on");
return null;
}
}
} }
} }
}

View file

@ -0,0 +1,28 @@
package edu.cornell.mannlib.vitro.webapp.visualization.visutils;
import java.util.concurrent.locks.ReentrantLock;
import java.util.concurrent.locks.Lock;
/* This class is a singleton implementation for locking the concurrent
construction of the models to resolve concurrency issue*/
public final class CustomLock{
private static final CustomLock instance = new CustomLock();
private static Lock lock;
private CustomLock()
{
this.lock = new ReentrantLock();
}
public static CustomLock getInstance()
{
return instance;
}
public static Lock getLock()
{
return lock;
}
}