1 package de.tivsource.page.admin.actions.others.picture;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.FileInputStream;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.io.InputStreamReader;
10 import java.nio.file.Files;
11 import java.nio.file.Path;
12 import java.nio.file.Paths;
13 import java.util.Date;
14 import java.util.HashMap;
15 import java.util.Map;
16 import java.util.UUID;
17
18 import org.apache.commons.codec.digest.DigestUtils;
19 import org.apache.logging.log4j.LogManager;
20 import org.apache.logging.log4j.Logger;
21 import org.apache.struts2.ServletActionContext;
22 import org.apache.struts2.convention.annotation.Action;
23 import org.apache.struts2.convention.annotation.Actions;
24 import org.apache.struts2.convention.annotation.Result;
25
26 import de.tivsource.ejb3plugin.InjectEJB;
27 import de.tivsource.page.admin.actions.EmptyAction;
28 import de.tivsource.page.dao.picture.PictureDaoLocal;
29 import de.tivsource.page.entity.picture.Picture;
30 import de.tivsource.page.entity.picture.PictureUrl;
31 import de.tivsource.page.enumeration.UrlType;
32
33
34
35
36
37
38 public class PictureEditAction extends EmptyAction {
39
40
41
42
43 private static final long serialVersionUID = -732434023428163882L;
44
45
46
47
48 private static final Logger LOGGER = LogManager.getLogger(PictureEditAction.class);
49
50
51
52
53 private static final String picturePath = "/var/www/html/pictures/";
54
55
56
57
58 private static final String uploadPath = picturePath + "FULL/";
59
60 @InjectEJB(name="PictureDao")
61 private PictureDaoLocal pictureDaoLocal;
62
63 private Picture picture;
64
65 private File file;
66
67 public Picture getPicture() {
68 return picture;
69 }
70
71 public void setPicture(Picture picture) {
72 this.picture = picture;
73 }
74
75 public void setFile(File file) {
76 this.file = file;
77 }
78
79 @Override
80 @Actions({
81 @Action(
82 value = "picture",
83 results = {
84 @Result(name = "success", type = "redirectAction", location = "index.html"),
85 @Result(name = "input", type = "tiles", location = "pictureForm"),
86 @Result(name = "error", type = "tiles", location = "pictureEditError")
87 }
88 )
89 })
90 public String execute() throws Exception {
91 LOGGER.info("execute() aufgerufen.");
92
93 String remoteUser = ServletActionContext.getRequest().getRemoteUser();
94 String remoteAddress = ServletActionContext.getRequest().getRemoteAddr();
95
96 if(picture != null) {
97 LOGGER.info("UUID des Bildes: " + picture.getUuid());
98 Picture dbPicture = pictureDaoLocal.findByUuid(picture.getUuid());
99
100 dbPicture.setModified(new Date());
101 dbPicture.setModifiedBy(remoteUser);
102 dbPicture.setModifiedAddress(remoteAddress);
103
104 if(file != null) {
105
106 deletePictures(dbPicture.getPictureUrls());
107
108
109 String pictureSaveName = DigestUtils.shaHex("Hier ist das Geheimniss."
110 + file.getName() + new Date() + "Noch ein bischen.")
111 + ".png";
112 LOGGER.info("Variable pictureSaveName: " + pictureSaveName);
113
114 File fullPictureFileToCreate = new File(uploadPath, pictureSaveName);
115
116 if (!fullPictureFileToCreate.exists()) {
117 savePictureFile(file, fullPictureFileToCreate);
118 }
119
120 createNormal(uploadPath + pictureSaveName, picturePath
121 + "NORMAL/" + pictureSaveName);
122 createThumbnail(uploadPath + pictureSaveName, picturePath
123 + "THUMBNAIL/" + pictureSaveName);
124 createLarge(uploadPath + pictureSaveName, picturePath
125 + "LARGE/" + pictureSaveName);
126
127
128 pictureDaoLocal.delete(dbPicture.getPictureUrls().get(UrlType.FULL).getUuid());
129 pictureDaoLocal.delete(dbPicture.getPictureUrls().get(UrlType.LARGE).getUuid());
130 pictureDaoLocal.delete(dbPicture.getPictureUrls().get(UrlType.NORMAL).getUuid());
131 pictureDaoLocal.delete(dbPicture.getPictureUrls().get(UrlType.THUMBNAIL).getUuid());
132 dbPicture.getPictureUrls().remove(UrlType.FULL);
133 dbPicture.getPictureUrls().remove(UrlType.LARGE);
134 dbPicture.getPictureUrls().remove(UrlType.NORMAL);
135 dbPicture.getPictureUrls().remove(UrlType.THUMBNAIL);
136 pictureDaoLocal.merge(dbPicture);
137
138
139 dbPicture.setPictureUrls(generatePictureUrls(pictureSaveName, picture));
140 }
141
142
143 LOGGER.info("PictureUrl (FULL): " + dbPicture.getPictureUrls().get(UrlType.FULL).getUrl());
144 pictureDaoLocal.merge(dbPicture);
145 return SUCCESS;
146 }
147 else {
148 return ERROR;
149 }
150
151 }
152
153 private static void savePictureFile(File source, File destination) throws Exception {
154 byte[] buffer = new byte[(int) source.length()];
155 InputStream in = new FileInputStream(source);
156 in.read(buffer);
157 FileOutputStream fileOutStream = new FileOutputStream(destination);
158 fileOutStream.write(buffer);
159 fileOutStream.flush();
160 fileOutStream.close();
161 in.close();
162 }
163
164 private static void createNormal(String source, String destination) throws IOException {
165 String s = null;
166
167 Process p = Runtime.getRuntime().exec(
168 "/usr/bin/convert " + source
169 + " -resize 600x500 -quality 85 "
170 + destination);
171 BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
172 BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
173
174 while ((s = stdInput.readLine()) != null) {
175 System.out.println(s);
176 }
177
178 while ((s = stdError.readLine()) != null) {
179 System.out.println(s);
180 }
181 }
182
183 private static void createLarge(String source, String destination) throws IOException {
184 String s = null;
185
186 Process p = Runtime.getRuntime().exec(
187 "/usr/bin/convert " + source
188 + " -resize 1000x1000 -quality 85 "
189 + destination);
190 BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
191 BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
192
193 while ((s = stdInput.readLine()) != null) {
194 System.out.println(s);
195 }
196
197 while ((s = stdError.readLine()) != null) {
198 System.out.println(s);
199 }
200 }
201
202 private static void createThumbnail(String source, String destination) throws IOException {
203 String s = null;
204
205 Process p = Runtime.getRuntime().exec(
206 "/usr/bin/convert " + source
207 + " -resize 200x143 -quality 85 "
208 + destination);
209 BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
210 BufferedReader stdError = new BufferedReader(new InputStreamReader(p.getErrorStream()));
211
212 while ((s = stdInput.readLine()) != null) {
213 System.out.println(s);
214 }
215
216 while ((s = stdError.readLine()) != null) {
217 System.out.println(s);
218 }
219 }
220
221 private static Map<UrlType, PictureUrl> generatePictureUrls(String pictureName, Picture pictureObject) {
222 LOGGER.debug("generatePictureUrls(String pictureName, Picture pictureObject) aufgerufen.");
223 LOGGER.info("Variable pictureName: " + pictureName);
224
225 Map<UrlType, PictureUrl> pictureUrls = new HashMap<UrlType, PictureUrl>();
226 PictureUrl normalPictureUrl = new PictureUrl();
227 normalPictureUrl.setUuid(UUID.randomUUID().toString());
228 normalPictureUrl.setPicture(pictureObject);
229 normalPictureUrl.setUrl(pictureName);
230 normalPictureUrl.setUrlType(UrlType.NORMAL);
231
232 PictureUrl largePictureUrl = new PictureUrl();
233 largePictureUrl.setUuid(UUID.randomUUID().toString());
234 largePictureUrl.setPicture(pictureObject);
235 largePictureUrl.setUrl(pictureName);
236 largePictureUrl.setUrlType(UrlType.LARGE);
237
238 PictureUrl thumbnailPictureUrl = new PictureUrl();
239 thumbnailPictureUrl.setUuid(UUID.randomUUID().toString());
240 thumbnailPictureUrl.setPicture(pictureObject);
241 thumbnailPictureUrl.setUrl(pictureName);
242 thumbnailPictureUrl.setUrlType(UrlType.THUMBNAIL);
243
244 PictureUrl fullPictureUrl = new PictureUrl();
245 fullPictureUrl.setUuid(UUID.randomUUID().toString());
246 fullPictureUrl.setPicture(pictureObject);
247 fullPictureUrl.setUrl(pictureName);
248 fullPictureUrl.setUrlType(UrlType.FULL);
249
250 pictureUrls.put(UrlType.NORMAL, normalPictureUrl);
251 pictureUrls.put(UrlType.LARGE, largePictureUrl);
252 pictureUrls.put(UrlType.THUMBNAIL, thumbnailPictureUrl);
253 pictureUrls.put(UrlType.FULL, fullPictureUrl);
254
255 return pictureUrls;
256 }
257
258 private static void deletePictures(Map<UrlType, PictureUrl> pictureUrls) throws IOException {
259 String pathFULL = picturePath + "FULL/" + pictureUrls.get(UrlType.FULL).getUrl();
260 deleteFile(pathFULL);
261 String pathLARGE = picturePath + "LARGE/" + pictureUrls.get(UrlType.LARGE).getUrl();
262 deleteFile(pathLARGE);
263 String pathNORMAL = picturePath + "NORMAL/" + pictureUrls.get(UrlType.NORMAL).getUrl();
264 deleteFile(pathNORMAL);
265 String pathTHUMBNAIL = picturePath + "THUMBNAIL/" + pictureUrls.get(UrlType.THUMBNAIL).getUrl();
266 deleteFile(pathTHUMBNAIL);
267 }
268
269 private static void deleteFile(String source) throws IOException {
270 Path filePath = Paths.get(source);
271 if (Files.exists(filePath) && !Files.isDirectory(filePath)
272 && Files.isRegularFile(filePath)) {
273
274 Files.delete(filePath);
275 LOGGER.info("Datei: "+ source +" erfolgreich gelöscht");
276 } else {
277 LOGGER.info("Konnte die Datei: "+ source +" nicht löschen.");
278 }
279 }
280
281 }