From 1777a6ecf392b781e8230a4280786b3e629eab3d Mon Sep 17 00:00:00 2001 From: Jacky Date: Sun, 29 Oct 2017 13:46:37 -0400 Subject: [PATCH] edit the user metadata --- .../com/google/refine/ProjectMetadata.java | 60 ++++++++++++++--- .../GetAllProjectMetadataCommand.java | 2 +- .../google/refine/io/FileProjectManager.java | 62 +++++++++++++++-- .../refine/preference/PreferenceStore.java | 2 + .../scripts/index/edit-metadata-dialog.js | 33 +++++++--- .../core/scripts/index/open-project-ui.js | 66 ++++++++++++++++++- 6 files changed, 200 insertions(+), 25 deletions(-) diff --git a/main/src/com/google/refine/ProjectMetadata.java b/main/src/com/google/refine/ProjectMetadata.java index 29372b7cc..545e3fef1 100644 --- a/main/src/com/google/refine/ProjectMetadata.java +++ b/main/src/com/google/refine/ProjectMetadata.java @@ -41,6 +41,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Properties; +import org.apache.commons.lang.exception.ExceptionUtils; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -72,10 +73,13 @@ public class ProjectMetadata implements Jsonizable { // import options is an array for 1-n data sources private JSONArray _importOptionMetaData = new JSONArray(); + // user metadata + private JSONArray _userMetadata = new JSONArray();; + private Map _customMetadata = new HashMap(); private PreferenceStore _preferenceStore = new PreferenceStore(); - final Logger logger = LoggerFactory.getLogger("project_metadata"); + final static Logger logger = LoggerFactory.getLogger("project_metadata"); protected ProjectMetadata(Date date) { _created = date; @@ -121,6 +125,12 @@ public class ProjectMetadata implements Jsonizable { writer.value(_importOptionMetaData); } + // write user metadata in {name, value, display} form: + if (_userMetadata.length() > 0) { + writer.key(PreferenceStore.USER_METADATA_KEY); + writer.value(_userMetadata); + } + if (isSaveMode(options)) { writer.key("password"); writer.value(_password); @@ -190,7 +200,7 @@ public class ProjectMetadata implements Jsonizable { try { pm._preferenceStore.load(obj.getJSONObject("preferences")); } catch (JSONException e) { - // ignore + logger.error(ExceptionUtils.getFullStackTrace(e)); } } @@ -199,7 +209,7 @@ public class ProjectMetadata implements Jsonizable { ((TopList) pm._preferenceStore.get("scripting.expressions")) .load(obj.getJSONArray("expressions")); } catch (JSONException e) { - // ignore + logger.error(ExceptionUtils.getFullStackTrace(e)); } } @@ -217,7 +227,7 @@ public class ProjectMetadata implements Jsonizable { } } } catch (JSONException e) { - // ignore + logger.error(ExceptionUtils.getFullStackTrace(e)); } } @@ -226,11 +236,19 @@ public class ProjectMetadata implements Jsonizable { JSONArray jsonArray = obj.getJSONArray("importOptionMetaData"); pm._importOptionMetaData = jsonArray; } catch (JSONException e) { - // ignore + logger.error(ExceptionUtils.getFullStackTrace(e)); } } - + if (obj.has(PreferenceStore.USER_METADATA_KEY) && !obj.isNull(PreferenceStore.USER_METADATA_KEY)) { + try { + JSONArray jsonArray = obj.getJSONArray(PreferenceStore.USER_METADATA_KEY); + pm._userMetadata = jsonArray; + } catch (JSONException e) { + logger.error(ExceptionUtils.getFullStackTrace(e)); + } + } + pm.written = new Date(); // Mark it as not needing writing until modified return pm; @@ -381,15 +399,39 @@ public class ProjectMetadata implements Jsonizable { updateModified(); } + + public JSONArray getUserMetadata() { + return _userMetadata; + } + + + public void setUserMetadata(JSONArray userMetadata) { + this._userMetadata = userMetadata; + } + + private void updateUserMetadata(String metaName, String valueString) { + for (int i = 0; i < _userMetadata.length(); i++) { + try { + JSONObject obj = _userMetadata.getJSONObject(i); + if (obj.getString("name").equals(metaName)) { + obj.put("value", valueString); + } + } catch (JSONException e) { + logger.error(ExceptionUtils.getFullStackTrace(e)); + } + } + } + public void setAnyField(String metaName, String valueString) { Class metaClass = this.getClass(); try { Field metaField = metaClass.getDeclaredField("_" + metaName); metaField.set(this, valueString); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException e) { - // do nothing - e.printStackTrace(); + } catch (NoSuchFieldException e) { + updateUserMetadata(metaName, valueString); + } catch (SecurityException | IllegalArgumentException | IllegalAccessException e) { + logger.error(ExceptionUtils.getFullStackTrace(e)); } } diff --git a/main/src/com/google/refine/commands/workspace/GetAllProjectMetadataCommand.java b/main/src/com/google/refine/commands/workspace/GetAllProjectMetadataCommand.java index c2f40128e..8ab03e036 100644 --- a/main/src/com/google/refine/commands/workspace/GetAllProjectMetadataCommand.java +++ b/main/src/com/google/refine/commands/workspace/GetAllProjectMetadataCommand.java @@ -76,7 +76,7 @@ public class GetAllProjectMetadataCommand extends Command { } } writer.endObject(); - + writer.key("customMetaDataColumns"); JSONArray customMetaDataColumns = new JSONArray( (String)ProjectManager.singleton.getPreferenceStore().get("userMetaData")); diff --git a/main/src/com/google/refine/io/FileProjectManager.java b/main/src/com/google/refine/io/FileProjectManager.java index e1cac2ede..1c255812d 100644 --- a/main/src/com/google/refine/io/FileProjectManager.java +++ b/main/src/com/google/refine/io/FileProjectManager.java @@ -44,6 +44,8 @@ import java.io.OutputStream; import java.util.Properties; import java.util.zip.GZIPInputStream; +import org.apache.commons.lang.exception.ExceptionUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.tools.tar.TarEntry; import org.apache.tools.tar.TarInputStream; import org.apache.tools.tar.TarOutputStream; @@ -59,8 +61,10 @@ import com.google.refine.ProjectManager; import com.google.refine.ProjectMetadata; import com.google.refine.history.HistoryEntryManager; import com.google.refine.model.Project; +import com.google.refine.preference.PreferenceStore; import com.google.refine.preference.TopList; + public class FileProjectManager extends ProjectManager { final static protected String PROJECT_DIR_SUFFIX = ".project"; @@ -355,6 +359,11 @@ public class FileProjectManager extends ProjectManager { reader = new FileReader(file); JSONTokener tokener = new JSONTokener(reader); JSONObject obj = (JSONObject) tokener.nextValue(); + + // load global preferences firstly + if (obj.has("preferences") && !obj.isNull("preferences")) { + _preferenceStore.load(obj.getJSONObject("preferences")); + } JSONArray a = obj.getJSONArray("projectIDs"); int count = a.length(); @@ -363,14 +372,12 @@ public class FileProjectManager extends ProjectManager { File projectDir = getProjectDir(id); ProjectMetadata metadata = ProjectMetadataUtilities.load(projectDir); + + mergeEmptyUserMetadata(metadata); _projectsMetadata.put(id, metadata); } - if (obj.has("preferences") && !obj.isNull("preferences")) { - _preferenceStore.load(obj.getJSONObject("preferences")); - } - if (obj.has("expressions") && !obj.isNull("expressions")) { // backward compatibility ((TopList) _preferenceStore.get("scripting.expressions")) .load(obj.getJSONArray("expressions")); @@ -395,6 +402,53 @@ public class FileProjectManager extends ProjectManager { return found; } + private void mergeEmptyUserMetadata(ProjectMetadata metadata) { + if (metadata == null) + return; + + // place holder + JSONArray userMetadataPreference = null; + // actual metadata for project + JSONArray jsonObjArray = metadata.getUserMetadata(); + + try { + userMetadataPreference = new JSONArray((String)_preferenceStore.get(PreferenceStore.USER_METADATA_KEY)); + } catch (JSONException e1) { + logger.error(ExceptionUtils.getFullStackTrace(e1)); + } + + if (userMetadataPreference == null) { + logger.warn("wrong definition of userMetadata format. Please use form [{\"name\": \"client name\", \"display\":true}, {\"name\": \"progress\", \"display\":false}]"); + return; + } + + for (int index = 0; index < userMetadataPreference.length(); index++) { + try { + boolean found = false; + JSONObject placeHolderJsonObj = userMetadataPreference.getJSONObject(index); + + for (int i = 0; i < jsonObjArray.length(); i++) { + JSONObject jsonObj = jsonObjArray.getJSONObject(i); + if (jsonObj.getString("name").equals(placeHolderJsonObj.getString("name"))) { + found = true; + jsonObj.put("display", placeHolderJsonObj.get("display")); + break; + } + } + + if (!found) { + placeHolderJsonObj.put("value", ""); + metadata.getUserMetadata().put(placeHolderJsonObj); + logger.info("Put the placeholder {} for project {}", + placeHolderJsonObj.getString("name"), + metadata.getName()); + } + } catch (JSONException e) { + logger.warn("Exception when mergeEmptyUserMetadata",e); + } + } + } + protected void recover() { boolean recovered = false; for (File file : _workspaceDir.listFiles()) { diff --git a/main/src/com/google/refine/preference/PreferenceStore.java b/main/src/com/google/refine/preference/PreferenceStore.java index b4ca581db..93b4d9c38 100644 --- a/main/src/com/google/refine/preference/PreferenceStore.java +++ b/main/src/com/google/refine/preference/PreferenceStore.java @@ -48,6 +48,8 @@ import com.google.refine.Jsonizable; import com.google.refine.RefineServlet; public class PreferenceStore implements Jsonizable { + public static final String USER_METADATA_KEY = "userMetaData"; + private boolean dirty = false; protected Map _prefs = new HashMap(); diff --git a/main/webapp/modules/core/scripts/index/edit-metadata-dialog.js b/main/webapp/modules/core/scripts/index/edit-metadata-dialog.js index f20d9f2b8..671757eb2 100644 --- a/main/webapp/modules/core/scripts/index/edit-metadata-dialog.js +++ b/main/webapp/modules/core/scripts/index/edit-metadata-dialog.js @@ -1,12 +1,11 @@ -function EditMetadataDialog(metaData) { +function EditMetadataDialog(metaData, targetRowElem) { this._metaDataUIs = []; this._metaData = metaData; this._MetaDataUI = function(tr, key, value, project) { var self = this; - var td0 = tr.insertCell(0); $(td0).text(key); @@ -14,7 +13,7 @@ function EditMetadataDialog(metaData) { $(td1).text((value !== null) ? value : ""); var td2 = tr.insertCell(2); - + $('