17c1a65522d76b46f4ceffb872df0a93ea9a94a2
[mediacube.git] /
1 package user.jobengine.server.steps;\r
2 \r
3 import java.io.IOException;\r
4 import java.net.URI;\r
5 import java.net.URISyntaxException;\r
6 import java.util.Calendar;\r
7 import java.util.List;\r
8 \r
9 import org.apache.commons.lang.StringUtils;\r
10 import org.apache.logging.log4j.LogManager;\r
11 import org.apache.logging.log4j.Logger;\r
12 \r
13 import com.ibm.nosql.json.api.BasicDBObject;\r
14 import com.ibm.nosql.json.api.DB;\r
15 import com.ibm.nosql.json.api.DBCollection;\r
16 import com.ibm.nosql.json.api.DBObject;\r
17 \r
18 import user.commons.CalendarUtils;\r
19 import user.commons.StoreUri;\r
20 import user.commons.nosql.NoSQLUtils;\r
21 import user.commons.octopus.IOctopusAPI;\r
22 import user.commons.octopus.OctopusAPI;\r
23 import user.commons.remotestore.RemoteStoreProtocol;\r
24 import user.jobengine.db.IItemManager;\r
25 import user.jobengine.server.IJobEngine;\r
26 import user.jobengine.server.IJobRuntime;\r
27 import user.jobengine.server.JobEngineException;\r
28 import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
29 \r
30 public class CopyForArchiveNEXIOMaterialsStep extends JobStep {\r
31         private static final String MXFEXT = ".MXF";\r
32         private static final Logger logger = LogManager.getLogger();\r
33         private static final String NEXIOCLIPS = "nexioclips";\r
34         private static final String KILLDATE = "killdate";\r
35         private static final String LONGNAMEID = "longnameid";\r
36         private static final String ID = "id";\r
37         private StoreUri sourceUri;\r
38         private StoreUri targetUri;\r
39         private OctopusAPI octopusAPI;\r
40         private IItemManager manager;\r
41         private DB db;\r
42 \r
43         private int check(int value, String name) {\r
44                 if (value == 0) {\r
45                         logger.error(getMarker(), "A folyamat '{}' bemeneti paramétere 0.", name);\r
46                         throw new NullPointerException(String.format("System is not configured properly, missing '%s' input parameter.", name));\r
47                 }\r
48                 return value;\r
49         }\r
50 \r
51         private String check(String value, String name) {\r
52                 if (value == null) {\r
53                         logger.error(getMarker(), "A folyamat '{}' bemeneti paramétere üres.", name);\r
54                         throw new NullPointerException(String.format("System is not configured properly, missing '%s' input parameter.", name));\r
55                 }\r
56                 return value;\r
57         }\r
58 \r
59         private BasicDBObject createMetadata(BasicDBObject rundown, BasicDBObject story, BasicDBObject mosObject) {\r
60                 // TODO Auto-generated method stub\r
61                 return null;\r
62         }\r
63 \r
64         @StepEntry\r
65         public Object[] execute(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
66                         int daysBeforeNow, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
67                 setAndCheck(nexioPort, nexioUserName, nexioPassword, archiveFtp, archiveUserName, archivePassword, jobEngine);\r
68                 octopusAPI = new OctopusAPI();\r
69                 Calendar scheduledDate = Calendar.getInstance();\r
70                 scheduledDate.add(Calendar.DAY_OF_YEAR, -1 * daysBeforeNow);\r
71                 List<DBObject> rundowns = octopusAPI.getRundowns(scheduledDate.getTime());\r
72                 if (rundowns == null) {\r
73                         logger.warn(getMarker(), "Nem található adástükör a {} napra.", CalendarUtils.toDateString(scheduledDate));\r
74                         return null;\r
75                 }\r
76                 try {\r
77                         int index = 1;\r
78                         for (DBObject r : rundowns) {\r
79                                 setProgress(index * 100 / rundowns.size());\r
80                                 processRundow(r);\r
81                                 index++;\r
82                         }\r
83                 } catch (Exception e) {\r
84                         logger.catching(e);\r
85                         logger.error(getMarker(), e.getMessage());\r
86                         throw e;\r
87                 }\r
88                 return null;\r
89         }\r
90 \r
91         private void processMosObject(BasicDBObject rundown, BasicDBObject story, BasicDBObject mosObject) throws Exception {\r
92                 String mosID = mosObject.getString(IOctopusAPI.OBJ_ID);\r
93                 if (MetadataTypeDetector.GuessMetadataType(mosID) != MetadataType.OCTOPUSPLACEHOLDER) {\r
94                         logger.warn("Skipping MOS object {}", mosID);\r
95                         return;\r
96                 }\r
97 \r
98                 DBCollection clips = db.getCollection(NEXIOCLIPS);\r
99                 DBObject clip = clips.findOne(new BasicDBObject(LONGNAMEID, mosID));\r
100                 if (clip == null) {\r
101                         logger.info("File NOT exists {}", mosID);\r
102                         throw new Exception("Not exists");\r
103                 } else {\r
104                         logger.info("File exists {}", mosID);\r
105                 }\r
106 \r
107                 BasicDBObject metadata = createMetadata(rundown, story, mosObject);\r
108         }\r
109 \r
110         private void processRundow(DBObject r) throws Exception {\r
111                 BasicDBObject rundown = (BasicDBObject) r;\r
112                 long rundownID = rundown.getLong(ID);\r
113                 logger.info("Processing rundown {}", rundownID);\r
114                 List<DBObject> stories = octopusAPI.getRundownStories(rundownID);\r
115                 if (stories == null)\r
116                         return;\r
117                 for (DBObject s : stories)\r
118                         processStory(rundown, s);\r
119         }\r
120 \r
121         private void processStory(BasicDBObject rundown, DBObject s) throws Exception {\r
122                 BasicDBObject story = (BasicDBObject) s;\r
123                 String parentStoryID = story.getString(IOctopusAPI.PARENT_STORY_ID);\r
124                 logger.info("Processing story {}", parentStoryID);\r
125                 List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
126                 if (mosObjects == null)\r
127                         return;\r
128                 for (BasicDBObject mosObject : mosObjects)\r
129                         processMosObject(rundown, story, mosObject);\r
130 \r
131         }\r
132 \r
133         private void setAndCheck(int nexioPort, String nexioUserName, String nexioPassword, String archiveFtp, String archiveUserName, String archivePassword,\r
134                         IJobEngine jobEngine) throws JobEngineException, IOException, URISyntaxException {\r
135                 db = NoSQLUtils.getNoSQLDB();\r
136                 if (db == null) {\r
137                         logger.error(getMarker(), "Az NoSQL adatkezelő réteg nem elérhető.");\r
138                         throw new NullPointerException("Internal error, missing NoSQL DB reference.");\r
139                 }\r
140 \r
141                 if (jobEngine == null) {\r
142                         logger.error(getMarker(), "Az folyamatkezelő réteg nem elérhető.");\r
143                         throw new NullPointerException("Internal error, missing JobEngine reference.");\r
144                 }\r
145                 manager = jobEngine.getItemManager();\r
146                 if (manager == null) {\r
147                         logger.error(getMarker(), "Az adatbáziskezelő réteg nem elérhető.");\r
148                         throw new NullPointerException("Internal error, missing ItemManager reference.");\r
149                 }\r
150                 String nexioHost = System.getProperty("nexio.host");\r
151                 if (StringUtils.isBlank(nexioHost)) {\r
152                         logger.error(getMarker(), "A 'nexio.host' rendszer paraméter nem található.");\r
153                         throw new NullPointerException("System is not configured properly, 'jobengine.selenio.address' startup parameter missing.");\r
154                 }\r
155                 check(nexioPort, "nexioPort");\r
156                 check(nexioUserName, "nexioUserName");\r
157                 check(nexioPassword, "nexioPassword");\r
158 \r
159                 sourceUri = manager.createStoreUri(RemoteStoreProtocol.FTP, nexioHost);\r
160                 sourceUri.setPortNumber(nexioPort);\r
161                 sourceUri.setUserName(nexioUserName);\r
162                 sourceUri.setPassword(nexioPassword);\r
163 \r
164                 check(archiveFtp, "archiveFtp");\r
165                 check(archiveUserName, "archiveUserName");\r
166                 check(archivePassword, "archivePassword");\r
167 \r
168                 targetUri = manager.createStoreUri(new URI(archiveFtp));\r
169                 targetUri.setUserName(archiveUserName);\r
170                 targetUri.setPassword(archivePassword);\r
171         }\r
172 \r
173 }\r