Skip to content

Commit

Permalink
Merge pull request #41 from ekoi/external-cvoc
Browse files Browse the repository at this point in the history
Add controlled vocabulary
  • Loading branch information
PaulBoon authored Feb 2, 2021
2 parents a63b32f + 5076dd1 commit 6960a4c
Show file tree
Hide file tree
Showing 6 changed files with 18,900 additions and 16 deletions.
105 changes: 101 additions & 4 deletions src/main/java/edu/harvard/iq/dataverse/DatasetPage.java
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,8 @@

import edu.harvard.iq.dataverse.util.StringUtil;
import edu.harvard.iq.dataverse.util.SystemConfig;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import java.io.*;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
Expand All @@ -82,6 +80,8 @@

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.file.UploadedFile;

import javax.json.*;
import javax.validation.ConstraintViolation;
import org.apache.commons.httpclient.HttpClient;
//import org.primefaces.context.RequestContext;
Expand Down Expand Up @@ -5479,4 +5479,101 @@ public boolean isFileAccessRequest() {
public void setFileAccessRequest(boolean fileAccessRequest) {
this.fileAccessRequest = fileAccessRequest;
}

public Map<String, CVM> getCVMConf(){
Map <String, CVM> cvmMap = new HashMap<>();
String cvmSetting = settingsService.getValueForKey(SettingsServiceBean.Key.CVMConf);
if (cvmSetting == null || cvmSetting.isEmpty())
return cvmMap;

JsonReader jsonReader = Json.createReader(new StringReader(settingsService.getValueForKey(SettingsServiceBean.Key.CVMConf)));
JsonArray cvmConfJsonArray = jsonReader.readArray();
jsonReader.close();
if (cvmConfJsonArray != null) {
for (JsonObject jo : cvmConfJsonArray.getValuesAs(JsonObject.class)) {
JsonArray v = jo.getJsonArray("vocabs");
List<String> vs = new ArrayList<>();
for (JsonString elm: v.getValuesAs(JsonString.class)){
vs.add(elm.getString());
}
JsonArray k = jo.getJsonArray("vocab-codes");
List<String> ks = new ArrayList<>();
for (JsonString elm: k.getValuesAs(JsonString.class)){
ks.add(elm.getString());
}
String cvmLang = BundleUtil.getDefaultLocale().getLanguage();//default
if (jo.containsKey("language"))
cvmLang = jo.getString("language"); // in case of "language":"", "&lang=" will be send to the middleware
boolean cvmReadonly = false;
if (jo.containsKey("readonly") && jo.getString("readonly").toLowerCase().equals("true"))
cvmReadonly = true;
String cvmProtocol = "skosmos";//default
if (jo.containsKey("protocol"))
cvmProtocol = jo.getString("protocol");
String mapId = "uri" ;//default
if (jo.containsKey("map-id"))
mapId = jo.getString("map-id");
String mapQuery = "prefLabel" ;//default
if (jo.containsKey("map-query"))
mapQuery = jo.getString("map-query");
CVM CVm = new CVM(jo.getString("cvm-url"), cvmLang, cvmProtocol, cvmReadonly, vs, ks
, jo.getString("js-url"), mapId, mapQuery);
cvmMap.put(jo.getString("vocab-name"), CVm);

}
}
return cvmMap;
}
public class CVM {
String cvmUrl;
String language;
String protocol;
String jsUrl;
String mapId;
String mapQuery;
boolean readonly;
List<String> vocabs;
List<String> keys;
public CVM(String cvmUrl, String language, String protocol, boolean readonly, List<String> vocabs, List<String> keys
, String jsUrl, String mapId, String mapQuery){
this.cvmUrl = cvmUrl;
this.language = language;
this.protocol = protocol;
this.readonly = readonly;
this.vocabs = vocabs;
this.keys = keys;
this.jsUrl = jsUrl;
this.mapId = mapId;
this.mapQuery = mapQuery;
}

public String getCvmUrl() {
return cvmUrl;
}
public String getLanguage() {
return language;
}
public String getProtocol() { return protocol; }
public boolean isReadonly() {
return readonly;
}
public List<String> getVocabs() {
return vocabs;
}
public List<String> getKeys() {
return keys;
}

public String getJsUrl() {
return jsUrl;
}

public String getMapId() {
return mapId;
}

public String getMapQuery() {
return mapQuery;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -192,6 +192,8 @@ public enum Key {
/** Optionally override http://guides.dataverse.org . */
GuidesBaseUrl,

CVMConf,

/**
* A link to an installation of https://github.com/IQSS/miniverse or
* some other metrics app.
Expand Down
98 changes: 86 additions & 12 deletions src/main/webapp/datasetFieldForEditFragment.xhtml
Original file line number Diff line number Diff line change
@@ -1,32 +1,106 @@
<ui:composition
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:pt="http://java.sun.com/jsf/passthrough"
xmlns:jsf="http://xmlns.jcp.org/jsf">
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:c="http://java.sun.com/jsp/jstl/core"
xmlns:p="http://primefaces.org/ui"
xmlns:pt="http://java.sun.com/jsf/passthrough"
xmlns:jsf="http://xmlns.jcp.org/jsf">

<ui:remove>
<!-- input text start UPDATE: UI:REMOVE applied due to duplicate ID errors, left code as reference incase test scripts complain -->
<span id="pre-input-#{dsf.datasetFieldType.name}" class="pre-input-tag"/></ui:remove>

<!-- input text start UPDATE: UI:REMOVE applied due to duplicate ID errors, left code as reference incase test scripts complain -->
<span id="pre-input-#{dsf.datasetFieldType.name}" class="pre-input-tag"/></ui:remove>
<c:set var="displayCV" value="#{cvMgr.size() > 0 and (dsfv.datasetField.datasetFieldType.name ==cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]
or dsfv.datasetField.datasetFieldType.name==cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[1]
or dsfv.datasetField.datasetFieldType.name==cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[2])}"/>
<p:inputText value="#{dsfv.valueForEdit}" id="inputText" pt:aria-required="#{dsf.required}"
styleClass="form-control #{dsfv.datasetField.datasetFieldType.name == 'title' and DatasetPage.editMode == 'CREATE' ? 'datasetfield-title' : ''}"
rendered="#{!dsfv.datasetField.datasetFieldType.controlledVocabulary
rendered="#{!dsfv.datasetField.datasetFieldType.controlledVocabulary and !displayCV
and (dsfv.datasetField.datasetFieldType.fieldType == 'TEXT'
or dsfv.datasetField.datasetFieldType.fieldType == 'INT'
or dsfv.datasetField.datasetFieldType.fieldType == 'FLOAT'
or dsfv.datasetField.datasetFieldType.fieldType == 'URL'
or dsfv.datasetField.datasetFieldType.fieldType == 'DATE'
or dsfv.datasetField.datasetFieldType.fieldType == 'EMAIL')}"/>
<p:watermark for="inputText" value="#{dsfv.datasetField.datasetFieldType.localeWatermark}"></p:watermark>
<ui:fragment rendered="#{displayCV and dsfv.datasetField.datasetFieldType.name==cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]}">
<div id="akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]}">
<p:autoComplete id="cv_vocabs_#{valCount.index+1}_k" value="#{dsfv.valueForEdit}"
completeMethod="#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getVocabs()}"
style="width:95%;"
readonly="#{facesContext.renderResponse and cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getVocabs().size() == 1
and cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).isReadonly()}"/>

</div>
</ui:fragment>
<ui:fragment rendered="#{displayCV and dsfv.datasetField.datasetFieldType.name==cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[1]}">
<div id="akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[1]}">
<p:inputText value="#{dsfv.valueForEdit}" id="cv_term_#{valCount.index+1}" tabindex="#{block.index+1}"
styleClass="form-control #{dsfv.datasetField.datasetFieldType.name == 'title' and DatasetPage.editMode == 'CREATE' ? 'datasetfield-title' : ''}"/>
</div>
</ui:fragment>
<ui:fragment rendered="#{displayCV and dsfv.datasetField.datasetFieldType.name==cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[2] }">
<div id="akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[2]}">
<p:inputText value="#{dsfv.valueForEdit}" id="cv_url_#{valCount.index+1}" tabindex="#{block.index+1}"
styleClass="form-control #{dsfv.datasetField.datasetFieldType.name == 'title' and DatasetPage.editMode == 'CREATE' ? 'datasetfield-title' : ''}"/>
</div>
<script src="#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getJsUrl()}">
</script>
<script>
$(document).ready(function() {
var jsonResult = {};
var cvmUrl = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getCvmUrl()}";
var cvmLang = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getLanguage()}";
var cvmProtocol = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getProtocol()}";
var cvmReqUrl = cvmUrl + "?protocol=" + cvmProtocol + "&amp;lang=" + cvmLang;
var vocabsize = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getVocabs().size()}";
var readonly = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).isReadonly()}";
if (vocabsize == 1 &amp;&amp; readonly)
$("#akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]}").find("input[name*='cv_vocabs_'").css('background-color' , '#EEEEEE');

var selectedVocab = "";
var vocabFieldValue = $("#akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]}").find("input[name*='cv_vocabs_'").val();
if (vocabFieldValue =='' &amp;&amp; vocabsize == 1) {
selectedVocab = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getVocabs()[0]}";
$("#akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]}").find("input[name*='cv_vocabs_'").val(selectedVocab);
}
$("#akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[0]}").find("input[name*='cv_vocabs_'").on("focusout", function(){
selectedVocab = $(this).val();
});

var mapquery = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getMapQuery()}";
var mapid = "#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getMapId()}";
var mapping = { query: mapquery, id: mapid };
$("#akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[1]}").find("input[name*='cv_term_']").autocomplete(
{
source: function( request, response ) {
cv = { 'cvmReqUrl' : cvmReqUrl, 'selectedVocab': selectedVocab, 'term': request.term };
autointerface(cvmProtocol, request, response, cv, mapping);
},
minLength: 2,
select: function(event, ui) {
$.each(ui, function(i, v) {
$("#akmi_#{valCount.index+1}_#{cvMgr.get(dsfv.datasetField.datasetFieldType.parentDatasetFieldType.name).getKeys()[2]}").find("input[name*='cv_url_']").val(v.id);
}
)}
}
);
});
</script>
<style type="text/css">
ul.ui-autocomplete {
list-style: none;
list-style-type: none;
padding: 0px;
margin: 0px;
}
</style>
</ui:fragment>
<p:inputTextarea value="#{dsfv.valueForEdit}" id="description" pt:aria-required="#{dsf.required}"
rows="5" cols="60" styleClass="form-control"
rendered="#{dsfv.datasetField.datasetFieldType.fieldType == 'TEXTBOX'}"/>
<p:watermark for="description" value="#{dsfv.datasetField.datasetFieldType.localeWatermark}"></p:watermark>

<div class="ui-message ui-message-error ui-widget ui-corner-all" aria-live="polite" jsf:rendered="#{dsfvIndex eq 0 and !empty dsfv.datasetField.validationMessage}">
<span class="ui-message-error-detail">#{dsfv.datasetField.validationMessage}</span>
</div>
Expand Down
3 changes: 3 additions & 0 deletions src/main/webapp/dataverse_template.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@
<o:resourceInclude path="/CustomizationFilesServlet?customFileType=style" />
</style>
</ui:fragment>
<ui:fragment rendered="#{DatasetPage.getCVMConf().size() > 0}">
<script src="#{resource['js/jquery-ui.js']}"></script>
</ui:fragment>
</h:head>
<h:body styleClass="#{widgetWrapper.widgetView ? 'widget-view' : ''}">
<f:loadBundle basename="propertyFiles.Bundle" var="bundle"/>
Expand Down
2 changes: 2 additions & 0 deletions src/main/webapp/metadataFragment.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@
</div>
<!-- Edit Mode -->
<ui:fragment rendered="${(!empty editMode)}">
<c:set var="cvmConf" value="#{DatasetPage.getCVMConf()}"/>
<p:fragment id="editMetadataFragement">
<o:importFunctions type="java.util.Collections" />
<div class="panel-group">
Expand Down Expand Up @@ -210,6 +211,7 @@
<ui:include src="datasetFieldForEditFragment.xhtml">
<ui:param name="dsfv" value="#{subdsf.singleValue}"/>
<ui:param name="dsfvIndex" value="0"/>
<ui:param name="cvMgr" value="#{cvmConf}"/>
</ui:include>
</ui:fragment>
<!-- MOVED SELECT ONE TO dataFieldForEdit -->
Expand Down
Loading

0 comments on commit 6960a4c

Please sign in to comment.