1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.rest.reference.dam;
35
36 import info.magnolia.cms.util.DateUtil;
37 import info.magnolia.dam.api.Asset;
38 import info.magnolia.dam.api.metadata.DublinCore;
39 import info.magnolia.dam.api.metadata.MagnoliaAssetMetadata;
40 import info.magnolia.rest.delivery.jcr.OutputStreamWrapper;
41
42 import java.io.IOException;
43 import java.io.OutputStream;
44 import java.lang.annotation.Annotation;
45 import java.lang.reflect.Type;
46 import java.util.Arrays;
47 import java.util.Calendar;
48
49 import javax.json.Json;
50 import javax.json.stream.JsonGenerator;
51 import javax.ws.rs.Produces;
52 import javax.ws.rs.WebApplicationException;
53 import javax.ws.rs.core.MediaType;
54 import javax.ws.rs.core.MultivaluedMap;
55 import javax.ws.rs.ext.MessageBodyWriter;
56 import javax.ws.rs.ext.Provider;
57
58 import org.apache.commons.collections4.CollectionUtils;
59 import org.apache.commons.lang3.ArrayUtils;
60 import org.apache.commons.lang3.StringUtils;
61
62
63
64
65 @Provider
66 @Produces({ MediaType.APPLICATION_JSON })
67 public class AssetWriter implements MessageBodyWriter<Asset> {
68
69 private static final String DATE_TIME_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
70
71 @Override
72 public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
73 return Asset.class.isAssignableFrom(type);
74 }
75
76 @Override
77 public long getSize(Asset asset, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
78
79 return -1;
80 }
81
82 @Override
83 public void writeTo(Asset asset, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
84 boolean includeAssetLinkOnly = (asset instanceof ConfigurableAssetWrappernce/dam/ConfigurableAssetWrapper.html#ConfigurableAssetWrapper">ConfigurableAssetWrappernolia/rest/reference/dam/ConfigurableAssetWrapper.html#ConfigurableAssetWrapper">ConfigurableAssetWrapper) && !((ConfigurableAssetWrappernce/dam/ConfigurableAssetWrapper.html#ConfigurableAssetWrapper">ConfigurableAssetWrapper) asset).isExpand() && ((ConfigurableAssetWrapper) asset).isIncludeDownloadLink();
85
86 JsonGenerator jsonGenerator = entityStream instanceof OutputStreamWrapper ?
87 ((OutputStreamWrapper) entityStream).getJsonGenerator() :
88 Json.createGenerator(entityStream);
89
90 if (includeAssetLinkOnly) {
91 jsonGenerator.write(asset.getLink());
92 return;
93 }
94
95 jsonGenerator.writeStartObject();
96 jsonGenerator.write("@name", asset.getName());
97 jsonGenerator.write("@path", asset.getPath());
98 jsonGenerator.write("@id", asset.getItemKey().asString());
99
100 try {
101 Class jcrProvider = Class.forName("info.magnolia.dam.jcr.JcrAssetProvider");
102 if (asset.getAssetProvider().getClass().isInstance(jcrProvider)) {
103 jsonGenerator.write("@nodeType", "mgnl:asset");
104 }
105 } catch (ClassNotFoundException e) {
106
107 }
108
109 if (!(asset instanceof ConfigurableAssetWrapper/info/magnolia/rest/reference/dam/ConfigurableAssetWrapper.html#ConfigurableAssetWrapper">ConfigurableAssetWrapper) || ((ConfigurableAssetWrapper) asset).isIncludeDownloadLink()) {
110 writeNonEmptyString(jsonGenerator, "@link", asset.getLink());
111 }
112
113 if (!(asset instanceof ConfigurableAssetWrapper/info/magnolia/rest/reference/dam/ConfigurableAssetWrapper.html#ConfigurableAssetWrapper">ConfigurableAssetWrapper) || ((ConfigurableAssetWrapper) asset).isIncludeAssetMetadata()) {
114 jsonGenerator.writeStartObject("metadata");
115 writeNonEmptyString(jsonGenerator, "fileName", asset.getFileName());
116 writeNonEmptyString(jsonGenerator, "mimeType", asset.getMimeType());
117 writeNonEmptyString(jsonGenerator, "caption", asset.getCaption());
118 writeNonEmptyString(jsonGenerator, "comment", asset.getComment());
119 writeNonEmptyString(jsonGenerator, "fileSize", String.valueOf(asset.getFileSize()));
120
121 if (asset.supports(MagnoliaAssetMetadata.class)) {
122 MagnoliaAssetMetadata metadata = asset.getMetadata(MagnoliaAssetMetadata.class);
123 writeNonEmptyString(jsonGenerator, "height", String.valueOf(metadata.getHeight()));
124 writeNonEmptyString(jsonGenerator, "width", String.valueOf(metadata.getWidth()));
125 }
126
127
128 if (asset.supports(DublinCore.class)) {
129 DublinCore metadata = asset.getMetadata(DublinCore.class);
130 writeNonEmptyString(jsonGenerator, "type", metadata.getType());
131 writeNonEmptyString(jsonGenerator, "title", metadata.getTitle());
132 writeNonEmptyString(jsonGenerator, "format", metadata.getFormat());
133 writeNonEmptyString(jsonGenerator, "coverage", metadata.getCoverage());
134 writeNonEmptyString(jsonGenerator, "description", metadata.getDescription());
135 writeNonEmptyString(jsonGenerator, "language", asset.getLanguage());
136 writeNonEmptyString(jsonGenerator, "publisher", metadata.getPublisher());
137 writeNonEmptyString(jsonGenerator, "relation", metadata.getRelation());
138 writeNonEmptyString(jsonGenerator, "rights", metadata.getRights());
139 writeNonEmptyString(jsonGenerator, "source", metadata.getSource());
140 writeNonEmptyStringArray(jsonGenerator, "creator", metadata.getCreator());
141 writeNonEmptyStringArray(jsonGenerator, "contributor", metadata.getContributor());
142 writeNonEmptyStringArray(jsonGenerator, "subject", metadata.getSubject());
143 writeNonEmptyDate(jsonGenerator, "date", metadata.getDate());
144 writeNonEmptyDate(jsonGenerator, "created", metadata.getCreated());
145 writeNonEmptyDate(jsonGenerator, "modified", metadata.getModified());
146 }
147 jsonGenerator.writeEnd();
148 }
149
150 if ((asset instanceof ConfigurableAssetWrapperonfigurableAssetWrapper.html#ConfigurableAssetWrapper">ConfigurableAssetWrapper) && CollectionUtils.isNotEmpty(((ConfigurableAssetWrapper) asset).getAssetRenditions())) {
151 jsonGenerator.writeStartObject("renditions");
152 ((ConfigurableAssetWrapper) asset).getAssetRenditions().forEach(rendition -> {
153 jsonGenerator.writeStartObject(rendition.getRenditionName());
154 jsonGenerator.write("mimeType", rendition.getMimeType());
155 jsonGenerator.write("link", rendition.getLink());
156 jsonGenerator.writeEnd();
157 });
158 jsonGenerator.writeEnd();
159 }
160 jsonGenerator.writeEnd();
161 jsonGenerator.flush();
162 }
163
164 private void writeNonEmptyString(JsonGenerator jsonGenerator, String key, String value) {
165 if (StringUtils.isNotEmpty(value)) {
166 jsonGenerator.write(key, value);
167 }
168 }
169
170 private void writeNonEmptyStringArray(JsonGenerator jsonGenerator, String key, String[] values) {
171 String[] nonEmptyValues = Arrays.stream(ArrayUtils.nullToEmpty(values))
172 .filter(StringUtils::isNotEmpty)
173 .toArray(String[]::new);
174 if (ArrayUtils.isEmpty(nonEmptyValues)) {
175 return;
176 }
177 jsonGenerator.writeStartArray(key);
178 for (String value : nonEmptyValues) {
179 jsonGenerator.write(value);
180 }
181 jsonGenerator.writeEnd();
182 }
183
184 private void writeNonEmptyDate(JsonGenerator jsonGenerator, String key, Calendar date) {
185 if (date != null) {
186 jsonGenerator.write(key, DateUtil.format(date.getTime(), DATE_TIME_PATTERN));
187 }
188 }
189 }