From 6bb9980fc3a31fdc80a9e10b1c1a79cf8b1316aa Mon Sep 17 00:00:00 2001 From: jeb228 Date: Thu, 29 Jul 2010 13:27:35 +0000 Subject: [PATCH] NIHVIVO-962 Merge 5536 from branch --- .../updater/AllThumbsAdjuster.java | 19 ++---- .../updater/DeadEndPropertyRemover.java | 15 ++--- .../filestorage/updater/FsuScanner.java | 4 ++ .../updater/ImageSchemaTranslater.java | 4 +- .../filestorage/updater/ModelWrapper.java | 45 +++++++++++++ .../updater/MultiplePropertyRemover.java | 14 ++--- .../filestorage/updater/NoThumbsAdjuster.java | 18 ++---- .../updater/NonLiteralPropertyRemover.java | 35 +++++------ .../filestorage/updater/ResourceWrapper.java | 63 +++++++++++++++++++ 9 files changed, 147 insertions(+), 70 deletions(-) create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ModelWrapper.java create mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ResourceWrapper.java diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/AllThumbsAdjuster.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/AllThumbsAdjuster.java index e0973b606..129213c5f 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/AllThumbsAdjuster.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/AllThumbsAdjuster.java @@ -5,7 +5,6 @@ package edu.cornell.mannlib.vitro.webapp.filestorage.updater; import java.io.File; import java.io.IOException; -import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; /** @@ -28,17 +27,11 @@ public class AllThumbsAdjuster extends FsuScanner { updateLog.section("Creating main images for thumbnails " + "that have none."); - ResIterator haveThumb = model.listResourcesWithProperty(thumbProperty); - try { - while (haveThumb.hasNext()) { - Resource resource = haveThumb.next(); - - if (resource.getProperty(imageProperty) == null) { - createMainImageFromThumbnail(resource); - } + for (Resource resource : ModelWrapper.listResourcesWithProperty(model, + thumbProperty)) { + if (ResourceWrapper.getProperty(resource, imageProperty) == null) { + createMainImageFromThumbnail(resource); } - } finally { - haveThumb.close(); } } @@ -62,12 +55,10 @@ public class AllThumbsAdjuster extends FsuScanner { File mainFile = imageDirectoryWithBackup.getNewfile(mainFilename); mainFile = checkNameConflicts(mainFile); FileUtil.copyFile(thumbFile, mainFile); - - resource.addProperty(imageProperty, mainFilename); + ResourceWrapper.addProperty(resource, imageProperty, mainFilename); } catch (IOException e) { updateLog.error(resource, "failed to create main file '" + mainFilename + "'", e); } } - } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/DeadEndPropertyRemover.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/DeadEndPropertyRemover.java index b8e329402..f81a1c0e3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/DeadEndPropertyRemover.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/DeadEndPropertyRemover.java @@ -7,7 +7,6 @@ import java.io.File; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; @@ -39,14 +38,9 @@ public class DeadEndPropertyRemover extends FsuScanner { * Check all of the individuals that possess this property. */ private void removeDeadEndProperties(Property prop, String label) { - ResIterator resources = model.listResourcesWithProperty(prop); - try { - while (resources.hasNext()) { - Resource resource = resources.next(); - removeDeadEndPropertiesFromResource(resource, prop, label); - } - } finally { - resources.close(); + for (Resource resource : ModelWrapper.listResourcesWithProperty(model, + prop)) { + removeDeadEndPropertiesFromResource(resource, prop, label); } } @@ -67,7 +61,8 @@ public class DeadEndPropertyRemover extends FsuScanner { "removing link to " + label + " '" + filename + "': file does not exist at '" + file.getAbsolutePath() + "'."); - model.remove(stmt); + + ModelWrapper.removeStatement(model, stmt); } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/FsuScanner.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/FsuScanner.java index 6a1e6b59e..e0549d66e 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/FsuScanner.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/FsuScanner.java @@ -13,6 +13,7 @@ import com.hp.hpl.jena.rdf.model.RDFNode; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.shared.Lock; /** * Base class for the tools that scan the model. Holds some useful fields and @@ -66,6 +67,8 @@ public abstract class FsuScanner { */ protected List getStatements(Resource resource, Property property) { List list = new ArrayList(); + + resource.getModel().enterCriticalSection(Lock.READ); StmtIterator stmts = resource.listProperties(property); try { while (stmts.hasNext()) { @@ -73,6 +76,7 @@ public abstract class FsuScanner { } } finally { stmts.close(); + resource.getModel().leaveCriticalSection(); } return list; } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ImageSchemaTranslater.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ImageSchemaTranslater.java index 047aa2fd4..753bba376 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ImageSchemaTranslater.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ImageSchemaTranslater.java @@ -81,7 +81,7 @@ public class ImageSchemaTranslater extends FsuScanner { translateMainImage(resource, mainImages.get(0)); translated.add(mainImages.get(0)); - resource.removeAll(imageProperty); + ResourceWrapper.removeAll(resource, imageProperty); List thumbnails = getValues(resource, thumbProperty); if (thumbnails.size() != 1) { @@ -92,7 +92,7 @@ public class ImageSchemaTranslater extends FsuScanner { translateThumbnail(resource, thumbnails.get(0)); translated.add(thumbnails.get(0)); - resource.removeAll(thumbProperty); + ResourceWrapper.removeAll(resource, thumbProperty); } /** diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ModelWrapper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ModelWrapper.java new file mode 100644 index 000000000..a2f22bf0b --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ModelWrapper.java @@ -0,0 +1,45 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.filestorage.updater; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.hp.hpl.jena.rdf.model.Model; +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.ResIterator; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.shared.Lock; + +/** + * Utility methods that operate against the Model with proper locks. + */ +public class ModelWrapper { + + public static Collection listResourcesWithProperty(Model model, + Property property) { + List list = new ArrayList(); + ResIterator iterator = model.listResourcesWithProperty(property); + try { + while (iterator.hasNext()) { + Resource resource = iterator.next(); + list.add(resource); + } + } finally { + iterator.close(); + } + return list; + } + + public static void removeStatement(Model model, Statement stmt) { + model.enterCriticalSection(Lock.WRITE); + try { + model.remove(stmt); + } finally { + model.leaveCriticalSection(); + } + } + +} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/MultiplePropertyRemover.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/MultiplePropertyRemover.java index e2161f7da..4148943fa 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/MultiplePropertyRemover.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/MultiplePropertyRemover.java @@ -7,7 +7,6 @@ import java.util.List; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; @@ -37,14 +36,9 @@ public class MultiplePropertyRemover extends FsuScanner { * Check each resource that has this property. */ public void removeExtraProperties(Property prop, String label) { - ResIterator resources = model.listResourcesWithProperty(prop); - try { - while (resources.hasNext()) { - Resource resource = resources.next(); - removeExtraProperties(resource, prop, label); - } - } finally { - resources.close(); + for (Resource resource : ModelWrapper.listResourcesWithProperty(model, + prop)) { + removeExtraProperties(resource, prop, label); } } @@ -65,7 +59,7 @@ public class MultiplePropertyRemover extends FsuScanner { updateLog.warn(resource, "removing extra " + label + " property: '" + node + "'"); } - model.remove(stmt); + ModelWrapper.removeStatement(model, stmt); } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NoThumbsAdjuster.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NoThumbsAdjuster.java index b41611847..2c906b1f0 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NoThumbsAdjuster.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NoThumbsAdjuster.java @@ -10,7 +10,6 @@ import java.io.IOException; import javax.imageio.ImageIO; -import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; /** @@ -32,17 +31,11 @@ public class NoThumbsAdjuster extends FsuScanner { public void adjust() { updateLog.section("Creating thumbnails to match main images."); - ResIterator haveImage = model.listResourcesWithProperty(imageProperty); - try { - while (haveImage.hasNext()) { - Resource resource = haveImage.next(); - - if (resource.getProperty(thumbProperty) == null) { - createThumbnailFromMainImage(resource); - } + for (Resource resource : ModelWrapper.listResourcesWithProperty(model, + imageProperty)) { + if (resource.getProperty(thumbProperty) == null) { + createThumbnailFromMainImage(resource); } - } finally { - haveImage.close(); } } @@ -67,8 +60,7 @@ public class NoThumbsAdjuster extends FsuScanner { generateThumbnailImage(mainFile, thumbFile, FileStorageUpdater.THUMBNAIL_WIDTH, FileStorageUpdater.THUMBNAIL_HEIGHT); - - resource.addProperty(thumbProperty, thumbFilename); + ResourceWrapper.addProperty(resource, thumbProperty, thumbFilename); } catch (IOException e) { updateLog.error(resource, "failed to create thumbnail file '" + thumbFilename + "'", e); diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NonLiteralPropertyRemover.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NonLiteralPropertyRemover.java index 0792b452f..6b78468e8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NonLiteralPropertyRemover.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/NonLiteralPropertyRemover.java @@ -8,10 +8,9 @@ import java.util.List; import com.hp.hpl.jena.rdf.model.Literal; import com.hp.hpl.jena.rdf.model.Property; import com.hp.hpl.jena.rdf.model.RDFNode; -import com.hp.hpl.jena.rdf.model.ResIterator; import com.hp.hpl.jena.rdf.model.Resource; import com.hp.hpl.jena.rdf.model.Statement; -import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.shared.Lock; /** * All image properties should have literal values. Burn any that don't. @@ -37,14 +36,9 @@ public class NonLiteralPropertyRemover extends FsuScanner { * Check all resources for bogus values on this property. */ private void removeNonLiterals(Property prop, String label) { - ResIterator resources = model.listResourcesWithProperty(prop); - try { - while (resources.hasNext()) { - Resource resource = resources.next(); - removeNonLiterals(resource, prop, label); - } - } finally { - resources.close(); + for (Resource resource : ModelWrapper.listResourcesWithProperty(model, + prop)) { + removeNonLiterals(resource, prop, label); } } @@ -54,24 +48,23 @@ public class NonLiteralPropertyRemover extends FsuScanner { private void removeNonLiterals(Resource resource, Property prop, String label) { List bogusValues = new ArrayList(); - StmtIterator stmts = resource.listProperties(prop); - try { - while (stmts.hasNext()) { - Statement stmt = stmts.next(); - RDFNode object = stmt.getObject(); - if (!object.isLiteral()) { - bogusValues.add(object); - } + for (Statement stmt : ResourceWrapper.listProperties(resource, prop)) { + RDFNode object = stmt.getObject(); + if (!object.isLiteral()) { + bogusValues.add(object); } - } finally { - stmts.close(); } for (RDFNode bogusValue : bogusValues) { updateLog.warn(resource, "discarding " + label + " property with non-literal as object: '" + bogusValue + "'"); - model.createStatement(resource, prop, bogusValue).remove(); + model.enterCriticalSection(Lock.WRITE); + try { + model.createStatement(resource, prop, bogusValue).remove(); + } finally { + model.leaveCriticalSection(); + } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ResourceWrapper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ResourceWrapper.java new file mode 100644 index 000000000..4253d4d18 --- /dev/null +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/filestorage/updater/ResourceWrapper.java @@ -0,0 +1,63 @@ +/* $This file is distributed under the terms of the license in /doc/license.txt$ */ + +package edu.cornell.mannlib.vitro.webapp.filestorage.updater; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import com.hp.hpl.jena.rdf.model.Property; +import com.hp.hpl.jena.rdf.model.Resource; +import com.hp.hpl.jena.rdf.model.Statement; +import com.hp.hpl.jena.rdf.model.StmtIterator; +import com.hp.hpl.jena.shared.Lock; + +/** + * Utility methods that get the appropriate model locks before manipluating + * resources. + */ +public class ResourceWrapper { + + public static Statement getProperty(Resource resource, Property property) { + resource.getModel().enterCriticalSection(Lock.READ); + try { + return resource.getProperty(property); + } finally { + resource.getModel().leaveCriticalSection(); + } + } + + public static void addProperty(Resource resource, Property property, + String value) { + resource.getModel().enterCriticalSection(Lock.WRITE); + try { + resource.addProperty(property, value); + } finally { + resource.getModel().leaveCriticalSection(); + } + } + + public static void removeAll(Resource resource, Property property) { + resource.getModel().enterCriticalSection(Lock.WRITE); + try { + resource.removeAll(property); + } finally { + resource.getModel().leaveCriticalSection(); + } + } + + public static Collection listProperties(Resource resource, + Property prop) { + List list = new ArrayList(); + StmtIterator stmts = resource.listProperties(prop); + try { + while (stmts.hasNext()) { + list.add(stmts.next()); + } + return list; + } finally { + stmts.close(); + } + } + +}