View Javadoc
1   /*
2    * This file is part of ***  M y C o R e  ***
3    * See http://www.mycore.de/ for details.
4    *
5    * MyCoRe is free software: you can redistribute it and/or modify
6    * it under the terms of the GNU General Public License as published by
7    * the Free Software Foundation, either version 3 of the License, or
8    * (at your option) any later version.
9    *
10   * MyCoRe is distributed in the hope that it will be useful,
11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   * GNU General Public License for more details.
14   *
15   * You should have received a copy of the GNU General Public License
16   * along with MyCoRe.  If not, see <http://www.gnu.org/licenses/>.
17   */
18  
19  package org.mycore.common.events;
20  
21  import java.io.IOException;
22  import java.nio.file.Files;
23  import java.nio.file.Path;
24  import java.nio.file.attribute.BasicFileAttributeView;
25  import java.nio.file.attribute.BasicFileAttributes;
26  
27  import org.apache.logging.log4j.LogManager;
28  import org.apache.logging.log4j.Logger;
29  import org.mycore.datamodel.classifications2.MCRCategory;
30  import org.mycore.datamodel.metadata.MCRDerivate;
31  import org.mycore.datamodel.metadata.MCRObject;
32  
33  /**
34   * Abstract helper class that can be subclassed to implement event handlers more
35   * easily.
36   * 
37   * @author Frank Lützenkirchen
38   * @author Jens Kupferschmidt
39   */
40  public abstract class MCREventHandlerBase implements MCREventHandler {
41      private static Logger logger = LogManager.getLogger(MCREventHandlerBase.class);
42  
43      /**
44       * This method handle all calls for EventHandler for the event types
45       * MCRObject, MCRDerivate and MCRFile.
46       * 
47       * @param evt
48       *            The MCREvent object
49       */
50      public void doHandleEvent(MCREvent evt) {
51  
52          if (evt.getObjectType() == MCREvent.ObjectType.OBJECT) {
53              MCRObject obj = (MCRObject) evt.get("object");
54              if (obj != null) {
55                  logger.debug("{} handling {} {}", getClass().getName(), obj.getId(), evt.getEventType());
56                  switch (evt.getEventType()) {
57                      case CREATE:
58                          handleObjectCreated(evt, obj);
59                          break;
60                      case UPDATE:
61                          handleObjectUpdated(evt, obj);
62                          break;
63                      case DELETE:
64                          handleObjectDeleted(evt, obj);
65                          break;
66                      case REPAIR:
67                          handleObjectRepaired(evt, obj);
68                          break;
69                      case INDEX:
70                          handleObjectIndex(evt, obj);
71                          break;
72                      default:
73                          logger
74                              .warn("Can't find method for an object data handler for event type {}", evt.getEventType());
75                          break;
76                  }
77                  return;
78              }
79              logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
80              return;
81          }
82  
83          if (evt.getObjectType() == MCREvent.ObjectType.DERIVATE) {
84              MCRDerivate der = (MCRDerivate) evt.get("derivate");
85              if (der != null) {
86                  logger.debug("{} handling {} {}", getClass().getName(), der.getId(), evt.getEventType());
87                  switch (evt.getEventType()) {
88                      case CREATE:
89                          handleDerivateCreated(evt, der);
90                          break;
91                      case UPDATE:
92                          handleDerivateUpdated(evt, der);
93                          break;
94                      case DELETE:
95                          handleDerivateDeleted(evt, der);
96                          break;
97                      case REPAIR:
98                          handleDerivateRepaired(evt, der);
99                          break;
100                     case INDEX:
101                         updateDerivateFileIndex(evt, der);
102                         break;
103                     default:
104                         logger
105                             .warn("Can't find method for a derivate data handler for event type {}",
106                                 evt.getEventType());
107                         break;
108                 }
109                 return;
110             }
111             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
112             return;
113         }
114 
115         if (evt.getObjectType() == MCREvent.ObjectType.PATH) {
116             Path path = (Path) evt.get(MCREvent.PATH_KEY);
117             if (path != null) {
118                 if (!path.isAbsolute()) {
119                     logger.warn("Cannot handle path events on non absolute paths: {}", path);
120                 }
121                 logger.debug("{} handling {} {}", getClass().getName(), path, evt.getEventType());
122                 BasicFileAttributes attrs = (BasicFileAttributes) evt.get(MCREvent.FILEATTR_KEY);
123                 if (attrs == null && evt.getEventType() != MCREvent.EventType.DELETE) {
124                     logger.warn("BasicFileAttributes for {} was not given. Resolving now.", path);
125                     try {
126                         attrs = Files.getFileAttributeView(path, BasicFileAttributeView.class).readAttributes();
127                     } catch (IOException e) {
128                         logger.error("Could not get BasicFileAttributes from path: {}", path, e);
129                     }
130                 }
131                 switch (evt.getEventType()) {
132                     case CREATE:
133                         handlePathCreated(evt, path, attrs);
134                         break;
135                     case UPDATE:
136                         handlePathUpdated(evt, path, attrs);
137                         break;
138                     case DELETE:
139                         handlePathDeleted(evt, path, attrs);
140                         break;
141                     case REPAIR:
142                         handlePathRepaired(evt, path, attrs);
143                         break;
144                     case INDEX:
145                         updatePathIndex(evt, path, attrs);
146                         break;
147                     default:
148                         logger.warn("Can't find method for Path data handler for event type {}", evt.getEventType());
149                         break;
150                 }
151                 return;
152             }
153             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
154             return;
155         }
156 
157         if (evt.getObjectType() == MCREvent.ObjectType.CLASS) {
158             MCRCategory cl = (MCRCategory) evt.get("class");
159             if (cl != null) {
160                 logger.debug("{} handling {} {}", getClass().getName(), cl.getId(), evt.getEventType());
161                 switch (evt.getEventType()) {
162                     case CREATE:
163                         handleClassificationCreated(evt, cl);
164                         break;
165                     case UPDATE:
166                         handleClassificationUpdated(evt, cl);
167                         break;
168                     case DELETE:
169                         handleClassificationDeleted(evt, cl);
170                         break;
171                     case REPAIR:
172                         handleClassificationRepaired(evt, cl);
173                         break;
174                     default:
175                         logger.warn("Can't find method for a classification data handler for event type {}",
176                             evt.getEventType());
177                         break;
178                 }
179                 return;
180             }
181             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
182         }
183 
184     }
185 
186     /**
187      * This method roll back all calls for EventHandler for the event types
188      * MCRObject, MCRDerivate and MCRFile.
189      * 
190      * @param evt
191      *            The MCREvent object
192      */
193     public void undoHandleEvent(MCREvent evt) {
194 
195         if (evt.getObjectType() == MCREvent.ObjectType.OBJECT) {
196             MCRObject obj = (MCRObject) evt.get("object");
197             if (obj != null) {
198                 logger.debug("{} handling {} {}", getClass().getName(), obj.getId(), evt.getEventType());
199                 switch (evt.getEventType()) {
200                     case CREATE:
201                         undoObjectCreated(evt, obj);
202                         break;
203                     case UPDATE:
204                         undoObjectUpdated(evt, obj);
205                         break;
206                     case DELETE:
207                         undoObjectDeleted(evt, obj);
208                         break;
209                     case REPAIR:
210                         undoObjectRepaired(evt, obj);
211                         break;
212                     default:
213                         logger
214                             .warn("Can't find method for an object data handler for event type {}", evt.getEventType());
215                         break;
216                 }
217                 return;
218             }
219             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
220             return;
221         }
222 
223         if (evt.getObjectType() == MCREvent.ObjectType.DERIVATE) {
224             MCRDerivate der = (MCRDerivate) evt.get("derivate");
225             if (der != null) {
226                 logger.debug("{} handling {}{}", getClass().getName(), der.getId(), evt.getEventType());
227                 switch (evt.getEventType()) {
228                     case CREATE:
229                         undoDerivateCreated(evt, der);
230                         break;
231                     case UPDATE:
232                         undoDerivateUpdated(evt, der);
233                         break;
234                     case DELETE:
235                         undoDerivateDeleted(evt, der);
236                         break;
237                     case REPAIR:
238                         undoDerivateRepaired(evt, der);
239                         break;
240                     default:
241                         logger
242                             .warn("Can't find method for a derivate data handler for event type {}",
243                                 evt.getEventType());
244                         break;
245                 }
246                 return;
247             }
248             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
249             return;
250         }
251 
252         if (evt.getObjectType() == MCREvent.ObjectType.PATH) {
253             Path path = (Path) evt.get(MCREvent.PATH_KEY);
254             if (path != null) {
255                 if (!path.isAbsolute()) {
256                     logger.warn("Cannot handle path events on non absolute paths: {}", path);
257                 }
258                 logger.debug("{} handling {} {}", getClass().getName(), path, evt.getEventType());
259                 BasicFileAttributes attrs = (BasicFileAttributes) evt.get(MCREvent.FILEATTR_KEY);
260                 if (attrs == null && evt.getEventType() != MCREvent.EventType.DELETE) {
261                     logger.warn("BasicFileAttributes for {} was not given. Resolving now.", path);
262                     try {
263                         attrs = Files.getFileAttributeView(path, BasicFileAttributeView.class).readAttributes();
264                     } catch (IOException e) {
265                         logger.error("Could not get BasicFileAttributes from path: {}", path, e);
266                     }
267                 }
268                 switch (evt.getEventType()) {
269                     case CREATE:
270                         undoPathCreated(evt, path, attrs);
271                         break;
272                     case UPDATE:
273                         undoPathUpdated(evt, path, attrs);
274                         break;
275                     case DELETE:
276                         undoPathDeleted(evt, path, attrs);
277                         break;
278                     case REPAIR:
279                         undoPathRepaired(evt, path, attrs);
280                         break;
281                     default:
282                         logger.warn("Can't find method for Path data handler for event type {}", evt.getEventType());
283                         break;
284                 }
285                 return;
286             }
287             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
288             return;
289         }
290 
291         if (evt.getObjectType() == MCREvent.ObjectType.CLASS) {
292             MCRCategory obj = (MCRCategory) evt.get(MCREvent.CLASS_KEY);
293             if (obj != null) {
294                 logger.debug("{} handling {} {}", getClass().getName(), obj.getId(), evt.getEventType());
295                 switch (evt.getEventType()) {
296                     case CREATE:
297                         undoClassificationCreated(evt, obj);
298                         break;
299                     case UPDATE:
300                         undoClassificationUpdated(evt, obj);
301                         break;
302                     case DELETE:
303                         undoClassificationDeleted(evt, obj);
304                         break;
305                     case REPAIR:
306                         undoClassificationRepaired(evt, obj);
307                         break;
308                     default:
309                         logger.warn("Can't find method for an classification data handler for event type {}",
310                             evt.getEventType());
311                         break;
312                 }
313                 return;
314             }
315             logger.warn("Can't find method for " + evt.getObjectType() + " for event type {}", evt.getEventType());
316         }
317 
318     }
319 
320     /** This method does nothing. It is very useful for debugging events. */
321     public void doNothing(MCREvent evt, Object obj) {
322         logger.debug("{} does nothing on {} {} {}", getClass().getName(), evt.getEventType(), evt.getObjectType(),
323             obj.getClass().getName());
324     }
325 
326     /**
327      * Handles classification created events. This implementation does nothing and
328      * should be overwritted by subclasses.
329      * 
330      * @param evt
331      *            the event that occured
332      * @param obj
333      *            the MCRClassification that caused the event
334      */
335     protected void handleClassificationCreated(MCREvent evt, MCRCategory obj) {
336         doNothing(evt, obj);
337     }
338 
339     /**
340      * Handles classification updated events. This implementation does nothing and
341      * should be overwritted by subclasses.
342      * 
343      * @param evt
344      *            the event that occured
345      * @param obj
346      *            the MCRClassification that caused the event
347      */
348     protected void handleClassificationUpdated(MCREvent evt, MCRCategory obj) {
349         doNothing(evt, obj);
350     }
351 
352     /**
353      * Handles classification deleted events. This implementation does nothing and
354      * should be overwritted by subclasses.
355      * 
356      * @param evt
357      *            the event that occured
358      * @param obj
359      *            the MCRClassification that caused the event
360      */
361     protected void handleClassificationDeleted(MCREvent evt, MCRCategory obj) {
362         doNothing(evt, obj);
363     }
364 
365     /**
366      * Handles classification repair events. This implementation does nothing and should
367      * be overwritted by subclasses.
368      * 
369      * @param evt
370      *            the event that occured
371      * @param obj
372      *            the MCRClassification that caused the event
373      */
374     protected void handleClassificationRepaired(MCREvent evt, MCRCategory obj) {
375         doNothing(evt, obj);
376     }
377 
378     /**
379      * Handles object created events. This implementation does nothing and
380      * should be overwritted by subclasses.
381      * 
382      * @param evt
383      *            the event that occured
384      * @param obj
385      *            the MCRObject that caused the event
386      */
387     protected void handleObjectCreated(MCREvent evt, MCRObject obj) {
388         doNothing(evt, obj);
389     }
390 
391     /**
392      * Handles object updated events. This implementation does nothing and
393      * should be overwritted by subclasses.
394      * 
395      * @param evt
396      *            the event that occured
397      * @param obj
398      *            the MCRObject that caused the event
399      */
400     protected void handleObjectUpdated(MCREvent evt, MCRObject obj) {
401         doNothing(evt, obj);
402     }
403 
404     /**
405      * Handles object deleted events. This implementation does nothing and
406      * should be overwritted by subclasses.
407      * 
408      * @param evt
409      *            the event that occured
410      * @param obj
411      *            the MCRObject that caused the event
412      */
413     protected void handleObjectDeleted(MCREvent evt, MCRObject obj) {
414         doNothing(evt, obj);
415     }
416 
417     /**
418      * Handles object repair events. This implementation does nothing and should
419      * be overwritted by subclasses.
420      * 
421      * @param evt
422      *            the event that occured
423      * @param obj
424      *            the MCRObject that caused the event
425      */
426     protected void handleObjectRepaired(MCREvent evt, MCRObject obj) {
427         doNothing(evt, obj);
428     }
429 
430     protected void handleObjectIndex(MCREvent evt, MCRObject obj) {
431         doNothing(evt, obj);
432     }
433 
434     /**
435      * Handles derivate created events. This implementation does nothing and
436      * should be overwritted by subclasses.
437      * 
438      * @param evt
439      *            the event that occured
440      * @param der
441      *            the MCRDerivate that caused the event
442      */
443     protected void handleDerivateCreated(MCREvent evt, MCRDerivate der) {
444         doNothing(evt, der);
445     }
446 
447     /**
448      * Handles derivate updated events. This implementation does nothing and
449      * should be overwritted by subclasses.
450      * 
451      * @param evt
452      *            the event that occured
453      * @param der
454      *            the MCRDerivate that caused the event
455      */
456     protected void handleDerivateUpdated(MCREvent evt, MCRDerivate der) {
457         doNothing(evt, der);
458     }
459 
460     /**
461      * Handles derivate deleted events. This implementation does nothing and
462      * should be overwritted by subclasses.
463      * 
464      * @param evt
465      *            the event that occured
466      * @param der
467      *            the MCRDerivate that caused the event
468      */
469     protected void handleDerivateDeleted(MCREvent evt, MCRDerivate der) {
470         doNothing(evt, der);
471     }
472 
473     /**
474      * Handles derivate repair events. This implementation does nothing and
475      * should be overwritted by subclasses.
476      * 
477      * @param evt
478      *            the event that occured
479      * @param der
480      *            the MCRDerivate that caused the event
481      */
482     protected void handleDerivateRepaired(MCREvent evt, MCRDerivate der) {
483         doNothing(evt, der);
484     }
485 
486     protected void handlePathUpdated(MCREvent evt, Path path, BasicFileAttributes attrs) {
487         doNothing(evt, path);
488     }
489 
490     protected void handlePathDeleted(MCREvent evt, Path path, BasicFileAttributes attrs) {
491         doNothing(evt, path);
492     }
493 
494     protected void handlePathRepaired(MCREvent evt, Path path, BasicFileAttributes attrs) {
495         doNothing(evt, path);
496     }
497 
498     protected void updatePathIndex(MCREvent evt, Path path, BasicFileAttributes attrs) {
499         doNothing(evt, path);
500     }
501 
502     protected void handlePathCreated(MCREvent evt, Path path, BasicFileAttributes attrs) {
503         doNothing(evt, path);
504     }
505 
506     /**
507      * Handles undo of classification created events. This implementation does nothing
508      * and should be overwritted by subclasses.
509      * 
510      * @param evt
511      *            the event that occured
512      * @param obj
513      *            the MCRClassification that caused the event
514      */
515     protected void undoClassificationCreated(MCREvent evt, MCRCategory obj) {
516         doNothing(evt, obj);
517     }
518 
519     /**
520      * Handles undo of classification updated events. This implementation does nothing
521      * and should be overwritted by subclasses.
522      * 
523      * @param evt
524      *            the event that occured
525      * @param obj
526      *            the MCRClassification that caused the event
527      */
528     protected void undoClassificationUpdated(MCREvent evt, MCRCategory obj) {
529         doNothing(evt, obj);
530     }
531 
532     /**
533      * Handles undo of classification deleted events. This implementation does nothing
534      * and should be overwritted by subclasses.
535      * 
536      * @param evt
537      *            the event that occured
538      * @param obj
539      *            the MCRClassification that caused the event
540      */
541     protected void undoClassificationDeleted(MCREvent evt, MCRCategory obj) {
542         doNothing(evt, obj);
543     }
544 
545     /**
546      * Handles undo of classification repaired events. This implementation does nothing
547      * and should be overwritted by subclasses.
548      * 
549      * @param evt
550      *            the event that occured
551      * @param obj
552      *            the MCRClassification that caused the event
553      */
554     protected void undoClassificationRepaired(MCREvent evt, MCRCategory obj) {
555         doNothing(evt, obj);
556     }
557 
558     /**
559      * Handles undo of object created events. This implementation does nothing
560      * and should be overwritted by subclasses.
561      * 
562      * @param evt
563      *            the event that occured
564      * @param obj
565      *            the MCRObject that caused the event
566      */
567     protected void undoObjectCreated(MCREvent evt, MCRObject obj) {
568         doNothing(evt, obj);
569     }
570 
571     /**
572      * Handles undo of object updated events. This implementation does nothing
573      * and should be overwritted by subclasses.
574      * 
575      * @param evt
576      *            the event that occured
577      * @param obj
578      *            the MCRObject that caused the event
579      */
580     protected void undoObjectUpdated(MCREvent evt, MCRObject obj) {
581         doNothing(evt, obj);
582     }
583 
584     /**
585      * Handles undo of object deleted events. This implementation does nothing
586      * and should be overwritted by subclasses.
587      * 
588      * @param evt
589      *            the event that occured
590      * @param obj
591      *            the MCRObject that caused the event
592      */
593     protected void undoObjectDeleted(MCREvent evt, MCRObject obj) {
594         doNothing(evt, obj);
595     }
596 
597     /**
598      * Handles undo of object repaired events. This implementation does nothing
599      * and should be overwritted by subclasses.
600      * 
601      * @param evt
602      *            the event that occured
603      * @param obj
604      *            the MCRObject that caused the event
605      */
606     protected void undoObjectRepaired(MCREvent evt, MCRObject obj) {
607         doNothing(evt, obj);
608     }
609 
610     /**
611      * Handles undo of derivate created events. This implementation does nothing
612      * and should be overwritted by subclasses.
613      * 
614      * @param evt
615      *            the event that occured
616      * @param der
617      *            the MCRDerivate that caused the event
618      */
619     protected void undoDerivateCreated(MCREvent evt, MCRDerivate der) {
620         doNothing(evt, der);
621     }
622 
623     /**
624      * Handles undo of derivate updated events. This implementation does nothing
625      * and should be overwritted by subclasses.
626      * 
627      * @param evt
628      *            the event that occured
629      * @param der
630      *            the MCRDerivate that caused the event
631      */
632     protected void undoDerivateUpdated(MCREvent evt, MCRDerivate der) {
633         doNothing(evt, der);
634     }
635 
636     /**
637      * Handles undo of derivate deleted events. This implementation does nothing
638      * and should be overwritted by subclasses.
639      * 
640      * @param evt
641      *            the event that occured
642      * @param der
643      *            the MCRDerivate that caused the event
644      */
645     protected void undoDerivateDeleted(MCREvent evt, MCRDerivate der) {
646         doNothing(evt, der);
647     }
648 
649     /**
650      * Handles undo of derivate repaired events. This implementation does
651      * nothing and should be overwritted by subclasses.
652      * 
653      * @param evt
654      *            the event that occured
655      * @param der
656      *            the MCRDerivate that caused the event
657      */
658     protected void undoDerivateRepaired(MCREvent evt, MCRDerivate der) {
659         doNothing(evt, der);
660     }
661 
662     protected void undoPathCreated(MCREvent evt, Path path, BasicFileAttributes attrs) {
663         doNothing(evt, path);
664     }
665 
666     protected void undoPathUpdated(MCREvent evt, Path path, BasicFileAttributes attrs) {
667         doNothing(evt, path);
668     }
669 
670     protected void undoPathDeleted(MCREvent evt, Path path, BasicFileAttributes attrs) {
671         doNothing(evt, path);
672     }
673 
674     protected void undoPathRepaired(MCREvent evt, Path path, BasicFileAttributes attrs) {
675         doNothing(evt, path);
676     }
677 
678     /**
679      * Updates the index content of the given file.
680      */
681     protected void updateDerivateFileIndex(MCREvent evt, MCRDerivate file) {
682         doNothing(evt, file);
683     }
684 }