Author: lgiessmann Date: Wed Sep 14 02:25:05 2011 New Revision: 896
Log: gdl-frontend: Widgets: changed the update mechanism when committing http://textgrid.org/serviceregistry/model/types/Hash-Object instances => instead of deleting the entire old topic, only the old occurrence is deleted
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/CommitCallback.java
Modified: branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/CommitCallback.java ============================================================================== --- branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/CommitCallback.java Wed Sep 14 00:29:19 2011 (r895) +++ branches/gdl-frontend/src/anaToMia/GDL_Widgets/src/us/isidor/gdl/anaToMia/Widgets/isidorus/CommitCallback.java Wed Sep 14 02:25:05 2011 (r896) @@ -5,6 +5,8 @@ import us.isidor.gdl.anaToMia.Widgets.base.TmHelper; import us.isidor.gdl.anaToMia.Widgets.base.Utils; import us.isidor.gdl.anaToMia.Widgets.environment.Pair; +import us.isidor.gdl.anaToMia.Widgets.environment.TopicIdentifierTypes; + import com.google.gwt.core.client.JsArray; import com.google.gwt.http.client.Request; import com.google.gwt.http.client.RequestBuilder; @@ -14,7 +16,9 @@ import com.google.gwt.http.client.URL; import com.google.gwt.json.client.JSONArray; import com.google.gwt.json.client.JSONObject; +import com.google.gwt.json.client.JSONParser; import com.google.gwt.json.client.JSONString; +import com.google.gwt.json.client.JSONValue; import com.google.gwt.user.client.Window; import us.isidor.gdl.anaToMia.TopicMaps.TmEngineModel.ExporterException; import us.isidor.gdl.anaToMia.TopicMaps.TmEngineModel.TmEngine; @@ -33,6 +37,7 @@ public final String DELETE_REUQEST_URL = IsidorusConstants.DELETE_REQUEST_URL; public final String COMMIT_REQUEST_URL = IsidorusConstants.COMMIT_REQUEST_URL; public final String GET_REQUEST_URL = IsidorusConstants.GET_FRAGMENT_REQUEST_URL; + public final String HASH_VALUE_OCCURRENCE_TYPE = "http://textgrid.org/serviceregistry/model/value"; @Override @@ -234,24 +239,24 @@ if (200 == response.getStatusCode()) { if(edited){ String[] topPsi = Utils.splitUriByLastFragment(psi); - String[] tmPsi = Utils.splitUriByLastFragment(IsidorusConstants.TOPIC_MAP_IDENTIFIER); + String[] hashValuePsi = Utils.splitUriByLastFragment(CommitCallback.this.HASH_VALUE_OCCURRENCE_TYPE); JSONObject delObj = new JSONObject(); - delObj.put("type", new JSONString("Topic")); - JSONObject prefs = new JSONObject(); - prefs.put("pref_1", new JSONString(topPsi[0])); - prefs.put("pref_2", new JSONString(tmPsi[0])); - JSONObject delTop = new JSONObject(); - delTop.put("prefixes", prefs); - delTop.put("version", new JSONString("1.1")); - delTop.put("item_type", new JSONString("topic")); - JSONArray jPsis = new JSONArray(); - jPsis.set(0, new JSONString("[pref_1:" + topPsi[1] + "]")); - delTop.put("subject_identifiers", jPsis); + delObj.put("type", new JSONString("Occurrence")); + JSONObject delOcc = new JSONObject(); + delObj.put("delete", delOcc); + delOcc.put("version", new JSONString("1.1")); + delOcc.put("item_type", new JSONString("occurrence")); + JSONObject prefixes = new JSONObject(); + prefixes.put("pref_1", new JSONString(topPsi[0])); + prefixes.put("pref_2", new JSONString(hashValuePsi[0])); + delOcc.put("prefixes", prefixes); JSONArray jParents = new JSONArray(); - jParents.set(0, new JSONString("ii:[pref_2:" + tmPsi[1] + "]")); - delTop.put("parent", jParents); - delObj.put("delete", delTop); + jParents.set(0, new JSONString("si:[pref_1:" + topPsi[1] + "]")); + delOcc.put("parent", jParents); + + delOcc.put("value", this.getOldHashValue(response.getText(), this.psi)); + delOcc.put("type", new JSONString("si:[pref_2:" + hashValuePsi[1] + "]")); Window.alert(">>\n" + delObj.toString()); @@ -284,6 +289,122 @@ // TODO: reset page } } + + + private JSONString getOldHashValue(String jtmFragment, String topicPsiToBeUpdated){ + JSONString result = new JSONString(""); + if(jtmFragment == null || topicPsiToBeUpdated == null) return result; + + JSONValue receivedFragment = JSONParser.parseStrict(jtmFragment); + JSONObject fragment = receivedFragment.isObject(); + if(fragment == null) return result; + + JSONValue topsVal = fragment.get("topics"); + if(topsVal == null) return result; + JSONArray topics = topsVal.isArray(); + if(topics == null) return result; + + JSONValue prefVal = fragment.get("prefixes"); + JSONObject prefixes = null; + if(prefVal != null) prefixes = prefVal.isObject(); + + for(int topicIdx = 0; topicIdx != topics.size(); ++topicIdx){ + JSONValue hashTopicVal = topics.get(topicIdx); + if(hashTopicVal == null) continue; + + JSONObject hashTopic = hashTopicVal.isObject(); + if(hashTopic == null) continue; + + JSONValue psisVal = topics.get(topicIdx); + if(psisVal == null) continue; + + JSONArray psis = psisVal.isArray(); + if(psis == null) continue; + for(int psiIdx = 0; psiIdx != psis.size(); ++psiIdx){ + JSONValue psiVal = psis.get(psiIdx); + if(psiVal == null) continue; + + JSONString psi = psiVal.isString(); + if(psi != null && this.computeUri(psi.stringValue(), prefixes).equals(psi)){ + JSONObject occ = this.gethashValueOccurrence(hashTopic, prefixes); + if(occ == null) continue; + + JSONValue occVal = occ.get("value"); + if(occVal == null) continue; + + JSONString occValue = occVal.isString(); + if(occValue != null) return occValue; + } + } + } + + + return result; + } + + + private JSONObject gethashValueOccurrence(JSONObject hashTopic, JSONObject prefixes){ + if(hashTopic == null) return null; + + JSONValue occsVal = hashTopic.get("occurrences"); + if(occsVal == null) return null; + JSONArray occurrences = occsVal.isArray(); + if(occurrences == null) return null; + for(int occIdx = 0; occIdx != occurrences.size(); ++occIdx){ + JSONValue occVal = occurrences.get(occIdx); + if(occVal == null) continue; + JSONObject occurrence = occVal.isObject(); + if(occurrence == null) continue; + JSONValue typeVal = occurrence.get("type"); + if(typeVal == null) continue; + JSONString typeReference = typeVal.isString(); + if(typeReference == null) continue; + + Pair<String, TopicIdentifierTypes> typeRef = this.computeReferenceUri(typeReference, prefixes); + if(typeRef != null && typeRef.getSecond().equals(TopicIdentifierTypes.SubjectIdentifier) && typeRef.getFirst().equals(CommitCallback.this.HASH_VALUE_OCCURRENCE_TYPE)) return occurrence; + } + + return null; + } + + + private Pair<String, TopicIdentifierTypes> computeReferenceUri(JSONString curieReference, JSONObject prefixes){ + if(curieReference == null) return null; + + String curieString = curieReference.stringValue(); + if(curieString == null) return null; + + if(curieString.startsWith("ii:")){ + return new Pair<String, TopicIdentifierTypes>(this.computeUri(curieString.substring(3), prefixes), TopicIdentifierTypes.ItemIdentifier); + } else if(curieString.startsWith("si:")){ + return new Pair<String, TopicIdentifierTypes>(this.computeUri(curieString.substring(3), prefixes), TopicIdentifierTypes.SubjectIdentifier); + } else if(curieString.startsWith("sl:")){ + return new Pair<String, TopicIdentifierTypes>(this.computeUri(curieString.substring(3), prefixes), TopicIdentifierTypes.SubjectLocator); + } else { + return null; + } + } + + + private String computeUri(String curie, JSONObject prefixes){ + if(curie == null) return ""; + + if(curie.charAt(0) == '[' && curie.charAt(curie.length() - 1) == ']'){ + if(prefixes == null) return ""; + String rawString = curie.substring(1, curie.length() - 1); + String[] parts = rawString.split(":"); + if(parts.length != 2) return ""; + + JSONValue prefVal = prefixes.get(parts[0]); + if(prefVal == null) return ""; + JSONString prefString = prefVal.isString(); + if(prefString == null) return ""; + + return prefString + parts[1]; + } else { + return curie; + } + }
@Override @@ -294,6 +415,8 @@ } + + private class HashObjectDeleteRequest implements RequestCallback{ private String objectToBeDeleted = null; private String objectToBeSend = null;