b232182973838c4e9febe92d450fae5ef8014eb1
[mediacube.git] /
1 package user.jobengine.server.steps;\r
2 \r
3 import java.io.File;\r
4 import java.io.IOException;\r
5 import java.nio.file.DirectoryStream;\r
6 import java.nio.file.Files;\r
7 import java.nio.file.Path;\r
8 import java.nio.file.Paths;\r
9 import java.util.LinkedList;\r
10 import java.util.List;\r
11 \r
12 import org.apache.commons.lang.StringUtils;\r
13 import org.apache.logging.log4j.LogManager;\r
14 import org.apache.logging.log4j.Logger;\r
15 import org.apache.logging.log4j.Marker;\r
16 \r
17 import user.jobengine.server.IJobEngine;\r
18 import user.jobengine.server.IJobRuntime;\r
19 \r
20 /**\r
21  * Az archivalhato mediak listazasa MediaFileWrapper objektumokban. A listazott media allomanyokat megjeloli .catched signal allomannyal, hogy a legkozelebbi\r
22  * listazas figyelmen kivul hagyja.\r
23  *\r
24  * @author robi\r
25  */\r
26 public class ArchiveListBuilderStep extends JobStep {\r
27         private static final Logger logger = LogManager.getLogger();\r
28         //      private static final String UTF8 = "utf-8";\r
29         private static final String STATUSFOLDER = ".STATUS";\r
30         private static final String JSONEXT = ".json";\r
31         private static final String CATCHEDEXT = ".catched";\r
32 \r
33         public static final String ITEM_TITLE = "itemTitle";\r
34         public static final String ITEM_HOUSEID = "itemHouseId";\r
35         public static final String ITEM_DESCRIPTION = "itemDescription";\r
36         public static final String MEDIA_HOUSEID = "mediaHouseId";\r
37         public static final String MEDIA_TITLE = "mediaTitle";\r
38         public static final String MEDIA_DESCRIPTION = "mediaDescription";\r
39         public static final String MEDIA_TYPE = "mediaType";\r
40         private static final String DURATION = "duration";\r
41         private static final String EXISTING_MEDIAID = "existingMediaId";\r
42         private static final String TAGS = "tags";\r
43 \r
44         private Marker marker;\r
45 \r
46         private ArchiveItem createArchiveItem(Path jsonFilePath, Path mediaFilePath, Path catchedFilePath) {\r
47                 ArchiveItem result = null;\r
48                 try {\r
49                         result = ArchiveItem.fromFile(jsonFilePath);\r
50                         result.setMediaFile(mediaFilePath.toString());\r
51                         result.setCatchedFile(catchedFilePath.toString());\r
52                 } catch (Exception e) {\r
53                         logger.catching(e);\r
54                 }\r
55 \r
56                 return result;\r
57         }\r
58 \r
59         private void createCatchedFile(Path catchedFilePath) {\r
60                 try {\r
61                         Files.createFile(catchedFilePath);\r
62                         //Files.write(catchedFilePath, CATCHED.getBytes(UTF8), StandardOpenOption.CREATE);\r
63                 } catch (Exception e) {\r
64                         logger.catching(e);\r
65                 }\r
66         }\r
67 \r
68         @StepEntry\r
69         public Object[] execute(String sourcePath, int limit, IJobEngine jobEngine, IJobRuntime jobRuntime) {\r
70                 marker = jobRuntime.getSessionMarker();\r
71                 List<ArchiveItem> archiveList = new LinkedList<ArchiveItem>();\r
72                 DirectoryStream<Path> directoryStream = null;\r
73                 try {\r
74                         DirectoryStream<Path> stream = Files.newDirectoryStream(Paths.get(sourcePath));\r
75                         for (Path p : stream) {\r
76                                 processPathItem(p, archiveList);\r
77                         }\r
78                 } catch (Exception e) {\r
79                         logger.catching(e);\r
80                         logger.error(marker, "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", e.getMessage());\r
81                 } finally {\r
82                         if (directoryStream != null) {\r
83                                 try {\r
84                                         directoryStream.close();\r
85                                 } catch (IOException e) {\r
86                                 }\r
87                         }\r
88                 }\r
89 \r
90                 if (limit > 0 && archiveList.size() > limit) {\r
91                         archiveList = archiveList.subList(0, limit);\r
92                         logger.info(marker, "A folyamat alkalmazza a beállított {} limitet.", limit);\r
93                 }\r
94 \r
95                 if (archiveList.size() == 0)\r
96                         logger.info(marker, "Nincs archiválandó anyag.");\r
97                 else\r
98                         logger.info(marker, "Az archiváló folyamat {} új anyagot érzékelt.", archiveList == null ? 0 : archiveList.size());\r
99 \r
100                 for (ArchiveItem archiveItem : archiveList) {\r
101                         createCatchedFile(Paths.get(archiveItem.getCatchedFile()));\r
102                 }\r
103 \r
104                 return new Object[] { archiveList };\r
105         }\r
106 \r
107         private boolean processPathItem(Path mediaFilePath, final List<ArchiveItem> archiveList) {\r
108                 File mediaFile = mediaFilePath.toFile();\r
109 \r
110                 //              if (mediaFile.length() > 0)\r
111                 //                      return false;\r
112 \r
113                 if (mediaFile.isDirectory()) {\r
114                         return false;\r
115                 }\r
116 \r
117                 Path dotStorePath = Paths.get(mediaFilePath.getParent().toString(), STATUSFOLDER);\r
118                 Path catchedFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + CATCHEDEXT);\r
119                 File catchedFile = catchedFilePath.toFile();\r
120                 if (catchedFile.exists()) {\r
121                         logger.warn("{} file is already catched.", mediaFile.getName());\r
122                         return false;\r
123                 }\r
124 \r
125                 Path jsonFilePath = Paths.get(dotStorePath.toString(), mediaFile.getName() + JSONEXT);\r
126                 File jsonFile = jsonFilePath.toFile();\r
127                 if (!jsonFile.exists()) {\r
128                         logger.warn("{} has no json metadata.", mediaFile.getName());\r
129                         return false;\r
130                 }\r
131 \r
132                 ArchiveItem archiveItem = createArchiveItem(jsonFilePath, mediaFilePath, catchedFilePath);\r
133 \r
134                 if (archiveItem == null) {\r
135                         logger.warn("{} has no metadata specified.", mediaFile.getName());\r
136                         return false;\r
137                 }\r
138 \r
139                 if (StringUtils.isBlank(archiveItem.getItemHouseId())) {\r
140                         logger.warn("{} has no Item HouseID specified in metadata.", mediaFile.getName());\r
141                         return false;\r
142                 }\r
143 \r
144                 if (StringUtils.isBlank(archiveItem.getItemTitle())) {\r
145                         logger.warn("{} has no Item Title specified in metadata.", mediaFile.getName());\r
146                         return false;\r
147                 }\r
148 \r
149                 if (StringUtils.isBlank(archiveItem.getMediaHouseId())) {\r
150                         logger.warn("{} has no Media HouseID specified in metadata.", mediaFile.getName());\r
151                         return false;\r
152                 }\r
153 \r
154                 if (StringUtils.isBlank(archiveItem.getMediaTitle())) {\r
155                         logger.warn("{} has no Media Title specified in metadata.", mediaFile.getName());\r
156                         return false;\r
157                 }\r
158 \r
159                 //A tenyleges archivalast vesszuk elore\r
160                 if (mediaFile.length() == 0)\r
161                         archiveList.add(archiveItem);\r
162                 else\r
163                         archiveList.add(0, archiveItem);\r
164                 //createCatchedFile(catchedFilePath);\r
165                 return true;\r
166         }\r
167 }\r