Skip to content

Commit

Permalink
Change problematic SPARQL update statement namespace prefix URI
Browse files Browse the repository at this point in the history
  • Loading branch information
osmandin authored and Andrew Woods committed Mar 8, 2015
1 parent bd5b35a commit f257425
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 1 deletion.
Expand Up @@ -24,6 +24,7 @@
import static com.google.common.collect.Lists.newArrayList;
import static com.hp.hpl.jena.update.UpdateAction.execute;
import static com.hp.hpl.jena.update.UpdateFactory.create;
import static java.util.regex.Pattern.compile;
import static org.apache.commons.codec.digest.DigestUtils.shaHex;
import static org.fcrepo.kernel.impl.identifiers.NodeResourceConverter.nodeConverter;
import static org.fcrepo.kernel.impl.utils.FedoraTypesUtils.isFrozenNode;
Expand All @@ -40,6 +41,8 @@
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.jcr.AccessDeniedException;
import javax.jcr.ItemNotFoundException;
Expand Down Expand Up @@ -90,6 +93,8 @@ public class FedoraResourceImpl extends JcrTools implements FedoraJcrTypes, Fedo

protected Node node;

private static final Pattern uriPattern = compile("PREFIX\\s+[a-z]*:<[a-z]*://[^#(PREFIX)]*>");

/**
* Construct a {@link org.fcrepo.kernel.models.FedoraResource} from an existing JCR Node
* @param node an existing JCR node to treat as an fcrepo object
Expand Down Expand Up @@ -362,13 +367,26 @@ public void updateProperties(final IdentifierConverter<Resource, FedoraResource>

model.register(listener);

final UpdateRequest request = create(sparqlUpdateStatement, idTranslator.reverse().convert(this).toString());
final UpdateRequest request = create(changePrefixUri(sparqlUpdateStatement),
idTranslator.reverse().convert(this).toString());
model.setNsPrefixes(request.getPrefixMapping());
execute(request, model);

listener.assertNoExceptions();
}

private static String changePrefixUri(final String statement) {
final Matcher m = uriPattern.matcher(statement.trim());
final StringBuffer sb = new StringBuffer();

while (m.find()) {
m.appendReplacement(sb, m.group().replaceFirst(">", "/>"));
}

m.appendTail(sb);
return sb.length() > 0 ? sb.toString() : statement;
}

@Override
public RdfStream getTriples(final IdentifierConverter<Resource, FedoraResource> idTranslator,
final Class<? extends RdfStream> context) {
Expand Down
Expand Up @@ -450,6 +450,35 @@ public void testUpdateDenied() throws RepositoryException {
+ " WHERE { }", new RdfStream());
}

@Test
public void testSparqlUpdatePrefixUriSubstitution() throws RepositoryException {
final FedoraResource object =
containerService.findOrCreate(session, "/testRefObject");

object.updateProperties(
subjects,
"PREFIX dsc:<http://myurl.org> \n" +
"PREFIX esc:<http://myurl555.org> \n" +
"PREFIX fsc:<http://myurl.org#> \n" +
"PREFIX gsc:<http://myurl.org/u> \n" +
"INSERT { <> dsc:p \"aaa\" . \n <> esc:p \"bbb\" . \n " +
"<> fsc:p \"ccc\" . \n <> gsc:p \"ddd\" ;} WHERE { }",
new RdfStream());

final javax.jcr.Node n = object.getNode();
assertEquals(n.getProperty("dsc:p").getValues().length, 1);
assertEquals(n.getProperty("dsc:p").getValues()[0].getString(), "aaa");

assertEquals(n.getProperty("esc:p").getValues().length, 1);
assertEquals(n.getProperty("esc:p").getValues()[0].getString(), "bbb");

assertEquals(n.getProperty("fsc:p").getValues().length, 1);
assertEquals(n.getProperty("fsc:p").getValues()[0].getString(), "ccc");

assertEquals(n.getProperty("gsc:p").getValues().length, 1);
assertEquals(n.getProperty("gsc:p").getValues()[0].getString(), "ddd");
}

@Test
public void testUpdatingRdfType() throws RepositoryException {
final FedoraResource object =
Expand Down

0 comments on commit f257425

Please sign in to comment.