--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+public enum MetadataType {\r
+ TrafficMaterial, TrafficPromo, TrafficAD, OctopusStory, OctopusPlaceholder, Generic\r
+}\r
--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+import org.apache.commons.lang.StringUtils;\r
+\r
+public class MetadataTypeDetector {\r
+\r
+ private static final String HYPHEN = "-";\r
+ private static final String DOT = ".";\r
+\r
+ private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}";\r
+\r
+ public static MetadataType GuessMetadataType(String id) {\r
+ if (StringUtils.isBlank(id))\r
+ return MetadataType.Generic;\r
+ if (id.matches(REGEXP_TRAFFICMATERIALID))\r
+ return MetadataType.TrafficMaterial;\r
+ if (id.matches(REGEXP_TRAFFICPROMOID))\r
+ return MetadataType.TrafficPromo;\r
+ if (id.matches(REGEXP_TRAFFICADID))\r
+ return MetadataType.TrafficAD;\r
+ if (id.matches(REGEXP_OCTOPUSSTORYID))\r
+ return MetadataType.OctopusStory;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERID))\r
+ return MetadataType.OctopusPlaceholder;\r
+ if (id.matches(REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID))\r
+ return MetadataType.OctopusPlaceholder;\r
+ return MetadataType.Generic;\r
+ }\r
+\r
+ public static String truncateExtension(String name) {\r
+ String result = name;\r
+ if (result != null && result.contains(DOT))\r
+ result = result.substring(0, result.lastIndexOf(DOT));\r
+ return result;\r
+ }\r
+\r
+ public static String truncateVersion(String name) {\r
+ String result = name;\r
+ if (result != null && result.contains(HYPHEN))\r
+ result = result.split(HYPHEN)[0];\r
+ return result;\r
+ }\r
+\r
+}\r
--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+public class TestLib {\r
+\r
+ public void hello() {\r
+ TestLib1 lib = new TestLib1();\r
+ lib.helo();\r
+ }\r
+}\r
--- /dev/null
+package user.jobengine.server.steps.shared;\r
+\r
+public class TestLib1 {\r
+\r
+ public void hello() {\r
+ System.out.println("Hello from lib1");\r
+ }\r
+}\r
<classpath>\r
<classpathentry kind="src" path="src"/>\r
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>\r
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>\r
- <classpathentry kind="output" path="bin"/>\r
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">\r
+ <attributes>\r
+ <attribute name="maven.pomderived" value="true"/>\r
+ </attributes>\r
+ </classpathentry>\r
+ <classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">\r
+ <attributes>\r
+ <attribute name="maven.pomderived" value="true"/>\r
+ </attributes>\r
+ </classpathentry>\r
+ <classpathentry kind="output" path="target/classes"/>\r
</classpath>\r
</dictionary>\r
</arguments>\r
</buildCommand>\r
+ <buildCommand>\r
+ <name>org.eclipse.m2e.core.maven2Builder</name>\r
+ <arguments>\r
+ </arguments>\r
+ </buildCommand>\r
</buildSpec>\r
<natures>\r
+ <nature>org.eclipse.m2e.core.maven2Nature</nature>\r
<nature>org.eclipse.jdt.core.javanature</nature>\r
<nature>org.eclipse.pde.PluginNature</nature>\r
</natures>\r
--- /dev/null
+eclipse.preferences.version=1\r
+encoding/<project>=UTF-8\r
org.eclipse.jdt.core.compiler.debug.localVariable=generate\r
org.eclipse.jdt.core.compiler.debug.sourceFile=generate\r
org.eclipse.jdt.core.compiler.problem.assertIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled\r
org.eclipse.jdt.core.compiler.problem.enumIdentifier=error\r
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning\r
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore\r
+org.eclipse.jdt.core.compiler.release=disabled\r
org.eclipse.jdt.core.compiler.source=1.8\r
--- /dev/null
+activeProfiles=\r
+eclipse.preferences.version=1\r
+resolveWorkspaceProjects=true\r
+version=1\r
<!-- <version>1.0.0</version> -->\r
<!-- </parent> -->\r
<modelVersion>4.0.0</modelVersion>\r
+ <groupId>user.jobengine</groupId> \r
<artifactId>user.jobengine.executors</artifactId>\r
- <packaging>eclipse-plugin</packaging>\r
<version>1.0.0</version>\r
+ <properties>\r
+ <maven.compiler.source>1.8</maven.compiler.source>\r
+ <maven.compiler.target>1.8</maven.compiler.target>\r
+ <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r
+ <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r
+ </properties>\r
<!-- <build> -->\r
<!-- <plugins> -->\r
<!-- <plugin> -->\r
package user.jobengine.server.steps;\r
\r
-import org.apache.commons.net.ftp.FTPClient;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.apache.logging.log4j.Marker;\r
-import org.apache.logging.log4j.MarkerManager;\r
-\r
-import user.commons.StoreUri;\r
-import user.commons.remotestore.FtpDirectoryLister;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
-import user.jobengine.server.steps.shared.EscortFiles;\r
\r
public class CancelableStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
- int count = 10;\r
\r
@StepEntry\r
- public Object[] execute(int param) throws Exception {\r
- try {\r
-\r
- Marker marker = MarkerManager.getMarker("MEDIAPROFILE");\r
- logger.info(marker, "{}", EscortFiles.DOT_CATCHED);\r
- getJobRuntime().setRelated("TESZT" + param);\r
-\r
- // ftpTest();\r
-\r
- // if (param == 0)\r
- // Thread.sleep(5000);\r
- // if (param == 1)\r
- // throw new Exception("Error teszt");\r
-\r
- for (int i = 0; i < count; i++) {\r
- if (getJobRuntime().isWaitingCancel())\r
- break;\r
-\r
- Thread.sleep(200);\r
- int progress = (i + 1) * 100 / count;\r
- setProgress(progress);\r
- logger.info(marker, "{}", i);\r
- }\r
- } catch (Exception e) {\r
- e.printStackTrace();\r
- throw e;\r
+ public Object[] execute() throws Exception {\r
+ logger.info(getMarker(), "Executing");\r
+ for (int i = 0; i < 10; i++) {\r
+ logger.info(getMarker(), "Executing {}", i);\r
+ if (getJobRuntime().isWaitingCancel())\r
+ break;\r
+ Thread.sleep(100);\r
+ int progress = (i + 1) * 100 / 10;\r
+ setProgress(progress);\r
}\r
- return new Object[] { param };\r
- }\r
-\r
- void ftpTest() throws Exception {\r
- StoreUri source = null;\r
- StoreUri target = null;\r
- try {\r
- source = getManager().getStoreUri("MEDIACUBE_UPLOADS", RemoteStoreProtocol.LOCAL);\r
- target = getManager().getStoreUri("NEXIO1", RemoteStoreProtocol.FTP);\r
- source.addProgressListener(e -> setProgress(e.getProgress()));\r
- logger.info("Uploading file PART_TEST.mxf");\r
- source.transferFrom(target, "PART_TEST.mxf", "PART_TEST.mxf");\r
- FTPClient client = ((FtpDirectoryLister) target.getLister()).connect();\r
- logger.info("Renaming file PART_TEST.mxf to RENAME_TEST.mxf");\r
- client.rename("PART_TEST.mxf", "RENAME_TEST.mxf");\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- } finally {\r
- if (target != null)\r
- target.cleanUp();\r
- if (source != null)\r
- source.cleanUp();\r
- }\r
-\r
+ return null;\r
}\r
\r
}\r
import org.apache.logging.log4j.Logger;\r
import org.apache.logging.log4j.Marker;\r
\r
-import user.commons.RemoteFile;\r
-import user.commons.StoreUri;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
-import user.jobengine.db.Store;\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
\r
public class CleanupMountedLocationStep extends JobStep implements FileVisitor<Path> {\r
\r
\r
private Path sourcePath;\r
private SimpleDateFormat dateFormat;\r
- private StoreUri tsmStoreUri;\r
private boolean skipArchiveCheck;\r
\r
private Date checkExpiration(List<Path> killDateFiles) {\r
throw new NullPointerException(String.format("Directory %s not exists.", sourceFolder));\r
}\r
\r
- Store tsmStore = getManager().getSystemStore(false);\r
- if (tsmStore == null)\r
- throw new NullPointerException("A TSM bejegyzés nem található!");\r
-\r
- tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
- if (tsmStoreUri == null)\r
- throw new NullPointerException("A TSM forrás elérése nem található!");\r
-\r
try {\r
setProgress(1);\r
dateFormat = new SimpleDateFormat(DATEFORMAT);\r
return result;\r
}\r
\r
- private boolean isArchived(Path filePath) {\r
- boolean result = false;\r
- String name = filePath.getFileName().toString();\r
- String[] tsmName = new String[] { null };\r
- String query = String.format("SELECT relativepath FROM MEDIAFILE WHERE houseid = '%s'", name);\r
- getManager().executeQuery(query, rs -> {\r
- tsmName[0] = rs.getString("relativepath");\r
- return false;\r
- }, null);\r
-\r
- if (tsmName[0] != null) {\r
- try {\r
- RemoteFile remoteFile = tsmStoreUri.getRemoteFile(tsmName[0]);\r
- result = remoteFile != null;\r
- } catch (Exception e) {\r
- logger.error(e.getMessage());\r
- } finally {\r
- tsmStoreUri.cleanUp();\r
- }\r
- }\r
- return result;\r
- }\r
-\r
@Override\r
public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {\r
if (!dir.equals(sourcePath) && isEmpty(dir)) {\r
return;\r
\r
if (!skipArchiveCheck && filePath.toFile().length() > 0) {\r
- if (!isArchived(filePath)) {\r
+ if (!ItemManagerExtensions.isArchived(getManager(), filePath)) {\r
logger.error(marker, "A(z) {} anyag törlésre van kijelölve, de nem található az archívumban.", filePath);\r
return;\r
}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+\r
+public class DeleteFile extends JobStep {\r
+ private static final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String fileName, StoreUri tempStoreUri) throws Exception {\r
+ try {\r
+ RemoteFile remoteFile = tempStoreUri.getRemoteFile(fileName);\r
+ tempStoreUri.delete(remoteFile);\r
+ } catch (Exception e) {\r
+ logger.warn(getJobRuntime().getSessionMarker(), e.getMessage());\r
+ }\r
+ return null;\r
+ }\r
+}\r
import org.apache.logging.log4j.Logger;\r
import org.apache.logging.log4j.Marker;\r
\r
-import user.jobengine.server.IJobEngine;\r
-import user.jobengine.server.IJobRuntime;\r
-\r
public class DeleteFileStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
private Marker marker;\r
\r
@StepEntry\r
- public Object[] execute(ArchiveItem archiveItem, boolean isDelete, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
- marker = jobRuntime.getSessionMarker();\r
+ public Object[] execute(ArchiveItem archiveItem, boolean isDelete) throws Exception {\r
+ marker = getJobRuntime().getSessionMarker();\r
if (isDelete) {\r
Path filePath = Paths.get(archiveItem.getMediaFile());\r
File file = filePath.toFile();\r
package user.jobengine.server.steps;\r
\r
+import java.nio.file.Files;\r
import java.nio.file.Path;\r
import java.nio.file.Paths;\r
import java.util.concurrent.CountDownLatch;\r
import user.jobengine.db.ArchivedMedia;\r
import user.jobengine.db.Item;\r
import user.jobengine.db.Media;\r
+import user.jobengine.server.steps.shared.ItemManagerExtensions;\r
\r
public class IntegrationTestStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
+ private ArchivedMedia archivedMedia;\r
\r
- @StepEntry\r
- public Object[] execute() throws Exception {\r
- try {\r
- //test_cancelable(finishLatch);\r
- ArchivedMedia archivedMedia = new ArchivedMedia();\r
- Media media = getManager().getMedia(15285);\r
- Item item = getManager().getItem(media.getItemId());\r
- archivedMedia.setItem(item);\r
- archivedMedia.setMedia(media);\r
- test_retrieve_ondemand(archivedMedia);\r
- Path output = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
- archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
- if (!output.toFile().exists())\r
- throw new Exception("File not exists: " + output);\r
-\r
- test_delete_materials(output.getParent().toString());\r
-\r
- if (output.toFile().exists())\r
- throw new Exception("File exists: " + output);\r
-\r
- } catch (Exception e) {\r
- logger.info(e.getMessage());\r
- throw e;\r
- }\r
- return null;\r
- }\r
-\r
- private void test_cancelable() throws Exception {\r
+ private void _00_test_cancelable() throws Exception {\r
CountDownLatch finishLatch = new CountDownLatch(1);\r
getEngine().submit(null, e -> {\r
if (e.isRuntimeTerminated())\r
finishLatch.countDown();\r
}, "cancelable.xml", "Test cancelable", ListUtils.asMap("param", 1));\r
finishLatch.await();\r
+ logger.info("_00_test_cancelable SUCCESS");\r
}\r
\r
- private void test_delete_materials(String source) throws Exception {\r
+ private void _01_test_retrieve_ondemand() throws Exception {\r
+ archivedMedia = new ArchivedMedia();\r
+ Media media = getManager().getMedia(15285);\r
+ Item item = getManager().getItem(media.getItemId());\r
+ archivedMedia.setItem(item);\r
+ archivedMedia.setMedia(media);\r
+\r
CountDownLatch finishLatch = new CountDownLatch(1);\r
getEngine().submit(null, e -> {\r
if (e.isRuntimeTerminated())\r
finishLatch.countDown();\r
- }, "delete-materials.xml", "Test delete-materials", ListUtils.asMap("sourcePath", source, "skipArchiveCheck", true));\r
+\r
+ }, "retrieve-ondemand.xml", "Test retrieve-ondemand",\r
+ ListUtils.asMap("globalRetrievePath", "file://10.11.1.100", "localRetrievePath", "/mediacube/data", "materialOutputFolder", "/",\r
+ "promoOutputFolder", "/", "advertisementOutputFolder", "/", "octopusOutputFolder", "/", "genericOutputFolder", "/",\r
+ "onlineOutputFolder", "/", "killDateDays", -1, "nexioAgency", "ARCHIVE_RESTORE", "nexioPort", 2098, "nexioUserName", "administrator",\r
+ "nexioPassword", "system", "archivedMedia", archivedMedia, "successRecipient", "vasary@elgekko.net", "houseId",\r
+ archivedMedia.getMedia().getHouseId(), "targetPathType", "0"));\r
+\r
finishLatch.await();\r
+ Path output = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
+ archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
+ if (!output.toFile().exists())\r
+ throw new Exception("File not exists: " + output);\r
+\r
+ logger.info("_01_test_retrieve_ondemand SUCCESS");\r
}\r
\r
- private void test_retrieve_ondemand(ArchivedMedia archivedMedia) throws Exception {\r
+ private void _02_test_archive_material() throws Exception {\r
+ Path input = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
+ archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
+\r
+ String outputName = "IntegrationTest_" + System.currentTimeMillis() + ".mxf";\r
+ Path ouptput = Paths.get(input.getParent().toString(), outputName);\r
+ Files.copy(input, ouptput);\r
+ if (!ouptput.toFile().exists())\r
+ throw new Exception("File not exists: " + ouptput);\r
+\r
+ ArchiveItem archiveItem = new ArchiveItem();\r
+ archiveItem.setMediaFile(ouptput.toString());\r
+ archiveItem.setItemHouseId(outputName);\r
+ archiveItem.setItemTitle(outputName);\r
+ archiveItem.setMediaHouseId(outputName);\r
+ archiveItem.setMediaTitle(outputName);\r
+ archiveItem.setMediaType("Generic");\r
\r
CountDownLatch finishLatch = new CountDownLatch(1);\r
getEngine().submit(null, e -> {\r
if (e.isRuntimeTerminated())\r
finishLatch.countDown();\r
+ }, "archive-material.xml", "Test archive-material", ListUtils.asMap("archiveItem", archiveItem, "killDateDays", 0));\r
+ finishLatch.await();\r
\r
- }, "retrieve-ondemand.xml", "Test retrieve-ondemand",\r
- ListUtils.asMap("globalRetrievePath", "file://10.11.1.100", "localRetrievePath", "/mediacube/data", "materialOutputFolder", "/",\r
- "promoOutputFolder", "/", "advertisementOutputFolder", "/", "octopusOutputFolder", "/", "genericOutputFolder", "/",\r
- "onlineOutputFolder", "/", "killDateDays", -1, "nexioAgency", "ARCHIVE_RESTORE", "nexioPort", 2098, "nexioUserName", "administrator",\r
- "nexioPassword", "system", "archivedMedia", archivedMedia, "successRecipient", "vasary@elgekko.net", "houseId",\r
- archivedMedia.getMedia().getHouseId(), "targetPathType", "0"));\r
+ if (!ItemManagerExtensions.isArchived(getManager(), ouptput))\r
+ throw new Exception("File not archived: " + ouptput);\r
+\r
+ Files.delete(ouptput);\r
\r
+ logger.info("_02_test_archive_material SUCCESS");\r
+ }\r
+\r
+ private void _03_test_delete_materials() throws Exception {\r
+ Path output = Paths.get("/mediacube/data", archivedMedia.getMedia().getHouseId(),\r
+ archivedMedia.getMedia().getHouseId() + "-ARCH-" + archivedMedia.getMedia().getMediaFileRealName());\r
+ String source = output.getParent().toString();\r
+\r
+ CountDownLatch finishLatch = new CountDownLatch(1);\r
+ getEngine().submit(null, e -> {\r
+ if (e.isRuntimeTerminated())\r
+ finishLatch.countDown();\r
+ }, "delete-materials.xml", "Test delete-materials", ListUtils.asMap("sourcePath", source, "skipArchiveCheck", true));\r
finishLatch.await();\r
\r
+ if (output.toFile().exists())\r
+ throw new Exception("File exists: " + output);\r
+ }\r
+\r
+ @StepEntry\r
+ public Object[] execute() throws Exception {\r
+ getJobRuntime().setDescription("_00_test_cancelable");\r
+ _00_test_cancelable();\r
+ setProgress(25);\r
+\r
+ getJobRuntime().setDescription("_01_test_retrieve_ondemand");\r
+ _01_test_retrieve_ondemand();\r
+ setProgress(50);\r
+\r
+ getJobRuntime().setDescription("_02_test_archive_material");\r
+ _02_test_archive_material();\r
+ setProgress(75);\r
+\r
+ getJobRuntime().setDescription("_03_test_delete_materials");\r
+ _03_test_delete_materials();\r
+ setProgress(100);\r
+ return null;\r
}\r
\r
}\r
\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.apache.logging.log4j.Marker;\r
\r
-import user.commons.mediatool.MediaInfo;\r
+import user.commons.mediaarea.MediaArea;\r
import user.jobengine.db.Media;\r
\r
public class MediaToolStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
- private Marker marker;\r
\r
@StepEntry\r
public Object[] execute(ArchiveItem archiveItem, Media mediaCubeMedia) throws Exception {\r
- marker = getSessionMarker();\r
-\r
- //TODO ez most minden esetben ujranezi\r
- // if (mediaCubeMedia.getLength() > 0)\r
- // return null;\r
-\r
Path filePath = Paths.get(archiveItem.getMediaFile());\r
- MediaInfo mi = new MediaInfo(filePath);\r
- try {\r
- mi.process();\r
- long frames = mi.getFrames();\r
+ if (filePath.toFile().length() != 0) {\r
+ MediaArea ma = new MediaArea(filePath);\r
+ ma.process();\r
+ long frames = ma.getFrameCount();\r
if (frames > 0) {\r
+ logger.info("Media {} length is {}", filePath, frames);\r
mediaCubeMedia.setLength(frames);\r
getManager().modify(mediaCubeMedia);\r
}\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- logger.error(marker, "A '{}' média analizálása sikertelen. A rendszer üzenete: {}", filePath, e.getMessage());\r
}\r
return null;\r
}\r
package user.jobengine.server.steps;\r
\r
+import java.util.List;\r
+\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
\r
@StepEntry\r
public Object[] execute(Media media, String tempStoreName, String tempStoreProtocol) throws Exception {\r
StoreUri mediaStoreUri = null;\r
- for (MediaFile mediaFile : media.getMediaFiles()) {\r
+ List<MediaFile> mediaFiles = media.getMediaFiles();\r
+ if (mediaFiles.size() > 1)\r
+ throw new Exception("Media " + media.getId() + " already has proxy");\r
+ for (MediaFile mediaFile : mediaFiles) {\r
Store store = mediaFile.getStore();\r
if (store.isSystem() && !store.isLowres()) {\r
mediaStoreUri = store.getStoreUri(RemoteStoreProtocol.TSM);\r
+++ /dev/null
-package user.jobengine.server.steps;\r
-\r
-import java.nio.file.Path;\r
-import java.nio.file.Paths;\r
-\r
-import com.ibm.nosql.json.api.BasicDBObject;\r
-\r
-import user.commons.StoreUri;\r
-import user.commons.remotestore.RemoteStoreProtocol;\r
-\r
-public class PrepareRemoteTranscodeJobParametersStep extends JobStep {\r
- @StepEntry\r
- public Object[] execute(String profileName, String tempStoreName, String tempStoreProtocol, String fileName) throws Exception {\r
- Path inputPath = Paths.get("m:/", fileName);\r
-\r
- StoreUri tempStoreUri = getManager().getStoreUri(tempStoreName, Enum.valueOf(RemoteStoreProtocol.class, tempStoreProtocol));\r
- String outFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".mp4";\r
- Path outputPath = null;\r
- if (fileName.length() > 2) {\r
- outputPath = Paths.get(tempStoreUri.toString(true), fileName.substring(0, 1), fileName.substring(1, 2), fileName.substring(2, 3), outFileName);\r
- } else {\r
- outputPath = Paths.get(tempStoreUri.toString(true), fileName, outFileName);\r
- }\r
-\r
- BasicDBObject parameters = new BasicDBObject();\r
- parameters.put("profile", profileName);\r
- parameters.put("input", inputPath.toString());\r
- parameters.put("output", outputPath.toString());\r
- return new Object[] { parameters };\r
- }\r
-\r
-}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import java.nio.file.Path;\r
+import java.nio.file.Paths;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
+public class PrepareRemoteTranscodeStep extends JobStep {\r
+ static private final Logger logger = LogManager.getLogger();\r
+\r
+ @StepEntry\r
+ public Object[] execute(String profileName, String fileName) throws Exception {\r
+ String hiResRoot = "m:/";\r
+ String lowResRoot = "m:/lowres";\r
+\r
+ Path inputPath = Paths.get(hiResRoot, fileName);\r
+\r
+ String outFileName = fileName.substring(0, fileName.lastIndexOf(".")) + ".mp4";\r
+\r
+ Path relativeOutputPath = null;\r
+ if (fileName.length() > 2)\r
+ relativeOutputPath = Paths.get(fileName.substring(0, 1), fileName.substring(1, 2), fileName.substring(2, 3), outFileName);\r
+ else\r
+ relativeOutputPath = Paths.get(fileName, outFileName);\r
+\r
+ BasicDBObject parameters = new BasicDBObject();\r
+ parameters.put("profile", profileName);\r
+ parameters.put("input", inputPath.toString());\r
+ parameters.put("output", Paths.get(lowResRoot, relativeOutputPath.toString()).toString());\r
+\r
+ logger.info("Prepared for remote transode {}", parameters);\r
+ return new Object[] { parameters, relativeOutputPath.toString() };\r
+ }\r
+\r
+}\r
\r
@StepEntry\r
public Object[] execute() throws Exception {\r
- Object[] result = new Object[] { null };\r
+ setDescription("Looking for missing proxy");\r
DB db = NoSQLUtils.getNoSQLDB();\r
DBCollection collection = db.getCollection("missing_lowres");\r
Media media = getFirstUntranscodedMedia(collection);\r
\r
- try {\r
- if (media == null) {\r
- logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
- // throw new Exception("Nincs feldolgozandó hiány.");\r
- cancel();\r
- return null;\r
- }\r
-\r
- String name = media.getMediaFileRealName();\r
- collection.save(new BasicDBObject("name", name));\r
- logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
- result[0] = media;\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- logger.error(getSessionMarker(), e.getMessage());\r
- throw e;\r
- } finally {\r
- setProgress(100);\r
+ if (media == null) {\r
+ logger.info(new MediaCubeUndoMarker(getSessionMarker().getSessionID()), "Nincs feldolgozandó hiány.");\r
+ cancel();\r
+ return null;\r
}\r
- return result;\r
+\r
+ String name = media.getMediaFileRealName();\r
+ collection.save(new BasicDBObject("name", name));\r
+ logger.info(getSessionMarker(), "Processing mediaID: {}", media.getId());\r
+ return new Object[] { media };\r
}\r
\r
private Media getFirstUntranscodedMedia(DBCollection collection) {\r
\r
import user.jobengine.server.steps.shared.MediaCubeClient;\r
\r
-/*\r
-import user.jobengine.server.steps.MediaCubeClient;\r
-*/\r
public class RemoteJobStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
\r
@StepEntry\r
public Object[] execute(String remoteServer, String template, String name, BasicDBObject remoteJobParameters) throws Exception {\r
- try {\r
- MediaCubeClient mc = new MediaCubeClient(remoteServer);\r
- long jobId = mc.startjob(template, name, remoteJobParameters);\r
- logger.info(getMarker(), "Started {} on server {}", jobId, remoteServer);\r
- while (true) {\r
- BasicDBObject status = mc.getStatus(jobId);\r
- if (status != null)\r
- setProgress(status.getInt("progress"));\r
-\r
- Thread.sleep(3000);\r
-\r
- String jobStatus = status.getString("status");\r
- if ("SUSPENDED".equals(jobStatus))\r
- throw new Exception(status.getString("description"));\r
-\r
- if ("FINISHED".equals(jobStatus))\r
- break;\r
- }\r
-\r
- } catch (Exception e) {\r
- throw e;\r
+ setDescription("Executing on {}, template {}, profile {}", remoteServer, template, remoteJobParameters.getString("profile"));\r
+ MediaCubeClient mc = new MediaCubeClient(remoteServer);\r
+ long jobId = mc.startjob(template, name, remoteJobParameters);\r
+ logger.info(getMarker(), "Started {} on server {}", jobId, remoteServer);\r
+ while (true) {\r
+ BasicDBObject status = mc.getStatus(jobId);\r
+ if (status != null)\r
+ setProgress(status.getInt("progress"));\r
+\r
+ Thread.sleep(2000);\r
+\r
+ String jobStatus = status.getString("status");\r
+ if ("SUSPENDED".equals(jobStatus))\r
+ throw new Exception(status.getString("description"));\r
+\r
+ if ("FINISHED".equals(jobStatus))\r
+ break;\r
}\r
- return new Object[] { null };\r
+\r
+ return null;\r
}\r
}\r
--- /dev/null
+package user.jobengine.server.steps;\r
+\r
+import user.jobengine.db.IItemManager;\r
+import user.jobengine.db.Media;\r
+import user.jobengine.db.MediaFile;\r
+import user.jobengine.db.Store;\r
+\r
+public class SaveMediaProxy extends JobStep {\r
+\r
+ @StepEntry\r
+ public Object[] execute(Media media, String proxyRelativePath) throws Exception {\r
+ IItemManager manager = getManager();\r
+ Store store = manager.getCurrentLowresStore();\r
+ MediaFile mediaFile = new MediaFile();\r
+ mediaFile.setMedia(media);\r
+ mediaFile.setStore(store);\r
+ mediaFile.setFileType(manager.getFileType("Low-res"));\r
+ mediaFile.setRelativePath(proxyRelativePath);\r
+ manager.add(mediaFile);\r
+ return null;\r
+ }\r
+}\r
\r
File sourceMediaFile = new File(archiveItem.getMediaFile());\r
String sourceFileName = sourceMediaFile.getName();\r
+ try {\r
+ Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+ String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
+ getJobRuntime().setDescription(details);\r
+ } catch (Exception e) {\r
+ String details = String.format("%s (%d bytes)", sourceFileName, sourceMediaFile.length());\r
+ getJobRuntime().setDescription(details);\r
+ }\r
Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
getJobRuntime().setDescription(details);\r
//TODO mxf helyett az osszes kiterjesztest!!!!!\r
//A dupla ellenorzes a napon beluli ismetlesek miatt kell\r
long existingMediaId = archiveItem.getExistingMediaId();\r
+\r
if (sourceMediaFile.length() == 0 && existingMediaId == 0) {\r
existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, sourceFileName.replace(MXFEXT, ""));\r
if (existingMediaId == 0)\r
\r
if (existingMediaId == 0)\r
existingMediaId = ItemManagerExtensions.getExistingRundownMedia(manager, sourceFileName.replace(MXFEXT, ""));\r
-\r
String targetFileName;\r
if (RANDOMIZE_ARCHIVES) {\r
// a-z, A-Z, 0-9. For example: WRMcpIk7, s57JwCVA\r
private Marker marker;\r
\r
protected void afterRestore(StoreUri targetUri, String targetPath, int killDateDays, String targetFileName) throws IOException, Exception {\r
- if (killDateDays > 0)\r
+ if (killDateDays != 0)\r
EscortFiles.createUNCKillDate(targetPath, targetFileName, killDateDays, marker);\r
}\r
\r
});\r
RemoteFile result = sourceUri.transferFrom(targetUri, sourceFileName, targetFileName);\r
\r
- String globalTargetPath = Paths.get(targetPath, targetFileName).getParent().toString().replace(Paths.get(localRetrievePath).toString(),\r
- globalRetrievePath);\r
+ String globalTargetPath = Paths.get(targetPath, targetFileName)\r
+ .getParent()\r
+ .toString()\r
+ .replace(Paths.get(localRetrievePath).toString(), globalRetrievePath);\r
\r
logger.info(marker,\r
"Az '{}' állomány visszatöltése sikeres volt '{}' néven. A célmappa a <a href='{}' target='_blank'>ide kattintva</a> nyitható meg.",\r
package user.jobengine.server.steps;\r
\r
+import java.nio.file.Path;\r
import java.nio.file.Paths;\r
\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
\r
import user.commons.mediaarea.MediaArea;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+import user.jobengine.server.steps.shared.EscortFiles;\r
import user.jobengine.server.steps.shared.ExternalCommandExecutor;\r
-import user.jobengine.server.steps.shared.IExternalCallback;\r
\r
-/*\r
-import user.jobengine.server.steps.shared.ExternalProfile;\r
-import user.jobengine.server.steps.shared.ExternalProfilesConfig;\r
- */\r
-public class TranscodeFFMpegStep extends JobStep implements IExternalCallback {\r
+public class TranscodeFFMpegStep extends JobStep {\r
private static final Logger logger = LogManager.getLogger();\r
private long allFrameCount;\r
private long processedFrameCount;\r
\r
@StepEntry\r
public Object[] execute(String input, String output, String profile) throws Exception {\r
- try {\r
- MediaArea ma = new MediaArea(Paths.get(input));\r
- ma.process();\r
- allFrameCount = ma.getFrameCount();\r
-\r
- ExternalCommandExecutor executor = new ExternalCommandExecutor();\r
- executor.execute(profile, input, output, this);\r
- } catch (Exception e) {\r
- logger.error(getMarker(), "Media information not available. System message: {}", e.getMessage());\r
- throw e;\r
- }\r
+ Path inputPath = Paths.get(input);\r
+ MediaArea ma = new MediaArea(inputPath);\r
+ ma.process();\r
+ allFrameCount = ma.getFrameCount();\r
+\r
+ Timecode timecode = new Timecode(allFrameCount, Type.PAL);\r
+ setDescription("Transcoding file {}, profile {}, media length {} ({} frames)", inputPath.getFileName(), profile, timecode, allFrameCount);\r
+\r
+ Path lowresPath = Paths.get(output).getParent();\r
+ logger.info("Ensure path exists {}", lowresPath);\r
+ EscortFiles.ensureUNCFolder(lowresPath);\r
+\r
+ ExternalCommandExecutor executor = new ExternalCommandExecutor();\r
+ executor.execute(profile, input, output, l -> {\r
+ onResponse(l);\r
+ });\r
return null;\r
}\r
\r
- @Override\r
public void onResponse(String line) {\r
String[] values = line.split("=");\r
if ("frame".equals(values[0])) {\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
try {\r
+ Set<PosixFilePermission> perms = PosixFilePermissions.fromString("rwxrwxrwx");\r
+ FileAttribute<Set<PosixFilePermission>> attr = PosixFilePermissions.asFileAttribute(perms);\r
Files.createDirectories(filePath, attr);\r
} catch (Exception e) {\r
- // logger.catching(e);\r
+ //logger.catching(e);\r
try {\r
Files.createDirectories(filePath);\r
} catch (Exception e1) {\r
- logger.catching(e);\r
- throw e;\r
+ logger.catching(e1);\r
+ throw e1;\r
}\r
}\r
}\r
package user.jobengine.server.steps.shared;\r
\r
+import java.nio.file.Path;\r
+\r
import com.ibm.nosql.json.api.BasicDBObject;\r
\r
+import user.commons.RemoteFile;\r
+import user.commons.StoreUri;\r
+import user.commons.remotestore.RemoteStoreProtocol;\r
import user.jobengine.db.IItemManager;\r
import user.jobengine.db.IResultSetConsumer;\r
+import user.jobengine.db.Store;\r
\r
public class ItemManagerExtensions {\r
\r
}\r
\r
public static long getExistingRundownMedia(IItemManager manager, String houseid) {\r
- final long[] result = { 0 };\r
- final String[] idToCheck = { houseid };\r
+ final long[] result = new long[] { 0 };\r
+ final String[] idToCheck = new String[] { houseid };\r
int pos = houseid.lastIndexOf("-");\r
//a hivas a CopyForArchiveNEXIOMaterialsStep-bol is johet, ott meg nincs idobelyegezve a nev!\r
if (pos > 0 && houseid.length() - pos > 4)\r
return result[0];\r
}\r
\r
+ static public boolean isArchived(IItemManager manager, Path filePath) {\r
+ boolean result = false;\r
+ String name = filePath.getFileName().toString();\r
+ String[] tsmName = new String[] { null };\r
+ String query = String.format("SELECT relativepath FROM MEDIAFILE WHERE houseid = '%s'", name);\r
+ manager.executeQuery(query, rs -> {\r
+ tsmName[0] = rs.getString("relativepath");\r
+ return false;\r
+ }, null);\r
+\r
+ Store tsmStore = manager.getSystemStore(false);\r
+ if (tsmStore == null)\r
+ throw new NullPointerException("A TSM bejegyzés nem található!");\r
+\r
+ StoreUri tsmStoreUri = tsmStore.getSourceStoreUri(RemoteStoreProtocol.TSM);\r
+ if (tsmStoreUri == null)\r
+ throw new NullPointerException("A TSM forrás elérése nem található!");\r
+\r
+ if (tsmName[0] != null) {\r
+ try {\r
+ RemoteFile remoteFile = tsmStoreUri.getRemoteFile(tsmName[0]);\r
+ result = remoteFile != null;\r
+ } catch (Exception e) {\r
+ result = false;\r
+ } finally {\r
+ tsmStoreUri.cleanUp();\r
+ }\r
+ }\r
+ return result;\r
+ }\r
}\r
private static final String HYPHEN = "-";\r
private static final String DOT = ".";\r
\r
- private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}$";\r
- private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+$";\r
- private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+$";\r
- private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}$";\r
+ private static final String REGEXP_TRAFFICMATERIALID = "^M{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_TRAFFICADID = "^R{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_TRAFFICPROMOID = "^P{1}[0-9]{6}[A-Z]{1}";\r
+ private static final String REGEXP_OCTOPUSSTORYID = "^[0-9]+";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERID = "^[0-9]+_[0-9]+";\r
+ private static final String REGEXP_OCTOPUSPLACEHOLDERVERSIONEDID = "^[0-9]+_[0-9]+-[0-9]{3}";\r
\r
public static MetadataType GuessMetadataType(String id) {\r
if (StringUtils.isBlank(id))\r
setSessionName(parent.getSessionName());\r
setTo(parent.getTo());\r
setUseSessionLog(parent.isUseSessionLog());\r
+ setParents(parent);\r
}\r
\r
public MediaCubeFinishMarker(MediaCubeMarker parent, String to) {\r
super(to);\r
setSessionID(parent.getSessionID());\r
setSessionName(parent.getSessionName());\r
+ setParents(parent);\r
}\r
}\r
package user.commons.remotestore;\r
\r
+import java.io.FileNotFoundException;\r
import java.io.IOException;\r
import java.io.InputStream;\r
import java.io.OutputStream;\r
ftpClient.login(userName, storeUri.getPassword());\r
ftpClient.setFileType(FTP.BINARY_FILE_TYPE);\r
ftpClient.enterLocalPassiveMode();\r
+\r
+ //210510 ha tud, akkor menjen a gyoker konyvtarba ld. AMC ISILON valtas\r
+ ftpClient.changeWorkingDirectory("/");\r
+\r
if (pathElements.length > 1) {\r
for (int i = 1; i < pathElements.length; i++) {\r
ftpClient.changeWorkingDirectory(pathElements[i]);\r
}\r
}\r
\r
+ logger.info("Current working directory is {}", ftpClient.printWorkingDirectory());\r
return ftpClient;\r
}\r
\r
// cleanUp();\r
}\r
if (result == null)\r
- throw new Exception("File not exists: " + fileName + " on uri " + storeUri);\r
+ throw new FileNotFoundException(storeUri.toString() + "/" + fileName);\r
return result;\r
}\r
\r
\r
import java.io.File;\r
import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
import java.io.FileOutputStream;\r
import java.io.IOException;\r
import java.io.InputStream;\r
}\r
\r
@Override\r
- public void delete(RemoteFile remoteFile) {\r
- // TODO Auto-generated method stub\r
-\r
+ public void delete(RemoteFile remoteFile) throws Exception {\r
+ String path = storeUri.toString(true);\r
+ File file = new File(path + remoteFile.getName());\r
+ if (file.exists() && !file.isDirectory())\r
+ file.delete();\r
}\r
\r
@Override\r
public RemoteFile get(String fileName) throws Exception {\r
String path = storeUri.toString(true);\r
File file = new File(path + fileName);\r
+\r
+ if (!file.exists())\r
+ throw new FileNotFoundException(storeUri.toString() + "/" + fileName);\r
+\r
return toRemoteFile(file);\r
}\r
\r
org.apache.commons.io.output;version="2.2.0",
org.apache.logging.log4j;version="2.8.2",
org.apache.logging.log4j.message;version="2.8.2",
+ org.codehaus.groovy.ast;version="3.0.3",
+ org.codehaus.groovy.classgen;version="3.0.3",
+ org.codehaus.groovy.control;version="3.0.3",
+ org.codehaus.groovy.control.customizers;version="3.0.3",
org.eclipse.core.runtime.adaptor,
org.eclipse.osgi.framework.console;version="1.1.0",
org.jboss.resteasy.client.jaxrs,
static final int QUEUE_POLL_INTERVAL_MS = 50;
static final String DEFAULT_OWNER = "MediaCube";
- void addJobChangedEventListener(IJobChangedListener listener);
-
- void addManagedJobChangedListener(IJobChangedListener listener);
+ boolean addJobChangedEventListener(IJobChangedListener listener);
void addToExecutorQueue(IJobRuntime jobRuntime);
void jobCleanup(IJobRuntime jobRuntime);
- void keepAliveJobChangedListener(IJobChangedListener listener);
+ boolean keepAliveJobChangedListener(IJobChangedListener listener);
void keepAliveWorker(String remoteAddr);
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.PriorityBlockingQueue;
private AtomicLong nextJobId;
private SchedulerService schedulerService = null;
- private List<IJobChangedListener> jobChangedListenerList = new CopyOnWriteArrayList<>();
+ private Set<IJobChangedListener> jobChangedListenerList = ConcurrentHashMap.newKeySet();
private Map<String, LocalDate> remoteWorkers;
private String masterServerAddress = System.getProperty("jobengine.master.server", "");
private final JobEngineRemote remoteEngine;
}
@Override
- public void addJobChangedEventListener(IJobChangedListener listener) {
- if (listener != null && !keepAliveJobChangedListeners.containsKey(listener)) {
+ public boolean addJobChangedEventListener(IJobChangedListener listener) {
+ boolean result = !jobChangedListenerList.contains(listener);
+ if (listener != null && result)
jobChangedListenerList.add(listener);
- }
- }
- @Override
- public void addManagedJobChangedListener(IJobChangedListener listener) {
- if (listener != null) {
- jobChangedListenerList.add(listener);
- keepAliveJobChangedListeners.put(listener, System.currentTimeMillis());
- logger.info("Managed listener added {}", listener);
- }
+ return result;
}
@Override
}
@Override
- public void keepAliveJobChangedListener(IJobChangedListener listener) {
+ public boolean keepAliveJobChangedListener(IJobChangedListener listener) {
+ boolean result = false;
if (keepAliveJobChangedListeners != null) {
long now = System.currentTimeMillis();
//ha mar hozza van adva, nem adja hozza
- addJobChangedEventListener(listener);
+ result = addJobChangedEventListener(listener);
keepAliveJobChangedListeners.put(listener, now);
- //logger.info("Refreshing listener {}, now {} ({})", listener, now, keepAliveJobChangedListeners.size());
+ logger.debug("Refreshing listener {}, now {} ({})", listener, now, keepAliveJobChangedListeners.size());
}
+
+ return result;
}
@Deprecated
if ((now - lastMod) > 5 * 1000) {
toBeRemoved.add(listener);
- logger.info("{} refreshed {}, now {}", listener, lastMod, now);
+ logger.debug("{} refreshed {}, now {}", listener, lastMod, now);
}
}
toBeRemoved.forEach(r -> {
- logger.info("Removing listener {}", r);
+ logger.debug("Removing listener {}", r);
removeJobChangedEventListener(r);
keepAliveJobChangedListeners.remove(r);
});
import java.io.FileNotFoundException;\r
import java.io.IOException;\r
import java.io.InputStream;\r
+import java.net.MalformedURLException;\r
import java.net.URL;\r
import java.net.URLClassLoader;\r
import java.nio.file.Files;\r
import java.nio.file.Path;\r
import java.nio.file.Paths;\r
+import java.security.CodeSource;\r
import java.util.ArrayList;\r
import java.util.Collections;\r
import java.util.LinkedHashMap;\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
+import org.codehaus.groovy.control.CompilationUnit;\r
+import org.codehaus.groovy.control.CompilerConfiguration;\r
\r
import com.ibm.nosql.json.JSONUtil;\r
import com.ibm.nosql.json.api.BasicDBList;\r
private final Map<String, IProgram> programs = new LinkedHashMap<String, IProgram>();\r
private final List<JobTemplate> templates = Collections.synchronizedList(new ArrayList<JobTemplate>());\r
private final Map<String, BasicDBObject> schedules = new LinkedHashMap<String, BasicDBObject>();\r
+ private URLClassLoader stepsClassLoader;\r
\r
public synchronized void bindSystemConfiguration(Object service) {\r
if (service instanceof IConfiguration) {\r
}\r
}\r
\r
+ private GroovyClassLoader createGroovyClassLoader(URLClassLoader stepsClassLoader) throws FileNotFoundException {\r
+ String stepsDir = systemConfig.getConfig(DIR_STEPS);\r
+ GroovyClassLoader gcl = new GroovyClassLoader(stepsClassLoader) {\r
+\r
+ @Override\r
+ protected CompilationUnit createCompilationUnit(CompilerConfiguration config, CodeSource source) {\r
+ CompilationUnit result = new CompilationUnit(config, source, this);\r
+ loadStepSources(result, Paths.get(stepsDir, "shared"));\r
+ loadStepSources(result, Paths.get(stepsDir));\r
+ return result;\r
+ }\r
+\r
+ };\r
+ return gcl;\r
+ }\r
+\r
@SuppressWarnings("unchecked")\r
@Override\r
public IJobStep createJobStep(String stepUnitName) throws Exception {\r
IJobStep result = null;\r
\r
boolean isGroovyClass = stepUnitName.toLowerCase().endsWith(".java") || stepUnitName.toLowerCase().endsWith(".groovy");\r
+ logger.info("Looking for {} step classloader requirement", stepUnitName);\r
\r
- URLClassLoader stepsClassLoader = null;\r
- try {\r
- String stepClassesDir = systemConfig.getConfig(DIR_CLASSES);\r
- Path path = Paths.get(stepClassesDir);\r
- URL[] urls = { path.toUri().toURL() };\r
- stepsClassLoader = URLClassLoader.newInstance(urls, Thread.currentThread().getContextClassLoader());\r
- } catch (FileNotFoundException e) {\r
- //nincs jobs/classes mappa\r
- URL[] urls = {};\r
- stepsClassLoader = URLClassLoader.newInstance(urls, Thread.currentThread().getContextClassLoader());\r
- }\r
+ if (stepsClassLoader == null)\r
+ stepsClassLoader = createParentClassLoader();\r
\r
Class<IJobStep> stepClass = null;\r
\r
if (isGroovyClass) {\r
- try {\r
- GroovyClassLoader gcl = new GroovyClassLoader(stepsClassLoader);\r
- String stepsDir = systemConfig.getConfig(DIR_STEPS);\r
- stepClass = (Class<IJobStep>) parseClassHierarchy(gcl, stepsDir, stepUnitName);\r
- } catch (Exception e) {\r
- throw e;\r
- }\r
-\r
+ logger.info("Creating GroovyClassLoader");\r
+ GroovyClassLoader gcl = createGroovyClassLoader(stepsClassLoader);\r
+ stepClass = (Class<IJobStep>) loadClassFromSourceCode(gcl, stepUnitName);\r
} else\r
stepClass = (Class<IJobStep>) stepsClassLoader.loadClass(stepUnitName);\r
\r
- if (stepClass == null) {\r
- throw new Exception("Missing " + stepUnitName);\r
- }\r
+ if (stepClass == null)\r
+ throw new Exception("Cant load " + stepUnitName);\r
+\r
result = stepClass.newInstance();\r
+ logger.info("Class for step {} successfully created", stepUnitName);\r
\r
return result;\r
}\r
\r
+ private URLClassLoader createParentClassLoader() throws MalformedURLException {\r
+ try {\r
+ String stepClassesDir = systemConfig.getConfig(DIR_CLASSES);\r
+ Path path = Paths.get(stepClassesDir);\r
+ URL[] urls = { path.toUri().toURL() };\r
+ logger.info("Creating URLClassLoader with {}", this.getClass().getClassLoader());\r
+ // stepsClassLoader = URLClassLoader.newInstance(urls, Thread.currentThread().getContextClassLoader());\r
+ stepsClassLoader = URLClassLoader.newInstance(urls, Thread.currentThread().getContextClassLoader());\r
+ } catch (FileNotFoundException e) {\r
+ //nincs jobs/classes mappa\r
+ URL[] urls = {};\r
+ logger.info("Creating URLClassLoader");\r
+ // stepsClassLoader = URLClassLoader.newInstance(urls, Thread.currentThread().getContextClassLoader());\r
+ stepsClassLoader = URLClassLoader.newInstance(urls, this.getClass().getClassLoader());\r
+ }\r
+ return stepsClassLoader;\r
+ }\r
+\r
@Override\r
public ScheduledJob createScheduledJob(BasicDBObject jobJSON, IJobEngine jobEngine) {\r
ScheduledJob sj = new ScheduledJob();\r
loadSchedules();\r
}\r
\r
+ private Class<?> loadClassFromSourceCode(GroovyClassLoader gcl, String className) throws IOException {\r
+ Class<?> result = null;\r
+\r
+ String stepsDir = systemConfig.getConfig(DIR_STEPS);\r
+ Path path = Paths.get(stepsDir, className);\r
+ if (!path.toFile().exists())\r
+ return result;\r
+\r
+ result = gcl.parseClass(path.toFile());\r
+ if (result != null)\r
+ logger.info("Successfully loaded {}", className);\r
+ return result;\r
+ }\r
+\r
@Override\r
public void loadExecutors(IJobEngine jobEngine, boolean autoStart) {\r
InputStream stream = null;\r
BasicDBObject dbo = (BasicDBObject) JSONUtil.jsonToDbObject(jsonConfig);\r
BasicDBList scheduleJobs = NoSQLUtils.asDBList(dbo, "joblist");\r
scheduleJobs.forEach(o -> {\r
- BasicDBObject j = (BasicDBObject) o;\r
- schedules.put(j.getString("template"), j);\r
+ try {\r
+ BasicDBObject j = (BasicDBObject) o;\r
+ String template = j.getString("template");\r
+ String xml = loadTemplateXml(template);\r
+ j.put("xml", xml);\r
+ schedules.put(template, j);\r
+ } catch (Exception e) {\r
+ logger.error("Scheduled job error! {}", e.getMessage());\r
+ }\r
+\r
});\r
}\r
\r
+ private void loadStepSources(CompilationUnit compilationUnit, Path path) {\r
+ if (path.toFile().isDirectory()) {\r
+ Predicate<Path> filter = file -> !Files.isDirectory(file) && file.getFileName().toString().endsWith(".java");\r
+ try (Stream<Path> stream = Files.list(path)) {\r
+ stream.filter(filter).forEach(p -> {\r
+ compilationUnit.addSource(p.toFile());\r
+ });\r
+ } catch (Exception e) {\r
+ }\r
+\r
+ }\r
+ }\r
+\r
private void loadTemplate(Path config) {\r
InputStream stream = null;\r
try {\r
}\r
return result;\r
}\r
-\r
- private Class<?> parseClassHierarchy(GroovyClassLoader cl, String root, String className) throws IOException {\r
- Path path = Paths.get(root, className);\r
-\r
- Class<?> result = null;\r
- if (!path.toFile().exists())\r
- return result;\r
- List<String> lines = Files.readAllLines(path);\r
-\r
- String packageName = null;\r
- for (String line : lines) {\r
- String trimmedLine = line.trim();\r
- if (trimmedLine.startsWith("package")) {\r
- String[] tokens = trimmedLine.split(" ");\r
- packageName = tokens[1].trim().replace(";", "");\r
- }\r
-\r
- if (trimmedLine.startsWith("import") && trimmedLine.contains(packageName)) {\r
- String[] tokens = trimmedLine.split("\\.");\r
- String name = tokens[tokens.length - 1];\r
- name = name.replace(";", "");\r
- logger.info("Try loading imported file {}", name);\r
- parseClassHierarchy(cl, root, name + ".java");\r
- }\r
-\r
- if (trimmedLine.contains("extends")) {\r
- String[] tokens = trimmedLine.split("extends");\r
- String parent = tokens[tokens.length - 1];\r
- parent = parent.replace("{", "").trim();\r
- //logger.info("Class {} needs parent class {}", className, parent);\r
- logger.info("Try loading parent file {}", parent);\r
- parseClassHierarchy(cl, root, parent + ".java");\r
- break;\r
- }\r
- }\r
- result = cl.parseClass(path.toFile());\r
- return result;\r
- }\r
}\r
logger.error("Error in {}", jobRuntime);
Throwable t = e.getCause() == null ? e : e.getCause();
logger.catching(t);
- if (JobStatus.EXECUTING.equals(jobRuntime.getStatus()))
- jobEngine.suspendExecutingJob(t, jobRuntime);
- if (JobStatus.WAIT_EXECUTOR.equals(jobRuntime.getStatus()))
- jobEngine.suspendWaitExecutorJob(t, jobRuntime);
+
+ if (jobRuntime != null) {
+ logger.error(jobRuntime.getSessionMarker(), t.getMessage());
+ if (JobStatus.EXECUTING.equals(jobRuntime.getStatus()))
+ jobEngine.suspendExecutingJob(t, jobRuntime);
+ if (JobStatus.WAIT_EXECUTOR.equals(jobRuntime.getStatus()))
+ jobEngine.suspendWaitExecutorJob(t, jobRuntime);
+ }
} finally {
if (step != null) {
step.cleanup();
if (step != null) {
ClassLoader cl = step.getClass().getClassLoader();
if (cl instanceof GroovyClassLoader) {
- URLClassLoader parentCl = (URLClassLoader) cl.getParent();
- GroovyClassLoader groovyCl = (GroovyClassLoader) cl;
- groovyCl.close();
- parentCl.close();
+
+ GroovyClassLoader stepClassLoader = (GroovyClassLoader) cl;
+ stepClassLoader.close();
+
+ URLClassLoader stepParentClassLoader = (URLClassLoader) cl.getParent();
+ stepParentClassLoader.close();
+ } else if (cl instanceof URLClassLoader) {
+ URLClassLoader stepClassLoader = (URLClassLoader) cl;
+ stepClassLoader.close();
+
}
}
}
import org.apache.logging.log4j.Logger;\r
import org.apache.logging.log4j.Marker;\r
import org.apache.logging.log4j.MarkerManager;\r
+import org.apache.logging.log4j.message.Message;\r
+import org.apache.logging.log4j.message.ParameterizedMessage;\r
import org.osgi.framework.Bundle;\r
import org.osgi.framework.BundleContext;\r
import org.osgi.framework.FrameworkUtil;\r
return result;\r
}\r
\r
+ protected void setDescription(String description, Object... arguments) {\r
+ Message msg = new ParameterizedMessage(description, arguments);\r
+ getJobRuntime().setDescription(msg.getFormattedMessage());\r
+ }\r
+\r
protected void setProgress(int progress) {\r
if (jobRuntime != null)\r
jobRuntime.incrementProgress(progress);\r
<?xml version="1.0" encoding="UTF-8"?>\r
<window id="resultWin" title="Folyamat paraméterei" width="400px" border="normal" apply="org.zkoss.bind.BindComposer"\r
viewModel="@id('jlm') @init('user.jobengine.zk.model.JobParametersModel')" forward="onCancel=closeButton.onClick">\r
- <grid sizedByContent="false" span="true" model="@bind(jlm.selectedJob.parameters)" vflex="true" style="border: none; background: #e3e3e3 !important;"\r
+ <vlayout>\r
+ <hlayout>\r
+ <label value="Végrehajtás alatt:" />\r
+ <label value="@bind(jlm.selectedJob.currentStep)" />\r
+ </hlayout>\r
+ <grid sizedByContent="false" span="true" model="@bind(jlm.selectedJob.parameters)" vflex="true"\r
oddRowSclass="listbox-odd-style" sclass="listbox-normal-style">\r
<columns>\r
<column label="" hflex="1" align="left" />\r
</template>\r
</rows>\r
</grid>\r
- <hbox width="100%" pack="center" align="center">\r
- <button id="closeButton" label="Bezár" onClick="@command('close')" />\r
- </hbox>\r
+ <hbox width="100%" pack="center" align="center">\r
+ <button id="closeButton" label="Bezár" onClick="@command('close')" />\r
+ </hbox>\r
+ </vlayout>\r
</window>\r
\r
@Override\r
protected void doKeepAlive() {\r
- jobEngine.keepAliveJobChangedListener(this);\r
- //logger.info("Listener refreshed");\r
+ if (jobEngine.keepAliveJobChangedListener(this)) {\r
+ //ujra hozzadadtuk, refresh\r
+ initializeList();\r
+ }\r
}\r
\r
@Command\r
package user.jobengine.zk.model;\r
\r
import java.text.ParseException;\r
+import java.util.ArrayList;\r
+import java.util.Collections;\r
import java.util.Date;\r
+import java.util.List;\r
\r
import org.apache.commons.lang.StringUtils;\r
import org.apache.logging.log4j.LogManager;\r
@Init\r
public void init() {\r
this.jobEngine = (IJobEngine) Executions.getCurrent().getArg().get("jobEngine");\r
- jobs = new ListModelList<>(jobEngine.getJobEngineConfiguration().getSchedules().values());\r
+\r
+ initJobList();\r
+ }\r
+\r
+ private void initJobList() {\r
+ List<BasicDBObject> jobsCollection = new ArrayList<>(jobEngine.getJobEngineConfiguration().getSchedules().values());\r
+ Collections.sort(jobsCollection, (a, b) -> {\r
+ String aName = a.getString("name");\r
+ if (aName == null)\r
+ aName = a.getString("template");\r
+ String bName = b.getString("name");\r
+ if (bName == null)\r
+ bName = b.getString("template");\r
+ return aName.toLowerCase().compareTo(bName.toLowerCase());\r
+ });\r
+ jobs = new ListModelList<>(jobsCollection);\r
+\r
}\r
\r
@Command\r
SchedulerService scheduler = jobEngine.getScheduler();\r
try {\r
scheduler.restart();\r
- jobs = new ListModelList<>(jobEngine.getJobEngineConfiguration().getSchedules().values());\r
+ initJobList();\r
+\r
} catch (Exception e) {\r
logger.info("Scheduler reload error. System message: {}", e.getMessage());\r
}\r
if (selectedJob == null)\r
return;\r
\r
- String template = selectedJob.getString(TEMPLATE);\r
- String xml = jobEngine.getJobEngineConfiguration().loadTemplateXml(template);\r
- selectedJob.put(XML, xml);\r
-\r
String cronExpression = selectedJob.getString(CRONEXPRESSION);\r
if (StringUtils.isBlank(cronExpression))\r
return;\r
// setAttribute(JOBLISTENER, listener);\r
\r
IJobEngine jobEngine = ComponentBinder.getJobEngine();\r
- if (jobEngine != null) {\r
- jobEngine.addManagedJobChangedListener(listener);\r
- }\r
+ if (jobEngine != null)\r
+ jobEngine.addJobChangedEventListener(listener);\r
+\r
}\r
\r
static public void setAttribute(String name, Object obj) {\r