summaryrefslogtreecommitdiffstats
path: root/aai-core/src/main/java/org/onap/aai/serialization/queryformats
diff options
context:
space:
mode:
authorVenkata Harish K Kajur <vk250x@att.com>2017-09-28 12:43:08 -0400
committerVenkata Harish K Kajur <vk250x@att.com>2017-09-28 13:29:27 -0400
commit1767960099ea2983eef5218b8ce44b167ae0774c (patch)
tree4efe13601c1f9ebebc6026b32ec749778cd96caf /aai-core/src/main/java/org/onap/aai/serialization/queryformats
parenta8a05641920545aa094dffdb016b7b5febe9a879 (diff)
Change openecomp to onap and update license
Issue-ID: AAI-61 AAI-82 Change-Id: Iae98d4bf4c693c0a3203158bff98c3c5e739f453 Signed-off-by: Venkata Harish K Kajur <vk250x@att.com>
Diffstat (limited to 'aai-core/src/main/java/org/onap/aai/serialization/queryformats')
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java43
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java31
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java97
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java32
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java80
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java63
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java71
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java70
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java190
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java163
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java76
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java28
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java41
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java41
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java29
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java35
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java29
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java37
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java85
-rw-r--r--aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java92
20 files changed, 1333 insertions, 0 deletions
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java
new file mode 100644
index 00000000..f101f890
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Console.java
@@ -0,0 +1,43 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import com.google.gson.JsonObject;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+
+public class Console implements FormatMapper {
+
+ @Override
+ public JsonObject formatObject(Object v) throws AAIFormatVertexException {
+
+ JsonObject json = new JsonObject();
+ json.addProperty("result", v.toString());
+
+ return json;
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 100;
+ }
+
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java
new file mode 100644
index 00000000..2904cce6
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Format.java
@@ -0,0 +1,31 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+public enum Format {
+ graphson,
+ pathed, id, resource,
+ simple,
+ resource_and_url,
+ console,
+ raw
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java
new file mode 100644
index 00000000..b19e0c3e
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatFactory.java
@@ -0,0 +1,97 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.serialization.db.DBSerializer;
+import org.onap.aai.serialization.queryformats.exceptions.QueryParamInjectionException;
+import org.onap.aai.serialization.queryformats.utils.QueryParamInjector;
+import org.onap.aai.serialization.queryformats.utils.UrlBuilder;
+
+import javax.ws.rs.core.MultivaluedHashMap;
+import javax.ws.rs.core.MultivaluedMap;
+
+public class FormatFactory {
+
+ private final Loader loader;
+ private final DBSerializer serializer;
+ private final UrlBuilder urlBuilder;
+ private final QueryParamInjector injector;
+ public FormatFactory (Loader loader, DBSerializer serializer) throws AAIException {
+ this.loader = loader;
+ this.serializer = serializer;
+ this.urlBuilder = new UrlBuilder(loader.getVersion(), serializer);
+ this.injector = QueryParamInjector.getInstance();
+ }
+
+ public Formatter get(Format format) throws AAIException {
+ return get(format, new MultivaluedHashMap<String, String>());
+ }
+
+ public Formatter get(Format format, MultivaluedMap<String, String> params) throws AAIException {
+
+ Formatter formattter = null;
+
+ switch (format) {
+ case graphson :
+ formattter = new Formatter(inject(new GraphSON(), params));
+ break;
+ case pathed :
+ formattter = new Formatter(inject(new PathedURL(loader, urlBuilder), params));
+ break;
+ case id :
+ formattter = new Formatter(inject(new IdURL(loader, urlBuilder), params));
+ break;
+ case resource :
+ formattter = new Formatter(inject(new Resource.Builder(loader, serializer, urlBuilder), params).build());
+ break;
+ case resource_and_url :
+ formattter = new Formatter(inject(new Resource.Builder(loader, serializer, urlBuilder).includeUrl(), params).build());
+ break;
+ case raw :
+ formattter = new Formatter(inject(new RawFormat.Builder(loader, serializer, urlBuilder), params).build());
+ break;
+ case simple :
+ formattter = new Formatter(inject(new RawFormat.Builder(loader, serializer, urlBuilder).depth(0).modelDriven(), params).build());
+ break;
+ case console :
+ formattter = new Formatter(inject(new Console(), params));
+ break;
+ default :
+ break;
+
+ }
+
+ return formattter;
+ }
+
+ private <T> T inject (T obj, MultivaluedMap<String, String> params) throws QueryParamInjectionException {
+
+ injector.injectParams(obj, params);
+ return obj;
+ }
+
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java
new file mode 100644
index 00000000..fb822dd9
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/FormatMapper.java
@@ -0,0 +1,32 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import com.google.gson.JsonObject;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+
+public interface FormatMapper {
+
+ public JsonObject formatObject(Object v) throws AAIFormatVertexException;
+
+ public int parallelThreshold();
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java
new file mode 100644
index 00000000..50042b76
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Formatter.java
@@ -0,0 +1,80 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import com.att.eelf.configuration.EELFLogger;
+import com.att.eelf.configuration.EELFManager;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Stream;
+
+public class Formatter {
+
+ private static final EELFLogger LOGGER = EELFManager.getInstance().getLogger(Formatter.class);
+
+ protected JsonParser parser = new JsonParser();
+ protected final FormatMapper format;
+ public Formatter (FormatMapper format) {
+ this.format = format;
+ }
+
+ public JsonObject output(List<Object> vertices) {
+ Stream<Object> stream = null;
+ JsonObject result = new JsonObject();
+ JsonArray body = new JsonArray();
+ if (vertices.size() >= format.parallelThreshold()) {
+ stream = vertices.parallelStream();
+ } else {
+ stream = vertices.stream();
+ }
+ final boolean isParallel = stream.isParallel();
+ stream.map(v -> {
+ try {
+ return Optional.<JsonObject>of(format.formatObject(v));
+ } catch (AAIFormatVertexException e) {
+ LOGGER.warn("Failed to format vertex, returning a partial list", e);
+ }
+
+ return Optional.<JsonObject>empty();
+ }).forEach(obj -> {
+ if (obj.isPresent()) {
+ if (isParallel) {
+ synchronized (body) {
+ body.add(obj.get());
+ }
+ } else {
+ body.add(obj.get());
+ }
+ }
+ });
+
+ result.add("results", body);
+
+ return result.getAsJsonObject();
+ }
+
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java
new file mode 100644
index 00000000..00aa781c
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/GraphSON.java
@@ -0,0 +1,63 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import com.thinkaurelius.titan.graphdb.tinkerpop.TitanIoRegistry;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONMapper;
+import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONWriter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+
+public class GraphSON implements FormatMapper {
+
+ private final GraphSONMapper mapper = GraphSONMapper.build().addRegistry(TitanIoRegistry.INSTANCE).create();
+ private final GraphSONWriter writer = GraphSONWriter.build().mapper(mapper).create();
+ protected JsonParser parser = new JsonParser();
+
+ @Override
+ public JsonObject formatObject(Object v) {
+ OutputStream os = new ByteArrayOutputStream();
+ String result = "";
+ try {
+ writer.writeVertex(os, (Vertex)v, Direction.BOTH);
+
+ result = os.toString();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ return parser.parse(result).getAsJsonObject();
+
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 50;
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java
new file mode 100644
index 00000000..320cd616
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/IdURL.java
@@ -0,0 +1,71 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+import org.onap.aai.serialization.queryformats.utils.UrlBuilder;
+
+public class IdURL implements FormatMapper {
+
+ private final UrlBuilder urlBuilder;
+ private final JsonParser parser;
+ private final Loader loader;
+
+ public IdURL (Loader loader, UrlBuilder urlBuilder) throws AAIException {
+ this.urlBuilder = urlBuilder;
+ this.parser = new JsonParser();
+ this.loader = loader;
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 2500;
+ }
+
+ @Override
+ public JsonObject formatObject(Object input) throws AAIFormatVertexException {
+ Vertex v = (Vertex)input;
+ try {
+ final Introspector searchResult = this.loader.introspectorFromName("result-data");
+
+ searchResult.setValue("resource-type", v.value(AAIProperties.NODE_TYPE));
+ searchResult.setValue("resource-link", this.urlBuilder.id(v));
+
+ final String json = searchResult.marshal(false);
+
+ return parser.parse(json).getAsJsonObject();
+
+ } catch (AAIUnknownObjectException e) {
+ throw new RuntimeException("Fatal error - result-data object does not exist!");
+ }
+
+
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java
new file mode 100644
index 00000000..8b9d5058
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/PathedURL.java
@@ -0,0 +1,70 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+import org.onap.aai.serialization.queryformats.utils.UrlBuilder;
+
+public final class PathedURL implements FormatMapper {
+
+ private final UrlBuilder urlBuilder;
+ private final JsonParser parser;
+ private final Loader loader;
+
+ public PathedURL (Loader loader, UrlBuilder urlBuilder) throws AAIException {
+ this.urlBuilder = urlBuilder;
+ this.parser = new JsonParser();
+ this.loader = loader;
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 20;
+ }
+
+ @Override
+ public JsonObject formatObject(Object input) throws AAIFormatVertexException {
+ Vertex v = (Vertex)input;
+ try {
+ final Introspector searchResult = this.loader.introspectorFromName("result-data");
+
+ searchResult.setValue("resource-type", v.value(AAIProperties.NODE_TYPE));
+
+ searchResult.setValue("resource-link", this.urlBuilder.pathed(v));
+ final String json = searchResult.marshal(false);
+ return this.parser.parse(json).getAsJsonObject();
+
+ } catch (AAIUnknownObjectException e) {
+ throw new RuntimeException("Fatal error - result-data does not exist!", e);
+ }
+
+ }
+
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java
new file mode 100644
index 00000000..7aaf3035
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/RawFormat.java
@@ -0,0 +1,190 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.serialization.db.DBSerializer;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+import org.onap.aai.serialization.queryformats.params.Depth;
+import org.onap.aai.serialization.queryformats.params.NodesOnly;
+import org.onap.aai.serialization.queryformats.utils.UrlBuilder;
+
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+
+public class RawFormat implements FormatMapper {
+ protected JsonParser parser = new JsonParser();
+ protected final DBSerializer serializer;
+ protected final Loader loader;
+ protected final UrlBuilder urlBuilder;
+ protected final int depth;
+ protected final boolean nodesOnly;
+ protected RawFormat(Builder builder) {
+ this.urlBuilder = builder.getUrlBuilder();
+ this.loader = builder.getLoader();
+ this.serializer = builder.getSerializer();
+ this.depth = builder.getDepth();
+ this.nodesOnly = builder.isNodesOnly();
+ }
+
+ @Override
+ public JsonObject formatObject(Object input) throws AAIFormatVertexException {
+ Vertex v = (Vertex)input;
+ JsonObject json = new JsonObject();
+ json.addProperty("id", v.id().toString());
+ json.addProperty("node-type", v.<String>value(AAIProperties.NODE_TYPE));
+ json.addProperty("url", this.urlBuilder.pathed(v));
+ json.add("properties", this.createPropertiesObject(v));
+ if (!nodesOnly) {
+ json.add("related-to", this.createRelationshipObject(v));
+ }
+ return json;
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 100;
+ }
+
+
+ public JsonObject createPropertiesObject(Vertex v) throws AAIFormatVertexException {
+ JsonObject json = new JsonObject();
+ Iterator<VertexProperty<Object>> iter = v.properties();
+
+ while (iter.hasNext()) {
+ VertexProperty<Object> prop = iter.next();
+ if (prop.value() instanceof String) {
+ json.addProperty(prop.key(), (String)prop.value());
+ } else if (prop.value() instanceof Boolean) {
+ json.addProperty(prop.key(), (Boolean)prop.value());
+ } else if (prop.value() instanceof Number) {
+ json.addProperty(prop.key(), (Number)prop.value());
+ } else if (prop.value() instanceof List) {
+ Gson gson = new Gson();
+ String list = gson.toJson(prop.value());
+
+ json.addProperty(prop.key(), list);
+ } else {
+ //throw exception?
+ return null;
+ }
+ }
+
+ return json;
+ }
+ protected JsonArray createRelationshipObject(Vertex v) throws AAIFormatVertexException {
+ JsonArray jarray = new JsonArray();
+ Iterator<Vertex> iter = v.vertices(Direction.BOTH);
+
+ while (iter.hasNext()) {
+ Vertex related = iter.next();
+
+ JsonObject json = new JsonObject();
+ json.addProperty("id", related.id().toString());
+ json.addProperty("node-type", related.<String>value(AAIProperties.NODE_TYPE));
+ json.addProperty("url", this.urlBuilder.pathed(related));
+ jarray.add(json);
+ }
+
+ return jarray;
+ }
+
+ public static class Builder implements NodesOnly<Builder>, Depth<Builder> {
+
+ protected final Loader loader;
+ protected final DBSerializer serializer;
+ protected final UrlBuilder urlBuilder;
+ protected boolean includeUrl = false;
+ protected boolean nodesOnly = false;
+ protected int depth = 1;
+ protected boolean modelDriven = false;
+ public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) {
+ this.loader = loader;
+ this.serializer = serializer;
+ this.urlBuilder = urlBuilder;
+ }
+
+ protected Loader getLoader() {
+ return this.loader;
+ }
+
+ protected DBSerializer getSerializer() {
+ return this.serializer;
+ }
+
+ protected UrlBuilder getUrlBuilder() {
+ return this.urlBuilder;
+ }
+
+ public Builder includeUrl() {
+ this.includeUrl = true;
+ return this;
+ }
+
+ public Builder nodesOnly(Boolean nodesOnly) {
+ this.nodesOnly = nodesOnly;
+ return this;
+ }
+ public boolean isNodesOnly() {
+ return this.nodesOnly;
+ }
+
+ public Builder depth(Integer depth) {
+ this.depth = depth;
+ return this;
+ }
+
+ public int getDepth() {
+ return this.depth;
+ }
+
+ public boolean isIncludeUrl() {
+ return this.includeUrl;
+ }
+
+ public Builder modelDriven() {
+ this.modelDriven = true;
+ return this;
+ }
+
+ public boolean getModelDriven() {
+ return this.modelDriven;
+ }
+ public RawFormat build() {
+ if (modelDriven) {
+ return new SimpleFormat(this);
+ } else {
+ return new RawFormat(this);
+ }
+ }
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java
new file mode 100644
index 00000000..649971be
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/Resource.java
@@ -0,0 +1,163 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.Loader;
+import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
+import org.onap.aai.serialization.db.DBSerializer;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+import org.onap.aai.serialization.queryformats.params.Depth;
+import org.onap.aai.serialization.queryformats.params.NodesOnly;
+import org.onap.aai.serialization.queryformats.utils.UrlBuilder;
+
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+
+public class Resource implements FormatMapper {
+
+ private final Loader loader;
+ private final DBSerializer serializer;
+ private final JsonParser parser;
+ private final UrlBuilder urlBuilder;
+ private final boolean includeUrl;
+ private final boolean nodesOnly;
+ private final int depth;
+ private Resource (Builder builder) {
+ this.parser = new JsonParser();
+ this.loader = builder.getLoader();
+ this.serializer = builder.getSerializer();
+ this.urlBuilder = builder.getUrlBuilder();
+ this.includeUrl = builder.isIncludeUrl();
+ this.nodesOnly = builder.isNodesOnly();
+ this.depth = builder.getDepth();
+ }
+
+ @Override
+ public JsonObject formatObject(Object input) throws AAIFormatVertexException {
+ Vertex v = (Vertex)input;
+ JsonObject json = new JsonObject();
+
+ if (this.includeUrl) {
+ json.addProperty("url", this.urlBuilder.pathed(v));
+ }
+ json.add(v.<String>property(AAIProperties.NODE_TYPE)
+ .orElse(null), this.vertexToJsonObject(v));
+
+ return json;
+ }
+
+ protected JsonObject vertexToJsonObject(Vertex v) throws AAIFormatVertexException {
+ try {
+ final Introspector obj = getLoader().introspectorFromName(
+ v.<String>property(AAIProperties.NODE_TYPE)
+ .orElse(null)
+ );
+
+ final List<Vertex> wrapper = new ArrayList<>();
+
+ wrapper.add(v);
+
+ try {
+ getSerializer().dbToObject(wrapper, obj, this.depth, this.nodesOnly, "false");
+ } catch (AAIException | UnsupportedEncodingException e) {
+ throw new AAIFormatVertexException("Failed to format vertex - error while serializing: " + e.getMessage(), e);
+ }
+
+ final String json = obj.marshal(false);
+
+ return getParser().parse(json).getAsJsonObject();
+ } catch (AAIUnknownObjectException e) {
+ throw new AAIFormatVertexException("Failed to format vertex - unknown object", e);
+ }
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 20;
+ }
+
+ private Loader getLoader() { return loader; }
+ private DBSerializer getSerializer() { return serializer; }
+ private JsonParser getParser() { return parser; }
+
+ public static class Builder implements NodesOnly<Builder>, Depth<Builder> {
+
+ private final Loader loader;
+ private final DBSerializer serializer;
+ private final UrlBuilder urlBuilder;
+ private boolean includeUrl = false;
+ private boolean nodesOnly = false;
+ private int depth = 1;
+ public Builder(Loader loader, DBSerializer serializer, UrlBuilder urlBuilder) {
+ this.loader = loader;
+ this.serializer = serializer;
+ this.urlBuilder = urlBuilder;
+ }
+
+ protected Loader getLoader() {
+ return this.loader;
+ }
+
+ protected DBSerializer getSerializer() {
+ return this.serializer;
+ }
+
+ protected UrlBuilder getUrlBuilder() {
+ return this.urlBuilder;
+ }
+
+ public Builder includeUrl() {
+ this.includeUrl = true;
+ return this;
+ }
+
+ public Builder nodesOnly(Boolean nodesOnly) {
+ this.nodesOnly = nodesOnly;
+ return this;
+ }
+ public boolean isNodesOnly() {
+ return this.nodesOnly;
+ }
+ public Builder depth(Integer depth) {
+ this.depth = depth;
+ return this;
+ }
+ public int getDepth() {
+ return this.depth;
+ }
+ public boolean isIncludeUrl() {
+ return this.includeUrl;
+ }
+
+ public Resource build() {
+ return new Resource(this);
+ }
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java
new file mode 100644
index 00000000..ba49e3a3
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SimpleFormat.java
@@ -0,0 +1,76 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.db.props.AAIProperties;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Introspector;
+import org.onap.aai.introspection.exceptions.AAIUnknownObjectException;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+
+import com.google.gson.JsonObject;
+
+public class SimpleFormat extends RawFormat {
+
+
+ protected SimpleFormat(Builder builder) {
+ super(builder);
+
+ }
+
+ @Override
+ public int parallelThreshold() {
+ return 20;
+ }
+
+ @Override
+ public JsonObject createPropertiesObject(Vertex v) throws AAIFormatVertexException {
+ try {
+ final Introspector obj = loader.introspectorFromName(
+ v.<String>property(AAIProperties.NODE_TYPE)
+ .orElse(null)
+ );
+
+ final List<Vertex> wrapper = new ArrayList<>();
+
+ wrapper.add(v);
+
+ try {
+ serializer.dbToObject(wrapper, obj, this.depth, true, "false");
+ } catch (AAIException | UnsupportedEncodingException e) {
+ throw new AAIFormatVertexException("Failed to format vertex - error while serializing: " + e.getMessage(), e);
+ }
+
+ final String json = obj.marshal(false);
+ return parser.parse(json).getAsJsonObject();
+ } catch (AAIUnknownObjectException e) {
+ throw new AAIFormatVertexException("Failed to format vertex - unknown object", e);
+ }
+
+
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java
new file mode 100644
index 00000000..6a8acd2f
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/SubGraphStyle.java
@@ -0,0 +1,28 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats;
+
+public enum SubGraphStyle {
+ star,
+ prune,
+ no_op
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java
new file mode 100644
index 00000000..98b90050
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/AAIFormatVertexException.java
@@ -0,0 +1,41 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.exceptions;
+
+public class AAIFormatVertexException extends Exception {
+
+ private static final long serialVersionUID = -5814240841844624097L;
+
+ public AAIFormatVertexException() {}
+
+ public AAIFormatVertexException(String message) {
+ super(message);
+ }
+
+ public AAIFormatVertexException(Throwable cause) {
+ super(cause);
+ }
+
+ public AAIFormatVertexException(String message, Throwable cause) {
+ super(message, cause);
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java
new file mode 100644
index 00000000..313b8942
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/exceptions/QueryParamInjectionException.java
@@ -0,0 +1,41 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.exceptions;
+
+import org.onap.aai.exceptions.AAIException;
+
+public class QueryParamInjectionException extends AAIException {
+
+ private static final long serialVersionUID = -5575661036426538012L;
+
+ public QueryParamInjectionException(String message) {
+ super("AAI_4017", message);
+ }
+
+ public QueryParamInjectionException(Throwable cause) {
+ super("AAI_4017",cause);
+ }
+
+ public QueryParamInjectionException(String message, Throwable cause) {
+ super("AAI_4017", cause, message);
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java
new file mode 100644
index 00000000..e98f0667
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Depth.java
@@ -0,0 +1,29 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.params;
+
+@Inject(name = "depth")
+public interface Depth<T> {
+
+ @Setter
+ public T depth(Integer depth);
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java
new file mode 100644
index 00000000..18d85545
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Inject.java
@@ -0,0 +1,35 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.params;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.RUNTIME)
+public @interface Inject {
+
+ /**
+ * The way the query parameter appears in the URI
+ * @return
+ */
+ String name();
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java
new file mode 100644
index 00000000..1429d552
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/NodesOnly.java
@@ -0,0 +1,29 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.params;
+
+@Inject(name = "nodesOnly")
+public interface NodesOnly<T> {
+
+ @Setter
+ public T nodesOnly(Boolean nodesOnly);
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java
new file mode 100644
index 00000000..e95de0db
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/params/Setter.java
@@ -0,0 +1,37 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.params;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.METHOD})
+/**
+ * Marks what method in the object should be used for setting the value
+ * of the query parameter
+ */
+public @interface Setter {
+
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java
new file mode 100644
index 00000000..29fb56df
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/QueryParamInjector.java
@@ -0,0 +1,85 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.utils;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Set;
+
+import javax.ws.rs.core.MultivaluedMap;
+
+import org.onap.aai.serialization.queryformats.exceptions.QueryParamInjectionException;
+import org.onap.aai.serialization.queryformats.params.Inject;
+import org.onap.aai.serialization.queryformats.params.Setter;
+import org.reflections.Reflections;
+
+public class QueryParamInjector {
+
+ private final Set<Class<?>> results;
+
+
+ private QueryParamInjector () {
+ Reflections reflections = new Reflections("org.onap.aai.serialization.queryformats.params");
+ results = reflections.getTypesAnnotatedWith(Inject.class);
+ }
+
+ private static class Helper {
+ private static final QueryParamInjector INSTANCE = new QueryParamInjector();
+ }
+
+ public static QueryParamInjector getInstance() {
+ return Helper.INSTANCE;
+ }
+
+ public <T> T injectParams(T obj, MultivaluedMap<String, String> params) throws QueryParamInjectionException{
+ try {
+ for (Class<?> item : results) {
+ if (item.isAssignableFrom(obj.getClass())) {
+ String name = item.getAnnotation(Inject.class).name();
+
+ if (params.containsKey(name)) {
+ String value = params.getFirst(name);
+
+ for (Method method : item.getMethods()) {
+ if (method.isAnnotationPresent(Setter.class)) {
+ Class<?>[] args = method.getParameterTypes();
+ if (args.length == 1) {
+ Object o = args[0].getConstructor(String.class).newInstance(value);
+ method.invoke(obj, o);
+ } else {
+ method.invoke(obj);
+ }
+ }
+ }
+ }
+ }
+ }
+ } catch (InstantiationException | IllegalAccessException | IllegalArgumentException
+ | InvocationTargetException | NoSuchMethodException
+ | SecurityException e) {
+ throw new QueryParamInjectionException("issue with query params", e);
+ }
+
+
+ return obj;
+ }
+}
diff --git a/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java
new file mode 100644
index 00000000..8387285d
--- /dev/null
+++ b/aai-core/src/main/java/org/onap/aai/serialization/queryformats/utils/UrlBuilder.java
@@ -0,0 +1,92 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ */
+package org.onap.aai.serialization.queryformats.utils;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URI;
+import java.net.URISyntaxException;
+
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.onap.aai.exceptions.AAIException;
+import org.onap.aai.introspection.Version;
+import org.onap.aai.serialization.db.DBSerializer;
+import org.onap.aai.serialization.queryformats.exceptions.AAIFormatVertexException;
+import org.onap.aai.util.AAIApiServerURLBase;
+import org.onap.aai.util.AAIConstants;
+import org.onap.aai.workarounds.LegacyURITransformer;
+
+public class UrlBuilder {
+
+ private final DBSerializer serializer;
+ private final Version version;
+ private final String serverBase;
+
+ public UrlBuilder (Version version, DBSerializer serializer) throws AAIException {
+ this.serializer = serializer;
+ this.version = version;
+ this.serverBase = this.getServerBase(version);
+ }
+
+ public UrlBuilder (Version version, DBSerializer serializer, String serverBase) {
+ this.serializer = serializer;
+ this.version = version;
+ this.serverBase = serverBase;
+ }
+
+ public String pathed(Vertex v) throws AAIFormatVertexException {
+
+ try {
+ final StringBuilder result = new StringBuilder();
+ final URI uri = this.serializer.getURIForVertex(v);
+
+ if (this.version.compareTo(Version.v11) >= 0) {
+ result.append(AAIConstants.AAI_APP_ROOT);
+ } else {
+ result.append(this.serverBase);
+ }
+ result.append(this.version);
+ result.append(uri);
+
+ return result.toString();
+ } catch (UnsupportedEncodingException | IllegalArgumentException | SecurityException e) {
+ throw new AAIFormatVertexException(e);
+ }
+ }
+
+ public String id(Vertex v) {
+ final StringBuilder result = new StringBuilder();
+
+ result.append("/resources/id/" + v.id());
+ result.insert(0, this.version);
+ if (this.version.compareTo(Version.v11) >= 0) {
+ result.insert(0, AAIConstants.AAI_APP_ROOT);
+ } else {
+ result.insert(0, this.serverBase);
+ }
+
+ return result.toString();
+ }
+
+ protected String getServerBase(Version v) throws AAIException {
+ return AAIApiServerURLBase.get(v);
+ }
+}