summaryrefslogtreecommitdiffstats
path: root/catalog-be/src/main/java/org/openecomp/sdc/be/view/MixinModelWriter.java
diff options
context:
space:
mode:
Diffstat (limited to 'catalog-be/src/main/java/org/openecomp/sdc/be/view/MixinModelWriter.java')
-rw-r--r--catalog-be/src/main/java/org/openecomp/sdc/be/view/MixinModelWriter.java60
1 files changed, 60 insertions, 0 deletions
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/view/MixinModelWriter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/view/MixinModelWriter.java
new file mode 100644
index 0000000000..e3d6ca6e10
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/view/MixinModelWriter.java
@@ -0,0 +1,60 @@
+package org.openecomp.sdc.be.view;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.MultivaluedMap;
+import javax.ws.rs.ext.MessageBodyWriter;
+import javax.ws.rs.ext.Provider;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Type;
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * A class that is then responsible for converting a message payload with a dedicated mixin from an instance of a specific Java type into a json representation.
+ */
+@Provider
+@Produces(MediaType.APPLICATION_JSON)
+public class MixinModelWriter implements MessageBodyWriter<Object> {
+
+ @Override
+ public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+ return hasResponseViewAndMixinTargetAnnotations(annotations) && mediaType.isCompatible(MediaType.APPLICATION_JSON_TYPE);
+ }
+
+ @Override
+ public long getSize(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
+ return -1;
+ }
+
+ @Override
+ public void writeTo(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException {
+ ObjectMapper objectMapper = new ObjectMapper();
+ List<MixinSourceTarget> mixinSourceTargets = getMixinSourceTarget(annotations);
+ mixinSourceTargets.forEach(mixinSourceTarget -> objectMapper.addMixIn(mixinSourceTarget.getTarget(), mixinSourceTarget.getMixinSource()));
+ objectMapper.writeValue(entityStream, object);
+ }
+
+ private List<MixinSourceTarget> getMixinSourceTarget(Annotation[] annotations) {
+ return Stream.of(annotations)
+ .filter(annotation -> annotation.annotationType().equals(ResponseView.class))
+ .map(annotation -> (ResponseView) annotation)
+ .flatMap(responseView -> Stream.of(responseView.mixin()))
+ .map(mixinClass -> new MixinSourceTarget(mixinClass, mixinClass.getAnnotation(MixinTarget.class).target()))
+ .collect(Collectors.toList());
+ }
+
+ private boolean hasResponseViewAndMixinTargetAnnotations(Annotation[] annotations) {
+ return Stream.of(annotations)
+ .filter(annotation -> annotation.annotationType().equals(ResponseView.class))
+ .map(annotation -> (ResponseView) annotation)
+ .flatMap(responseView -> Stream.of(responseView.mixin()))
+ .anyMatch(mixinClass -> Objects.nonNull(mixinClass.getAnnotation(MixinTarget.class)));
+ }
+}