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