diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/modelconstructor/factory/OrganizationToPublicationsForSubOrganizationsFactory.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/modelconstructor/factory/OrganizationToPublicationsForSubOrganizationsFactory.java old mode 100644 new mode 100755 index 6ad5c18b..586ce4e0 --- a/src/edu/cornell/mannlib/vitro/webapp/visualization/modelconstructor/factory/OrganizationToPublicationsForSubOrganizationsFactory.java +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/modelconstructor/factory/OrganizationToPublicationsForSubOrganizationsFactory.java @@ -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.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 ModelFactoryInterface { - + private static final Log log = LogFactory.getLog(OrganizationToPublicationsForSubOrganizationsFactory.class.getName()); @Override public Model getOrCreateModel(String uri, Dataset dataset) throws MalformedQueryParametersException { @@ -21,26 +26,36 @@ public class OrganizationToPublicationsForSubOrganizationsFactory implements .generateModelIdentifier( uri, OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE)); - + if (candidateModel != null) { return candidateModel; } else { - - ModelConstructor model = new OrganizationToPublicationsForSubOrganizationsModelConstructor(uri, dataset); - - Model constructedModel = model.getConstructedModel(); - ConstructedModelTracker.trackModel( - ConstructedModelTracker - .generateModelIdentifier( - uri, - OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE), - constructedModel); - - return constructedModel; + Lock customLock = CustomLock.getInstance().getLock(); + if (customLock.tryLock()) //Acquiring lock if available to construct the model + { + customLock.lock(); + ModelConstructor model = new OrganizationToPublicationsForSubOrganizationsModelConstructor(uri, dataset); + + Model constructedModel = model.getConstructedModel(); + ConstructedModelTracker.trackModel( + ConstructedModelTracker + .generateModelIdentifier( + uri, + OrganizationToPublicationsForSubOrganizationsModelConstructor.MODEL_TYPE), + constructedModel); + customLock.unlock(); + return constructedModel; + } + else + { + log.info("The Model construction process is going on"); + return null; + } + } } } -} + diff --git a/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/CustomLock.java b/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/CustomLock.java new file mode 100644 index 00000000..63439867 --- /dev/null +++ b/src/edu/cornell/mannlib/vitro/webapp/visualization/visutils/CustomLock.java @@ -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; + } +}