import com.ibm.nosql.json.api.BasicDBObject;\r
\r
import groovy.lang.GroovyClassLoader;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
import user.jobengine.db.Media;\r
import user.jobengine.server.steps.ArchiveItem;\r
import user.jobengine.server.steps.EscortFiles;\r
assertFalse(catched.toFile().exists());\r
assertFalse(EscortFiles.isMediaCatched(sut));\r
}\r
+\r
+ @Test\r
+ public void test9998() throws Exception {\r
+ Long x = 35739L;\r
+ Timecode sut = new Timecode(x, Type.PAL);\r
+\r
+ System.out.println(sut.toString());\r
+ }\r
+\r
}\r
</variables>\r
</declarations>\r
<commands>\r
- <calljobstep id="step1" type="user.jobengine.server.steps.ArchiveListBuilderStep" weight="1">\r
+ <calljobstep id="step1" type="ArchiveListBuilderStep.java" weight="1">\r
<inputs>\r
<input>\r
<parameter name="sourcePath" />\r
</outputs>\r
</calljobstep>\r
\r
- <calljobstep id="step2" type="user.jobengine.server.steps.ArchiveMaterialSubmitStep" weight="1">\r
+ <calljobstep id="step2" type="ArchiveMaterialSubmitStep.java" weight="1">\r
<inputs>\r
<input>\r
<variable name="archiveList" />\r
import java.nio.file.Path;\r
import java.nio.file.Paths;\r
import java.nio.file.attribute.BasicFileAttributes;\r
-import java.nio.file.attribute.FileAttribute;\r
-import java.nio.file.attribute.PosixFilePermission;\r
-import java.nio.file.attribute.PosixFilePermissions;\r
import java.text.SimpleDateFormat;\r
import java.util.Arrays;\r
-import java.util.Date;\r
import java.util.List;\r
import java.util.Map;\r
-import java.util.Set;\r
\r
import org.apache.commons.io.FilenameUtils;\r
import org.apache.commons.lang.StringUtils;\r
private static final String ARCHIVE = "Archiválás";\r
private static final String ARCHIVE_ITEM = "archiveItem";\r
private static final String KILL_DATE_DAYS = "killDateDays";\r
- private static final String CONFLICT = ".CONFLICT";\r
private SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");\r
- private String sourcePath;\r
\r
- private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", "Transfered", "VASAROLT", EscortFiles.STATUSFOLDER, EscortFiles.CONFLICTFOLDER);\r
+ private List<String> skipPathNames = Arrays.asList("!ARCHIVALAS_ALATT", "VASAROLT", EscortFiles.STATUSFOLDER, EscortFiles.CONFLICTFOLDER);\r
private int limit;\r
private int submitted;\r
private int killDateDays;\r
}\r
\r
@StepEntry\r
- public Object[] execute(String sourcePath, int killDateDays, int limit) {\r
- this.sourcePath = sourcePath;\r
+ public Object[] execute(String sourcePath, int killDateDays, int limit) throws Exception {\r
this.killDateDays = killDateDays;\r
this.limit = limit;\r
try {\r
- Files.walkFileTree(Paths.get(sourcePath), this);\r
+ if (getJobRuntime().forkPrepare()) {\r
+ Files.walkFileTree(Paths.get(sourcePath), this);\r
+ }\r
} catch (Exception e) {\r
logger.error(getSessionMarker(), "Az '{}' mappa elérése sikertelen. A rendszer hibaüzenete: {}", sourcePath, e.getMessage());\r
+ } finally {\r
+ if (submitted > 0)\r
+ getJobRuntime().forkWaitComplete();\r
+ else\r
+ getJobRuntime().cancelForkPrepare();\r
+\r
}\r
return null;\r
}\r
return result;\r
}\r
\r
- private boolean handleArchiveConflict(Path sourcePath) throws Exception {\r
+ private boolean handleArchiveConflict(Path mediaPath) throws Exception {\r
boolean result = false;\r
- String sourceFileName = sourcePath.getFileName().toString();\r
+ String sourceFileName = mediaPath.getFileName().toString();\r
if (getManager().isMediaFileExists(sourceFileName)) {\r
- try {\r
- Path parent = sourcePath.getParent();\r
- Path conflictPath = Paths.get(parent.toString(), CONFLICT);\r
- File folder = conflictPath.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
- Files.createDirectories(conflictPath, attr);\r
- } catch (Exception e) {\r
- try {\r
- Files.createDirectory(conflictPath);\r
- } catch (Exception e1) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
- }\r
- }\r
-\r
- Path conflictFile = Paths.get(conflictPath.toString(), sourceFileName);\r
- if (conflictFile.toFile().exists())\r
- conflictFile = Paths.get(conflictPath.toString(), sourceFileName + (new Date()).getTime());\r
- Files.move(sourcePath, conflictFile);\r
- result = true;\r
- } catch (Exception e1) {\r
- logger.error(getSessionMarker(), "Hiba az '{}' állomány mappába mozgatásakor. A rendszer üzenete: {}", CONFLICT, e1.getMessage());\r
- }\r
+ EscortFiles.createMediaCatch(mediaPath);\r
+ result = true;\r
+\r
+ // try {\r
+ // Path parent = sourcePath.getParent();\r
+ // Path conflictPath = Paths.get(parent.toString(), CONFLICT);\r
+ // File folder = conflictPath.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
+ // Files.createDirectories(conflictPath, attr);\r
+ // } catch (Exception e) {\r
+ // try {\r
+ // Files.createDirectory(conflictPath);\r
+ // } catch (Exception e1) {\r
+ // logger.catching(e);\r
+ // throw e;\r
+ // }\r
+ // }\r
+ // }\r
+ //\r
+ // Path conflictFile = Paths.get(conflictPath.toString(), sourceFileName);\r
+ // if (conflictFile.toFile().exists())\r
+ // conflictFile = Paths.get(conflictPath.toString(), sourceFileName + (new Date()).getTime());\r
+ // Files.move(sourcePath, conflictFile);\r
+ // result = true;\r
+ // } catch (Exception e1) {\r
+ // logger.error(getSessionMarker(), "Hiba az '{}' állomány mappába mozgatásakor. A rendszer üzenete: {}", CONFLICT, e1.getMessage());\r
+ // }\r
}\r
\r
return result;\r
@Override\r
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes paramBasicFileAttributes) throws IOException {\r
Path dirName = dir.getFileName();\r
+ logger.info("PreVisit {}", dir);\r
\r
- if (skipPathNames.contains(dirName.toString())) {\r
- //logger.info("Skipping {}", dir);\r
+ if (skipPathNames.contains(dirName.toString()))\r
return FileVisitResult.SKIP_SUBTREE;\r
- } else\r
+ else\r
logger.info("PreVisit {}", dir);\r
\r
return FileVisitResult.CONTINUE;\r
if (submitted == limit)\r
return false;\r
\r
+ // if (!"Transfered".equals(mediaPath.getParent().getFileName().toString()))\r
+ // return false;\r
+\r
+ if (mediaPath.getFileName().toString().startsWith("."))\r
+ return false;\r
+\r
File mediaFile = mediaPath.toFile();\r
if (mediaFile.isDirectory())\r
return false;\r
if (EscortFiles.isMediaCatched(mediaPath))\r
return false;\r
\r
- if (!canReadMediaInfo(mediaPath))\r
+ if (handleArchiveConflict(mediaPath))\r
return false;\r
\r
- if (handleArchiveConflict(mediaPath))\r
+ if (!canReadMediaInfo(mediaPath))\r
return false;\r
\r
ArchiveItem archiveItem = createArchiveItem(mediaPath);\r
submitted++;\r
\r
Map<String, Object> parameters = ListUtils.asMap(ARCHIVE_ITEM, archiveItem, KILL_DATE_DAYS, killDateDays);\r
- IJobRuntime runtime = getEngine().submit(null, e -> {\r
+ IJobRuntime runtime = getEngine().submit(getJobRuntime(), e -> {\r
if (e.getStatus().equals(JobStatus.CANCELED) || e.getStatus().equals(JobStatus.SUSPENDED))\r
EscortFiles.removeMediaCatch(mediaPath);\r
}, JOBTEMPLATE, ARCHIVE, 1, IJobEngine.DEFAULT_OWNER, parameters);\r
if (runtime == null)\r
throw new Exception("Submit returned null runtime");\r
-\r
+ runtime.setRelated(mediaPath.toString());\r
EscortFiles.createMediaCatch(mediaPath);\r
} catch (Exception e) {\r
String fileName = new File(archiveItem.getMediaFile()).getName();\r
import org.apache.logging.log4j.Logger;\r
\r
import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
import user.commons.remotestore.IProgressEventListener;\r
import user.commons.remotestore.IStatusEventListener;\r
import user.commons.remotestore.ProgressEvent;\r
Media media = getManager().getMedia(mediaId);\r
MediaFile mediaFile = getManager().getSystemMediaFile(media);\r
fileName = mediaFile.getRelativePath();\r
- getJobRuntime().setDescription(String.format("%s (%d frames)", fileName, media.getLength()));\r
+ Timecode timecode = new Timecode(media.getLength(), Type.PAL);\r
+ getJobRuntime().setDescription(String.format("%s (%s)", fileName, timecode.toString()));\r
Store tsmStore = getManager().getSystemStore(false);\r
StoreUri sourceStoreUri = getManager().getStoreUri(tsmStore.getName(), RemoteStoreProtocol.TSM);\r
sourceStoreUri.addProgressListener(new IProgressEventListener() {\r
*/\r
public static void createMediaCatch(Path mediaFile) throws IOException {\r
Path catchedFile = createMediaCathFilePath(mediaFile);\r
- ensureUNCFolder(mediaFile.getParent());\r
+ ensureUNCFolder(catchedFile.getParent());\r
Files.createFile(catchedFile);\r
}\r
\r
\r
import user.commons.RemoteFile;\r
import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
import user.commons.remotestore.IProgressEventListener;\r
import user.commons.remotestore.IStatusEventListener;\r
import user.commons.remotestore.ProgressEvent;\r
\r
File sourceMediaFile = new File(archiveItem.getMediaFile());\r
String sourceFileName = sourceMediaFile.getName();\r
- String details = String.format("%s (%d bytes)", sourceFileName, sourceMediaFile.length());\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
try {\r
\r
setAndCheck(archiveItem, mediaCubeMedia, getEngine());\r
\r
- getJobRuntime().setDescription(details);\r
-\r
//TODO mxf helyett az osszes kiterjesztest!!!!!\r
//A dupla ellenorzes a napon beluli ismetlesek miatt kell\r
long existingMediaId = archiveItem.getExistingMediaId();\r
import user.commons.LogUtils;\r
import user.commons.RemoteFile;\r
import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
import user.commons.remotestore.IProgressEventListener;\r
import user.commons.remotestore.IStatusEventListener;\r
import user.commons.remotestore.ProgressEvent;\r
marker = jobRuntime.getSessionMarker();\r
setAndCheck(mediaCubeMedia, targetPath, targetNamePattern, localRetrievePath, globalRetrievePath, jobEngine);\r
String targetFileName = String.format(targetNamePattern, sourceFileName);\r
+ Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
try {\r
- String details = String.format("%s (%d frames)", sourceFileName, mediaCubeMedia.getLength());\r
+ String details = String.format("%s (%s)", sourceFileName, timecode.toString());\r
jobRuntime.setDescription(details);\r
beforeRestore(targetUri, targetNamePattern);\r
final IJobRuntime runtime = jobRuntime;\r
import user.commons.FFAStransAPI;\r
import user.commons.IFFAStransAPI;\r
import user.commons.StoreUri;\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
import user.commons.remotestore.RemoteStoreProtocol;\r
import user.jobengine.db.FileType;\r
import user.jobengine.db.IItemManager;\r
File sourceMediaFile = new File(archiveItem.getMediaFile());\r
logger.info("Transcoding {}", archiveItem.getMediaFile());\r
String sourceFileName = sourceMediaFile.getName();\r
- String details = String.format("%s (%d bytes)", sourceFileName, sourceMediaFile.length());\r
+ Timecode timecode = new Timecode(mediaCubeMedia.getLength(), Type.PAL);\r
+\r
+ String details = String.format("%s (%s, %d bytes)", sourceFileName, timecode.toString(), sourceMediaFile.length());\r
\r
StoreUri storeUri = store.getTargetStoreUri(RemoteStoreProtocol.LOCAL);\r
if (storeUri == null)\r
setFrames(frame);\r
}\r
\r
+ public Timecode(long frames, Type type) {\r
+ this((int) frames, type);\r
+ }\r
+\r
/** Creates a new CD timecode based on a string in the form HH:MM:SS:FF */\r
public Timecode(String timecode) throws Timecode.TimecodeException {\r
this(timecode, Type.CD);\r
public void removeJobChangedEventListener(IJobChangedListener listener) {
if (listener != null) {
jobChangedListenerList.remove(listener);
+ logger.info("Listeners left {}", jobChangedListenerList.size());
}
}
<!-- <listener> -->\r
<!-- <listener-class>user.jobengine.zk.util.WebAppCleanupListener</listener-class> -->\r
<!-- </listener> -->\r
-<!-- <listener> -->\r
-<!-- <listener-class>user.jobengine.zk.util.LifeCycleListener</listener-class> -->\r
-<!-- </listener> -->\r
+ <listener>\r
+ <listener-class>user.jobengine.zk.util.LifeCycleListener</listener-class>\r
+ </listener>\r
<!-- <listener> -->\r
<!-- <listener-class>org.zkoss.zk.ui.http.HttpSessionListener</listener-class> -->\r
<!-- </listener> -->\r
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>\r
+<?init class="user.jobengine.zk.util.AuthInitiator"?>\r
+<window id="joblistwnd" title="Folyamatok" width="50%" height="50%" mode="overlapped" closable="true" maximizable="true" minimizable="true" sizable="true" position="center,top" >\r
+ <include src="/pages/joblist.zul" />\r
+</window>\r
<menuitem sclass="rozsda" label="${labels.menu_version}" href="/resource/help.html" target="_blank" />\r
</menupopup>\r
</menu>\r
+ <menuitem sclass="whitemenu" label="Mini monitor" onClick="@global-command('createFloatingJobMonitor')" />\r
\r
<menuitem id="basketIMenuItem" image="/img/ic_shopping_cart_black_24dp.png" sclass="whitemenu" style="float: right" label="@load(lm.basketMenuLabel)" onClick="@command('showBasket')" disabled="false" />\r
<menuitem sclass="whitemenu" style="float: right" label="Kilépés" onClick="@command('doLogout')" disabled="false" />\r
</borderlayout>\r
</center>\r
</borderlayout>\r
+ \r
+<!-- <window title="My Overlapped" width="300px" mode="overlapped" closable="true" maximizable="true" minimizable="true" > -->\r
+<!-- </window> -->\r
</div>\r
</zk>
\ No newline at end of file
import org.zkoss.bind.annotation.Command;\r
import org.zkoss.bind.annotation.ContextParam;\r
import org.zkoss.bind.annotation.ContextType;\r
+import org.zkoss.bind.annotation.GlobalCommand;\r
import org.zkoss.bind.annotation.NotifyChange;\r
import org.zkoss.json.JSONObject;\r
import org.zkoss.zk.ui.Component;\r
Executions.getCurrent().sendRedirect(email);\r
}\r
\r
+ @GlobalCommand\r
+ public void createFloatingJobMonitor() {\r
+ Window window = (Window) Executions.createComponents("/pages/joblistwnd.zul", null, null);\r
+ window.doOverlapped();\r
+ }\r
+\r
@Command\r
public void createLowres() {\r
IJobEngine jobEngine = ComponentBinder.getJobEngine();\r
});\r
timer.start();\r
}\r
+\r
}\r
import org.zkoss.bind.Converter;\r
import org.zkoss.zul.Label;\r
\r
+import user.commons.mediatool.Timecode;\r
+import user.commons.mediatool.Timecode.Type;\r
+\r
public class TCConverter implements Converter<String, Long, Label> {\r
\r
@Override\r
\r
@Override\r
public String coerceToUi(Long frames, Label label, BindContext context) {\r
- double reminder = frames;\r
- int hour = (int) Math.floor(reminder / (60 * 60 * 25));\r
- reminder = reminder % (60 * 60 * 25);\r
- int minute = (int) Math.floor(reminder / (60 * 25));\r
- reminder = reminder % (60 * 25);\r
- int sec = (int) Math.floor(reminder / 25);\r
- reminder = reminder % 25;\r
- int frame = (int) Math.floor(reminder);\r
- return String.format("%02d:%02d:%02d:%02d", hour, minute, sec, frame);\r
+ //kell a konverzio, mert egyebkent float-ra cast-ol es rosszul szamol\r
+ Timecode timecode = new Timecode(frames, Type.PAL);\r
+ return timecode.toString();\r
+ // double reminder = frames;\r
+ // int hour = (int) Math.floor(reminder / (60 * 60 * 25));\r
+ // reminder = reminder % (60 * 60 * 25);\r
+ // int minute = (int) Math.floor(reminder / (60 * 25));\r
+ // reminder = reminder % (60 * 25);\r
+ // int sec = (int) Math.floor(reminder / 25);\r
+ // reminder = reminder % 25;\r
+ // int frame = (int) Math.floor(reminder);\r
+ // return String.format("%02d:%02d:%02d:%02d", hour, minute, sec, frame);\r
}\r
\r
}\r
\r
@Override\r
public void afterComponentAttached(Component component, Page page) {\r
- //logger.info("afterComponentAttached {} {}", component.getClass(), page);\r
+ // logger.info("afterComponentAttached {} {}", component.getClass(), page);\r
}\r
\r
@Override\r
public void afterComponentDetached(Component component, Page page) {\r
- //logger.info("afterComponentDetached {} {}", component.getClass(), page);\r
+ // logger.info("afterComponentDetached {} {}", component.getClass(), page);\r
}\r
\r
@Override\r
- public void afterComponentMoved(Component arg0, Component arg1, Component arg2) {\r
- // TODO Auto-generated method stub\r
+ public void afterComponentMoved(Component component1, Component component2, Component component3) {\r
+ // logger.info("afterComponentMoved {} {}", component1.getClass(), component2.getClass(), component3.getClass());\r
\r
}\r
\r
@Override\r
- public void afterPageAttached(Page arg0, Desktop arg1) {\r
- // TODO Auto-generated method stub\r
-\r
+ public void afterPageAttached(Page page, Desktop desktop) {\r
+ // logger.info("afterPageAttached {} {}", page, desktop);\r
}\r
\r
@Override\r
- public void afterPageDetached(Page arg0, Desktop arg1) {\r
- // TODO Auto-generated method stub\r
-\r
+ public void afterPageDetached(Page page, Desktop desktop) {\r
+ // logger.info("afterPageAttached {} {}", page, desktop);\r
}\r
\r
@Override\r