View Javadoc

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   * @author Marc Michele
36   *
37   */
38  public class PictureEditAction extends EmptyAction {
39  
40  	/**
41  	 * Serial Version UID.
42  	 */
43  	private static final long serialVersionUID = -732434023428163882L;
44  
45  	/**
46  	 * Statischer Logger der Klasse.
47  	 */
48      private static final Logger LOGGER = LogManager.getLogger(PictureEditAction.class);
49  
50      /**
51       * Pfad zu den Verzeichnissen der Bild Dateien
52       */
53      private static final String picturePath = "/var/www/html/pictures/";
54  
55      /**
56       * Pfad in dem die hochgeladene orginal Bild Datei gespeichert wird.
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     	    	// Lösche die alten Bilder
106     	    	deletePictures(dbPicture.getPictureUrls());
107 
108                 // Name der Bild Datei die erstellt werden soll. 
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                 // Wenn die Datei noch nicht existiert wird Sie erstellt.
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                 // Lösche alle Bilder
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             	// Setzte die Urls in das Bild.
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     }// Ende execute()
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     }// Ende deletePictures(Map<UrlType, PictureUrl> pictureUrls)
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 			// Lösche die Datei
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     }// Ende deleteFile(String source)
280 
281 }// Ende class