Skip to content

Commit

Permalink
Pull label from RDF stream for serialization formats
Browse files Browse the repository at this point in the history
- Add getSerializationTitle to bridge HAS_SERIALIZATION -> IS_IN_FORMAT -> RDFS_LABEL gap
- Add to dc:format to Repository objects to cover mode:root nodeTypes (homepage of admin interface)
- Remove hack from getObjectTitle
- Modify common-node-actions to use new serialization Titles for both export and import select boxes

Resolves https://www.pivotaltracker.com/story/show/65221404
  • Loading branch information
Jared Whiklo authored and Andrew Woods committed Sep 18, 2014
1 parent 75734b0 commit b0fe421
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 21 deletions.
Expand Up @@ -17,6 +17,7 @@

import static com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createProperty;
import static java.util.Collections.singletonMap;
import static org.fcrepo.jcr.FedoraJcrTypes.ROOT;
import static org.fcrepo.kernel.RdfLexicon.HAS_FIXITY_SERVICE;
Expand All @@ -28,8 +29,12 @@
import static org.fcrepo.kernel.RdfLexicon.HAS_TRANSACTION_SERVICE;
import static org.fcrepo.kernel.RdfLexicon.HAS_VERSION_HISTORY;
import static org.fcrepo.kernel.RdfLexicon.HAS_WORKSPACE_SERVICE;
import static org.fcrepo.kernel.RdfLexicon.RDFS_LABEL;
import static org.fcrepo.kernel.RdfLexicon.REPOSITORY_NAMESPACE;
import static org.fcrepo.kernel.RdfLexicon.DC_NAMESPACE;

import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Property;
import com.hp.hpl.jena.rdf.model.Resource;

import org.fcrepo.http.api.FedoraExport;
Expand All @@ -47,6 +52,7 @@
import org.fcrepo.kernel.exception.RepositoryRuntimeException;
import org.fcrepo.kernel.rdf.IdentifierTranslator;
import org.fcrepo.serialization.SerializerUtil;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand Down Expand Up @@ -133,13 +139,20 @@ private void addNodeStatements(final FedoraResource resource, final UriInfo uriI
pathMap).toASCIIString()));
}

final Property dcFormat = createProperty(DC_NAMESPACE + "format");
// fcr:exports?format=xyz
for (final String key : serializers.keySet()) {
final Resource format =
createResource(uriInfo.getBaseUriBuilder().path(
FedoraExport.class).queryParam("format", key)
.buildFromMap(pathMap).toASCIIString());
model.add(s, HAS_SERIALIZATION, format);

//RDF the serialization
final Resource formatRDF = createResource(REPOSITORY_NAMESPACE + key);

model.add(formatRDF, RDFS_LABEL, key);
model.add(format, dcFormat, formatRDF);
}
}

Expand Down Expand Up @@ -169,11 +182,17 @@ private void addRepositoryStatements(final UriInfo uriInfo, final Model model,
.getBaseUriBuilder().path(FedoraRepositoryWorkspaces.class)
.build().toASCIIString()));

final Property dcFormat = createProperty(DC_NAMESPACE + "format");
// fcr:export?format=xyz
for (final String key : serializers.keySet()) {
model.add(s, HAS_SERIALIZATION, createResource(uriInfo
.getBaseUriBuilder().path(FedoraRepositoryExport.class)
.queryParam("format", key).build().toASCIIString()));
final Resource format = createResource(uriInfo
.getBaseUriBuilder().path(FedoraRepositoryExport.class)
.queryParam("format", key).build().toASCIIString());
model.add(s, HAS_SERIALIZATION, format);
final Resource formatRDF = createResource(REPOSITORY_NAMESPACE + key);

model.add(formatRDF, RDFS_LABEL, key);
model.add(format, dcFormat, formatRDF);
}
}

Expand Down
Expand Up @@ -99,7 +99,7 @@ WHERE { }

<ul class="dropdown-menu">
#foreach($quad in $helpers.getSortedTriples($model, $serializations))
<li><a href="$quad.getObject().getURI()">$helpers.getObjectTitle($rdf, $quad.getObject())</a></li>
<li><a href="$quad.getObject().getURI()">$helpers.getSerializationTitle($rdf, $quad.getObject())</a></li>
#end
</ul>
</div>
Expand All @@ -125,7 +125,7 @@ WHERE { }
<label class="control-label">Format</label>
<select id="import_format" name="format" class="form-control">
#foreach($quad in $helpers.getSortedTriples($model, $serializations))
<option>$helpers.getObjectTitle($rdf, $quad.getObject())</option>
<option>$helpers.getSerializationTitle($rdf, $quad.getObject())</option>
#end
</select>
</div>
Expand Down
Expand Up @@ -18,6 +18,7 @@
import static com.google.common.base.Strings.isNullOrEmpty;
import static com.hp.hpl.jena.graph.Node.ANY;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createProperty;
import static org.fcrepo.jcr.FedoraJcrTypes.FCR_CONTENT;
import static org.fcrepo.kernel.RdfLexicon.DC_TITLE;
import static org.fcrepo.kernel.RdfLexicon.HAS_VERSION_LABEL;
Expand All @@ -26,6 +27,7 @@
import static org.fcrepo.kernel.RdfLexicon.HAS_VERSION;
import static org.fcrepo.kernel.RdfLexicon.HAS_CONTENT;
import static org.fcrepo.kernel.RdfLexicon.RDF_NAMESPACE;
import static org.fcrepo.kernel.RdfLexicon.DC_NAMESPACE;
import static org.slf4j.LoggerFactory.getLogger;

