View Javadoc

1   package de.tivsource.page.user.actions.gallery;
2   
3   import java.util.HashMap;
4   import java.util.Map;
5   import java.util.regex.Pattern;
6   
7   import org.apache.logging.log4j.LogManager;
8   import org.apache.logging.log4j.Logger;
9   import org.apache.struts2.ServletActionContext;
10  import org.apache.struts2.convention.annotation.Action;
11  import org.apache.struts2.convention.annotation.Actions;
12  import org.apache.struts2.convention.annotation.Result;
13  import org.apache.struts2.tiles.annotation.TilesDefinition;
14  import org.apache.struts2.tiles.annotation.TilesDefinitions;
15  import org.apache.struts2.tiles.annotation.TilesPutAttribute;
16  
17  import de.tivsource.ejb3plugin.InjectEJB;
18  import de.tivsource.page.dao.gallery.GalleryDaoLocal;
19  import de.tivsource.page.dao.picture.PictureDaoLocal;
20  import de.tivsource.page.dao.property.PropertyDaoLocal;
21  import de.tivsource.page.entity.enumeration.Language;
22  import de.tivsource.page.entity.gallery.Gallery;
23  import de.tivsource.page.entity.namingitem.Description;
24  import de.tivsource.page.entity.page.Page;
25  import de.tivsource.page.entity.picture.Picture;
26  import de.tivsource.page.user.actions.EmptyAction;
27  import de.tivsource.page.user.interfaces.Pagination;
28  
29  /**
30   * 
31   * @author Marc Michele
32   *
33   */
34  @TilesDefinitions({
35    @TilesDefinition(name="picture", extend = "userTemplate", putAttributes = {
36      @TilesPutAttribute(name = "meta",    value = "/WEB-INF/tiles/active/meta/picture.jsp"),
37      @TilesPutAttribute(name = "content", value = "/WEB-INF/tiles/active/view/gallery/picture.jsp")
38    })
39  })
40  public class PictureAction extends EmptyAction implements Pagination {
41  
42      /**
43       * Serial Version UID.
44       */
45      private static final long serialVersionUID = -5967314888490364407L;
46  
47      /**
48       * Statischer Logger der Klasse.
49       */
50      private static final Logger LOGGER = LogManager.getLogger(PictureAction.class);
51  
52      @InjectEJB(name="PropertyDao")
53      private PropertyDaoLocal propertyDaoLocal;
54  
55      @InjectEJB(name="GalleryDao")
56      private GalleryDaoLocal galleryDaoLocal;
57  
58      @InjectEJB(name="PictureDao")
59      private PictureDaoLocal pictureDaoLocal;
60      
61      private Page page;
62  
63      private Gallery gallery;
64  
65      private Picture picture;
66      
67      /**
68  	 * Wird durch den Benutzer beeinflusst, es sollte vor der Verwendung auf
69  	 * Sonderzeichen getestet werden.
70  	 */
71      private String pathUuid;
72  
73      /**
74       * Kann durch den Benutzer manipuliert werden, der Wert sollte vor der
75       * Verwendung überprüft werden.
76       */ 
77      private Integer requestedPicture;
78  
79      /**
80       * Kann durch den Benutzer manipuliert werden, der Wert sollte vor der
81       * Verwendung überprüft werden.
82       */ 
83      private Integer requestedPage;
84  
85      private Integer previousPicture;
86  
87      private Integer nextPicture;
88      
89      /**
90       * Anzahl der Bilder aus der Datenbank ermittlet.
91       */
92      private Integer pictureCount;
93  
94      /**
95       * Maximal Anzahl von Bildern auf der aktuellen Seite.
96       */
97      private Integer maxPictures;
98      /**
99       * Attribut das die maximal Anzahl der Liste enthält. 
100      */
101     private Integer maxElements = 5;
102 
103     private Integer next;
104     private Integer previous;
105     private Integer current;
106 
107     /**
108      * Attribut das den Startpunkt der Liste enthält.
109      */
110     private Integer from;
111 
112     /**
113      * Attribute das die maximal mögliche Anzahl an Seiten enthält.
114      */
115     private Integer maxPages;
116 
117     @Override
118     @Actions({
119         @Action(value = "*/*/*/index", results = {
120             @Result(name = "success", type = "tiles", location = "picture"),
121             @Result(name = "input", type = "redirectAction", location = "index.html", params={"namespace", "/"}),
122             @Result(name = "error", type = "redirectAction", location = "index.html", params={"namespace", "/"})
123         })
124     })
125     public String execute() throws Exception {
126         LOGGER.info("execute() aufgerufen.");
127 
128         // Hole Action Locale
129         this.getLanguageFromActionContext();
130 
131         /*
132          * Ermittle ob die Galeriefunktion der Webseite angeschaltet wurde.
133          */
134         boolean galleryPageEnabled = getProperty("gallery.page.enabled").equals("true") ? true : false;
135         if(!galleryPageEnabled) {
136             return ERROR;
137         }
138 
139         /*
140          * Ermittle Wert des Attributes maxElements aus Datenbank, versuche
141          * die Eigenschaft gallery.page.max.pictures zu laden.
142          */
143         if(getProperty("gallery.overview.list.quantity") != null) {
144             maxElements = Integer.parseInt(getProperty("gallery.overview.list.quantity"));
145         }
146 
147         pathUuid = ServletActionContext.getRequest().getServletPath();
148         LOGGER.info("UUID from Path: " + pathUuid);
149 
150         // /gallery/painting/index.html?page=1&request_locale=de
151         
152         
153         pathUuid = pathUuid.replaceAll("/index.html", "");
154         pathUuid = pathUuid.replaceAll("/gallery/", "");
155         
156         LOGGER.info("UUID from Path: " + pathUuid);
157         
158         String[] parts = pathUuid.split("/");
159         
160         LOGGER.info("Erster Teil: " + parts[0]);
161 
162         /*
163          * Überprüfung ob der Inhalt der dritten Position im Array nur Zahlen
164          * enthält.
165          */
166         LOGGER.info("Zweiter Teil: " + parts[1]);
167         if(parts.length == 3 && isNumber(parts[1])) {
168             try {
169                 requestedPage = Integer.parseInt(parts[1]);
170             } catch (Exception e) {
171                 return ERROR;
172             }
173         } else {
174             return ERROR;
175         }
176 
177         /*
178          * Überprüfung das Array aus 3 Postionen besteht und ob der Inhalt des
179          * String Objektes an dritten Position im Array nur Zahlen besteht
180          * enthält. Anschließend wird die Zahl als Integer geparst.
181          */
182         LOGGER.info("Dritter Teil: " + parts[2]);
183         if(parts.length == 3 && isNumber(parts[2])) {
184             try {
185                 requestedPicture = Integer.parseInt(parts[2]);
186             } catch (Exception e){
187                 return ERROR;
188             }
189         } else {
190             return ERROR;
191         }
192 
193         /*
194          * Wenn die Location Uuid keine nicht erlaubten Zeichen enthält und es
195          * die Location mit der Uuid gibt dann wird der Block ausgeführt.
196          */
197         if (isValid(parts[0]) && galleryDaoLocal.isGallery(parts[0])) {
198             LOGGER.info("gültige Gallery UUID.");
199 
200             gallery = galleryDaoLocal.findByUuid(parts[0]);
201 
202             pictureCount = pictureDaoLocal.countAllInGallery(gallery.getUuid());
203             
204             calculate();
205             
206             // TODO: Neue Methode für die Abfrage
207             Integer pictureStart = requestedPage == 1 ? requestedPicture - 1 : (requestedPage - 1) * maxElements + requestedPicture - 1;
208             LOGGER.info("Attribute pictureStart: " + pictureStart);
209             picture = pictureDaoLocal.findCurrentPicture(pictureStart, gallery.getUuid());
210 
211             createPageObject();
212 
213             return SUCCESS;
214         }
215 
216         /*
217          * Wenn es die Seite nicht gibt oder es einen Manipulationsversuch
218          * gab.
219          */
220          return ERROR;
221     }// Ende execute()
222 
223 	public Page getPage() {
224         return page;
225     }
226 
227     public Gallery getGallery() {
228 		return gallery;
229 	}
230 
231 	public Picture getPicture() {
232 		return picture;
233 	}
234 
235     public Integer getRequestedPage() {
236         return requestedPage;
237     }
238 
239     public Integer getPreviousPicture() {
240         return previousPicture;
241     }
242 
243     public Integer getNextPicture() {
244         return nextPicture;
245     }
246 
247     @Override
248     public Integer getNext() {
249         return next;
250     }
251 
252     @Override
253     public Integer getPrevious() {
254         return previous;
255     }
256 
257     @Override
258     public Integer getCurrent() {
259         return requestedPicture;
260     }
261 
262     @Override
263     public void setPage(Integer page) {
264         // Nicht nötig.
265     }
266 
267     private Boolean isValid(String input) {
268         if (Pattern.matches("[abcdef0-9-]*", input)) {
269             return true;
270         } else {
271             return false;
272         }
273     }
274 
275     private Boolean isNumber(String input) {
276         if (Pattern.matches("[0-9]*", input)) {
277             return true;
278         } else {
279             return false;
280         }
281     }
282 
283     /**
284      * Methode die Start und Enpunkt der Liste und die vorherige beziehungweise
285      * die nächste Seitenzahl berechnet.
286      */
287     private void calculate() {
288         maxPages = (pictureCount % maxElements == 0) ? (pictureCount / maxElements)
289                 : (pictureCount / maxElements) + 1;
290 
291         LOGGER.info("Inhalt von requestedPage: " + requestedPage);
292         // Wenn page nicht gesetzt wurde
293         if(requestedPage == null) {
294             requestedPage = 1;
295         }
296 
297         //  Wenn page größer als maxPages ist.
298         if(requestedPage > maxPages) {
299             requestedPage = 1;
300         }
301         LOGGER.info("Inhalt von requestedPage nach den Überprüfungen: " + requestedPage);
302 
303         maxPictures = requestedPage * maxElements < pictureCount ? maxElements : 
304             pictureCount - ((requestedPage - 1) * maxElements);
305         LOGGER.info("Errechnet maximal Anzahl von Bildern: " + maxPictures);
306 
307         // Wenn Bildnummer größer als erlaubt ist
308         if(requestedPicture > maxPictures) {
309             requestedPicture = 1;
310         }
311 
312         // Berechne Seitennummern
313         if(requestedPage == 1) {
314             LOGGER.info("requestedPage erste Abfrage");
315             previous = requestedPage;
316             next = (requestedPicture + 1 > maxPictures) ? requestedPage + 1 : requestedPage;
317         }
318         else if(requestedPicture == 1 && requestedPage - 1 >= 1) {
319             LOGGER.info("requestedPage zweite Abfrage");
320             previous = requestedPage - 1;
321             next = (requestedPicture + 1 > maxPictures) ? requestedPage + 1 : requestedPage;
322             current = requestedPage;
323         }
324         else {
325             LOGGER.info("requestedPage letze Abfrage");
326             previous = requestedPicture <= maxElements ? requestedPage : 1;
327             next = (requestedPicture + 1 > maxPictures) ? requestedPage + 1 : requestedPage;
328             current = requestedPage;
329         }
330 
331         /// Berechne Bildnummern
332         if(requestedPage == 1 && requestedPicture == 1) {
333             LOGGER.info("requestedPicture erste Abfrage");
334             previousPicture = null;
335             nextPicture = (2 <= pictureCount) ? 2 : null;
336         } 
337         else if ((requestedPicture + 1 <= maxElements) && (requestedPicture + 1 <= maxPictures)) {
338             LOGGER.info("requestedPicture zweite Abfrage");
339             previousPicture = requestedPicture - 1 >= 1 ? requestedPicture - 1 : maxElements;
340             nextPicture = requestedPicture + 1;
341         }
342         else {
343             LOGGER.info("requestedPicture letzte Abfrage");
344             previousPicture = requestedPicture - 1 > 1 ? requestedPicture - 1 : maxElements;
345             nextPicture = (requestedPicture + 1 > maxElements) && (requestedPage + 1 <= maxPages) ? 1 : null;
346         }
347         
348     }// Ende calculate()
349 
350     private void createPageObject(){
351         // Erstelle Page Objekt
352         page = new Page();
353         page.setTechnical("picture_current");
354         Map<Language, Description> descriptionMap = new HashMap<Language, Description>();
355 
356         Description descriptionDE = new Description();
357         descriptionDE.setDescription(picture.getDescriptionMap().get(Language.DE).getDescription());
358         descriptionDE.setKeywords(picture.getDescriptionMap().get(Language.DE).getKeywords());
359         descriptionDE.setLanguage(Language.DE);
360         descriptionDE.setName(picture.getDescriptionMap().get(Language.DE).getName());
361         descriptionDE.setNamingItem(page);
362         descriptionMap.put(Language.DE, descriptionDE);
363 
364         Description descriptionEN = new Description();
365         descriptionEN.setDescription(picture.getDescriptionMap().get(Language.EN).getDescription());
366         descriptionEN.setKeywords(picture.getDescriptionMap().get(Language.EN).getKeywords());
367         descriptionEN.setLanguage(Language.EN);
368         descriptionEN.setName(picture.getDescriptionMap().get(Language.EN).getName());
369         descriptionEN.setNamingItem(page);
370         descriptionMap.put(Language.EN, descriptionEN);
371         
372         page.setDescriptionMap(descriptionMap);
373         page.setPicture(picture);
374         page.setPictureOnPage(gallery.getPictureOnPage());
375         page.setCssGroup(gallery.getCssGroup());
376         
377     }
378 
379 }// Ende class