package gojsonld
// /**
// * Compacts the given input using the context according to the steps in the
// *
// * Compaction algorithm .
// *
// * @param input
// * The input JSON-LD object.
// * @param context
// * The context object to use for the compaction algorithm.
// * @param opts
// * The {@link JsonLdOptions} that are to be sent to the
// * compaction algorithm.
// * @return The compacted JSON-LD document
// * @throws JsonLdError
// * If there is an error while compacting.
// */
// public static Map compact(Object input, Object context, JsonLdOptions opts)
// throws JsonLdError {
// // 1)
// // TODO: look into java futures/promises
// // 2-6) NOTE: these are all the same steps as in expand
// final Object expanded = expand(input, opts);
// // 7)
// if (context instanceof Map && ((Map) context).containsKey("@context")) {
// context = ((Map) context).get("@context");
// }
// Context activeCtx = new Context(opts);
// activeCtx = activeCtx.parse(context);
// // 8)
// Object compacted = new JsonLdApi(opts).compact(activeCtx, null, expanded,
// opts.getCompactArrays());
// // final step of Compaction Algorithm
// // TODO: SPEC: the result result is a NON EMPTY array,
// if (compacted instanceof List) {
// if (((List) compacted).isEmpty()) {
// compacted = new LinkedHashMap();
// } else {
// final Map tmp = new LinkedHashMap();
// // TODO: SPEC: doesn't specify to use vocab = true here
// tmp.put(activeCtx.compactIri("@graph", true), compacted);
// compacted = tmp;
// }
// }
// if (compacted != null && context != null) {
// // TODO: figure out if we can make "@context" appear at the start of
// // the keySet
// if ((context instanceof Map && !((Map) context).isEmpty())
// || (context instanceof List && !((List) context).isEmpty())) {
// ((Map) compacted).put("@context", context);
// }
// }
// // 9)
// return (Map) compacted;
// }
// /**
// * Expands the given input according to the steps in the Expansion
// * algorithm .
// *
// * @param input
// * The input JSON-LD object.
// * @param opts
// * The {@link JsonLdOptions} that are to be sent to the expansion
// * algorithm.
// * @return The expanded JSON-LD document
// * @throws JsonLdError
// * If there is an error while expanding.
// */
// public static List expand(Object input, JsonLdOptions opts) throws JsonLdError {
// // 1)
// // TODO: look into java futures/promises
// // 2) TODO: better verification of DOMString IRI
// if (input instanceof String && ((String) input).contains(":")) {
// try {
// final RemoteDocument tmp = opts.getDocumentLoader().loadDocument((String) input);
// input = tmp.document;
// // TODO: figure out how to deal with remote context
// } catch (final Exception e) {
// throw new JsonLdError(Error.LOADING_DOCUMENT_FAILED, e.getMessage());
// }
// // if set the base in options should override the base iri in the
// // active context
// // thus only set this as the base iri if it's not already set in
// // options
// if (opts.getBase() == null) {
// opts.setBase((String) input);
// }
// }
// // 3)
// Context activeCtx = new Context(opts);
// // 4)
// if (opts.getExpandContext() != null) {
// Object exCtx = opts.getExpandContext();
// if (exCtx instanceof Map && ((Map) exCtx).containsKey("@context")) {
// exCtx = ((Map) exCtx).get("@context");
// }
// activeCtx = activeCtx.parse(exCtx);
// }
// // 5)
// // TODO: add support for getting a context from HTTP when content-type
// // is set to a jsonld compatable format
// // 6)
// Object expanded = new JsonLdApi(opts).expand(activeCtx, input);
// // final step of Expansion Algorithm
// if (expanded instanceof Map && ((Map) expanded).containsKey("@graph")
// && ((Map) expanded).size() == 1) {
// expanded = ((Map) expanded).get("@graph");
// } else if (expanded == null) {
// expanded = new ArrayList();
// }
// // normalize to an array
// if (!(expanded instanceof List)) {
// final List tmp = new ArrayList();
// tmp.add(expanded);
// expanded = tmp;
// }
// return (List) expanded;
// }
// /**
// * Expands the given input according to the steps in the Expansion
// * algorithm , using the default {@link JsonLdOptions}.
// *
// * @param input
// * The input JSON-LD object.
// * @return The expanded JSON-LD document
// * @throws JsonLdError
// * If there is an error while expanding.
// */
// public static List expand(Object input) throws JsonLdError {
// return expand(input, new JsonLdOptions(""));
// }
// public static Object flatten(Object input, Object context, JsonLdOptions opts)
// throws JsonLdError {
// // 2-6) NOTE: these are all the same steps as in expand
// final Object expanded = expand(input, opts);
// // 7)
// if (context instanceof Map && ((Map) context).containsKey("@context")) {
// context = ((Map) context).get("@context");
// }
// // 8) NOTE: blank node generation variables are members of JsonLdApi
// // 9) NOTE: the next block is the Flattening Algorithm described in
// // http://json-ld.org/spec/latest/json-ld-api/#flattening-algorithm
// // 1)
// final Map nodeMap = new LinkedHashMap();
// nodeMap.put("@default", new LinkedHashMap());
// // 2)
// new JsonLdApi(opts).generateNodeMap(expanded, nodeMap);
// // 3)
// final Map defaultGraph = (Map) nodeMap.remove("@default");
// // 4)
// for (final String graphName : nodeMap.keySet()) {
// final Map graph = (Map) nodeMap.get(graphName);
// // 4.1+4.2)
// Map entry;
// if (!defaultGraph.containsKey(graphName)) {
// entry = new LinkedHashMap();
// entry.put("@id", graphName);
// defaultGraph.put(graphName, entry);
// } else {
// entry = (Map) defaultGraph.get(graphName);
// }
// // 4.3)
// // TODO: SPEC doesn't specify that this should only be added if it
// // doesn't exists
// if (!entry.containsKey("@graph")) {
// entry.put("@graph", new ArrayList());
// }
// final List keys = new ArrayList(graph.keySet());
// Collections.sort(keys);
// for (final String id : keys) {
// final Map node = (Map) graph.get(id);
// if (!(node.containsKey("@id") && node.size() == 1)) {
// ((List) entry.get("@graph")).add(node);
// }
// }
// }
// // 5)
// final List flattened = new ArrayList();
// // 6)
// final List keys = new ArrayList(defaultGraph.keySet());
// Collections.sort(keys);
// for (final String id : keys) {
// final Map node = (Map) defaultGraph.get(id);
// if (!(node.containsKey("@id") && node.size() == 1)) {
// flattened.add(node);
// }
// }
// // 8)
// if (context != null && !flattened.isEmpty()) {
// Context activeCtx = new Context(opts);
// activeCtx = activeCtx.parse(context);
// // TODO: only instantiate one jsonldapi
// Object compacted = new JsonLdApi(opts).compact(activeCtx, null, flattened,
// opts.getCompactArrays());
// if (!(compacted instanceof List)) {
// final List tmp = new ArrayList();
// tmp.add(compacted);
// compacted = tmp;
// }
// final String alias = activeCtx.compactIri("@graph");
// final Map rval = activeCtx.serialize();
// rval.put(alias, compacted);
// return rval;
// }
// return flattened;
// }
// /**
// * Flattens the given input and compacts it using the passed context
// * according to the steps in the Flattening
// * algorithm :
// *
// * @param input
// * The input JSON-LD object.
// * @param opts
// * The {@link JsonLdOptions} that are to be sent to the
// * flattening algorithm.
// * @return The flattened JSON-LD document
// * @throws JsonLdError
// * If there is an error while flattening.
// */
// public static Object flatten(Object input, JsonLdOptions opts) throws JsonLdError {
// return flatten(input, null, opts);
// }
// /**
// * Frames the given input using the frame according to the steps in the
// * Framing Algorithm .
// *
// * @param input
// * The input JSON-LD object.
// * @param frame
// * The frame to use when re-arranging the data of input; either
// * in the form of an JSON object or as IRI.
// * @param opts
// * The {@link JsonLdOptions} that are to be sent to the framing
// * algorithm.
// * @return The framed JSON-LD document
// * @throws JsonLdError
// * If there is an error while framing.
// */
// public static Map frame(Object input, Object frame, JsonLdOptions opts)
// throws JsonLdError {
// if (frame instanceof Map) {
// frame = JsonLdUtils.clone(frame);
// }
// // TODO string/IO input
// final Object expandedInput = expand(input, opts);
// final List expandedFrame = expand(frame, opts);
// final JsonLdApi api = new JsonLdApi(expandedInput, opts);
// final List framed = api.frame(expandedInput, expandedFrame);
// final Context activeCtx = api.context.parse(((Map) frame).get("@context"));
// Object compacted = api.compact(activeCtx, null, framed);
// if (!(compacted instanceof List)) {
// final List tmp = new ArrayList();
// tmp.add(compacted);
// compacted = tmp;
// }
// final String alias = activeCtx.compactIri("@graph");
// final Map rval = activeCtx.serialize();
// rval.put(alias, compacted);
// JsonLdUtils.removePreserve(activeCtx, rval, opts);
// return rval;
// }
// /**
// * A registry for RDF Parsers (in this case, JSONLDSerializers) used by
// * fromRDF if no specific serializer is specified and options.format is set.
// *
// * TODO: this would fit better in the document loader class
// */
// private static Map rdfParsers = new LinkedHashMap() {
// {
// // automatically register nquad serializer
// put("application/nquads", new NQuadRDFParser());
// put("text/turtle", new TurtleRDFParser());
// }
// };
// public static void registerRDFParser(String format, RDFParser parser) {
// rdfParsers.put(format, parser);
// }
// public static void removeRDFParser(String format) {
// rdfParsers.remove(format);
// }
// /**
// * Converts an RDF dataset to JSON-LD.
// *
// * @param dataset
// * a serialized string of RDF in a format specified by the format
// * option or an RDF dataset to convert.
// * @param options
// * the options to use: [format] the format if input is not an
// * array: 'application/nquads' for N-Quads (default).
// * [useRdfType] true to use rdf:type, false to use @type
// * (default: false). [useNativeTypes] true to convert XSD types
// * into native types (boolean, integer, double), false not to
// * (default: true).
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object fromRDF(Object dataset, JsonLdOptions options) throws JsonLdError {
// // handle non specified serializer case
// RDFParser parser = null;
// if (options.format == null && dataset instanceof String) {
// // attempt to parse the input as nquads
// options.format = "application/nquads";
// }
// if (rdfParsers.containsKey(options.format)) {
// parser = rdfParsers.get(options.format);
// } else {
// throw new JsonLdError(JsonLdError.Error.UNKNOWN_FORMAT, options.format);
// }
// // convert from RDF
// return fromRDF(dataset, options, parser);
// }
// /**
// * Converts an RDF dataset to JSON-LD, using the default
// * {@link JsonLdOptions}.
// *
// * @param dataset
// * a serialized string of RDF in a format specified by the format
// * option or an RDF dataset to convert.
// * @return The JSON-LD object represented by the given RDF dataset
// * @throws JsonLdError
// * If there was an error converting from RDF to JSON-LD
// */
// public static Object fromRDF(Object dataset) throws JsonLdError {
// return fromRDF(dataset, new JsonLdOptions(""));
// }
// /**
// * Converts an RDF dataset to JSON-LD, using a specific instance of
// * {@link RDFParser}.
// *
// * @param input
// * a serialized string of RDF in a format specified by the format
// * option or an RDF dataset to convert.
// * @param options
// * the options to use: [format] the format if input is not an
// * array: 'application/nquads' for N-Quads (default).
// * [useRdfType] true to use rdf:type, false to use @type
// * (default: false). [useNativeTypes] true to convert XSD types
// * into native types (boolean, integer, double), false not to
// * (default: true).
// * @param parser
// * A specific instance of {@link RDFParser} to use for the
// * conversion.
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object fromRDF(Object input, JsonLdOptions options, RDFParser parser)
// throws JsonLdError {
// final RDFDataset dataset = parser.parse(input);
// // convert from RDF
// final Object rval = new JsonLdApi(options).fromRDF(dataset);
// // re-process using the generated context if outputForm is set
// if (options.outputForm != null) {
// if ("expanded".equals(options.outputForm)) {
// return rval;
// } else if ("compacted".equals(options.outputForm)) {
// return compact(rval, dataset.getContext(), options);
// } else if ("flattened".equals(options.outputForm)) {
// return flatten(rval, dataset.getContext(), options);
// } else {
// throw new JsonLdError(JsonLdError.Error.UNKNOWN_ERROR);
// }
// }
// return rval;
// }
// /**
// * Converts an RDF dataset to JSON-LD, using a specific instance of
// * {@link RDFParser}, and the default {@link JsonLdOptions}.
// *
// * @param input
// * a serialized string of RDF in a format specified by the format
// * option or an RDF dataset to convert.
// * @param parser
// * A specific instance of {@link RDFParser} to use for the
// * conversion.
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object fromRDF(Object input, RDFParser parser) throws JsonLdError {
// return fromRDF(input, new JsonLdOptions(""), parser);
// }
// /**
// * Outputs the RDF dataset found in the given JSON-LD object.
// *
// * @param input
// * the JSON-LD input.
// * @param callback
// * A callback that is called when the input has been converted to
// * Quads (null to use options.format instead).
// * @param options
// * the options to use: [base] the base IRI to use. [format] the
// * format to use to output a string: 'application/nquads' for
// * N-Quads (default). [loadContext(url, callback(err, url,
// * result))] the context loader.
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object toRDF(Object input, JsonLdTripleCallback callback, JsonLdOptions options)
// throws JsonLdError {
// final Object expandedInput = expand(input, options);
// final JsonLdApi api = new JsonLdApi(expandedInput, options);
// final RDFDataset dataset = api.toRDF();
// // generate namespaces from context
// if (options.useNamespaces) {
// List> _input;
// if (input instanceof List) {
// _input = (List>) input;
// } else {
// _input = new ArrayList>();
// _input.add((Map) input);
// }
// for (final Map e : _input) {
// if (e.containsKey("@context")) {
// dataset.parseContext(e.get("@context"));
// }
// }
// }
// if (callback != null) {
// return callback.call(dataset);
// }
// if (options.format != null) {
// if ("application/nquads".equals(options.format)) {
// return new NQuadTripleCallback().call(dataset);
// } else if ("text/turtle".equals(options.format)) {
// return new TurtleTripleCallback().call(dataset);
// } else {
// throw new JsonLdError(JsonLdError.Error.UNKNOWN_FORMAT, options.format);
// }
// }
// return dataset;
// }
// /**
// * Outputs the RDF dataset found in the given JSON-LD object.
// *
// * @param input
// * the JSON-LD input.
// * @param options
// * the options to use: [base] the base IRI to use. [format] the
// * format to use to output a string: 'application/nquads' for
// * N-Quads (default). [loadContext(url, callback(err, url,
// * result))] the context loader.
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object toRDF(Object input, JsonLdOptions options) throws JsonLdError {
// return toRDF(input, null, options);
// }
// /**
// * Outputs the RDF dataset found in the given JSON-LD object, using the
// * default {@link JsonLdOptions}.
// *
// * @param input
// * the JSON-LD input.
// * @param callback
// * A callback that is called when the input has been converted to
// * Quads (null to use options.format instead).
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object toRDF(Object input, JsonLdTripleCallback callback) throws JsonLdError {
// return toRDF(input, callback, new JsonLdOptions(""));
// }
// /**
// * Outputs the RDF dataset found in the given JSON-LD object, using the
// * default {@link JsonLdOptions}.
// *
// * @param input
// * the JSON-LD input.
// * @return A JSON-LD object.
// * @throws JsonLdError
// * If there is an error converting the dataset to JSON-LD.
// */
// public static Object toRDF(Object input) throws JsonLdError {
// return toRDF(input, new JsonLdOptions(""));
// }
// /**
// * Performs RDF dataset normalization on the given JSON-LD input. The output
// * is an RDF dataset unless the 'format' option is used.
// *
// * @param input
// * the JSON-LD input to normalize.
// * @param options
// * the options to use: [base] the base IRI to use. [format] the
// * format if output is a string: 'application/nquads' for
// * N-Quads. [loadContext(url, callback(err, url, result))] the
// * context loader.
// * @return The JSON-LD object
// * @throws JsonLdError
// * If there is an error normalizing the dataset.
// */
// public static Object normalize(Object input, JsonLdOptions options) throws JsonLdError {
// final JsonLdOptions opts = new JsonLdOptions(options.getBase());
// opts.format = null;
// final RDFDataset dataset = (RDFDataset) toRDF(input, opts);
// return new JsonLdApi(options).normalize(dataset);
// }
// /**
// * Performs RDF dataset normalization on the given JSON-LD input. The output
// * is an RDF dataset unless the 'format' option is used. Uses the default
// * {@link JsonLdOptions}.
// *
// * @param input
// * the JSON-LD input to normalize.
// * @return The JSON-LD object
// * @throws JsonLdError
// * If there is an error normalizing the dataset.
// */
// public static Object normalize(Object input) throws JsonLdError {
// return normalize(input, new JsonLdOptions(""));
// }