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.dam.external.app.imageprovider;
35
36 import info.magnolia.dam.api.Asset;
37 import info.magnolia.dam.api.AssetProviderRegistry;
38 import info.magnolia.dam.api.AssetRenderer;
39 import info.magnolia.ui.imageprovider.ImageProvider;
40 import info.magnolia.ui.vaadin.integration.contentconnector.ContentConnector;
41
42 import java.io.InputStream;
43
44 import javax.inject.Inject;
45
46 import org.apache.commons.lang3.StringUtils;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50 import com.google.common.net.MediaType;
51 import com.vaadin.data.util.BeanItem;
52 import com.vaadin.server.StreamResource;
53
54
55
56
57 public class AssetImageProvider implements ImageProvider {
58
59 private static final Logger log = LoggerFactory.getLogger(AssetImageProvider.class);
60
61 private static final String ICON_CLASS_DEFAULT = "file";
62
63 private final ContentConnector contentConnector;
64 private final AssetProviderRegistry assetProviderRegistry;
65
66 @Inject
67 public AssetImageProvider(ContentConnector contentConnector, AssetProviderRegistry assetProviderRegistry) {
68 this.contentConnector = contentConnector;
69 this.assetProviderRegistry = assetProviderRegistry;
70 }
71
72 @Override
73 public String getPortraitPath(Object itemId) {
74 BeanItem<info.magnolia.dam.api.Item> item = (BeanItem<info.magnolia.dam.api.Item>) contentConnector.getItem(itemId);
75 if (item != null && item.getBean() instanceof Asset) {
76 final Asset asset = (Asset) item.getBean();
77 return getGeneratorImagePath(asset, PORTRAIT_GENERATOR);
78 } else {
79 log.debug("AssetImageProvider works with BeanItem<info.magnolia.dam.api.Asset> only.");
80 }
81 return null;
82 }
83
84 @Override
85 public String getThumbnailPath(Object itemId) {
86 BeanItem<info.magnolia.dam.api.Item> item = (BeanItem<info.magnolia.dam.api.Item>) contentConnector.getItem(itemId);
87 if (item != null && item.getBean() instanceof Asset) {
88 final Asset asset = (Asset) item.getBean();
89 return getGeneratorImagePath(asset, THUMBNAIL_GENERATOR);
90 } else {
91 log.debug("AssetImageProvider works with BeanItem<info.magnolia.dam.api.Asset> only.");
92 }
93 return null;
94 }
95
96 @Override
97 public String resolveIconClassName(String mimeType) {
98 if(StringUtils.isBlank(mimeType)) {
99 return ICON_CLASS_DEFAULT;
100 }
101 try {
102 MediaType mediaType = MediaType.parse(mimeType);
103 return resolveIconFileType(mediaType);
104 } catch(IllegalArgumentException iae) {
105 return ICON_CLASS_DEFAULT;
106 }
107 }
108
109 @Override
110 public Object getThumbnailResource(Object itemId, String generator) {
111 BeanItem<info.magnolia.dam.api.Item> item = (BeanItem<info.magnolia.dam.api.Item>) contentConnector.getItem(itemId);
112 if (item != null && item.getBean() instanceof Asset) {
113 final Asset asset = (Asset) item.getBean();
114 if (isImage(asset.getMimeType())) {
115 StreamResource.StreamSource streamSource = new StreamResource.StreamSource() {
116 @Override
117 public InputStream getStream() {
118 return asset.getAssetProvider().getAsset(asset.getItemKey()).getContentStream();
119 }
120 };
121 return new StreamResource(streamSource, asset.getFileName());
122 } else {
123 return resolveIconClassName(asset.getMimeType());
124 }
125 } else {
126 log.debug("AssetImageProvider works with BeanItem<info.magnolia.dam.api.Asset> only.");
127 }
128 return null;
129 }
130
131 private String resolveIconFileType(MediaType mediaType) {
132 if (mediaType.is(MediaType.PDF)) {
133 return "file-pdf";
134 }
135 if (mediaType.is(MediaType.MICROSOFT_WORD)) {
136 return "file-word";
137 }
138 if (mediaType.is(MediaType.MICROSOFT_EXCEL)) {
139 return "file-excel";
140 }
141 if (mediaType.is(MediaType.MICROSOFT_POWERPOINT)) {
142 return "file-powerpoint";
143 }
144 if (mediaType.is(MediaType.ANY_TEXT_TYPE)) {
145 return "file-text";
146 }
147 if (mediaType.is(MediaType.ANY_IMAGE_TYPE)) {
148 return "file-image";
149 }
150 if (mediaType.is(MediaType.ANY_VIDEO_TYPE)) {
151 return "file-video";
152 }
153 if (mediaType.is(MediaType.ANY_AUDIO_TYPE)) {
154 return "file-audio";
155 }
156 return ICON_CLASS_DEFAULT;
157 }
158
159 protected String getGeneratorImagePath(Asset asset, String generator) {
160 String imagePath = null;
161 if (asset != null) {
162 try {
163 final MediaType mediaType = MediaType.parse(asset.getMimeType());
164 final AssetRenderer assetRenderer = assetProviderRegistry.getRendererFor(asset, mediaType);
165 if (assetRenderer != null) {
166 return assetRenderer.render(asset, mediaType, generator).getLink();
167 }
168 } catch (IllegalArgumentException iae) {
169 log.debug("Could not get media type from asset: {}", iae.getMessage());
170 }
171 }
172 return imagePath;
173 }
174
175 protected boolean isImage(String mimeType) {
176 if (mimeType != null) {
177 final MediaType mediaType = MediaType.parse(mimeType);
178 if (mediaType != null && mediaType.is(MediaType.ANY_IMAGE_TYPE)) {
179 return true;
180 }
181 }
182 return false;
183 }
184 }