Skip to content

Commit

Permalink
Making HTML views editable (delete link for user-editable properties,…
Browse files Browse the repository at this point in the history
… form to add new properties)
  • Loading branch information
escowles committed Dec 2, 2013
1 parent 436ff13 commit 1f146f1
Show file tree
Hide file tree
Showing 5 changed files with 108 additions and 4 deletions.
21 changes: 21 additions & 0 deletions fcrepo-http-api/src/main/resources/views/common-node-actions.vsl
Expand Up @@ -14,6 +14,27 @@
<hr />
#end

<form id="action_addprop" onsubmit="addProperty()">
<h3>Add Property</h3>
<div class="form-group">
<label for="add-pre-menu">Property</label>
<select id="add-pre-menu" class="form-control">
#foreach($option in $predicates.entrySet().iterator())
<option value="$option.getValue()">$option.getKey()</option>
#end
</select>
<input type="text" id="add-pre-custom" placeholder="Custom Property URI..."
class="form-control"/>
</div>
<div class="form-group">
<label for="add-val">Value</label>
<input type="text" id="add-val" class="form-control"/>
</div>
<input type="submit" class="btn btn-primary" value="Add"/>
<hr/>
</form>


<form id="action_create" name="action_create" method="POST" enctype="multipart/form-data">
<h3>Create New Node</h3>
<div class="form-group">
Expand Down
42 changes: 41 additions & 1 deletion fcrepo-http-api/src/main/resources/views/common.js
Expand Up @@ -225,4 +225,44 @@ function ajaxErrorHandler(xhr, textStatus, errorThrown) {
$('#errorText').text(xhr.responseText);
$('#errorModal').modal('show');

}
}

function addProperty() {
var sub = $('#main').attr('resource');
var pre = $('#add-pre-custom').val();
if ( pre == '' ) { pre = $('#add-pre-menu').val(); }
var obj = quoteObject( $('#add-val').val() );
var update = "insert data { <" + sub + "> <" + pre + "> " + obj + " }";

// perform sparql update
$.ajax({url: sub, type: "PATCH", contentType: "application/sparql-update", data: update, error: ajaxErrorHandler});
window.location.reload();
return false;
}

function deleteProperty( id ) {
var elem = $('#' + id );
var sub = $('#main').attr('resource');
var pre = elem.attr('property');
var obj = quoteObject( elem.html() );
if ( obj.charAt(0) == '"' && obj.indexOf("^^") > -1 ) {
obj = obj.substring( 0, obj.indexOf("^^") );
}
var update = "delete data { <" + sub + "> <" + pre + "> " + obj + " }";

// perform sparql update
$.ajax({url: sub, type: "PATCH", contentType: "application/sparql-update", data: update, error: ajaxErrorHandler});
window.location.reload();
return false;
}

function quoteObject( obj ) {
if (obj.charAt(0) != '"' && obj.charAt(0) != "'" && obj.charAt(0) != '<') {
if (obj.substring(0,4) == "http") {
obj = "<" + obj + ">";
} else {
obj = "\"" + obj.replace(/\"/g,"\\\"") + "\"";
}
}
return obj;
}
10 changes: 7 additions & 3 deletions fcrepo-http-api/src/main/resources/views/common.vsl
Expand Up @@ -19,15 +19,19 @@
#end
<dd>
#if($quad.getObject().isURI() && $quad.getObject().getURI().startsWith("http"))
<a href="$quad.getObject().getURI()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</a>
<a id="prop$quad.hashCode()" href="$quad.getObject().getURI()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</a>
#elseif ($quad.getObject().isLiteral())
<span property="$quad.getPredicate().toString()">$esc.html($quad.getObject().getLiteral().getLexicalForm())</span>
<span id="prop$quad.hashCode()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject().getLiteral().getLexicalForm())</span>
#else
<span property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</span>
<span id="prop$quad.hashCode()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</span>
#end
#if( $quad.getPredicate().toString().equals("http://fedora.info/definitions/v4/rest-api#digest") )
<a href="$topic/fcr:fixity">check fixity</a>
#end
#if( !$rdfLexicon.isManagedPredicateURI.apply($quad.getPredicate().toString()) )
<a href="#" onClick="deleteProperty('prop$quad.hashCode()');return false;" title="Delete Property">&times;</a>
#end

</dd>
#set ($last_quad = $quad)

Expand Down
Expand Up @@ -37,6 +37,7 @@
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import java.net.URL;
import java.util.TreeMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
Expand All @@ -61,6 +62,7 @@
import org.apache.velocity.tools.generic.FieldTool;
import org.fcrepo.http.commons.session.SessionFactory;
import org.fcrepo.kernel.RdfLexicon;
import org.fcrepo.kernel.services.RepositoryService;
import org.slf4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;

Expand All @@ -69,6 +71,9 @@
import com.hp.hpl.jena.graph.Node;
import com.hp.hpl.jena.query.Dataset;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.Statement;
import com.hp.hpl.jena.rdf.model.StmtIterator;


/**
* A simple JAX-RS Entity Provider that can accept RDF datasets that represent
Expand All @@ -85,6 +90,9 @@ public class BaseHtmlProvider implements MessageBodyWriter<Dataset> {
@Autowired
SessionFactory sessionFactory;

@Autowired
RepositoryService repositoryService;

@javax.ws.rs.core.Context
UriInfo uriInfo;

Expand Down Expand Up @@ -220,6 +228,26 @@ protected Context getContext(final Dataset rdf, final Node subject) {
context.put("nodeany", ANY);
context.put("topic", subject);
context.put("uriInfo", uriInfo);

// lookup properties
Session session = null;
Map<String,String> preds = new TreeMap<String,String>();
try {
session = sessionFactory.getInternalSession();
Model m = repositoryService.getNodeTypes(session).asModel();
StmtIterator stit = m.listStatements(null, RdfLexicon.RDFS_LABEL,
(String)null);
while ( stit.hasNext() ) {
Statement s = stit.nextStatement();
preds.put( s.getString(), s.getSubject().toString() );
}
} catch ( Exception ex ) {
LOGGER.warn("Error looking up predicates",ex);
} finally {
if ( session != null ) { session.logout(); }
}
context.put("predicates",preds);

return context;
}

Expand Down
11 changes: 11 additions & 0 deletions fcrepo-kernel/src/main/java/org/fcrepo/kernel/RdfLexicon.java
Expand Up @@ -308,6 +308,17 @@ public boolean apply(final Property p) {
public static final Predicate<Property> isManagedPredicate = or(
in(managedProperties), hasJcrNamespace, hasFedoraNamespace);

/**
* Detects whether an RDF predicate URI is managed by the repository.
*/
public static Predicate<String> isManagedPredicateURI =
new Predicate<String>() {
@Override
public boolean apply(final String uri) {
return isManagedPredicate.apply( createProperty(uri) );
}
};

private RdfLexicon() {

}
Expand Down

0 comments on commit 1f146f1

Please sign in to comment.