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