0663d5b3cf849a36a0e0dbc92e6e362ac96d2bd8
[mediacube.git] /
1 package user.jobengine.server.steps;\r
2 \r
3 import java.io.IOException;\r
4 import java.nio.file.Path;\r
5 import java.nio.file.Paths;\r
6 import java.util.Arrays;\r
7 import java.util.List;\r
8 \r
9 import org.apache.commons.lang.StringUtils;\r
10 import org.apache.commons.net.ftp.FTPClient;\r
11 import org.apache.logging.log4j.LogManager;\r
12 import org.apache.logging.log4j.Logger;\r
13 \r
14 import com.ibm.nosql.json.api.BasicDBList;\r
15 \r
16 import user.commons.DownloadableMedia;\r
17 import user.commons.StoreUri;\r
18 import user.commons.harris.HarrisRecord;\r
19 import user.commons.harris.VICFileParser;\r
20 import user.commons.remotestore.FtpDirectoryLister;\r
21 import user.commons.remotestore.RemoteStoreProtocol;\r
22 import user.jobengine.db.Media;\r
23 \r
24 public class HarrisMissingMaterialCheckerStep extends JobStep {\r
25         private static final Logger logger = LogManager.getLogger(HarrisMissingMaterialCheckerStep.class);\r
26         private static final String lineFormat = System.getProperty("harris.vic.lineformat",\r
27                         "A TTTTTTTT     LLLLLLLLLLL MMMMMMMMMMMMMMMMMMMMMMM X   DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD");\r
28         private static final String validTypeCodes = System.getProperty("harris.vic.validtypecodes", "SPACE,E");\r
29         private static final String appendExtension = System.getProperty("missingmaterial.appendextension", ".mxf");\r
30 \r
31         @StepEntry\r
32         public Object[] execute(BasicDBList vicFiles, String escortStoreName, String targetStoreName, String targetProtocol) throws Exception {\r
33                 StoreUri escortStoreUri = null;\r
34                 StoreUri targetStoreUri = null;\r
35                 try {\r
36                         getJobRuntime().setRelated(targetStoreName + " restore");\r
37 \r
38                         escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
39                         targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
40                         StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
41                         List<HarrisRecord> records = null;\r
42                         for (Object vicFile : vicFiles) {\r
43                                 if (getJobRuntime().isWaitingCancel()) {\r
44                                         cancel();\r
45                                         break;\r
46                                 }\r
47 \r
48                                 Path vicFilePath = Paths.get(String.valueOf(vicFile));\r
49 \r
50                                 if (!vicFilePath.toFile().exists()) {\r
51                                         logger.warn("File not exists: {}", vicFilePath);\r
52                                         continue;\r
53                                 }\r
54 \r
55                                 logger.info(getMarker(), "Processing {}", vicFilePath);\r
56                                 records = processVICFile(records, vicFilePath);\r
57                         }\r
58 \r
59                         if (records != null && !getJobRuntime().isWaitingCancel()) {\r
60                                 FTPClient client = ((FtpDirectoryLister) targetStoreUri.getLister()).connect();\r
61                                 logger.info(getMarker(), "Reading target file list");\r
62                                 List<String> fileNames = Arrays.asList(client.listNames());\r
63                                 logger.info(getMarker(), "Target file list reading completed, mediabase size is {}", fileNames.size());\r
64                                 int i = 0;\r
65                                 for (HarrisRecord record : records) {\r
66 \r
67                                         if (getJobRuntime().isWaitingCancel()) {\r
68                                                 cancel();\r
69                                                 break;\r
70                                         }\r
71 \r
72                                         boolean contains = fileNames.contains(record.getFileName());\r
73                                         if (contains)\r
74                                                 logger.info(getMarker(), "File {} already exists on {}", record.getFileName(), targetStoreName);\r
75                                         else\r
76                                                 processRecord(record, targetStoreName, sourceStoreUri, targetStoreUri, escortStoreUri);\r
77                                         i++;\r
78                                         int progress = i * 100 / records.size();\r
79                                         setProgress(progress);\r
80                                 }\r
81                         }\r
82 \r
83                         if (records == null || records.size() == 0)\r
84                                 logger.info(getMarker(), "Nothing to do");\r
85                         else\r
86                                 logger.info(getMarker(), "Completed");\r
87 \r
88                         setProgress(100);\r
89                 } catch (Exception e) {\r
90                         logger.error(e.getMessage());\r
91                         throw e;\r
92                 } finally {\r
93                         if (escortStoreUri != null)\r
94                                 escortStoreUri.cleanUp();\r
95                         if (targetStoreUri != null)\r
96                                 targetStoreUri.cleanUp();\r
97                 }\r
98 \r
99                 return null;\r
100         }\r
101 \r
102         private boolean processRecord(HarrisRecord record, String targetStoreName, StoreUri sourceStoreUri, StoreUri targetStoreUri, StoreUri escortStoreUri)\r
103                         throws Exception {\r
104 \r
105                 String fileName = record.getFileName();\r
106                 String outputPath = Paths.get(escortStoreUri.toString(true)).toString();\r
107 \r
108                 if (StringUtils.isNotBlank(appendExtension))\r
109                         fileName += appendExtension;\r
110 \r
111                 String escortFileName = targetStoreName + "." + fileName;\r
112 \r
113                 //ha mar letezik, nem toltjuk fel ujra (a vic fajlbol kezzel torlik valamikor...)\r
114                 try {\r
115                         if (EscortFiles.isMetadataExists(outputPath, escortFileName)) {\r
116                                 logger.debug(getMarker(), "Status file already exists {}", escortFileName);\r
117                                 return true;\r
118                         }\r
119                 } catch (IOException e1) {\r
120                         logger.info(getMarker(), "Status file check error for {}", fileName);\r
121                         return true;\r
122                 }\r
123 \r
124                 //nincs bent MC-ben\r
125                 Media media = getManager().getMedia(record.getFileName());\r
126                 if (media == null) {\r
127                         logger.error(getSessionMarker(), "File is not available in archive {}", record.getFileName());\r
128                         return true;\r
129                 }\r
130 \r
131                 //              if (existsOnNexio(record, targetStoreName, targetStoreUri)) {\r
132                 //                      logger.info(getMarker(),  "File {} already exists on {}", record.getFileName(), targetStoreName);\r
133                 //                      return false;\r
134                 //              }\r
135 \r
136                 DownloadableMedia downloadable = DownloadableMedia.create(media.getTitle(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
137                                 sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
138 \r
139                 //alapbol magasabb (1-99)\r
140                 downloadable.put("priority", 50);\r
141                 downloadable.put("isNexio", true);\r
142 \r
143                 try {\r
144                         EscortFiles.createMetadata(outputPath, escortFileName, downloadable.toPrettyString(""));\r
145                         logger.info(getMarker(), "Status file created {}", escortFileName);\r
146                 } catch (Exception e) {\r
147                         logger.error("Can't create escort file {}. System message is: {}", escortFileName, e.getMessage());\r
148                 }\r
149                 return true;\r
150         }\r
151 \r
152         private List<HarrisRecord> processVICFile(List<HarrisRecord> records, Path vicFilePath) {\r
153                 VICFileParser parser = null;\r
154                 try {\r
155                         parser = new VICFileParser(vicFilePath, lineFormat, validTypeCodes);\r
156 \r
157                         List<HarrisRecord> currentRecords = parser.getRecords();\r
158                         if (records == null)\r
159                                 records = currentRecords;\r
160                         else {\r
161                                 if (currentRecords != null)\r
162                                         records.addAll(currentRecords);\r
163                         }\r
164 \r
165                 } catch (Exception e) {\r
166                         logger.error(e.getMessage());\r
167                 }\r
168                 return records;\r
169         }\r
170 \r
171 }\r