You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@marmotta.apache.org by an...@apache.org on 2013/06/25 00:43:16 UTC
[6/7] MARMOTTA-261 : Remove sesame-tools-rio-jsonld
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/467d7055/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDProcessor.java
----------------------------------------------------------------------
diff --git a/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDProcessor.java b/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDProcessor.java
deleted file mode 100644
index 3d0074e..0000000
--- a/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDProcessor.java
+++ /dev/null
@@ -1,1386 +0,0 @@
-package de.dfki.km.json.jsonld;
-
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import de.dfki.km.json.jsonld.JSONLDUtils.NameGenerator;
-
-public class JSONLDProcessor {
-
- private static final Logger LOG = LoggerFactory.getLogger(JSONLDProcessor.class);
- private NameGenerator ngtmp;
-
- private Set<String> ignoredKeywords = new HashSet<String>();
-
- /**
- * Tells the processor to skip over the key specified by keyword any time it encounters it. Objects under this key will not be manipulated by any of the
- * processor functions and no triples will be created using it.
- *
- * @param keyword
- * The name of the key this processor should ignore.
- */
- public void ignoreKeyword(String keyword) {
- ignoredKeywords.add(keyword);
- }
-
- private Map<String, Object> edges;
- private Map<String, Object> subjects;
- private Map<String, Object> renamed;
- private Map<String, Object> serializations;
- private NameGenerator ngc14n;
-
- public Object expand(Object input) {
- return expand(new HashMap<String, Object>(), null, input);
- }
-
- private Object expand(Map<String, Object> ctx, Object property, Object value) {
- Object rval = null;
- if (value == null) {
- return null;
- } else if (property == null && value instanceof String) {
- rval = JSONLDUtils.expandTerm(ctx, (String) value);// , null));
- } else if (value instanceof List) {
- rval = new ArrayList<Object>();
- for (Object i : (List) value) {
- ((List) rval).add(expand(ctx, property, i));
- }
- } else if (value instanceof Map) {
- rval = new HashMap<String, Object>();
- if (((Map<String, Object>) value).containsKey("@context")) {
- try {
- ctx = JSONLDUtils.mergeContexts((Map<String, Object>) ctx, (Map<String, Object>) ((Map<String, Object>) value).get("@context"));
- } catch (Exception e) {
- // unable to merge contexts
- // TODO: this should probably just throw back to the calling
- // function
- e.printStackTrace();
- return null;
- }
- }
-
- rval = new HashMap<String, Object>();
- for (String key : ((Map<String, Object>) value).keySet()) {
- if ("@embed".equals(key) || "@explicit".equals(key) || "@default".equals(key) || "@omitDefault".equals(key) || ignoredKeywords.contains(key)) {
- JSONLDUtils.setProperty((Map<String, Object>) rval, key, JSONLDUtils.clone(((Map<String, Object>) value).get(key)));
- } else if (!"@context".equals(key)) {
- JSONLDUtils.setProperty((Map<String, Object>) rval, JSONLDUtils.expandTerm(ctx, key),
- expand(ctx, key, ((Map<String, Object>) value).get(key)));
- }
- }
- } else {
- // do type coercion
- String coerce = JSONLDUtils.getCoercionType(ctx, (String) property);// ,
- // null);
- Map<String, String> keywords = JSONLDUtils.getKeywords(ctx);
-
- // automatic coercion for basic JSON types
- if (coerce == null) {
- if (value instanceof Boolean) {
- coerce = JSONLDConsts.XSD_BOOLEAN;
- } else if (value instanceof Integer) {
- coerce = JSONLDConsts.XSD_INTEGER;
- } else if (value instanceof Double) {
- coerce = JSONLDConsts.XSD_DOUBLE;
- }
- }
-
- // special-case expand @id and @type (skips '@id' expansion)
- if (property.equals("@id") || property.equals(keywords.get("@id")) || property.equals("@type") || property.equals(keywords.get("@type"))) {
- rval = JSONLDUtils.expandTerm(ctx, (String) value);
- }
- // coerce to appropriate type
- else if (coerce != null) {
- rval = new HashMap<String, Object>();
-
- if (coerce.equals("@id")) {
- // expand IRI
- ((Map<String, Object>) rval).put("@id", JSONLDUtils.expandTerm(ctx, (String) value)); // ,
- // null));
- } else {
- ((Map<String, Object>) rval).put("@type", coerce);
- if (coerce.equals(JSONLDConsts.XSD_DOUBLE)) {
- DecimalFormat decimalFormat = new DecimalFormat("0.000000E0", new DecimalFormatSymbols(Locale.US));
- Double v = null;
- if (value instanceof String) {
- v = Double.parseDouble((String) value);
- } else if (value instanceof Integer) {
- // TODO: what is this? really?
- v = new Double(1.0 * (Integer) value);
- } else {
- v = (Double) value;
- }
- String dec = decimalFormat.format(v);
- Pattern p = Pattern.compile("(-?[0-9\\.]+)E((?:-*))([0-9]+)");
- Matcher matcher = p.matcher(dec);
- matcher.find();
- String sign = matcher.group(2);
- if ("".equals(sign)) {
- sign = "+";
- }
- value = matcher.group(1) + "e" + sign + (matcher.group(3).length() > 1 ? matcher.group(3) : "0" + matcher.group(3));
- } else {
- value = value.toString();
- }
- ((Map<String, Object>) rval).put("@value", value);
- }
- } else {
- // nothing to coerce
- rval = value.toString();
- }
- }
-
- return rval;
- }
-
- // TODO: note that in the spec, input is the first input, but in the ref
- // impl, context is.
- // using context here first because it matches everything else
- public Object compact(Object context, Object input) {
-
- Object rval = null;
-
- Map<String, Object> ctx;
- if (context == null) {
- ctx = new HashMap<String, Object>();
- } else if (context instanceof Map) {
- ctx = (Map<String, Object>) JSONLDUtils.clone(context);
- } else if (context instanceof List) {
- ctx = (Map<String, Object>) JSONLDUtils.mergeContexts(new HashMap<String, Object>(), context);
- } else {
- // TODO: are there any reasons that ctx shouldn't be a map?
- throw new RuntimeException("non-map or list contexts not yes supported");
- }
-
- input = expand(input);
-
- Map<String, Object> ctxOut = new HashMap<String, Object>();
- Object out = compact(ctx, null, input, ctxOut);
- rval = out;
-
- if (ctxOut.size() > 0) {
- rval = new HashMap<String, Object>();
- ((Map<String, Object>) rval).put("@context", ctxOut);
- if (out instanceof List) {
- ((Map<String, Object>) rval).put(JSONLDUtils.getKeywords(ctxOut).get("@id"), out);
- } else {
- for (String key : ((Map<String, Object>) out).keySet()) {
- ((Map<String, Object>) rval).put(key, ((Map<String, Object>) out).get(key));
- }
- }
- }
-
- return rval;
- }
-
- /*
- * TODO: this throws runtime exception. need to look at doing something more sane.
- */
- public Object compact(Map<String, Object> ctx, Object property, Object value, Map<String, Object> usedCtx) {
-
- Object rval = null;
- Map<String, String> keywords = JSONLDUtils.getKeywords(ctx);
-
- if (value == null) {
- rval = null;
- // TODO: used ctx stuff may actually be handy here
- JSONLDUtils.getCoercionType(ctx, (String) property, usedCtx);
- } else if (value instanceof List) {
- // recursively add compacted values to array
- rval = new ArrayList<Object>();
- for (Object o : (List<Object>) value) {
- ((List) rval).add(compact(ctx, property, o, usedCtx));
- }
- } else if (value instanceof Map && ((Map) value).containsKey("@id") && ((Map) value).get("@id") instanceof List) {
- // graph literal/disjoint graph
- rval = new HashMap<String, Object>();
- ((Map<String, Object>) rval).put(keywords.get("@id"), compact(ctx, property, ((Map) value).get("@id"), usedCtx));
- } else if (JSONLDUtils.isSubject(value)) { // recurse if value is a
- // subject
- // recursively handle sub-properties that aren't a sub-context
- rval = new HashMap<String, Object>();
- for (String key : ((Map<String, Object>) value).keySet()) {
- if (!"@context".equals(((Map<String, Object>) value).get(key))) {
- // set object to compacted property, only overwrite existing
- // properties if the property actually compacted
- String p = JSONLDUtils.compactIRI(ctx, key, usedCtx);
- if (!(key.equals(p)) || !((Map<String, Object>) rval).containsKey(p)) {
- ((Map<String, Object>) rval).put(p, compact(ctx, key, ((Map<String, Object>) value).get(key), usedCtx));
- }
- }
- }
- } else {
- // get coerce type
- String coerce = JSONLDUtils.getCoercionType(ctx, (String) property, usedCtx);
-
- // get type from value, to ensure coercion is valid
- String type = null;
- if (value instanceof Map) {
- // type coercion can only occur if language is not specified
- if (!((Map) value).containsKey("@language")) {
- // type must match coerce type if specified
- if (((Map) value).containsKey("@type")) {
- type = (String) ((Map<String, Object>) value).get("@type");
- } else if (((Map) value).containsKey("@id")) { // type is ID
- // (IRI)
- type = "@id";
- } else { // can be coerced to any type
- type = coerce;
- }
- }
- } else if (value instanceof String) {
- // type can be coerced to anything
- type = coerce;
- }
-
- // types that can be auto-coerced from a JSON-builtin
- if (coerce == null && (JSONLDConsts.XSD_BOOLEAN.equals(type) || JSONLDConsts.XSD_INTEGER.equals(type) || JSONLDConsts.XSD_DOUBLE.equals(type))) {
- coerce = type;
- }
-
- // do reverse type-coercion
- if (coerce != null) {
- // type is only None if a language was specified, which is an
- // error if type coercion is specified
- if (type == null) {
- throw new RuntimeException("Cannot coerce type when a language is " + "specified. The language information would be lost.");
- } else if (!type.equals(coerce)) {
- // if the value type does not match the coerce type, it is
- // an error
- throw new RuntimeException("Cannot coerce type because the type does not match.");
- } else {
- // do reverse type-coercion
- if (value instanceof Map) {
- if (((Map) value).containsKey("@id")) {
- rval = ((Map) value).get("@id");
- } else if (((Map) value).containsKey("@value")) {
- rval = ((Map) value).get("@value");
- }
- } else {
- rval = value;
- }
-
- // do basic JSON types conversion
- if (JSONLDConsts.XSD_BOOLEAN.equals(coerce)) {
- // TODO: this is a bit mad (and probably not exhaustive)
- if (rval instanceof String) {
- rval = "true".equals(rval);
- } else if (rval instanceof Integer) {
- rval = ((Integer) rval) != 0;
- } else if (rval instanceof Double) {
- rval = ((Double) rval) != 0.0;
- } else if (rval instanceof Long) {
- rval = ((Long) rval) != 0L;
- } else if (rval instanceof Float) {
- rval = ((Float) rval) != 0.0f;
- } else if (rval instanceof Short) {
- rval = ((Short) rval) != 0;
- } else if (!(rval instanceof Boolean)) {
- rval = false;
- }
- } else if (JSONLDConsts.XSD_DOUBLE.equals(coerce)) {
- if (rval instanceof String) {
- rval = Double.parseDouble((String) rval);
- } else if (rval instanceof Number) {
- rval = ((Number) rval).doubleValue();
- }
- } else if (JSONLDConsts.XSD_INTEGER.equals(coerce)) {
- if (rval instanceof String) {
- rval = Integer.parseInt((String) rval);
- } else if (rval instanceof Number) {
- rval = ((Number) rval).intValue();
- }
- }
- }
- } else if (value instanceof Map) {
- // no type-coercion, just change keywords/copy value
- rval = new HashMap<String, Object>();
- for (String key : ((Map<String, Object>) value).keySet()) {
- ((Map<String, Object>) rval).put(keywords.get(key), ((Map) value).get(key));
- }
- } else {
- rval = JSONLDUtils.clone(value);
- }
-
- if ("@id".equals(type)) {
- // compact IRI
- if (rval instanceof Map) {
- ((Map) rval).put(keywords.get("@id"), JSONLDUtils.compactIRI(ctx, (String) ((Map<String, Object>) rval).get(keywords.get("@id")), usedCtx));
- } else {
- rval = JSONLDUtils.compactIRI(ctx, (String) rval, usedCtx);
- }
- }
- }
- return rval;
- }
-
- public Object frame(Object input, Object frame) {
- return frame(input, frame, null);
- }
-
- public Object frame(Object input, Object frame, Map options) {
- Object rval = null;
-
- input = normalize(input);
-
- Object ctx = null;
-
- if (frame instanceof Map && ((Map) frame).containsKey("@context")) {
- ctx = JSONLDUtils.clone(((Map) frame).get("@context"));
- frame = expand(frame);
- } else if (frame instanceof List) {
- if (((List) frame).size() > 0) {
- Object f0 = ((List) frame).get(0);
- if (f0 instanceof Map && ((Map) f0).containsKey("@context")) {
- ctx = JSONLDUtils.clone(((Map) f0).get("@context"));
- }
-
- List tmp = new ArrayList();
- for (Object f : (List) frame) {
- tmp.add(expand(f));
- }
- frame = tmp;
- }
- }
-
- Map defaultOptions = new HashMap();
- Map tmpopts = new HashMap();
- tmpopts.put("embedOn", true);
- tmpopts.put("explicitOn", false);
- tmpopts.put("omitDefaultOn", false);
- defaultOptions.put("defaults", tmpopts);
-
- // TODO: merge in options from input
- options = defaultOptions;
-
- Map subjects = new HashMap();
- for (Object i : (List) input) {
- subjects.put(((Map) i).get("@id"), i);
- }
-
- rval = JSONLDUtils.frame(subjects, (List) input, frame, new HashMap(), false, null, null, options);
-
- if (ctx != null && rval != null) {
- if (rval instanceof List) {
- List tmp = (List) rval;
- rval = new ArrayList();
- for (Object i : tmp) {
- ((List) rval).add(compact(ctx, i));
- }
- } else {
- rval = compact(ctx, rval);
- }
- }
-
- return rval;
- }
-
- public List<? extends Map<String, Object>> normalize(Object input) {
- // because the expanded output of items from the onlinebox are the same
- // as the normalized version
- // (just inside a list) i'm going to skip implementing the normalize
- // function for now.
- // TODO: implement this properly as if data is really to be imported
- // into the OB with this method
- // this will be needed (mainly for identifying embedded items)
- List<Map<String, Object>> rval = new ArrayList<Map<String, Object>>();
-
- if (input != null) {
-
- Object expanded = expand(new HashMap<String, Object>(), null, input);
-
- nameBlankNodes(expanded);
-
- Map<String, Object> subjects = new HashMap<String, Object>();
- try {
- flatten(null, null, expanded, subjects);
- } catch (Exception e) {
- // TODO: This should probably be thrown back to the caller
- e.printStackTrace();
- LOG.error("flatten failed!");
- return null;
- }
-
- for (String key : subjects.keySet()) {
- Map<String, Object> s = (Map<String, Object>) subjects.get(key);
- // TODO: in javascript the keys are sorted and added back into
- // the array
- // in alphabetical order. however in HashMaps, this order isn't
- // kept
- rval.add(s);
- }
-
- canonicalizeBlankNodes(rval);
-
- // sort the output
- Collections.sort(rval, new Comparator<Map<String, Object>>() {
- public int compare(Map<String, Object> a, Map<String, Object> b) {
- return JSONLDUtils.compare(a.get("@id"), b.get("@id"));
- }
- });
- }
-
- return rval;
- }
-
- /**
- *
- *
- * @return a list of objects returned by tripleCallback
- */
- public void triples(Object input, JSONLDTripleCallback tripleCallback) {
- Object normalized = normalize(input);
-
- if (tripleCallback == null) {
- // TODO: make default triple callback
- }
-
- List<Object> rval = new ArrayList<Object>();
- for (Map<String, Object> e : (List<Map<String, Object>>) normalized) {
- String s = (String) e.get("@id");
-
- for (String p : e.keySet()) {
- Object obj = e.get(p);
-
- // don't generate a triple for the @id or any keys that should
- // be ignored
- if (p.equals("@id") || ignoredKeywords.contains(p)) {
- continue;
- } else if (p.equals("@type")) {
- p = JSONLDConsts.RDF_SYNTAX_NS + "type";
- }
-
- if (!(obj instanceof List)) {
- List<Object> tmp = new ArrayList<Object>();
- tmp.add(obj);
- obj = tmp;
- }
- for (Object o : (List<Object>) obj) {
- if (o instanceof String) {
- // type is a special case where the uri isn't expanded
- // out into an object
- if (p.toString().equals(JSONLDConsts.RDF_SYNTAX_NS + "type")) {
- tripleCallback.triple(s, p, o.toString());
- } else {
- tripleCallback.triple(s, p, (String) o, JSONLDConsts.XSD_STRING, null);
- }
- } else if (o instanceof Map) {
- if (((Map) o).containsKey("@value")) {
- if (((Map) o).containsKey("@type")) {
- String datatypeURI = (String) ((Map) o).get("@type");
- String value = (String) ((Map) o).get("@value");
- tripleCallback.triple(s, p, value, datatypeURI, null);
- } else if (((Map) o).containsKey("@language")) {
- tripleCallback.triple(s, p, (String) ((Map) o).get("@value"), JSONLDConsts.XSD_STRING, (String) ((Map) o).get("@language"));
- } else {
- tripleCallback.triple(s, p, (String) ((Map) o).get("@value"), JSONLDConsts.XSD_STRING, null);
- }
- } else if (((Map) o).containsKey("@id")) {
- tripleCallback.triple(s, p, (String) ((Map) o).get("@id"));
- } else {
- // TODO: have i missed anything?
- return;
- }
- }
- }
- }
- }
- }
-
- /*
- * public Object simplify(Map input) { return simplify(input, new HashMap()); }
- */
-
- public static void generateSimplifyContext(Object input, Map<String, Object> ctx) {
- if (input instanceof List) {
- for (Object o : (List) input) {
- generateSimplifyContext(o, ctx);
- }
- } else if (input instanceof Map) {
- Map<String, Object> o = (Map<String, Object>) input;
- for (String key : o.keySet()) {
- Object val = o.get(key);
- if (key.matches("^https?://.+$")) {
- int idx = key.lastIndexOf('#');
- if (idx < 0) {
- idx = key.lastIndexOf('/');
- }
- String skey = key.substring(idx + 1);
- Object keyval = key;
- if (val instanceof Map) {
- if (((Map) val).containsKey("@id")) {
- Map tmp = new HashMap();
- tmp.put("@type", "@id");
- tmp.put("@id", key);
- keyval = tmp;
- }
- }
- while (true) {
- // check if the key is already in the frame ctx
- if (ctx.containsKey(skey)) {
- // if so, check if the values are the same
- if (ctx.get(skey).equals(keyval)) {
- // if they are, skip adding this
- break;
- }
- // if not, add a _ to the simple key and try again
- skey += "_";
- } else {
- ctx.put(skey, keyval);
- break;
- }
- }
- }
- if (val instanceof Map || val instanceof List) {
- generateSimplifyContext(val, ctx);
- }
- }
- }
- }
-
- /**
- * automatically builds a frame which attempts to simplify the keys and values as much as possible
- *
- * NOTE: this is experimental and only built for specific conditions
- *
- * @param input
- * @return
- */
- public Object simplify(Map input) {
-
- Map<String, Object> origCtx = (Map<String, Object>) input.get("@context");
- Object expanded = expand(input);
- Map<String, Object> framectx = new HashMap<String, Object>();
-
- generateSimplifyContext(expanded, framectx);
-
- if (origCtx != null) {
- framectx = JSONLDUtils.mergeContexts(origCtx, framectx);
- }
-
- return compact(framectx, expanded);
- }
-
- private Map<String, Object> nestCore(Map<String, Object> rootObj, Map<String, Map<String, Object>> otherObjs) {
- Map<String, Object> rval = new HashMap<String, Object>();
- for (String key : rootObj.keySet()) {
- Object val = rootObj.get(key);
- if (ignoredKeywords.contains(key)) {
- rval.put(key, val);
- } else if (val instanceof List) {
- List<Object> lv = new ArrayList<Object>();
- for (Map<String, Object> o : (List<Map<String, Object>>) val) {
- lv.add(nestCore(o, otherObjs));
- }
- rval.put(key, lv);
- } else if (val instanceof Map) {
- // TODO: should this be true as well? ((Map) val).size() == 1
- if (((Map) val).containsKey("@id") && otherObjs.containsKey(((Map) val).get("@id"))) {
- rval.put(key, otherObjs.get(((Map) val).get("@id")));
- } else {
- rval.put(key, nestCore((Map<String, Object>) val, otherObjs));
- }
- } else {
- rval.put(key, val);
- }
- }
- return rval;
- }
-
- /**
- * expands all the objects in the input list, and nests all the non-root object lists
- * into the root object, resulting in a single object
- *
- * TODO: i'm not sure if the way i'm keeping the original context is what i really want
- *
- * @param input
- * @param rootObjId
- * @return
- */
- public Object nest(List<Map<String, Object>> input, String rootObjId) {
- Map<String, Object> rootObj = null;
- Map<String, Object> rootObjCtx = null;
- Map<String, Map<String, Object>> otherObjs = new HashMap<String, Map<String, Object>>();
- // find the root object and build a map of the non-root objects mapped by id
- for (Map<String, Object> item : input) {
- if (item.containsKey("@id")) {
- if (rootObjId.equals(item.get("@id"))) {
- rootObjCtx = (Map<String, Object>) item.get("@context");
- rootObj = (Map<String, Object>) expand(item);
- } else {
- //Map<String, Object> clone = (Map<String, Object>) JSONLDUtils.clone(item);
- //clone.remove("@id");
- otherObjs.put((String) item.get("@id"), (Map<String, Object>) expand(item));
- }
- }
- }
-
- if (rootObj == null) {
- // no object matching the root object found, should probably return an error actually
- // TODO: throw runtimeexception when the rest of the library is updated
- return input;
- }
-
- // this nests all the elements in the input once (not including the root object)
- Map<String, Map<String, Object>> nestedOthers = new HashMap<String, Map<String, Object>>();
- for (String key : otherObjs.keySet()) {
- Map<String, Object> val = otherObjs.get(key);
- nestedOthers.put(key, nestCore(val, otherObjs));
- }
- // nests the root object with the nested other objects
- Map<String, Object> rval = nestCore(rootObj, nestedOthers);
-
- // compact the results with the original root object's context
- return compact(rootObjCtx != null ? rootObjCtx : new HashMap<String, Object>(), rval);
- }
-
- public void nameBlankNodes(Object input) {
- JSONLDUtils.NameGenerator ng = new JSONLDUtils.NameGenerator("tmp");
- this.ngtmp = ng;
-
- // Map<String,Object> subjects = new HashMap<String, Object>();
- subjects = new HashMap<String, Object>();
- List<Map<String, Object>> bnodes = new ArrayList<Map<String, Object>>();
-
- collectSubjects(input, subjects, bnodes);
-
- for (Map<String, Object> bnode : bnodes) {
- if (!bnode.containsKey("@id")) {
- while (subjects.containsKey(ng.next()))
- ;
- ((Map<String, Object>) bnode).put("@id", ng.current());
- subjects.put(ng.current(), bnode);
- }
- }
- }
-
- private void flatten(Object parent, String parentProperty, Object value, Map<String, Object> subjects) throws Exception {
-
- Object flattened = null;
-
- if (value == null) {
- // drop null values
- } else if (value instanceof List) {
- for (Object v : (List<Object>) value) {
- flatten(parent, parentProperty, v, subjects);
- }
- } else if (value instanceof Map) {
- Map<String, Object> mapVal = (Map<String, Object>) value;
- if (mapVal.containsKey("@value") || "@type".equals(parentProperty)) {
- // already-expanded value
- flattened = JSONLDUtils.clone(value);
- } else if (mapVal.get("@id") instanceof List) {
- // graph literal/disjoint graph
- if (parent != null) {
- // cannot flatten embedded graph literals
- throw new Exception("Embedded graph literals cannot be flattened");
- }
-
- // top-level graph literal
- for (Object key : (List<Object>) mapVal.get("@id")) {
- if (!ignoredKeywords.contains(key)) {
- flatten(parent, parentProperty, key, subjects);
- }
- }
- } else { // regular subject
- // create of fetch existing subject
- Object subject;
- if (subjects.containsKey(mapVal.get("@id"))) {
- subject = subjects.get(mapVal.get("@id"));
- } else {
- subject = new HashMap<String, Object>();
- ((Map<String, Object>) subject).put("@id", mapVal.get("@id"));
- subjects.put((String) mapVal.get("@id"), subject);
- }
- flattened = new HashMap<String, Object>();
- ((Map<String, Object>) flattened).put("@id", ((Map<String, Object>) subject).get("@id"));
-
- for (String key : mapVal.keySet()) {
- Object v = mapVal.get(key);
-
- if (ignoredKeywords.contains(key)) {
- ((Map<String, Object>) subject).put(key, v);
- } else if (v != null && !"@id".equals(key)) {
- if (((Map<String, Object>) subject).containsKey(key)) {
- if (!(((Map<String, Object>) subject).get(key) instanceof List)) {
- Object tmp = ((Map<String, Object>) subject).get(key);
- List<Object> lst = new ArrayList<Object>();
- lst.add(tmp);
- ((Map<String, Object>) subject).put(key, lst);
- }
- } else {
- List<Object> lst = new ArrayList<Object>();
- ((Map<String, Object>) subject).put(key, lst);
- }
-
- flatten(((Map<String, Object>) subject).get(key), key, v, subjects);
- if (((List<Object>) ((Map<String, Object>) subject).get(key)).size() == 1) {
- // convert subject[key] to a single object if there
- // is only one object in the list
- ((Map<String, Object>) subject).put(key, ((List<Object>) ((Map<String, Object>) subject).get(key)).get(0));
- }
- }
- }
- }
- } else {
- // string value
- flattened = value;
- }
-
- if (flattened != null && parent != null) {
- if (parent instanceof List) {
- boolean duplicate = false;
- for (Object e : (List<Object>) parent) {
- if (JSONLDUtils.compareObjects(e, flattened) == 0) {
- duplicate = true;
- break;
- }
- }
- if (!duplicate) {
- ((List<Object>) parent).add(flattened);
- }
- } else {
- ((Map<String, Object>) parent).put(parentProperty, flattened);
- }
- }
- }
-
- private void collectEdges() {
- Map<String, Object> refs = (Map<String, Object>) this.edges.get("refs");
- Map<String, Object> props = (Map<String, Object>) this.edges.get("props");
-
- for (String iri : this.subjects.keySet()) {
- Map<String, Object> subject = (Map<String, Object>) this.subjects.get(iri);
- for (String key : subject.keySet()) {
- if (!key.equals("@id") && !ignoredKeywords.contains(key)) {
- Object object = subject.get(key);
- List<Object> tmp = null;
- if (object instanceof List) {
- tmp = (List<Object>) object;
- } else {
- tmp = new ArrayList<Object>();
- tmp.add(object);
- }
- for (Object o : tmp) {
- if (o instanceof Map && ((Map) o).containsKey("@id") && this.subjects.containsKey(((Map) o).get("@id"))) {
- Object objIri = ((Map<String, Object>) o).get("@id");
- Map<String, Object> tmp1 = new HashMap<String, Object>();
- tmp1.put("s", iri);
- tmp1.put("p", key);
- ((Map<String, List>) refs.get(objIri)).get("all").add(tmp1);
- tmp1 = new HashMap<String, Object>();
- tmp1.put("s", objIri);
- tmp1.put("p", key);
- ((Map<String, List>) props.get(iri)).get("all").add(tmp1);
- }
- }
- }
- }
- }
-
- Comparator<Object> edgesCmp = new Comparator<Object>() {
- public int compare(Object a, Object b) {
- return compareEdges(a, b);
- }
- };
-
- for (String iri : refs.keySet()) {
- List<Object> all = (List<Object>) ((Map<String, Object>) refs.get(iri)).get("all");
- Collections.sort(all, edgesCmp);
- List<Object> bnodes = new ArrayList<Object>();
- for (Object edge : all) {
- if (JSONLDUtils.isBlankNodeIri(((Map<String, Object>) edge).get("s"))) {
- bnodes.add(edge);
- }
- }
- ((Map<String, Object>) refs.get(iri)).put("bnodes", bnodes);
- }
- for (String iri : props.keySet()) {
- List<Object> all = (List<Object>) ((Map<String, Object>) props.get(iri)).get("all");
- Collections.sort(all, edgesCmp);
- List<Object> bnodes = new ArrayList<Object>();
- for (Object edge : all) {
- if (JSONLDUtils.isBlankNodeIri(((Map<String, Object>) edge).get("s"))) {
- bnodes.add(edge);
- }
- }
- ((Map<String, Object>) props.get(iri)).put("bnodes", bnodes);
- }
-
- }
-
- public void canonicalizeBlankNodes(List<Map<String, Object>> input) {
-
- this.renamed = new HashMap<String, Object>();
- this.serializations = new HashMap<String, Object>();
- this.edges = new HashMap<String, Object>();
- edges.put("refs", new HashMap<String, Object>());
- edges.put("props", new HashMap<String, Object>());
-
- this.subjects = new HashMap<String, Object>();
- List<Map<String, Object>> bnodes = new ArrayList<Map<String, Object>>();
-
- for (Map<String, Object> s : input) {
- String iri = (String) s.get("@id");
- subjects.put(iri, s);
- Map<String, Object> refs = (Map<String, Object>) edges.get("refs");
- Map<String, List> tmp = new HashMap<String, List>();
- tmp.put("all", new ArrayList<Object>());
- tmp.put("bnodes", new ArrayList<Object>());
- refs.put(iri, tmp);
- Map<String, Object> props = (Map<String, Object>) edges.get("props");
- tmp = new HashMap<String, List>();
- tmp.put("all", new ArrayList<Object>());
- tmp.put("bnodes", new ArrayList<Object>());
- props.put(iri, tmp);
-
- if (JSONLDUtils.isBlankNodeIri(iri)) {
- bnodes.add(s);
- }
- }
-
- collectEdges();
-
- this.ngc14n = new NameGenerator("c14n");
- NameGenerator c14n = this.ngc14n;
- NameGenerator ngTmp = this.ngtmp;
-
- for (Map<String, Object> bnode : bnodes) {
- String iri = (String) bnode.get("@id");
- if (c14n.inNamespace(iri)) {
- while (subjects.containsKey(ngTmp.next()))
- ;
- renameBlankNode(bnode, ngTmp.current());
- iri = (String) bnode.get("@id");
- }
- Map<String, Object> tmp = new HashMap<String, Object>();
- tmp.put("props", null);
- tmp.put("refs", null);
- serializations.put(iri, tmp);
- }
-
- Comparator<Map<String, Object>> bnodeSort = new Comparator<Map<String, Object>>() {
- private JSONLDProcessor processor;
-
- public Comparator<Map<String, Object>> setProcessor(JSONLDProcessor p) {
- processor = p;
- return this;
- }
-
- public int compare(Map<String, Object> a, Map<String, Object> b) {
- int rval = processor.deepCompareBlankNodes(a, b);
- return rval;
- }
- }.setProcessor(this);
-
- // keep sorting and naming blank nodes until they are all named
- boolean resort = true;
- while (bnodes.size() > 0) {
-
- if (resort) {
- resort = false;
- Collections.sort(bnodes, bnodeSort);
- }
-
- Map<String, Object> bnode = bnodes.get(0);
- bnodes.remove(0);
- String iri = (String) bnode.get("@id");
- resort = serializations.containsKey(iri) && ((Map<String, Object>) serializations.get(iri)).get("props") != null;
- Map<String, Object> mapping = null;
- for (String dir : new String[] { "props", "refs" }) {
- // if no serialization has been computed, name only the first
- // node
- if (serializations.containsKey(iri) && ((Map<String, Object>) serializations.get(iri)).containsKey(dir)
- && ((Map<String, Object>) serializations.get(iri)).get(dir) != null) {
- mapping = (Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) serializations.get(iri)).get(dir)).get("m");
- } else {
- mapping = new HashMap<String, Object>();
- mapping.put(iri, "s1");
- }
-
- // TODO: sort keys by value to name them in order
- List<String> keys = new ArrayList<String>(mapping.keySet());
- Collections.sort(keys, new Comparator<String>() {
- private Map<String, Object> mapping;
-
- public Comparator<String> setMapping(Map<String, Object> m) {
- this.mapping = m;
- return this;
- }
-
- public int compare(String a, String b) {
- return JSONLDUtils.compare(this.mapping.get(a), this.mapping.get(b));
- }
- }.setMapping(mapping));
-
- // name bnodes in mapping
- List<String> renamed = new ArrayList<String>();
- for (String iriK : keys) {
- if (!c14n.inNamespace(iri) && subjects.containsKey(iriK)) {
- renameBlankNode((Map<String, Object>) subjects.get(iriK), c14n.next());
- renamed.add(iriK);
- }
- }
-
- // only keep non-canonically named bnodes
- List<Map<String, Object>> tmp = bnodes;
- bnodes = new ArrayList<Map<String, Object>>();
- for (Map<String, Object> b : tmp) {
- String iriB = (String) b.get("@id");
- if (!c14n.inNamespace(iriB)) {
- for (Object i2 : renamed) {
- if (markSerializationDirty(iriB, i2, dir)) {
- resort = true;
- }
- }
- bnodes.add(b);
- }
- }
- }
- }
-
- for (String key : ((Map<String, Object>) edges.get("props")).keySet()) {
- if (((List<Object>) ((Map<String, Object>) ((Map<String, Object>) edges.get("props")).get(key)).get("bnodes")).size() > 0) {
- Map<String, Object> bnode = (Map<String, Object>) subjects.get(key);
- for (String p : bnode.keySet()) {
- if (!p.startsWith("@") && bnode.get(p) instanceof List) {
- Collections.sort((List<Object>) bnode.get(p), new Comparator<Object>() {
- public int compare(Object o1, Object o2) {
- return JSONLDUtils.compareObjects(o1, o2);
- }
-
- });
- }
- }
-
- }
- }
-
- }
-
- private boolean markSerializationDirty(String iri, Object changed, String dir) {
- boolean rval = false;
- Object s = serializations.get(iri);
- if (((Map<String, Object>) s).containsKey(dir) && ((Map<String, Object>) s).get(dir) != null
- && ((Map<String, Object>) ((Map<String, Object>) ((Map<String, Object>) s).get(dir)).get("m")).containsKey(changed)) {
- ((Map<String, Object>) s).put(dir, null);
- rval = true;
- }
- return rval;
- }
-
- private void renameBlankNode(Map<String, Object> b, String id) {
-
- String old = (String) b.get("@id");
- b.put("@id", id);
-
- subjects.put(id, subjects.get(old));
- subjects.remove(old);
-
- // update reference and property lists
- ((Map<String, Object>) edges.get("refs")).put(id, ((Map<String, Object>) edges.get("refs")).get(old));
- ((Map<String, Object>) edges.get("props")).put(id, ((Map<String, Object>) edges.get("props")).get(old));
- ((Map<String, Object>) edges.get("refs")).remove(old);
- ((Map<String, Object>) edges.get("props")).remove(old);
-
- // update references to this bnode
- List<Map<String, Object>> refs = (List<Map<String, Object>>) ((Map<String, Object>) ((Map<String, Object>) edges.get("refs")).get(id)).get("all");
- for (Map<String, Object> i : refs) {
- String iri = (String) i.get("s");
- if (iri.equals(old)) {
- iri = id;
- }
- Map<String, Object> ref = (Map<String, Object>) subjects.get(iri);
- List<Map<String, Object>> props = (List<Map<String, Object>>) ((Map<String, Object>) ((Map<String, Object>) edges.get("props")).get(iri))
- .get("all");
- for (Map<String, Object> i2 : props) {
- if (old.equals(i2.get("s"))) {
- i2.put("s", id);
- String p = (String) i2.get("p");
- List<Object> tmp = null;
- if (ref.get(p) instanceof Map) {
- tmp = new ArrayList<Object>();
- tmp.add(ref.get(p));
- } else if (ref.get(p) instanceof List) {
- tmp = (List<Object>) ref.get(p);
- } else {
- tmp = new ArrayList<Object>();
- }
-
- for (Object n : tmp) {
- if (n instanceof Map && ((Map) n).containsKey("@id") && old.equals(((Map<String, Object>) n).get("@id"))) {
- ((Map<String, Object>) n).put("@id", id);
- }
- }
- }
- }
- }
-
- // update references from this bnode
- List<Map<String, Object>> props = (List<Map<String, Object>>) ((Map<String, Object>) ((Map<String, Object>) edges.get("props")).get(id)).get("all");
- for (Map<String, Object> i : props) {
- String iri = (String) i.get("s");
- refs = (List<Map<String, Object>>) ((Map<String, Object>) ((Map<String, Object>) edges.get("refs")).get(iri)).get("all");
- for (Map<String, Object> r : refs) {
- if (old.equals(r.get("s"))) {
- r.put("s", id);
- }
- }
- }
- }
-
- private int deepCompareBlankNodes(Map<String, Object> a, Map<String, Object> b) {
- int rval = 0;
-
- String iriA = (String) a.get("@id");
- String iriB = (String) b.get("@id");
-
- if (iriA.equals(iriB)) {
- rval = 0;
- } else {
- // try a shallow compare first
- rval = shallowCompareBlankNodes(a, b);
-
- if (rval == 0) {
- // deep compare is needed
- String[] dirs = new String[] { "props", "refs" };
- for (int i = 0; rval == 0 && i < dirs.length; i++) {
- String dir = dirs[i];
- Map<String, Object> sA = (Map<String, Object>) serializations.get(iriA);
- Map<String, Object> sB = (Map<String, Object>) serializations.get(iriB);
- if (sA.get(dir) == null) {
- MappingBuilder mb = new MappingBuilder();
- if (dir.equals("refs")) {
- mb.mapping = (Map<String, String>) JSONLDUtils.clone(((Map<String, Object>) sA.get("props")).get("m"));
- mb.count = mb.mapping.size() + 1;
- }
- serializeBlankNode(sA, iriA, mb, dir);
- }
- if (sB.get(dir) == null) {
- MappingBuilder mb = new MappingBuilder();
- if (dir.equals("refs")) {
- mb.mapping = (Map<String, String>) JSONLDUtils.clone(((Map<String, Object>) sB.get("props")).get("m"));
- mb.count = mb.mapping.size() + 1;
- }
- serializeBlankNode(sB, iriB, mb, dir);
- }
-
- rval = JSONLDUtils.compare(((Map<String, Object>) sA.get(dir)).get("s"), ((Map<String, Object>) sB.get(dir)).get("s"));
- }
- }
- }
-
- return rval;
- }
-
- private void serializeBlankNode(Map<String, Object> s, String iri, MappingBuilder mb, String dir) {
- if (!(mb.processed.containsKey(iri))) {
- mb.processed.put(iri, true);
- String siri = mb.mapNode(iri);
-
- MappingBuilder original = mb.copy();
-
- List<Object> adj = (List<Object>) ((Map<String, Object>) ((Map<String, Object>) edges.get(dir)).get(iri)).get("bnodes");
- Map<String, Object> mapped = new HashMap<String, Object>();
- List<Object> notMapped = new ArrayList<Object>();
-
- for (Object i : adj) {
- if (mb.mapping.containsKey(((Map<String, Object>) i).get("s"))) {
- mapped.put(mb.mapping.get(((Map<String, Object>) i).get("s")), ((Map<String, Object>) i).get("s"));
- } else {
- notMapped.add(i);
- }
- }
-
- int combos = Math.max(1, notMapped.size());
- for (int i = 0; i < combos; ++i) {
- MappingBuilder m = (i == 0) ? mb : original.copy();
- serializeCombos(s, iri, siri, mb, dir, mapped, notMapped);
- }
- }
- }
-
- private void serializeCombos(Map<String, Object> s, String iri, String siri, MappingBuilder mb, String dir, Map<String, Object> mapped,
- List<Object> notMapped) {
- if (notMapped.size() > 0) {
- mapped = (Map<String, Object>) JSONLDUtils.clone(mapped);
- mapped.put(mb.mapNode((String) ((Map<String, Object>) notMapped.get(0)).get("s")), ((Map<String, Object>) notMapped.get(0)).get("s"));
-
- MappingBuilder original = mb.copy();
- notMapped.remove(0);
-
- int rotations = Math.max(1, notMapped.size());
- for (int r = 0; r < rotations; ++r) {
- MappingBuilder m = (r == 0) ? mb : original.copy();
- serializeCombos(s, iri, siri, m, dir, mapped, notMapped);
- JSONLDUtils.rotate(notMapped);
- }
- } else {
- List<String> keys = new ArrayList<String>(mapped.keySet());
- Collections.sort(keys);
- Map<String, Object> tmp = new HashMap<String, Object>();
- tmp.put("i", iri);
- tmp.put("k", keys);
- tmp.put("m", mapped);
- mb.adj.put(siri, tmp);
- mb.serialize(this.subjects, this.edges);
-
- if (s.get(dir) == null || JSONLDUtils.compareSerializations(mb.s, (String) ((Map<String, Object>) s.get(dir)).get("s")) <= 0) {
- for (String k : keys) {
- serializeBlankNode(s, (String) mapped.get(k), mb, dir);
- }
-
- mb.serialize(this.subjects, this.edges);
- if (s.get(dir) == null || JSONLDUtils.compareSerializations(mb.s, (String) ((Map<String, Object>) s.get(dir)).get("s")) <= 0
- && mb.s.length() >= ((String) ((Map<String, Object>) s.get(dir)).get("s")).length()) {
- tmp = new HashMap<String, Object>();
- tmp.put("s", mb.s);
- tmp.put("m", mb.mapping);
- s.put(dir, tmp);
- }
- }
- }
- }
-
- private int shallowCompareBlankNodes(Map<String, Object> a, Map<String, Object> b) {
- int rval = 0;
-
- List<String> pA = new ArrayList<String>();
- pA.addAll(a.keySet());
- List<String> pB = new ArrayList<String>();
- pB.addAll(b.keySet());
-
- rval = JSONLDUtils.compare(pA.size(), pB.size());
-
- if (rval == 0) {
- Collections.sort(pA);
- Collections.sort(pB);
- rval = JSONLDUtils.compare(pA, pB);
- }
-
- if (rval == 0) {
- rval = JSONLDUtils.compareBlankNodeObjects(a, b);
- }
-
- if (rval == 0) {
- List<Object> edgesA = (List<Object>) ((Map<String, Object>) ((Map<String, Object>) edges.get("refs")).get(a.get("@id"))).get("all");
- List<Object> edgesB = (List<Object>) ((Map<String, Object>) ((Map<String, Object>) edges.get("refs")).get(b.get("@id"))).get("all");
- rval = JSONLDUtils.compare(edgesA.size(), edgesB.size());
-
- if (rval == 0) {
- for (int i = 0; i < edgesA.size() && rval == 0; ++i) {
- rval = compareEdges(edgesA.get(i), edgesB.get(i));
- }
- }
- }
-
- return rval;
- }
-
- private int compareEdges(Object a, Object b) {
- int rval = 0;
-
- boolean bnodeA = JSONLDUtils.isBlankNodeIri(((Map<String, Object>) a).get("s"));
- boolean bnodeB = JSONLDUtils.isBlankNodeIri(((Map<String, Object>) b).get("s"));
- JSONLDUtils.NameGenerator c14n = ngc14n;
-
- if (bnodeA != bnodeB) {
- rval = bnodeA ? 1 : -1;
- } else {
-
- if (!bnodeA) {
- rval = JSONLDUtils.compare(((Map<String, Object>) a).get("s"), ((Map<String, Object>) b).get("s"));
- }
- if (rval == 0) {
- rval = JSONLDUtils.compare(((Map<String, Object>) a).get("p"), ((Map<String, Object>) b).get("p"));
- }
-
- if (rval == 0 && c14n != null) {
- boolean c14nA = c14n.inNamespace((String) ((Map<String, Object>) a).get("s"));
- boolean c14nB = c14n.inNamespace((String) ((Map<String, Object>) b).get("s"));
-
- if (c14nA != c14nB) {
- rval = c14nA ? 1 : -1;
- } else if (c14nA) {
- rval = JSONLDUtils.compare(((Map<String, Object>) a).get("s"), ((Map<String, Object>) b).get("s"));
- }
-
- }
-
- }
-
- return rval;
- }
-
- private void collectSubjects(Object input, Map<String, Object> subjects, List<Map<String, Object>> bnodes) {
- if (input == null) {
- return;
- } else if (input instanceof List) {
- for (Object o : (List<Object>) input) {
- collectSubjects(o, subjects, bnodes);
- }
- } else if (input instanceof Map) {
- if (((Map<String, Object>) input).containsKey("@id")) {
- Object id = ((Map<String, Object>) input).get("@id");
- if (id instanceof List) {
- // graph literal
- collectSubjects(id, subjects, bnodes);
- } else if (JSONLDUtils.isSubject(input)) {
- // named subject
- subjects.put((String) id, input);
- }
-
- } else if (JSONLDUtils.isBlankNode(input)) {
- bnodes.add((Map<String, Object>) input);
- }
-
- for (String key : ((Map<String, Object>) input).keySet()) {
- if (!ignoredKeywords.contains(key)) {
- collectSubjects(((Map<String, Object>) input).get(key), subjects, bnodes);
- }
- }
- }
- }
-
- /**
- * TODO: this whole thing should probably be optimized
- *
- * why doesn't Java make using maps and lists easy?!?!?!??!?
- *
- * @author tristan
- *
- */
- private class MappingBuilder {
-
- public MappingBuilder() {
- this.count = 1;
- this.processed = new HashMap<String, Boolean>();
- this.mapping = new HashMap<String, String>();
- this.adj = new HashMap<String, Object>();
-
- // this.keyStack = [{ keys: ['s1'], idx: 0 }];
- this.keyStack = new ArrayList<Object>();
- Map<String, Object> t1 = new HashMap<String, Object>();
- List<String> t2 = new ArrayList<String>();
- t2.add("s1");
- t1.put("keys", t2);
- t1.put("idx", 0);
- keyStack.add(t1);
- this.done = new HashMap<String, Boolean>();
- this.s = "";
- }
-
- public HashMap<String, Boolean> done;
- public ArrayList<Object> keyStack;
- public String s;
- public Map<String, Object> adj;
- public Map<String, Boolean> processed;
- public int count;
- public Map<String, String> mapping;
-
- /**
- * Maps the next name to the given bnode IRI if the bnode IRI isn't already in the mapping. If the given bnode IRI is canonical, then it will be given a
- * shortened form of the same name.
- *
- * @param iri
- * the blank node IRI to map the next name to.
- *
- * @return the mapped name.
- */
- public String mapNode(String iri) {
- if (!this.mapping.containsKey(iri)) {
- if (iri.startsWith("_:c14n")) {
- this.mapping.put(iri, "c" + iri.substring(6));
- } else {
- this.mapping.put(iri, "s" + this.count);
- this.count += 1;
- }
- }
- return this.mapping.get(iri);
- }
-
- public void serialize(Map<String, Object> subjects, Map<String, Object> edges) {
- if (this.keyStack.size() > 0) {
- Map<String, Object> next = (Map<String, Object>) this.keyStack.remove(this.keyStack.size() - 1);
- // for (; (Integer)next.get("idx") < ((List<String>)
- // next.get("keys")).size(); next.put("idx",
- // (Integer)next.get("idx")+1)) {
- while ((Integer) next.get("idx") < ((List<String>) next.get("keys")).size()) {
- String k = ((List<String>) next.get("keys")).get((Integer) next.get("idx"));
- if (!this.adj.containsKey(k)) {
- this.keyStack.add(next);
- break;
- }
- next.put("idx", (Integer) next.get("idx") + 1);
-
- if (this.done.containsKey(k)) {
- this.s += "_" + k;
- } else {
- this.done.put(k, true);
-
- String s = k;
- Map<String, Object> adj = (Map<String, Object>) this.adj.get(k);
- String iri = (String) adj.get("i");
- if (subjects.containsKey(iri)) {
- Map<String, Object> b = (Map<String, Object>) subjects.get(iri);
- s += "[" + JSONLDUtils.serializeProperties(b) + "]";
-
- Boolean first = true;
- s += "[";
- List<Map<String, Object>> refs = (List<Map<String, Object>>) ((Map<String, Object>) ((Map<String, Object>) edges.get("refs"))
- .get(iri)).get("all");
- for (Map<String, Object> r : refs) {
- if (first) {
- first = false;
- } else {
- s += "|";
- }
- s += "<" + r.get("p") + ">";
- s += JSONLDUtils.isBlankNodeIri(r.get("s")) ? "_:" : ("<" + r.get("s") + ">");
- }
- s += "]";
- }
-
- for (String o : (List<String>) adj.get("k")) {
- s += o;
- }
- this.s += s;
- Map<String, Object> tmp = new HashMap<String, Object>();
- tmp.put("keys", adj.get("k"));
- tmp.put("idx", 0);
- this.keyStack.add(tmp);
- this.serialize(subjects, edges);
- }
- }
- }
- }
-
- public MappingBuilder copy() {
- MappingBuilder rval = new MappingBuilder();
- rval.count = this.count;
- rval.processed = (Map<String, Boolean>) JSONLDUtils.clone(this.processed);
- rval.mapping = (Map<String, String>) JSONLDUtils.clone(this.mapping);
- rval.adj = (Map<String, Object>) JSONLDUtils.clone(this.adj);
- rval.keyStack = (ArrayList<Object>) JSONLDUtils.clone(this.keyStack);
- rval.done = (HashMap<String, Boolean>) JSONLDUtils.clone(this.done);
-
- rval.s = this.s;
- return rval;
- }
-
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/467d7055/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDSerializer.java
----------------------------------------------------------------------
diff --git a/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDSerializer.java b/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDSerializer.java
deleted file mode 100644
index 5935071..0000000
--- a/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDSerializer.java
+++ /dev/null
@@ -1,241 +0,0 @@
-package de.dfki.km.json.jsonld;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.io.Writer;
-
-import de.dfki.km.json.JSONUtils;
-
-/**
- * TODO:
- *
- * @author tristan
- *
- */
-public class JSONLDSerializer {
-
- private Map<String, Map<String, Object>> _subjects;
- private Map<String, Object> _context;
-
- JSONLDUtils.NameGenerator _ng;
- Map<String, String> _bns;
-
- public JSONLDSerializer() {
- reset();
- }
-
- /**
- * Resets the Serializer. Call this if you want to reuse the serializer for a different document
- */
- public void reset() {
- _subjects = new HashMap<String, Map<String, Object>>();
- _context = new HashMap<String, Object>();
- _context.put("rdf", JSONLDConsts.RDF_SYNTAX_NS);
- _context.put("rdfs", JSONLDConsts.RDF_SCHEMA_NS);
- _context.put("xsd", JSONLDConsts.XSD_NS);
-
- _ng = new JSONLDUtils.NameGenerator("bn");
- _bns = new HashMap<String, String>();
- }
-
- // some helper functions for extended classes
- protected Map<String, Object> getSubject(String subjURI) {
- return _subjects.get(subjURI);
- }
-
- protected void setSubject(String subjURI, Map<String, Object> subj) {
- _subjects.put(subjURI, subj);
- }
-
- protected String getNameForBlankNode(String node) {
- if (!_bns.containsKey(node)) {
- _bns.put(node, _ng.next());
- }
- return _bns.get(node);
- }
-
- /**
- * internal function to avoid repetition of code
- *
- * @param s
- * @param p
- * @param value
- */
- private void triple(String s, String p, Object value) {
- // get the cached object for this subject
- Map<String, Object> subj = _subjects.get(s);
- if (subj == null) {
- // if no cached object exists, create one.
- subj = new HashMap<String, Object>();
- _subjects.put(s, subj);
-
- // since this is the first time we're encountering this subject, add
- // it's @id key
- subj.put("@id", s);
- }
-
- // check for @type predicate
- if (JSONLDConsts.RDF_TYPE.equals(p)) {
- p = "@type";
- // type doesn't need to be (TODO: should it not be?) in an object
- if (value instanceof Map) {
- if (((Map) value).containsKey("@id")) {
- value = ((Map) value).get("@id");
- } else if (((Map) value).containsKey("@value")) {
- // this is a weird case, which probably shouldn't happen
- // but i'll account for it anyway.
- value = ((Map) value).get("@value");
- } // otherwise it's a string, leave it as such (TODO: it should
- // never be a list, but perhaps we should make sure)
- }
- }
-
- Object oldval = subj.get(p);
- // check if an existing value is present for this predicate
- if (oldval != null) {
- // if so, make the value a list (if it isn't already) and add the
- // new value to the end of the list
- // TODO: what if the value itself is a list, is this even possible?
- if (oldval instanceof List) {
- ((List) oldval).add(value);
- value = oldval;
- } else {
- List<Object> tmp = new ArrayList<Object>();
- tmp.add(oldval);
- tmp.add(value);
- value = tmp;
- }
- }
- // add the new value to the cache object
- subj.put(p, value);
- }
-
- /**
- * Call this to add a literal to the JSON-LD document
- *
- * @param s
- * the subjuct URI
- * @param p
- * the predicate URI
- * @param value
- * the literal value as a string
- * @param datatype
- * the datatype URI (if null, a plain literal is assumed)
- * @param language
- * the language (may be null, or an empty string)
- */
- public void triple(String s, String p, String value, String datatype, String language) {
-
- Object val;
- if (datatype == null || JSONLDConsts.XSD_STRING.equals(datatype)) {
- if (language == null || "".equals(language)) {
- val = value;
- } else {
- val = new HashMap<String, Object>();
- ((Map<String, Object>) val).put("@value", value);
- ((Map<String, Object>) val).put("@language", language);
- }
- } else {
- // compact the datatype (will return the same thing if no prefix has
- // been set for the uri)
- // datatype = JSONLDUtils.compactIRI(_context, datatype); NOTE:
- // going to leave this up to the user
- val = new HashMap<String, Object>();
- ((Map<String, Object>) val).put("@value", value);
- ((Map<String, Object>) val).put("@type", datatype);
- }
-
- triple(s, p, val);
- }
-
- /**
- * Call this to add a new object,predicate,object relation to the JSON-LD document
- *
- * @param s
- * the subject URI
- * @param p
- * the predicate URI
- * @param o
- * the object URI
- */
- public void triple(String s, String p, String o) {
- Map<String, Object> val = new HashMap<String, Object>();
- val.put("@id", o);
-
- // TODO: should we check if this object exists in the _subjects list and
- // add it if it doesn't?
- // this seems to be what the python rdflib serializer does, but it seems
- // redundant.
- triple(s, p, (Object) val);
- }
-
- public void setPrefix(String fullUri, String prefix) {
- _context.put(prefix, fullUri);
- }
-
- /**
- * Builds the JSON-LD document based on the currently stored triples, compacting the URIs based on the stored context.
- *
- * @return A Map representing the JSON-LD document.
- */
- public Object asObject() {
- JSONLDProcessor p = new JSONLDProcessor();
-
- // go through the list of subjects that were built, compact them based
- // of the current context
- // then add them to a subjects list
- List<Object> subjects = new ArrayList<Object>();
- for (Map<String, Object> subj : _subjects.values()) {
- subj = (Map<String, Object>) p.compact(_context, subj);
- subjects.add(subj);
- }
-
- if (subjects.size() == 1) {
- // if there is only one subject, make the base object this object
- Map<String, Object> rval = new HashMap<String, Object>();
- rval = (Map<String, Object>) subjects.get(0);
- rval.put("@context", _context);
- return rval;
- } else {
- return subjects;
- }
- }
-
- public void toWriter(Writer writer) {
- try {
- JSONUtils.writePrettyPrint(writer, asObject());
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- *
- * @return A String representing the JSON-LD document.
- */
- public String asString() {
- return asString(false);
- }
-
- /**
- * Returns a formated String representing the JSON-LD document using PrettyPrint writer.
- * @return A String representing the JSON-LD document.
- */
- public String asString(boolean prettyPrint) {
- // TODO: catching the exceptions here and returning JSON with the error
- // messages may not
- // be the best idea
- try {
- if (!prettyPrint)
- return JSONUtils.toString(asObject());
- else
- return JSONUtils.toPrettyString(asObject());
- } catch (Exception e) {
- return "{\"error\":\"" + e.getLocalizedMessage() + "\"}";
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-marmotta/blob/467d7055/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDTripleCallback.java
----------------------------------------------------------------------
diff --git a/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDTripleCallback.java b/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDTripleCallback.java
deleted file mode 100644
index e332492..0000000
--- a/commons/sesame-tools-rio-jsonld/src/ext/java/de/dfki/km/json/jsonld/JSONLDTripleCallback.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package de.dfki.km.json.jsonld;
-
-public interface JSONLDTripleCallback {
- /**
- * Construct a triple with three URIs.
- *
- * @param s
- * The Subject URI
- * @param p
- * The Predicate URI
- * @param o
- * The Object URI
- * @return The generated triple, or null to force triple generation to stop
- */
- void triple(String s, String p, String o);
-
- /**
- * Constructs a triple with a Literal object, which may or may not contain a
- * language and/or a datatype.
- *
- * @param s
- * The Subject URI
- * @param p
- * The Predicate URI
- * @param value
- * The literal value
- * @param datatype
- * The literal datatype
- * @param language
- * The literal language (NOTE: may be null if not specified!)
- * @return The generated triple, or null to force triple generation to stop
- */
- void triple(String s, String p, String value, String datatype, String language);
-}