Skip to content

Commit

Permalink
Code factoring for JcrPropertyStatementListener and RdfAdder/Remover
Browse files Browse the repository at this point in the history
- Add unit test for FedoraTypesUtils

Resolves: https://www.pivotaltracker.com/story/show/71846066
  • Loading branch information
giuliah authored and Andrew Woods committed Sep 11, 2014
1 parent be7d793 commit 8a97cfd
Show file tree
Hide file tree
Showing 6 changed files with 109 additions and 46 deletions.
Expand Up @@ -394,4 +394,15 @@ public static boolean propertyContains(final Property p, final String value) thr
return value.equals(p.getString());

}
/**
* Check if there is a node of given type
* @param subjectNode
* @param mixinName
*/
public static boolean nodeHasType(final Node subjectNode, final String mixinName) throws RepositoryException {
if (subjectNode == null) {
return false;
}
return getNodeTypeManager(subjectNode).hasNodeType(mixinName);
}
}
Expand Up @@ -41,6 +41,8 @@
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Resource;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.RDFNode;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.vocabulary.RDF;

import java.util.HashMap;
Expand Down Expand Up @@ -138,24 +140,26 @@ public void addedStatement(final Statement s) {
// special logic for handling rdf:type updates.
// if the object is an already-existing mixin, update
// the node's mixins. If it isn't, just treat it normally.
if (s.getPredicate().equals(RDF.type)
&& s.getObject().isResource()) {
final Resource mixinResource = s.getObject().asResource();
final Property property = s.getPredicate();
final RDFNode objectNode = s.getObject();
if (property.equals(RDF.type) && objectNode.isResource()) {
final Resource mixinResource = objectNode.asResource();
final String nameSpace = mixinResource.getNameSpace();

if (mixinResource.getNameSpace().equals(LDP_NAMESPACE)) {
if (nameSpace.equals(LDP_NAMESPACE)) {
return;
}

try {
final String namespacePrefix = session.getNamespacePrefix(mixinResource.getNameSpace());
final String namespacePrefix = session.getNamespacePrefix(nameSpace);
final String mixinName = namespacePrefix + ":" + mixinResource.getLocalName();

if (FedoraTypesUtils.getNodeTypeManager(subjectNode).hasNodeType(mixinName)) {
if (FedoraTypesUtils.nodeHasType(subjectNode, mixinName)) {

if (subjectNode.canAddMixin(mixinName)) {
subjectNode.addMixin(mixinName);
} else {
problems.add(subject, COULD_NOT_STORE_PROPERTY, s.getPredicate().getURI());
problems.add(subject, COULD_NOT_STORE_PROPERTY, property.getURI());
}

return;
Expand All @@ -169,18 +173,13 @@ public void addedStatement(final Statement s) {
// extract the JCR propertyName from the predicate
final String propertyName =
jcrRdfTools.getPropertyNameFromPredicate(subjectNode,
s.getPredicate(),
s.getModel()
.getNsPrefixMap());

if (validateModificationsForPropertyName(
subject, subjectNode, s.getPredicate())) {
final Value v =
jcrRdfTools.createValue(subjectNode, s.getObject(),
propertiesTools.getPropertyType(subjectNode,
propertyName));
propertiesTools.appendOrReplaceNodeProperty(subjects,
subjectNode, propertyName, v);
property,
s.getModel().getNsPrefixMap());

if (validateModificationsForPropertyName(subject, subjectNode, property)) {
final Value v = createValue(subjectNode, objectNode, propertyName);

propertiesTools.appendOrReplaceNodeProperty(subjects, subjectNode, propertyName, v);
}
} catch (final RepositoryException e) {
throw propagate(e);
Expand Down Expand Up @@ -210,31 +209,35 @@ public void removedStatement(final Statement s) {
// special logic for handling rdf:type updates.
// if the object is an already-existing mixin, update
// the node's mixins. If it isn't, just treat it normally.
if (s.getPredicate().equals(RDF.type)
&& s.getObject().isResource()) {
final Resource mixinResource = s.getObject().asResource();
final Property property = s.getPredicate();
final RDFNode objectNode = s.getObject();

if (property.equals(RDF.type) && objectNode.isResource()) {
final Resource mixinResource = objectNode.asResource();
final String nameSpace = mixinResource.getNameSpace();
final String errorPrefix = "Error removing node type";
try {
final String namespacePrefix = session.getNamespacePrefix(mixinResource.getNameSpace());
final String namespacePrefix = session.getNamespacePrefix(nameSpace);
final String mixinName = namespacePrefix + ":" + mixinResource.getLocalName();

if (FedoraTypesUtils.getNodeTypeManager(subjectNode).hasNodeType(mixinName)) {
if (FedoraTypesUtils.nodeHasType(subjectNode, mixinName)) {
try {
subjectNode.removeMixin(mixinName);
} catch (final RepositoryException e) {
LOGGER.info(
"problem with removing <{}> <{}> <{}>: {}",
subject.getURI(),
RdfLexicon.COULD_NOT_STORE_PROPERTY,
s.getPredicate().getURI(),
property.getURI(),
e);
String errorMessage = e.getMessage();
final String className = e.getClass().getName();
if (StringUtils.isNotBlank(errorMessage)) {
errorMessage = errorPrefix + " '" + mixinName +
"': \n" + e.getClass().getName() + ": " + errorMessage;
"': \n" + className + ": " + errorMessage;
} else {
errorMessage = errorPrefix + " '" + mixinName +
"': \n" + e.getClass().getName();
"': \n" + className;
}
problems.add(subject, RdfLexicon.COULD_NOT_STORE_PROPERTY, errorMessage);
}
Expand All @@ -245,29 +248,27 @@ public void removedStatement(final Statement s) {
LOGGER.trace("Unable to resolve registered namespace for resource {}: {}", mixinResource, e);

String errorMessage = e.getMessage();
final String className = e.getClass().getName();
if (StringUtils.isNotBlank(errorMessage)) {
errorMessage = errorPrefix + " " +
e.getClass().getName() + ": " + errorMessage;
className + ": " + errorMessage;
} else {
errorMessage = errorPrefix + ": " + e.getClass().getName();
errorMessage = errorPrefix + ": " + className;
}
problems.add(subject, RdfLexicon.COULD_NOT_STORE_PROPERTY, errorMessage);
}

}

final String propertyName =
jcrRdfTools.getPropertyNameFromPredicate(subjectNode, s.getPredicate());
jcrRdfTools.getPropertyNameFromPredicate(subjectNode, property);


// if the property doesn't exist, we don't need to worry about it.
if (subjectNode.hasProperty(propertyName) &&
validateModificationsForPropertyName(subject, subjectNode,
s.getPredicate())) {
final Value v =
jcrRdfTools.createValue(subjectNode, s.getObject(),
propertiesTools.getPropertyType(subjectNode,
propertyName));
validateModificationsForPropertyName(subject, subjectNode, property) ) {
final Value v = createValue(subjectNode, objectNode, propertyName);

propertiesTools.removeNodeProperty(subjects, subjectNode,
propertyName, v);
}
Expand All @@ -292,6 +293,14 @@ private boolean validateModificationsForPropertyName(
return true;
}

private Value createValue(final Node subjectNode,
final RDFNode RDFNode,
final String propertyName) throws RepositoryException {
return jcrRdfTools.createValue(subjectNode,
RDFNode,
propertiesTools.getPropertyType(subjectNode, propertyName));
}

/**
* Get a list of any problems from trying to apply the statement changes to
* the node's properties
Expand Down
Expand Up @@ -23,6 +23,7 @@
import static org.fcrepo.kernel.impl.rdf.ManagedRdf.isManagedMixin;
import static org.fcrepo.kernel.impl.rdf.ManagedRdf.isManagedTriple;
import static org.slf4j.LoggerFactory.getLogger;
import org.fcrepo.kernel.impl.utils.NodePropertiesTools;

import javax.jcr.Node;
import javax.jcr.RepositoryException;
Expand Down Expand Up @@ -186,6 +187,19 @@ protected Value createValue(final Node subjectNode, final RDFNode object,
return jcrRdfTools().createValue(subjectNode, object, propertyType);
}


protected Value createValue(final Node n, final Statement t, final String propertyName) throws RepositoryException {
final NodePropertiesTools propertiesTools = new NodePropertiesTools();
return jcrRdfTools().createValue(n, t.getObject(), propertiesTools.getPropertyType(n, propertyName));
}

protected boolean sessionHasType(final Session session, final String mixinName) throws RepositoryException {
if (session == null) {
return false;
}
return session().getWorkspace().getNodeTypeManager().hasNodeType(mixinName);
}

protected abstract void operateOnProperty(final Statement t,
final Node subjectNode) throws RepositoryException;

Expand Down
Expand Up @@ -64,7 +64,7 @@ protected void operateOnMixin(final Resource mixinResource,
final Node subjectNode) throws RepositoryException {

final String mixinName = getPropertyNameFromPredicate(subjectNode, mixinResource);
if (!session().getWorkspace().getNodeTypeManager().hasNodeType(mixinName)) {
if (!sessionHasType(session(), mixinName)) {
final NodeTypeManager mgr = session().getWorkspace().getNodeTypeManager();
final NodeTypeTemplate type = mgr.createNodeTypeTemplate();
type.setName(mixinName);
Expand Down Expand Up @@ -94,11 +94,10 @@ protected void operateOnMixin(final Resource mixinResource,
protected void operateOnProperty(final Statement t, final Node n) throws RepositoryException {
LOGGER.debug("Adding property from triple: {} to node: {}.", t, n
.getPath());

final String propertyName =
getPropertyNameFromPredicate(n, t.getPredicate());
final Value v =
createValue(n, t.getObject(), propertiesTools.getPropertyType(n,
propertyName));
final Value v = createValue(n, t, propertyName);
propertiesTools.appendOrReplaceNodeProperty(idTranslator(), n, propertyName, v);
}
}
Expand Up @@ -61,7 +61,7 @@ protected void operateOnMixin(final Resource mixinResource,
final Node subjectNode) throws RepositoryException {

final String mixinName = getPropertyNameFromPredicate(subjectNode, mixinResource);
if (session().getWorkspace().getNodeTypeManager().hasNodeType(mixinName)) {
if (sessionHasType(session(), mixinName)) {
LOGGER.debug("Removing mixin: {} from node: {}.", mixinName,
subjectNode.getPath());

Expand All @@ -84,14 +84,12 @@ protected void operateOnProperty(final Statement t, final Node n)
throws RepositoryException {
LOGGER.debug("Trying to remove property from triple: {} on node: {}.", t, n
.getPath());

final String propertyName =
getPropertyNameFromPredicate(n, t.getPredicate());
if (n.hasProperty(propertyName)) {
final Value v =
jcrRdfTools().createValue(n, t.getObject(),
propertiesTools.getPropertyType(n, propertyName));
propertiesTools.removeNodeProperty(idTranslator(), n, propertyName,
v);
final Value v = createValue(n, t, propertyName);
propertiesTools.removeNodeProperty(idTranslator(), n, propertyName, v);
}
}
}
Expand Up @@ -28,6 +28,7 @@
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.isFedoraResource;
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.isInternalNode;
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.isMultipleValuedProperty;
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.nodeHasType;
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.propertyContains;
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.value2string;
import static org.fcrepo.kernel.impl.utils.NodePropertiesTools.REFERENCE_PROPERTY_SUFFIX;
Expand Down Expand Up @@ -383,4 +384,35 @@ public void testMultiValuedPropertyContains() throws RepositoryException {
assertTrue(propertyContains(mockProperty, "some-string"));
assertFalse(propertyContains(mockProperty, "some-other-string"));
}

@Test
public void testNodeHasTypeNo() throws RepositoryException {
when(mockNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWS);
when(mockWS.getNodeTypeManager()).thenReturn(mockNTM);
assertFalse(nodeHasType(mockNode, "mixin"));
}

@Test
public void testNodeHasTypeYes() throws RepositoryException {
when(mockNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWS);
when(mockWS.getNodeTypeManager()).thenReturn(mockNTM);
when(mockNTM.hasNodeType("mixin")).thenReturn(true);
assertTrue(nodeHasType(mockNode, "mixin"));
}

@Test
public void testNodeHasTypeNullMixin() throws RepositoryException {
when(mockNode.getSession()).thenReturn(mockSession);
when(mockSession.getWorkspace()).thenReturn(mockWS);
when(mockWS.getNodeTypeManager()).thenReturn(mockNTM);
assertFalse(nodeHasType(mockNode, null));
}

@Test
public void testNodeHasTypeNull() throws RepositoryException {
assertFalse(nodeHasType(null, "mixin"));
}

}

0 comments on commit 8a97cfd

Please sign in to comment.