37b8bd19a03144f9c0e4b8b5302780a87e6ddd6e
[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.charset.Charset;\r
6 import java.nio.file.DirectoryStream;\r
7 import java.nio.file.Files;\r
8 import java.nio.file.Path;\r
9 import java.nio.file.Paths;\r
10 import java.util.Arrays;\r
11 import java.util.List;\r
12 \r
13 import org.apache.logging.log4j.LogManager;\r
14 import org.apache.logging.log4j.Logger;\r
15 \r
16 import user.commons.IEntityBase;\r
17 import user.commons.ListUtils;\r
18 import user.jobengine.db.IItemManager;\r
19 import user.jobengine.db.MediaFile;\r
20 import user.jobengine.db.MediaFileDAO;\r
21 import user.jobengine.server.IJobEngine;\r
22 import user.jobengine.server.IJobRuntime;\r
23 \r
24 public class CheckMORPHEUSMissingMaterialsStep extends JobStep {\r
25         private static final Logger logger = LogManager.getLogger();\r
26         private static final String KILLDATEDAYS = "killDateDays";\r
27         private static final String SUCCESSRECIPIENT = "successRecipient";\r
28         private static final String TARGETNAMEPATTERN = "targetNamePattern";\r
29         private static final String MATERIAL_ID = "Material ID";\r
30         private static final String RETRIEVE_MATERIAL = "Adásanyag visszatöltés";\r
31         private static final String TARGETPATH = "targetPath";\r
32         private static final String MEDIACUBEMEDIA = "mediaCubeMedia";\r
33         private static final String JOBTEMPLATE = "retrieve-material.xml";\r
34         private static final String CSV_EXT = ".csv";\r
35         private static final String MXF_EXT = ".MXF";\r
36         private String targetPath;\r
37         private MediaFileDAO dao;\r
38         private IJobEngine jobEngine;\r
39         private int killDateDays;\r
40 \r
41         @StepEntry\r
42         public Object[] execute(String sourcePath, String targetPath, int killDateDays, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
43                 this.killDateDays = killDateDays;\r
44                 setAndCheck(sourcePath, targetPath, jobEngine);\r
45                 DirectoryStream<Path> directoryStream = null;\r
46                 try {\r
47                         Files.newDirectoryStream(Paths.get(sourcePath)).forEach(p -> processPathItem(p));\r
48                 } catch (Exception e) {\r
49                         logger.error("", e);\r
50                 } finally {\r
51                         if (directoryStream != null) {\r
52                                 try {\r
53                                         directoryStream.close();\r
54                                 } catch (IOException e) {\r
55                                 }\r
56                         }\r
57                 }\r
58                 return null;\r
59         }\r
60 \r
61         private void processMediaId(String mediaId) throws Exception {\r
62                 List<IEntityBase> medias = dao.getByHouseId(mediaId + ".MXF");\r
63                 if (medias == null || medias.size() == 0) {\r
64                         logger.error(getMarker(), "Az {} anyag nem található az archívumban.", mediaId);\r
65                         return;\r
66                 }\r
67 \r
68                 if (medias.size() > 1) {\r
69                         logger.error(getMarker(), "Az {} anyagból egynél több található az archívumban.", mediaId);\r
70                         return;\r
71                 }\r
72 \r
73                 jobEngine.submit(JOBTEMPLATE, RETRIEVE_MATERIAL, ListUtils.asMap(MEDIACUBEMEDIA, medias.get(0), TARGETPATH, targetPath, TARGETNAMEPATTERN,\r
74                                 mediaId + MXF_EXT, SUCCESSRECIPIENT, null, KILLDATEDAYS, killDateDays));\r
75         }\r
76 \r
77         private void processMissingMaterialCSV(Path csvFilePath) throws Exception {\r
78                 List<String> lines = Files.readAllLines(csvFilePath, Charset.forName("UTF-8"));\r
79                 if (lines == null | lines.size() == 0) {\r
80                         return;\r
81                 }\r
82 \r
83                 int mediaIdPosition = -1;\r
84                 for (int i = 0; i < lines.size(); i++) {\r
85                         String line = lines.get(i);\r
86                         if (line == null)\r
87                                 continue;\r
88                         String[] data = line.split(",");\r
89                         if (i == 0) {\r
90                                 //Channel,Time to Air,Duration,Material ID,Title,Device ID,Reason,\r
91                                 List<String> dataList = Arrays.asList(data);\r
92                                 mediaIdPosition = dataList.indexOf(MATERIAL_ID);\r
93                                 if (mediaIdPosition < 0) {\r
94                                         logger.error(getMarker(), "A {} MORPHEUS állományban nem található a 'Material ID' mező.", csvFilePath.toFile().getName());\r
95                                         break;\r
96                                 }\r
97                         } else {\r
98                                 processMediaId(data[mediaIdPosition]);\r
99                         }\r
100                 }\r
101         }\r
102 \r
103         private void processPathItem(Path csvFilePath) {\r
104                 File csvFile = csvFilePath.toFile();\r
105 \r
106                 if (csvFile.isDirectory() || !csvFile.getName().toLowerCase().endsWith(CSV_EXT.toLowerCase())) {\r
107                         return;\r
108                 }\r
109 \r
110                 try {\r
111                         processMissingMaterialCSV(csvFilePath);\r
112                 } catch (Exception e) {\r
113                         logger.catching(e);\r
114                         logger.error(getMarker(), "A {} MORPHEUS állomány feldolgozásakor hiba történt. A rendszer hibaüzenete: {}.", csvFile.getName(), e.getMessage());\r
115                 }\r
116 \r
117                 //TODO ne törölje, move\r
118                 //              if (!csvFile.delete())\r
119                 //                      logger.error(getMarker(), "A {} MORPHEUS állomány nem törölhető.", csvFile.getName());\r
120         }\r
121 \r
122         private void setAndCheck(String sourcePath, String targetPath, IJobEngine jobEngine) {\r
123                 if (jobEngine == null) {\r
124                         logger.error(getMarker(), "Az folyamatkezelő réteg nem elérhető.");\r
125                         throw new NullPointerException("Internal error, missing JobEngine reference.");\r
126                 }\r
127                 this.jobEngine = jobEngine;\r
128 \r
129                 IItemManager manager = jobEngine.getItemManager();\r
130                 if (manager == null) {\r
131                         logger.error(getMarker(), "Az adatbáziskezelő réteg nem elérhető.");\r
132                         throw new NullPointerException("Internal error, missing ItemManager reference.");\r
133                 }\r
134                 dao = (MediaFileDAO) manager.getBaseDAO(MediaFile.class);\r
135                 if (dao == null) {\r
136                         logger.error(getMarker(), "Az adatbáziskezelő réteg MediaFile kezelöje nem elérhető.");\r
137                         throw new NullPointerException("Internal error, missing MediaFile DAO reference.");\r
138                 }\r
139                 if (sourcePath == null) {\r
140                         logger.error(getMarker(), "A folyamat 'sourcePath' bemeneti paramétere üres.");\r
141                         throw new NullPointerException("System is not configured properly, 'sourcePath' input parameter missing.");\r
142                 }\r
143                 if (targetPath == null) {\r
144                         logger.error(getMarker(), "A folyamat 'targetPath' bemeneti paramétere üres.");\r
145                         throw new NullPointerException("System is not configured properly, 'targetPath' input parameter missing.");\r
146                 }\r
147                 this.targetPath = targetPath;\r
148         }\r
149 \r
150 }\r