dc0d039a6ab13c4c3675fb16ac005aa23e40d962
[mediacube.git] /
1 package user.jobengine.server.steps;\r
2 \r
3 import java.nio.file.DirectoryStream;\r
4 import java.nio.file.Files;\r
5 import java.nio.file.Path;\r
6 import java.nio.file.Paths;\r
7 import java.util.ArrayList;\r
8 import java.util.Arrays;\r
9 import java.util.Collection;\r
10 import java.util.LinkedHashSet;\r
11 import java.util.List;\r
12 \r
13 import org.apache.commons.lang.StringUtils;\r
14 import org.apache.commons.net.ftp.FTPClient;\r
15 import org.apache.logging.log4j.LogManager;\r
16 import org.apache.logging.log4j.Logger;\r
17 \r
18 import com.ibm.nosql.json.api.BasicDBList;\r
19 \r
20 import user.commons.DownloadableMedia;\r
21 import user.commons.StoreUri;\r
22 import user.commons.remotestore.FtpDirectoryLister;\r
23 import user.commons.remotestore.RemoteStoreProtocol;\r
24 import user.jobengine.db.Media;\r
25 import user.jobengine.server.steps.PBQuery.MMMedia;\r
26 \r
27 public class PeableBeachMissingMaterialCheckerStep extends JobStep {\r
28         private static final Logger logger = LogManager.getLogger();\r
29         private static final String appendExtension = ".mxf";\r
30 \r
31         @StepEntry\r
32         public Object[] execute(String escortStoreName, BasicDBList lookupStoreNames, String targetStoreName, String targetProtocol, String primaryEndPoint,\r
33                         String primaryUserName, String primaryPassword, String secondaryEndPoint, String secondaryUserName, String secondaryPassword, int rangeForwardHours)\r
34                         throws Exception {\r
35                 StoreUri escortStoreUri = null;\r
36                 try {\r
37                         getJobRuntime().setRelated(targetStoreName + " restore");\r
38 \r
39                         escortStoreUri = getManager().getStoreUri(escortStoreName, RemoteStoreProtocol.LOCAL);\r
40                         StoreUri sourceStoreUri = getManager().getStoreUri("TSM", RemoteStoreProtocol.TSM);\r
41                         StoreUri targetStoreUri = getManager().getStoreUri(targetStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
42 \r
43                         LinkedHashSet<String> poolContent = new LinkedHashSet<>();\r
44 \r
45                         int progress = 0;\r
46                         int count = lookupStoreNames.size();\r
47                         int processed = 0;\r
48 \r
49                         for (Object lookup : lookupStoreNames) {\r
50                                 if (getJobRuntime().isWaitingCancel()) {\r
51                                         cancel();\r
52                                         return null;\r
53                                 }\r
54                                 String lookupStoreName = String.valueOf(lookup);\r
55 \r
56                                 StoreUri lookupStoreUri = getManager().getStoreUri(lookupStoreName, Enum.valueOf(RemoteStoreProtocol.class, targetProtocol));\r
57                                 logger.info(getMarker(), "Checking pool {}", lookupStoreName);\r
58                                 List<String> lookupContent = getPoolContent(lookupStoreName, lookupStoreUri);\r
59                                 poolContent.addAll(lookupContent);\r
60                                 processed++;\r
61                                 progress = processed * 50 / count;\r
62                                 setProgress(progress);\r
63                         }\r
64                         /*\r
65                                                 if (1 == 1) {\r
66                         \r
67                                                         logger.info(getMarker(), "Kikapcsolva");\r
68                                                         return null;\r
69                                                 }\r
70                         */\r
71 \r
72                         PBQuery query = new PBQuery();\r
73                         query.init(primaryEndPoint, primaryUserName, primaryPassword, secondaryEndPoint, secondaryUserName, secondaryPassword, rangeForwardHours);\r
74                         Collection<MMMedia> medias = query.getPossibelMissingMaterialNames(new ArrayList<>(poolContent));\r
75                         logger.info(getMarker(), "API returned {} items", medias == null ? 0 : medias.size());\r
76 \r
77                         if (medias != null && medias.size() > 0) {\r
78                                 count = medias.size();\r
79                                 for (MMMedia media : medias) {\r
80                                         logger.info(getMarker(), "API response contains {}", media.getName());\r
81                                 }\r
82 \r
83                                 for (MMMedia media : medias) {\r
84                                         if (getJobRuntime().isWaitingCancel()) {\r
85                                                 cancel();\r
86                                                 break;\r
87                                         }\r
88                                         processRecord(media, sourceStoreUri, targetStoreName, targetStoreUri, escortStoreUri);\r
89                                         processed++;\r
90                                         progress = 50 + (processed * 50 / count);\r
91                                         setProgress(progress);\r
92                                 }\r
93 \r
94                         }\r
95                         setProgress(100);\r
96                 } catch (Exception e) {\r
97                         logger.error(getSessionMarker(), e.getMessage());\r
98                         throw e;\r
99                 } finally {\r
100                         if (escortStoreUri != null)\r
101                                 escortStoreUri.cleanUp();\r
102                 }\r
103 \r
104                 return null;\r
105         }\r
106 \r
107         private List<String> getPoolContent(String storeName, StoreUri targetStoreUri) throws Exception {\r
108                 List<String> poolContent = new ArrayList<>();\r
109 \r
110                 FtpDirectoryLister lister = (FtpDirectoryLister) targetStoreUri.getLister();\r
111                 FTPClient client = lister.connect();\r
112                 logger.info(getMarker(), "Working dir is {}", client.printWorkingDirectory());\r
113                 String[] listNames = client.listNames();\r
114                 targetStoreUri.cleanUp();\r
115 \r
116                 if (listNames != null) {\r
117                         List<String> remoteFileNames = Arrays.asList(listNames);\r
118                         logger.info(getMarker(), "Remote file list size :{}", remoteFileNames.size());\r
119                         for (String name : remoteFileNames) {\r
120                                 try {\r
121                                         if (name.toLowerCase().endsWith(".mxf")) {\r
122                                                 int pos = name.lastIndexOf(".");\r
123                                                 if (pos > -1) {\r
124                                                         name = name.substring(0, pos);\r
125                                                         //logger.info(getMarker(), "Adding {}", name);\r
126                                                         poolContent.add(name);\r
127                                                 }\r
128                                         }\r
129                                 } catch (Exception e) {\r
130                                         logger.error(e.getMessage());\r
131                                 }\r
132 \r
133                         }\r
134                 }\r
135 \r
136                 //              List<RemoteFile> remoteFiles = targetStoreUri.getRemoteFiles();\r
137                 //              if (remoteFiles != null) {\r
138                 //                      logger.info(getMarker(), "Remote file list size :{}", remoteFiles.size());\r
139                 //                      for (RemoteFile rf : remoteFiles) {\r
140                 //                              try {\r
141                 //                                      String name = rf.getName();\r
142                 //                                      if (name.toLowerCase().endsWith(".mxf")) {\r
143                 //                                              int pos = name.lastIndexOf(".");\r
144                 //                                              if (pos > -1) {\r
145                 //                                                      name = name.substring(0, pos);\r
146                 //                                                      //logger.info(getMarker(), "Adding {}", name);\r
147                 //                                                      poolContent.add(name);\r
148                 //                                              }\r
149                 //                                      }\r
150                 //                              } catch (Exception e) {\r
151                 //                                      logger.error(e.getMessage());\r
152                 //                              }\r
153                 //\r
154                 //                      }\r
155                 //              }\r
156                 logger.info(getMarker(), "Pool {} contains {} items", storeName, poolContent == null ? 0 : poolContent.size());\r
157                 return poolContent;\r
158         }\r
159 \r
160         //csak visszaterunk\r
161         private String normalizeName(String mediaName) {\r
162                 String result = mediaName;\r
163                 if (StringUtils.isNotBlank(appendExtension))\r
164                         result += appendExtension;\r
165                 //              if (StringUtils.isNotBlank(mediaName)) {\r
166                 //                      result = mediaName.trim().toLowerCase();\r
167                 //              }\r
168                 return result;\r
169         }\r
170 \r
171         private void processRecord(MMMedia mmedia, StoreUri sourceStoreUri, String targetStoreName, StoreUri targetStoreUri, StoreUri escortStoreUri) {\r
172                 //TODO kisbetu/nagybetu problema kezelese\r
173 \r
174                 Media media = null;\r
175                 //duplikatum miatt\r
176                 try {\r
177                         media = getManager().getMedia(mmedia.getName());\r
178                 } catch (Exception e) {\r
179                         logger.error(getMarker(), "Can't identify missing material {}. System message is: {}", mmedia.getName(), e.getMessage());\r
180                         return;\r
181                 }\r
182 \r
183                 String fileName = normalizeName(mmedia.getName());\r
184 \r
185                 if (media == null) {\r
186                         logger.error(getMarker(), "File {} not archived yet", mmedia.getName());\r
187                         return;\r
188                 }\r
189 \r
190                 DownloadableMedia downloadable = DownloadableMedia.create(mmedia.getName(), fileName, media.getModified(), media.getCreated(), media.getLength(), 0L,\r
191                                 sourceStoreUri.getId(), targetStoreUri.getId(), media.getId());\r
192                 downloadable.put("priority", 50);\r
193                 String usage = mmedia.getUsage();\r
194                 usage = usage.replace("-", "").replace(":", "");\r
195                 String escortFileName = usage + "." + targetStoreName + "." + fileName;\r
196                 Path outputPath = null;\r
197                 try {\r
198                         outputPath = Paths.get(escortStoreUri.toString(true));\r
199                         boolean exsists = statusFileExists(outputPath, fileName);\r
200                         if (exsists)\r
201                                 return;\r
202                         EscortFiles.createMetadata(outputPath.toString(), escortFileName, downloadable.toPrettyString(""));\r
203                         logger.info(getMarker(), "Status file created {}", escortFileName);\r
204                 } catch (Exception e) {\r
205                         logger.error(getSessionMarker(), "Can't create status file {}", Paths.get(outputPath.toString(), escortFileName));\r
206                 }\r
207 \r
208         }\r
209 \r
210         private boolean statusFileExists(Path outputPath, String fileName) {\r
211                 boolean exsists = false;\r
212                 Path statusPath = Paths.get(outputPath.toString(), EscortFiles.STATUSFOLDER);\r
213                 try (DirectoryStream<Path> p = Files.newDirectoryStream(statusPath, "*" + fileName + EscortFiles.DOT_JSON)) {\r
214                         if (p.iterator().hasNext()) {\r
215                                 logger.info(getMarker(), "Status file for {} already exists", fileName);\r
216                                 exsists = true;\r
217                         }\r
218 \r
219                 } catch (Exception e1) {\r
220                         logger.error(getSessionMarker(), e1.getMessage());\r
221                 }\r
222                 return exsists;\r
223         }\r
224 \r
225 }\r