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.resources.app.form.field.transformer.item;
35
36 import info.magnolia.cms.beans.runtime.FileProperties;
37 import info.magnolia.objectfactory.Components;
38 import info.magnolia.ui.api.i18n.I18NAuthoringSupport;
39 import info.magnolia.ui.form.field.definition.BasicUploadFieldDefinition;
40 import info.magnolia.ui.form.field.transformer.item.FileTransformer;
41 import info.magnolia.ui.form.field.upload.UploadReceiver;
42 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
43
44 import java.io.FileInputStream;
45 import java.io.IOException;
46 import java.io.InputStream;
47 import java.util.Date;
48
49 import javax.inject.Inject;
50 import javax.jcr.Binary;
51 import javax.jcr.RepositoryException;
52
53 import org.apache.jackrabbit.JcrConstants;
54 import org.apache.jackrabbit.value.ValueFactoryImpl;
55 import org.slf4j.Logger;
56 import org.slf4j.LoggerFactory;
57
58 import com.vaadin.data.Item;
59 import com.vaadin.data.Property;
60
61
62
63
64
65
66 public class ResourceFileTransformer<T extends UploadReceiver> extends FileTransformer<T> {
67
68 private static final Logger log = LoggerFactory.getLogger(ResourceFileTransformer.class);
69
70 @Inject
71 public ResourceFileTransformer(Item relatedFormItem, BasicUploadFieldDefinition definition, Class<T> type, I18NAuthoringSupport i18NAuthoringSupport) {
72 super(relatedFormItem, definition, type, i18NAuthoringSupport);
73 }
74
75
76
77
78 @Deprecated
79 public ResourceFileTransformer(Item relatedFormItem, BasicUploadFieldDefinition definition, Class<T> type) {
80 this(relatedFormItem, definition, type, Components.getComponent(I18NAuthoringSupport.class));
81 }
82
83 @Override
84 public void writeToItem(T newValue) {
85 Item item = getOrCreateFileItem();
86 if (isValid(newValue, item)) {
87 populateItem(newValue, item);
88 } else {
89 handleInvalid(newValue, item);
90 }
91 }
92
93 @Override
94 protected void handleInvalid(T newValue, Item item) {
95 log.info("Can't handle {} as it is null or empty", newValue);
96 }
97
98 @Override
99 public T readFromItem() {
100 Item item = getOrCreateFileItem();
101 return createPropertyFromItem(item);
102 }
103
104 @Override
105 protected Item getOrCreateFileItem() {
106 String itemName = getItemName();
107
108 getOrCreateProperty(getRoot(), itemName, type);
109 return getRoot();
110 }
111
112 @Override
113 protected JcrNodeAdapter getRootItem() {
114 throw new UnsupportedOperationException("Not used by this class. Please use getRoot() method instead");
115 }
116
117 @SuppressWarnings("unchecked")
118 @Override
119 public Item populateItem(T newValue, Item item) {
120
121 Property<Binary> data = getOrCreateProperty(item, JcrConstants.JCR_DATA, Binary.class);
122 if (newValue != null) {
123 try (InputStream is = new FileInputStream(newValue.getFile())) {
124 data.setValue(ValueFactoryImpl.getInstance().createBinary(is));
125 } catch (RepositoryException | IOException e) {
126 log.error("Could not get Binary. Upload will not be performed", e);
127 getRoot().removeItemProperty(item);
128 return null;
129 }
130 }
131 getOrCreateProperty(item, JcrConstants.JCR_MIMETYPE, String.class).setValue(newValue.getMimeType());
132 getOrCreateProperty(item, FileProperties.PROPERTY_FILENAME, String.class).setValue(newValue.getFileName());
133 getOrCreateProperty(item, FileProperties.PROPERTY_LASTMODIFIED, Date.class).setValue(new Date());
134 getOrCreateProperty(item, FileProperties.PROPERTY_SIZE, Long.class).setValue(newValue.getFileSize());
135 getOrCreateProperty(item, FileProperties.PROPERTY_EXTENSION, String.class).setValue(newValue.getExtension());
136 return item;
137 }
138
139
140
141
142 protected Item getRoot() {
143 return relatedFormItem;
144 }
145 }