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