import java.text.SimpleDateFormat;
Expand Down Expand Up @@ -225,19 +227,6 @@ public String getObjectTitle(final DatasetGraph dataset,
}

if (subject.isURI()) {
// FIXME: The following hack should be removed/resolved with:
// https://www.pivotaltracker.com/story/show/65221404
//
// For /fcr:export endpoints, there should be a way to look up the serialization format and find the
// appropriate label to return here.
// This method is used (among other places?) in "fcrepo-http-api/common-node-actions.vsl#95"
final String uri = subject.getURI();
final String target = "fcr:export?format=";
if (uri.contains(target)) {
// Return the value of the query param "format".
return uri.substring(uri.indexOf(target) + target.length());
}

return subject.getURI();
} else if (subject.isBlank()) {
return subject.getBlankNodeLabel();
Expand All @@ -247,6 +236,22 @@ public String getObjectTitle(final DatasetGraph dataset,

}

/**
* Take a HAS_SERIALIZATION node and find the RDFS_LABEL for the format it is associated with
*
* @param dataset
* @param subject
* @return the label for the serialization format
*/
public String getSerializationTitle(final DatasetGraph dataset, final Node subject) {
final Property dcFormat = createProperty(DC_NAMESPACE + "format");
final Iterator<Quad> formatRDFs = getObjects(dataset, subject, dcFormat);
if (formatRDFs.hasNext()) {
return getObjectTitle(dataset, formatRDFs.next().getObject());
}
return "";
}

/**
* Determines whether the subject is writable
* true if node is writable
Expand Down
Expand Up @@ -22,16 +22,20 @@
import static com.hp.hpl.jena.graph.NodeFactory.createURI;
import static com.hp.hpl.jena.rdf.model.ModelFactory.createDefaultModel;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createResource;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createProperty;
import static com.hp.hpl.jena.rdf.model.ResourceFactory.createTypedLiteral;
import static com.hp.hpl.jena.sparql.core.DatasetGraphFactory.createMem;
import static org.fcrepo.http.commons.test.util.TestHelpers.getUriInfoImpl;
import static org.fcrepo.kernel.RdfLexicon.CREATED_BY;
import static org.fcrepo.kernel.RdfLexicon.DC_TITLE;
import static org.fcrepo.kernel.RdfLexicon.HAS_PRIMARY_TYPE;
import static org.fcrepo.kernel.RdfLexicon.HAS_VERSION_LABEL;
import static org.fcrepo.kernel.RdfLexicon.DC_NAMESPACE;
import static org.fcrepo.kernel.RdfLexicon.LAST_MODIFIED_DATE;
import static org.fcrepo.kernel.RdfLexicon.HAS_VERSION;
import static org.fcrepo.kernel.RdfLexicon.HAS_CONTENT;
import static org.fcrepo.kernel.RdfLexicon.RDFS_LABEL;
import static org.fcrepo.kernel.RdfLexicon.REPOSITORY_NAMESPACE;
import static org.fcrepo.kernel.RdfLexicon.WRITABLE;
import static org.fcrepo.kernel.RdfLexicon.RDF_NAMESPACE;
import static org.junit.Assert.assertEquals;
Expand Down Expand Up @@ -297,11 +301,16 @@ public void shouldJustUseTheStringIfItIsALiteral() {

@Test
public void shouldGetSerializationFormat() {
final Node subject = createURI("subject/fcr:export?format=jcr/xml");
final String serialKey = "jcr/xml";
final Node formatRDF = createLiteral(REPOSITORY_NAMESPACE + serialKey);
final Node subject = createLiteral("xyz");
final DatasetGraph mem = createMem();
final Property dcFormat = createProperty(DC_NAMESPACE + "format");

mem.add(createAnon(), subject, createLiteral("predicate"),createLiteral("abc"));
assertEquals("jcr/xml", testObj.getObjectTitle(mem, subject));
mem.add(createAnon(), formatRDF, RDFS_LABEL.asNode(), createLiteral(serialKey));
mem.add(createAnon(), subject, dcFormat.asNode(), formatRDF);

assertEquals("jcr/xml", testObj.getSerializationTitle(mem, subject));
}

@Test
Expand Down

0 comments on commit b0fe421

Please sign in to comment.