<declarations>\r
<parameters>\r
<parameter name="material" type="com.ibm.nosql.json.api.BasicDBObject" />\r
+ <parameter name="targetPath" type="java.lang.String" />\r
</parameters>\r
</declarations>\r
<commands>\r
<input>\r
<parameter name="material" />\r
</input>\r
+ <input>\r
+ <parameter name="targetPath" />\r
+ </input>\r
</inputs>\r
</calljobstep>\r
</commands>\r
private IJobRuntime jobRuntime;\r
private int overall;\r
private int current;\r
- private final SimpleDateFormat enDateFormat = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss:S", Locale.ENGLISH);\r
+ private final SimpleDateFormat enDateFormat = new SimpleDateFormat(MorpheusStrings.FORMAT_TIME_TO_AIR, Locale.ENGLISH);\r
\r
private Map<String, Integer> buildMetadataMap(Path csvFilePath, String[] data) throws Exception {\r
Map<String, Integer> result = new HashMap<>();\r
} else {\r
logger.info(jobRuntime.getMarker(), "Az '{}' anyag megtalálható az archívumban.", materialID);\r
dbObject.put(MorpheusStrings.STATUS, MorpheusStrings.STATUS_RESTORABLE);\r
+ dbObject.put(MorpheusStrings.MEDIAID, medias.get(0).getId());\r
}\r
\r
}\r
package user.jobengine.server.steps;\r
\r
import java.io.IOException;\r
-import java.nio.file.Files;\r
-import java.nio.file.Path;\r
import java.nio.file.Paths;\r
-import java.nio.file.attribute.FileAttribute;\r
-import java.nio.file.attribute.PosixFilePermission;\r
-import java.nio.file.attribute.PosixFilePermissions;\r
-import java.util.Set;\r
\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.logging.log4j.LogManager;\r
}\r
}\r
\r
- private void ensureTargetPathExistence(String targetPath) throws IOException {\r
- Path directoryPath = Paths.get(targetPath);\r
- boolean create = !Files.exists(directoryPath) || !Files.isDirectory(directoryPath);\r
-\r
- if (create) {\r
- Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
- FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
- Files.createDirectory(directoryPath, attr);\r
- }\r
- }\r
-\r
@StepEntry\r
public Object[] execute(String trafficOutputPath, String octopusOutputPath, String genericOutputPath, String houseId, IJobEngine jobEngine,\r
IJobRuntime jobRuntime) throws IOException {\r
}\r
String targetNamePattern = houseId + TARGETNAMEPATTERN;\r
try {\r
- ensureTargetPathExistence(targetPath);\r
+ EscortFiles.ensureUNCFolder(Paths.get(targetPath));\r
} catch (Exception e) {\r
- logger.catching(e);\r
- logger.error(jobRuntime.getMarker(), "A cél mappa '{}' nem létezik és hozható létre. A rendszer hibaüzenete: {}", targetPath, e.getMessage());\r
+ logger.error(jobRuntime.getMarker(), "A cél mappa '{}' nem létezik és nem hozható létre. A rendszer hibaüzenete: {}", targetPath, e.getMessage());\r
throw e;\r
}\r
return new Object[] { targetPath, targetNamePattern };\r
} catch (Exception e) {\r
Message msg = LogUtils.format("Az '{}' állomány visszatöltése sikertelen. A rendszer hibaüzenete: {}", sourceFileName, e.getMessage());\r
logger.error(getMarker(), msg);\r
- logger.error(jobRuntime.getMarker(), msg);\r
+ //logger.error(jobRuntime.getMarker(), msg);\r
logger.catching(e);\r
throw e;\r
}\r
\r
import user.commons.morpheus.MorpheusStrings;\r
import user.commons.nosql.NoSQLUtils;\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
import user.jobengine.server.IJobEngine;\r
import user.jobengine.server.IJobRuntime;\r
\r
-public class TSMRetrieveMissingMaterialStep extends JobStep {\r
+public class TSMRetrieveMissingMaterialStep extends TSMRestoreStep {\r
+ private static final String TARGETNAMEPATTERN = "%s";\r
private static final Logger logger = LogManager.getLogger();\r
\r
@StepEntry\r
- public Object[] execute(BasicDBObject material, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
- logger.info(jobRuntime.getMarker(), "Starting");\r
+ public Object[] execute(BasicDBObject material, String targetPath, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
try {\r
- for (int i = 0; i < 10; i++) {\r
- jobRuntime.incrementProgress((i + 1) * 10);\r
- Thread.sleep(100);\r
- }\r
- } catch (Exception e) {\r
- logger.error(e.getMessage());\r
- }\r
- logger.info(jobRuntime.getMarker(), "Finished");\r
-\r
- DB db = NoSQLUtils.getNoSQLDB();\r
- DBCollection collection = db.getCollection(MorpheusStrings.COLLECTION_NAME);\r
- try {\r
- material.put(MorpheusStrings.STATUS, MorpheusStrings.STATUS_DONE);\r
+ IItemManager itemManager = jobEngine.getItemManager();\r
+ Media mediaCubeMedia = itemManager.getMedia(material.getLong(MorpheusStrings.MEDIAID));\r
+ super.execute(mediaCubeMedia, targetPath, TARGETNAMEPATTERN, null, 0, jobEngine, jobRuntime);\r
+ saveMaterial(material, MorpheusStrings.STATUS_DONE);\r
} catch (Exception e) {\r
+ saveMaterial(material, MorpheusStrings.STATUS_ERROR);\r
logger.catching(e);\r
- material.put(MorpheusStrings.STATUS, MorpheusStrings.STATUS_ERROR);\r
throw e;\r
- } finally {\r
- collection.save(material);\r
}\r
return null;\r
}\r
\r
+ private void saveMaterial(BasicDBObject material, String status) throws Exception {\r
+ DB db = NoSQLUtils.getNoSQLDB();\r
+ DBCollection collection = db.getCollection(MorpheusStrings.COLLECTION_NAME);\r
+ material.put(MorpheusStrings.STATUS, MorpheusStrings.STATUS_DONE);\r
+ collection.save(material);\r
+ }\r
+\r
}\r
public static final String TIMETOAIR = "TimetoAir";\r
public static final String TIME_TO_AIR = "Time to Air";\r
public static final String STATUS = "Status";\r
+ public static final String MEDIAID = "MediaID";\r
+\r
+ public static final String FORMAT_TIME_TO_AIR = "dd-MMM-yyyy HH:mm:ss:S";\r
\r
public static final String STATUS_RETRIEVING = "RETRIEVING";\r
public static final String STATUS_RESTORABLE = "RESTORABLE";\r
<custom-attributes org.zkoss.zul.listbox.preloadSize="50" />\r
\r
<div id="scdiv" width="100%" height="100%" apply="org.zkoss.bind.BindComposer" viewModel="@id('jlm') @init('user.jobengine.zk.model.JobListModel')" >\r
- <timer id="timer" delay="500" repeats="true" onTimer="@command('refreshJobList')" />\r
+ <timer id="timer" delay="100" repeats="true" onTimer="@command('uiTick')" />\r
\r
<space bar="false" />\r
\r
return jobName;\r
}\r
\r
+ public Map<String, Object> getJobParameters() {\r
+ return jobParameters;\r
+ }\r
+\r
public String getTemplateName() {\r
return templateName;\r
}\r
public String toString() {\r
return String.format("!%s! %s", jobName, templateName);\r
}\r
+\r
}\r
\r
public class EscortFiles {\r
private static final Logger logger = LogManager.getLogger();\r
- private static final String KILLDATE_NAME = "%s.%s.killdate";\r
- private static final String YYYYMMDD = "yyyyMMdd";\r
+ private static final String EXTENDEDAGENCY = "ExtendedAgency";\r
+ private static final String EXTENDEDDESCRIPTION = "ExtendedDescription";\r
+ private static final String KILLDATE = "KillDate";\r
+ private static final String FORMAT_KILLDATE = "MM-dd-yyyy";\r
+ private static final String EXTENDEDID = "extendedId";\r
+ private static final String ID = "ID";\r
+ private static final String KILLDATE_FILENAME = "%s.%s.killdate";\r
+ private static final String FORMAT_KILLDATENAME = "yyyyMMdd";\r
public static final String STATUSFOLDER = ".STATUS";\r
\r
public static String composeKillDate(int days) {\r
Calendar killDate = Calendar.getInstance();\r
killDate.add(Calendar.DAY_OF_YEAR, days);\r
- SimpleDateFormat dateFormat = new SimpleDateFormat(YYYYMMDD);\r
+ SimpleDateFormat dateFormat = new SimpleDateFormat(FORMAT_KILLDATENAME);\r
return dateFormat.format(killDate.getTime());\r
}\r
/*\r
*/\r
\r
private static String composeKillDateFileName(String fileName, int days) {\r
- return String.format(KILLDATE_NAME, fileName, composeKillDate(days));\r
+ return String.format(KILLDATE_FILENAME, fileName, composeKillDate(days));\r
}\r
\r
public static byte[] createNEXIOKillDateFile(String fileName, Date killDate, String description, String agency) throws Exception {\r
DOMImplementation impl = db.getDOMImplementation();\r
Document xmlDocument = impl.createDocument(null, null, null);\r
\r
- Element root = xmlDocument.createElement("ID");\r
- root.setAttribute("extendedId", fileName);\r
+ Element root = xmlDocument.createElement(ID);\r
+ root.setAttribute(EXTENDEDID, fileName);\r
if (killDate != null) {\r
- String sKillDate = CalendarUtils.toString(CalendarUtils.createCalendar(killDate), "MM-dd-yyyy");\r
- root.appendChild(xmlDocument.createElement("KillDate")).appendChild(xmlDocument.createTextNode(sKillDate));\r
+ String sKillDate = CalendarUtils.toString(CalendarUtils.createCalendar(killDate), FORMAT_KILLDATE);\r
+ root.appendChild(xmlDocument.createElement(KILLDATE)).appendChild(xmlDocument.createTextNode(sKillDate));\r
}\r
\r
if (StringUtils.isNotBlank(description))\r
- root.appendChild(xmlDocument.createElement("ExtendedDescription")).appendChild(xmlDocument.createTextNode(description));\r
+ root.appendChild(xmlDocument.createElement(EXTENDEDDESCRIPTION)).appendChild(xmlDocument.createTextNode(description));\r
if (StringUtils.isNotBlank(agency))\r
- root.appendChild(xmlDocument.createElement("ExtendedAgency")).appendChild(xmlDocument.createTextNode(agency));\r
+ root.appendChild(xmlDocument.createElement(EXTENDEDAGENCY)).appendChild(xmlDocument.createTextNode(agency));\r
xmlDocument.appendChild(root);\r
\r
DOMSource domSource = new DOMSource(xmlDocument);\r
Files.createFile(killDatePath);\r
}\r
\r
- public static void ensureUNCFolder(String filePath, String folderName) throws IOException {\r
- Path statusPath = Paths.get(filePath, folderName);\r
- File statusFolder = statusPath.toFile();\r
- if (!statusFolder.exists() || !statusFolder.isDirectory()) {\r
+ public static void ensureUNCFolder(Path filePath) throws IOException {\r
+ File folder = filePath.toFile();\r
+ if (!folder.exists() || !folder.isDirectory()) {\r
Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
-\r
try {\r
- Files.createDirectories(statusPath, attr);\r
+ Files.createDirectories(filePath, attr);\r
} catch (Exception e) {\r
logger.catching(e);\r
- Files.createDirectories(statusPath);\r
+ try {\r
+ Files.createDirectory(filePath);\r
+ } catch (Exception e1) {\r
+ logger.catching(e);\r
+ throw e;\r
+ }\r
}\r
}\r
}\r
+\r
+ public static void ensureUNCFolder(String filePath, String folderName) throws IOException {\r
+ Path statusPath = Paths.get(filePath, folderName);\r
+ ensureUNCFolder(statusPath);\r
+ }\r
}\r
package user.jobengine.zk.model;\r
\r
-import java.util.ArrayList;\r
import java.util.HashMap;\r
-import java.util.List;\r
import java.util.Map;\r
\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.zkoss.bind.BindUtils;\r
import org.zkoss.bind.annotation.Command;\r
import org.zkoss.bind.annotation.Init;\r
import org.zkoss.bind.annotation.NotifyChange;\r
import org.zkoss.zk.ui.Executions;\r
import org.zkoss.zul.ListModelList;\r
+import org.zkoss.zul.Messagebox;\r
import org.zkoss.zul.Window;\r
\r
import user.jobengine.db.ItemManagerData.SignalType;\r
import user.jobengine.server.JobEngine;\r
import user.jobengine.zk.util.SessionUtil;\r
\r
-public class JobListModel extends BaseModel implements IJobChangedListener {\r
- private class EnableServerStart {\r
- }\r
-\r
+public class JobListModel extends AsyncBaseModel implements IJobChangedListener {\r
private static final Logger logger = LogManager.getLogger();\r
- private List<Object> jobEvents = new ArrayList<Object>();\r
- //protected CachedListModel searchResult = null;\r
private ListModelList<IJobRuntime> jobList = new ListModelList<IJobRuntime>();\r
private IJobRuntime selectedJob = null;\r
private IJobEngine jobEngine = null;\r
for (IJobRuntime job : this.jobList.getSelection()) {\r
job.setPriority(newPriority);\r
jobEngine.rePrioritization(job);\r
- // this.jobList.notifyChange(job);\r
}\r
}\r
}\r
setShutdownDisabled(!jobEngine.isRunning());\r
setStartupDisabled(jobEngine.isRunning());\r
\r
- SessionUtil.registerJobChangedListener(this); //sessionlistener fog leiratkozni\r
+ SessionUtil.registerJobChangedListener(this);\r
\r
initializeList();\r
\r
jobList.clear();\r
Map<Long, IJobRuntime> jobMap = this.jobEngine.getJobs();\r
jobList.addAll(jobMap.values());\r
- // List<IEntityBase> allItems = jobEngine.getItemManager().getAll(Job.class);\r
- // for (IEntityBase entity : allItems) {\r
- // jobList.add(new JobRuntime((IJob) entity));\r
- // }\r
-\r
//Collections.sort(jobList, (o1, o2) -> compare(o1, o2));\r
}\r
\r
return shutdownDisabled;\r
}\r
\r
- //TEST CODE *****************************************************\r
-\r
public boolean isStartupDisabled() {\r
return startupDisabled;\r
}\r
\r
@Override\r
public void jobChanged(JobChangedEvent event) {\r
- if (event != null) {\r
- synchronized (jobEvents) {\r
- jobEvents.add(event);\r
- }\r
+ JobChangedEvent jobEvent = event;\r
+ final IJobRuntime job = jobEvent.getJob();\r
+ if (jobEvent.getSignalType().equals(SignalType.CREATE)) {\r
+ registerTask(() -> onJobCreated(job));\r
+ return;\r
+ }\r
+ if (jobEvent.getSignalType().equals(SignalType.DELETE)) {\r
+ registerTask(() -> onJobDeleted(job));\r
+ return;\r
+ }\r
+ if (jobEvent.getSignalType().equals(SignalType.UPDATE)) {\r
+ registerTask(() -> onJobUpdated(job));\r
+ return;\r
}\r
}\r
\r
- @Command\r
- //@NotifyChange({ "jobList" })\r
- public void refreshJobList() {\r
- synchronized (jobEvents) {\r
- if (jobEvents.size() > 0) {\r
- boolean mustRefreshList = false;\r
- for (Object event : jobEvents) {\r
- if (event instanceof JobChangedEvent) {\r
- JobChangedEvent jobEvent = (JobChangedEvent) event;\r
- IJobRuntime job = jobEvent.getJob();\r
- if (jobEvent.getSignalType().equals(SignalType.DELETE)) {\r
- this.jobList.remove(jobEvent.getJob());\r
- mustRefreshList = true;\r
- } else if (jobEvent.getSignalType().equals(SignalType.CREATE)) {\r
- this.jobList.add(jobEvent.getJob());\r
- mustRefreshList = true;\r
- } else if (jobEvent.getSignalType().equals(SignalType.UPDATE)) {\r
- this.jobList.notifyChange(job);\r
- }\r
- }\r
- if (event instanceof EnableServerStart) {\r
- setStartupDisabled(false);\r
- BindUtils.postNotifyChange(null, null, this, "startupDisabled");\r
- }\r
- }\r
- if (mustRefreshList) {\r
- BindUtils.postNotifyChange(null, null, this, "jobList");\r
- }\r
- jobEvents.clear();\r
- }\r
- }\r
+ private void onJobCreated(IJobRuntime job) {\r
+ jobList.add(job);\r
+ NotifyChange("jobList");\r
+ }\r
+\r
+ private void onJobDeleted(IJobRuntime job) {\r
+ jobList.remove(job);\r
+ NotifyChange("jobList");\r
+ }\r
+\r
+ private void onJobUpdated(IJobRuntime job) {\r
+ jobList.notifyChange(job);\r
+ }\r
+\r
+ private void onShutdown() {\r
+ jobEngine.shutdown();\r
+ setStartupDisabled(false);\r
}\r
\r
@Command\r
- @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
public void restart() {\r
startupDisabled = true;\r
try {\r
this.selectedJob = _selectedJob;\r
}\r
\r
- //@NotifyChange({ "shutdownDisabled" })\r
public void setShutdownDisabled(boolean shutdownDisabled) {\r
this.shutdownDisabled = shutdownDisabled;\r
+ NotifyChange("shutdownDisabled");\r
}\r
\r
- @NotifyChange({ "startupDisabled" })\r
public void setStartupDisabled(boolean startupDisabled) {\r
this.startupDisabled = startupDisabled;\r
+ NotifyChange("startupDisabled");\r
}\r
\r
@Command\r
- @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
public void shutdown() {\r
- shutdownDisabled = true;\r
- Runnable r = new Runnable() {\r
- @Override\r
- public void run() {\r
- jobEngine.shutdown();\r
- synchronized (jobEvents) {\r
- jobEvents.add(new EnableServerStart());\r
- }\r
- }\r
- };\r
- Thread t = new Thread(r);\r
- t.start();\r
+ setShutdownDisabled(true);\r
+ registerTask(() -> onShutdown());\r
}\r
\r
@Command\r
- @NotifyChange({ "shutdownDisabled", "startupDisabled" })\r
public void startup() {\r
- startupDisabled = true;\r
+ setStartupDisabled(true);\r
try {\r
jobEngine.startup();\r
} catch (Exception e) {\r
+ Messagebox.show(e.getMessage());\r
}\r
- shutdownDisabled = false;\r
+ setShutdownDisabled(false);\r
initializeList();\r
}\r
}\r
\r
public class MissingMaterialsModel extends AsyncBaseModel implements IJobChangedListener {\r
private static final Logger logger = LogManager.getLogger();\r
+ private static final String TARGETPATH = "targetPath";\r
private static final String IMPORT_DISABLED = "importDisabled";\r
private static final String TEMPLATE = "template";\r
private static final String IMPORT_TEMPLATE = "import-morpheus-missing-materials.xml";\r
private IJobEngine jobEngine = null;\r
private boolean importDisabled;\r
private DBCollection collection;\r
+ private ScheduledJob importJob;\r
\r
@Command\r
public void executeImportJob() {\r
try {\r
setImportDisabled(true);\r
- SchedulerService scheduler = jobEngine.getScheduler();\r
- List<BasicDBObject> jobs = NoSQLUtils.asList(scheduler.getScheduleJobs());\r
- BasicDBObject importJob = null;\r
- for (BasicDBObject job : jobs) {\r
- if (isImportJob(job.getString(TEMPLATE))) {\r
- importJob = job;\r
- //logger.info(job.toString());\r
- break;\r
- }\r
- }\r
- if (importJob == null)\r
- throw new NullPointerException("Nem található az import sablon.");\r
- ScheduledJob scheduledJob = scheduler.createScheduledJob(importJob);\r
- scheduledJob.setJobEngine(jobEngine);\r
- scheduledJob.doJob();\r
+ importJob.setJobEngine(jobEngine);\r
+ importJob.doJob();\r
} catch (Exception e) {\r
logger.catching(e);\r
Messagebox.show(e.getMessage());\r
\r
@Command\r
public void executeRestoreJobs() {\r
- //logger.info("Selected: " + selectedJobs.size());\r
+ if (importJob == null) {\r
+ Messagebox.show("Nem található a rendszerben a 'import-morpheus-missing-materials.xml' folyamatsablon.");\r
+ return;\r
+ }\r
+\r
+ Map<String, Object> jobParameters = importJob.getJobParameters();\r
+ Object targetPath = jobParameters.get(TARGETPATH);\r
+ if (!(targetPath instanceof String)) {\r
+ Messagebox.show("Nem található a rendszerben a 'import-morpheus-missing-materials.xml' folyamatsablon.");\r
+ return;\r
+\r
+ }\r
+\r
for (BasicDBObject material : selectedJobs) {\r
String status = material.getString(MorpheusStrings.STATUS);\r
if (!MorpheusStrings.STATUS_RESTORABLE.equals(status))\r
logger.warn("'{}' already retrieving", name);\r
} else {\r
try {\r
+ //String targetPath, String targetNamePattern, String successRecipient\r
jobEngine.submit(RETRIEVE_TEMPLATE, String.format("%s hiányzó anyag visszatöltése", name),\r
- ListUtils.asMap(MorpheusStrings.MATERIAL, material));\r
+ ListUtils.asMap(MorpheusStrings.MATERIAL, material, TARGETPATH, String.valueOf(targetPath)));\r
} catch (Exception e) {\r
logger.catching(e);\r
}\r
}\r
}\r
\r
+ private ScheduledJob getImportScheduledJob() {\r
+ SchedulerService scheduler = jobEngine.getScheduler();\r
+ List<BasicDBObject> jobs = NoSQLUtils.asList(scheduler.getScheduleJobs());\r
+ BasicDBObject importJob = null;\r
+ for (BasicDBObject job : jobs) {\r
+ if (isImportJob(job.getString(TEMPLATE))) {\r
+ importJob = job;\r
+ //logger.info(job.toString());\r
+ break;\r
+ }\r
+ }\r
+ if (importJob == null)\r
+ throw new NullPointerException("Nem található az import sablon.");\r
+ return scheduler.createScheduledJob(importJob);\r
+ }\r
+\r
public ListModelList<BasicDBObject> getJobList() {\r
return jobList;\r
}\r
this.jobEngine = JobEngine.getInstance();\r
if (jobEngine == null)\r
throw new Exception("Belső hiba! A JobEngine szolgáltatás elérhetetlen.");\r
+\r
+ importJob = getImportScheduledJob();\r
+\r
List<IJobRuntime> jobRuntimes = new ArrayList<>(jobEngine.getJobs().values());\r
Optional<IJobRuntime> findFirst = jobRuntimes.stream().filter(jobRuntime -> isImportJob(jobRuntime.getTemplate())).findFirst();\r
if (findFirst.isPresent())\r
initializeList();\r
} catch (Exception e) {\r
logger.catching(e);\r
+ Messagebox.show(e.getMessage());\r
}\r
}\r
\r