{\r
- "title": "NLE",\r
+ "title": "UNC2FTP_NEXIO_UNC",\r
"active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
"timeout": 1000\r
}\r
},\r
- {\r
- "label": "Octopus mappába küldés",\r
- "processor": "FTPTargetProcessor",\r
- "tag": "Betöltés",\r
- "outputFormat": "%ID%",\r
- "subFolderFormat": "%IDROOT%-%TEXT%",\r
- "killDateDays": 7,\r
- "saveArchiveMetadata": false,\r
- "remote": {\r
- "address": "ftp://10.10.1.100/OCTOPUS",\r
- "userName": "mediacube",\r
- "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
- "timeout": 1000\r
- }\r
- },\r
- {\r
- "label": "Megtekintőbe küldés",\r
- "processor": "FTPTargetProcessor",\r
- "outputFormat": "%ID%-%SOURCENAME%",\r
- "tag": "Betöltés",\r
- "subFolderFormat": "%IDROOT%",\r
- "killDateDays": 7,\r
- "saveArchiveMetadata": false,\r
- "remote": {\r
- "address": "ftp://10.10.1.100/OCTOPUS",\r
- "userName": "mediacube",\r
- "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
- "timeout": 1000\r
- }\r
- },\r
- {\r
- "label": "Traffic mappába küldés",\r
- "processor": "FTPTargetProcessor",\r
- "outputFormat": "%ID%-%SOURCENAME%",\r
- "tag": "Betöltés",\r
- "subFolderFormat": "%IDROOT%",\r
- "killDateDays": 7,\r
- "saveArchiveMetadata": false,\r
- "remote": {\r
- "address": "ftp://10.10.1.100/PLAYOUT_NLE",\r
- "userName": "mediacube",\r
- "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
- "timeout": 1000\r
- }\r
- },\r
- {\r
- "label": "Lebonyba küldés",\r
- "processor": "FTPTargetProcessor",\r
- "outputFormat": "%ID%",\r
- "tag": "Betöltés",\r
- "killDateDays": 7,\r
- "remote": {\r
- "address": "ftp://10.10.1.100/PLAYOUT_CHECK",\r
- "userName": "mediacube",\r
- "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
- "timeout": 1000\r
- }\r
- },\r
{\r
"label": "Helyi küldés",\r
"processor": "UNCTargetProcessor",\r
"deleteAfterCopy": true,\r
"temporaryCopy": true,\r
"remote": {\r
- "address": "ftp://10.10.1.100/ARCHIVE/ONE",\r
+ "address": "ftp://10.10.1.100/ARCHIVE/TESZT",\r
"userName": "mediacube",\r
"password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
{\r
- "title": "Stúdió",\r
+ "title": "NEXIO2UNC_FXP",\r
"active": true,\r
"startInTray": false,\r
"enableCustomMetadataId": true,\r
}\r
],\r
"targets": [\r
- {\r
- "label": "Octopus",\r
- "processor": "FXPTargetProcessor",\r
- "outputFormat": "%ID%",\r
- "tag": "Adáskész",\r
- "subFolderFormat": "%IDROOT%-%TEXT%",\r
- "killDateDays": 15,\r
- "saveArchiveMetadata": false,\r
- "remote": {\r
- "address": "ftp://10.10.1.100:21/OCTOPUS",\r
- "userName": "mediacube",\r
- "password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
- "timeout": 1000\r
- }\r
- },\r
{\r
"label": "Archiválás",\r
"processor": "FXPTargetProcessor",\r
"outputFormat": "%ID%",\r
"tag": "Archiválás",\r
"saveArchiveMetadata": true,\r
+ "deleteAfterCopy": false,\r
"remote": {\r
- "address": "ftp://10.10.1.100:21/ARCHIVE/ONE",\r
+ "address": "ftp://10.10.1.100:21/ARCHIVE/TESZT",\r
"userName": "mediacube",\r
"password": "Dn8t4gfHcK98o8hyPgLDhr5SgSji4JCxsfpMJsODikUp3nXgrM0UNCi45lLAK8ZOnmEneO44P9qpJ4QDqhctN6MxZodjJgdZTyoZKmSa+ECzEzLr/wPYNgxVaXrVotEy",\r
"timeout": 1000\r
});\r
});\r
}\r
- Debug.WriteLine(string.Format("Changed {0}", item.Name));\r
+ //Debug.WriteLine(string.Format("Changed {0}", item.Name));\r
}\r
\r
private void OnCreated(JToken token) {\r
Source = parent\r
});\r
});\r
- Debug.WriteLine(string.Format("Created {0}", item.Name));\r
+ //Debug.WriteLine(string.Format("Created {0}", item.Name));\r
}\r
\r
private void OnDeleted(JToken d) {\r
\r
public class FTPTargetProcessor : UNCTargetProcessor {\r
private const string PATTERN_CONCAT = "{0}{1}";\r
- private const string _226 = "226";\r
+ protected const string _226 = "226";\r
protected const string UPLOAD_ERROR = "Feltöltési hiba.";\r
- private const string _200 = "200";\r
+ protected const string _200 = "200";\r
private const string SITE0011 = "SITE 0011";\r
private const string _1211 = "1211";\r
private readonly Logger logger = LogManager.GetCurrentClassLogger();\r
InternetProtocolVersions = FtpIpVersion.IPv4,\r
UploadDataType = FtpDataType.Binary,\r
DownloadDataType = FtpDataType.Binary,\r
- Credentials = new NetworkCredential(connection.UserName, connection.Password)\r
+ Credentials = new NetworkCredential(connection.UserName, connection.Password),\r
};\r
result.Connect();\r
return result;\r
using NLog;\r
using System;\r
using System.IO;\r
+using System.Linq;\r
+using System.Text;\r
using System.Text.RegularExpressions;\r
using System.Threading;\r
using System.Windows.Forms;\r
+using System.Xml;\r
+using System.Xml.Linq;\r
\r
namespace MaestroShared.Targets {\r
\r
public class FXPTargetProcessor : FTPTargetProcessor {\r
+ protected const string DOWNLOAD_ERROR = "Letöltési hiba.";\r
private const string LITERAL_SPACE = "%20";\r
private const string SPACE = " ";\r
private Logger logger = LogManager.GetCurrentClassLogger();\r
try {\r
sourceFTP = CreateClient(sourceConfig.Remote);\r
\r
- string input = Uri.UnescapeDataString(inputUri.AbsolutePath);\r
- sourceFileLength = sourceFTP.GetFileSize(input);\r
- bool nexioTarget = IsNexioServer(targetFTP);\r
- if (nexioTarget)\r
- sourceFileLength = sourceFileLength / 2;\r
+ Input = Uri.UnescapeDataString(inputUri.AbsolutePath);\r
+ if (Input.LastIndexOf("/") == 0)\r
+ Input = Input.Replace("/", "");\r
+ sourceFileLength = sourceFTP.GetFileSize(Input);\r
\r
- FtpReply replyPASV = targetFTP.Execute("PASV");\r
- if (!replyPASV.Success)\r
- throw new Exception(replyPASV.ErrorMessage);\r
+ bool isNexioSource = sourceFTP.IsNexio();\r
+ //Nexio eseten frame-eket kerdunk le\r
+ if (isNexioSource)\r
+ sourceFileLength = GetNexioLength();\r
\r
- Regex regex = new Regex(Regex.Escape("(") + "(.*)" + Regex.Escape(")"));\r
- var v = regex.Match(replyPASV.Message);\r
- string port = v.Groups[1].ToString();\r
+ string port = targetFTP.Pasv();\r
+ sourceFTP.Command("PORT " + port);\r
\r
- FtpReply replyPORT = sourceFTP.Execute("PORT " + port);\r
- if (!replyPORT.Success)\r
- throw new Exception(replyPORT.ErrorMessage);\r
-\r
- FtpReply sourceReplyTYPE = sourceFTP.Execute("TYPE I");\r
- if (!sourceReplyTYPE.Success)\r
- throw new Exception(sourceReplyTYPE.ErrorMessage);\r
-\r
- if (input.LastIndexOf("/") == 0)\r
- input = input.Replace("/", "");\r
- FtpReply replyRETR = sourceFTP.Execute("RETR " + input);\r
+ sourceFTP.Command("TYPE I");\r
+ FtpReply replyRETR = sourceFTP.Execute("RETR " + Input);\r
\r
+ //TODO nem lehet jobb?\r
if (!replyRETR.Success) {\r
- input = inputUri.Segments[inputUri.Segments.Length - 1];\r
- input = input.Replace("%20", " ");\r
- replyRETR = sourceFTP.Execute("RETR " + input);\r
-\r
+ Input = inputUri.Segments[inputUri.Segments.Length - 1];\r
+ Input = Input.Replace("%20", " ");\r
+ replyRETR = sourceFTP.Execute("RETR " + Input);\r
if (!replyRETR.Success)\r
throw new Exception(replyRETR.ErrorMessage);\r
}\r
\r
- FtpReply targetReplyTYPE = targetFTP.Execute("TYPE I");\r
- if (!targetReplyTYPE.Success)\r
- throw new Exception(targetReplyTYPE.ErrorMessage);\r
+ targetFTP.Command("TYPE I");\r
\r
string currentWorkingDir = targetFTP.GetWorkingDirectory();\r
logger.Debug("Current target working directory is {0}", currentWorkingDir);\r
\r
- bool useTemporaryName = !nexioTarget && Parameters.TargetConfig.TemporaryCopy;\r
string targetFilePath = OutputName;\r
+ bool useTemporaryName = !targetFTP.IsNexio() && Parameters.TargetConfig.TemporaryCopy;\r
if (useTemporaryName)\r
targetFilePath = OutputName + ".tmp";\r
\r
- FtpReply replySTOR = targetFTP.Execute("STOR " + targetFilePath);\r
- if (!replySTOR.Success)\r
- throw new Exception(replySTOR.ErrorMessage);\r
-\r
- monitorFTP = CreateClient(Parameters.TargetConfig.Remote);\r
- monitorFTP.SetWorkingDirectory(workingDir);\r
- FtpReply monitorReplyTYPE = monitorFTP.Execute("TYPE I");\r
- if (!monitorReplyTYPE.Success)\r
- throw new Exception(targetReplyTYPE.ErrorMessage);\r
- //if (!FileExists(OutputName))\r
- // throw new Exception("A cél állomány nem jött létre.");\r
- long lastSize = 0;\r
+ targetFTP.Command("STOR " + targetFilePath);\r
+\r
+ if (!isNexioSource) {\r
+ monitorFTP = CreateClient(Parameters.TargetConfig.Remote);\r
+ monitorFTP.SetWorkingDirectory(workingDir);\r
+ monitorFTP.Command("TYPE I");\r
+ }\r
+\r
while (uploadedFileLength != sourceFileLength) {\r
- uploadedFileLength = monitorFTP.GetFileSize(OutputName);\r
- /*\r
- FtpReply statRETR = sourceFTP.Execute("STAT");\r
- if (!statRETR.Success)\r
- Debug.WriteLine($"Overall {overall}, last {lastSize}");\r
- else\r
- Debug.WriteLine($"Overall {overall}, last {lastSize} site {statRETR.Message}");\r
-*/\r
- if (uploadedFileLength == lastSize && uploadedFileLength > 0) {\r
- Progress = 100;\r
- break;\r
+ if (isNexioSource) {\r
+ string response = sourceFTP.Command("STAT");\r
+ logger.Info("Monitor: " + response);\r
+ if (response.EndsWith("No System Status") || response.EndsWith("Transfer Complete(TRANSACTION_SUCCESS)")) {\r
+ Progress = 100;\r
+ break;\r
+ }\r
+ if (!response.Contains("Fields Transferred"))\r
+ throw new Exception($"Unsopported STAT response: {response}");\r
+ long.TryParse(response.Replace("STAT Fields Transferred", "").Trim(), out uploadedFileLength);\r
+\r
+ logger.Info($"Progress {uploadedFileLength} / {sourceFileLength}");\r
+\r
} else {\r
- int currentProgress = (int)((double)uploadedFileLength / sourceFileLength * 100);\r
- Progress = currentProgress > 100 ? 100 : currentProgress;\r
- lastSize = uploadedFileLength;\r
+ uploadedFileLength = monitorFTP.GetFileSize(targetFilePath);\r
}\r
- Thread.Sleep(1000);\r
+ Progress = (int)((double)uploadedFileLength / sourceFileLength * 100);\r
+ Thread.Sleep(500);\r
}\r
if (useTemporaryName) {\r
if (!targetFTP.MoveFile(targetFilePath, OutputName))\r
throw new Exception(UPLOAD_ERROR);\r
}\r
- }\r
- catch (Exception e) {\r
+ } catch (Exception e) {\r
throw e;\r
}\r
\r
//logger.Debug("Done");\r
}\r
\r
+ public static String ReadFully(Stream input) {\r
+ byte[] buffer = new byte[1024];\r
+ using (MemoryStream ms = new MemoryStream()) {\r
+ int read;\r
+ while ((read = input.Read(buffer, 0, buffer.Length)) > 0) {\r
+ ms.Write(buffer, 0, read);\r
+ }\r
+ return ms.ToString();\r
+ }\r
+ }\r
+\r
+ private long GetNexioLength() {\r
+ long result = 0;\r
+ string xml = Input.Replace(".MXF", ".XML");\r
+ using (MemoryStream ms = new MemoryStream()) {\r
+ try {\r
+ //Binary modban lekerdezi a meretet, ez nem tamogatott\r
+ sourceFTP.DownloadDataType = FtpDataType.ASCII;\r
+ if (!sourceFTP.Download(ms, xml))\r
+ throw new Exception(DOWNLOAD_ERROR);\r
+ //a Unicode BOM 2 byte\r
+ ms.Seek(2, SeekOrigin.Begin);\r
+ XDocument xdoc = XDocument.Load(ms);\r
+ long.TryParse(xdoc.Descendants("Duration").Single().Value, out result);\r
+ result *= 2;\r
+ } catch (Exception e) {\r
+ logger.Error(e.Message);\r
+ throw e;\r
+ } finally {\r
+ sourceFTP.DownloadDataType = FtpDataType.Binary;\r
+ }\r
+ }\r
+ return result;\r
+ }\r
+\r
protected override void ValidateTransfer() {\r
- if (!IsNexioServer(sourceFTP) && !IsNexioServer(monitorFTP)) {\r
+ if (!targetFTP.IsNexio() && !sourceFTP.IsNexio()) {\r
if (sourceFileLength != uploadedFileLength)\r
throw new Exception(COPY_SIZE_ERROR);\r
}\r
TerminateClient(sourceFTP);\r
}\r
\r
+ protected bool FileExists(FtpClient client, string path) {\r
+ long x = -1;\r
+ try {\r
+ x = client.GetFileSize(path);\r
+ } catch (Exception e) {\r
+ logger.Warn(e.Message);\r
+ }\r
+ return x > -1;\r
+ }\r
+\r
+ protected override void DeleteAfterCopy() {\r
+ logger.Debug("Deleting source: " + Input);\r
+ try {\r
+ if (FileExists(sourceFTP, Input))\r
+ sourceFTP.DeleteFile(Input);\r
+ } catch (Exception e) {\r
+ logger.Error(e.Message);\r
+ }\r
+ }\r
+\r
+ }\r
+\r
+ public static class FtpClientExtensions {\r
+ public static String Command(this FtpClient client, String command) {\r
+ FtpReply response = client.Execute(command);\r
+ if (!response.Success)\r
+ throw new Exception($"Error executing {command}. Error message: {response.ErrorMessage}");\r
+ return response.Message;\r
+ }\r
+\r
+ public static String Pasv(this FtpClient client) {\r
+ String pasv = client.Command("PASV");\r
+ Regex regex = new Regex(Regex.Escape("(") + "(.*)" + Regex.Escape(")"));\r
+ return regex.Match(pasv).Groups[1].ToString();\r
+ }\r
+\r
+ public static bool IsNexio(this FtpClient client) {\r
+ bool result = false;\r
+ try {\r
+ //Device Type lekerdezese\r
+ string response = client.Command("SITE 0011");\r
+ result = response.Contains("1211");\r
+ } catch { }\r
+ return result;\r
+ }\r
\r
}\r
}\r
Status = READY;\r
Message = SUCCESS;\r
}\r
+ if (Parameters.TargetConfig.DeleteAfterCopy)\r
+ DeleteAfterCopy();\r
\r
ExecuteCompleted();\r
}\r
}\r
\r
protected virtual void AfterExecute() {\r
-\r
- if (Parameters.SourceConfig is UNCSource && Parameters.TargetConfig.DeleteAfterCopy) {\r
- logger.Debug("Deleting source: " + Input);\r
- try {\r
- if (FileExists(inputFile.FullName))\r
- DeleteFile(inputFile.FullName);\r
- } catch (Exception e) {\r
- logger.Error(e.Message); \r
- }\r
- }\r
-\r
logger.Trace(Strings.ENTRY);\r
Finished = DateTime.Now;\r
workFlowAction.finished = Finished;\r
logger.Trace(Strings.EXIT);\r
}\r
\r
+ protected virtual void DeleteAfterCopy() {\r
+ logger.Debug("Deleting source: " + Input);\r
+ try {\r
+ if (Parameters.SourceConfig is UNCSource && FileExists(inputFile.FullName))\r
+ DeleteFile(inputFile.FullName);\r
+ } catch (Exception e) {\r
+ logger.Error(e.Message);\r
+ }\r
+ }\r
+\r
protected virtual bool FileExists(string path) {\r
return File.Exists(path);\r
}\r
"name" : "SYS: retrieve-ondemand",\r
"template": "retrieve-ondemand.xml",\r
"parameters": [ \r
- {"name": "globalRetrievePath", "value": "file://isilon.intra.echotv.hu", "type": "java.lang.String"},\r
- {"name": "localRetrievePath", "value": "/mnt/ISILON", "type": "java.lang.String"},\r
+ {"name": "globalRetrievePath", "value": "c:\\temp", "type": "java.lang.String"},\r
+ {"name": "localRetrievePath", "value": "c:\\temp", "type": "java.lang.String"},\r
{"name": "materialOutputFolder", "value": "PLAYOUT_NLE", "type": "java.lang.String"},\r
{"name": "promoOutputFolder", "value": "PROMO_NLE", "type": "java.lang.String"},\r
{"name": "advertisementOutputFolder", "value": "REKLAM_NLE", "type": "java.lang.String"},\r
"template": "import-statistics.xml",\r
"cronexpression": "0 0 0/1 1/1 * ? *",\r
"parameters": [ \r
- {"name": "daysBeforeNow", "value": 5, "type": "java.lang.Integer"}\r
+ {"name": "daysBeforeNow", "value": 7, "type": "java.lang.Integer"}\r
]\r
},\r
{\r
private static final String MEDIACUBEMEDIA = "mediaCubeMedia";\r
private static final String RECIPIENT = "successRecipient";\r
private static final String HOUSEID = "houseId";\r
- private MediaCubeMarker marker;\r
+ private MediaCubeMarker systemMarker;\r
\r
@StepEntry\r
public Object[] execute(List<Media> basket, String houseId, String recipient, String targetPathType, IJobEngine jobEngine, IJobRuntime jobRuntime)\r
throws Exception {\r
- marker = (MediaCubeMarker) jobRuntime.getMarker();\r
- marker.setTo(recipient);\r
+ systemMarker = (MediaCubeMarker) jobRuntime.getMarker();\r
+ systemMarker.setTo(recipient);\r
\r
if (basket == null || basket.size() == 0)\r
return null;\r
setProgress(10);\r
+\r
+ // StringBuilder sb = new StringBuilder();\r
+ // sb.append("A visszatöltések elindultak az alábbi állományokra:</br>");\r
if (jobRuntime.forkPrepare()) {\r
for (Media mediaCubeMedia : basket) {\r
+ // sb.append(mediaCubeMedia.getMediaFilesName() + "</br>");\r
submit(mediaCubeMedia, recipient, houseId, targetPathType, jobEngine, jobRuntime);\r
}\r
}\r
setProgress(50);\r
+ // logger.info(new MediaCubeMarker(recipient), sb.toString());\r
jobRuntime.forkWaitComplete();\r
setProgress(100);\r
return null;\r
((MediaCubeMarker) child.getMarker()).setTo(recipient);\r
} catch (Exception e) {\r
logger.catching(e);\r
- logger.error(marker, "Hiba a kötegelt visszatöltésben. A rendszer üzenete: {}", e.getMessage());\r
+ logger.error(systemMarker, "Hiba a kötegelt visszatöltésben. A rendszer üzenete: {}", e.getMessage());\r
}\r
\r
}\r
BasicDBObject clip = (BasicDBObject) clipCollection.findOne(new BasicDBObject(LONGNAMEID, clipName));\r
if (clip != null) {\r
long duration = NoSQLUtils.asLong(clip, DURATION);\r
- if (duration > 0) {\r
+ //az ures klipp 1 kocka hosszu\r
+ if (duration > 1) {\r
mosObject.put("duration", duration);\r
foundAnyClip = true;\r
}\r
continue;\r
\r
long parentStoryId = NoSQLUtils.asLong(story, IOctopusAPI.PARENT_STORY_ID);\r
+ logger.info("Processing parentStoryId {}", parentStoryId);\r
+\r
String key = String.format("%d-%s", parentStoryId, objId);\r
if (processed.contains(key))\r
continue;\r
NoSQLUtils.addLong(perReporterStat, "ingest_duration", ingestDuration);\r
}\r
\r
- BasicDBObject archiveInfo = manager.getArchiveInfo(scheduledDate, String.valueOf(parentStoryId));\r
+ BasicDBObject archiveInfo = ItemManagerExtensions.getArchiveInfo(manager, parentStoryId);\r
if (archiveInfo != null) {\r
long archiveCount = archiveInfo.getLong("count");\r
long archiveDuration = archiveInfo.getLong("duration");\r
package user.jobengine.server.steps;\r
\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+\r
import user.jobengine.db.IItemManager;\r
import user.jobengine.db.IResultSetConsumer;\r
\r
public class ItemManagerExtensions {\r
\r
+ public static BasicDBObject getArchiveInfo(IItemManager manager, long houseid) {\r
+ final BasicDBObject[] result = { null };\r
+ StringBuilder query = new StringBuilder();\r
+ query.append("select count(*) as count, sum(length) as duration FROM media");\r
+ query.append(" ");\r
+ query.append(String.format("where houseid='%d' and itemtypeid = 82", houseid));\r
+ query.append(" ");\r
+ query.append("group by houseid");\r
+ IResultSetConsumer consumer = rs -> {\r
+ BasicDBObject o = new BasicDBObject();\r
+ o.put("count", rs.getLong("count"));\r
+ o.put("duration", rs.getLong("duration"));\r
+ result[0] = o;\r
+ return false;\r
+ };\r
+ manager.executeQuery(query.toString(), consumer, null);\r
+ return result[0];\r
+ }\r
+\r
public static long getExistingRundownMedia(IItemManager manager, String houseid) {\r
final long[] result = { 0 };\r
StringBuilder query = new StringBuilder();\r
CREATE INDEX IDX_WORKFLOWACTION_FINISHED ON WORKFLOWACTION ("FINISHED")@\r
CREATE INDEX IDX_WORKFLOWACTION_HOUSEID ON WORKFLOWACTION ("HOUSEID")@\r
\r
+\r
+CREATE TABLE MEDIADESCRIPTION ( \r
+ ID BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1, CACHE 20) NOT NULL,\r
+ ITEMID BIGINT NOT NULL,\r
+ MEDIAID BIGINT NOT NULL,\r
+ MEDIAFILEID BIGINT NOT NULL,\r
+ DESCRIPTION CLOB(400000) NOT LOGGED COMPACT,\r
+ CONSTRAINT PK_MEDIADESCRIPTION PRIMARY KEY(ID)\r
+)\r
+@\r
+\r
+ALTER TABLE DB2ADMIN.MEDIADESCRIPTION\r
+ ADD CONSTRAINT FK_MEDIADESCRIPTION_MEDIAID\r
+ FOREIGN KEY(MEDIAID)\r
+ REFERENCES DB2ADMIN.MEDIA(ID)\r
+ ON DELETE CASCADE\r
+ ON UPDATE NO ACTION \r
+@\r
+ALTER TABLE DB2ADMIN.MEDIADESCRIPTION\r
+ ADD CONSTRAINT FK_MEDIADESCRIPTION_MEDIAFILEID\r
+ FOREIGN KEY(MEDIAFILEID)\r
+ REFERENCES DB2ADMIN.MEDIAFILE(ID)\r
+ ON DELETE CASCADE \r
+ ON UPDATE NO ACTION \r
+@\r
+ALTER TABLE DB2ADMIN.MEDIADESCRIPTION\r
+ ADD CONSTRAINT FK_MEDIADESCRIPTION_ITEMID\r
+ FOREIGN KEY(ITEMID)\r
+ REFERENCES DB2ADMIN.ITEM(ID)\r
+ ON DELETE CASCADE \r
+ ON UPDATE NO ACTION \r
+@\r
-- execute with \r
-- db2 -td@ -vmf 2-CreateStructure.db2\r
\r
-DROP TRIGGER TRG_INSERT_ITEM@\r
+--DROP TRIGGER TRG_INSERT_ITEM@\r
\r
-CREATE TRIGGER TRG_INSERT_ITEM\r
- AFTER INSERT ON ITEM\r
- REFERENCING NEW AS r\r
- FOR EACH ROW\r
-BEGIN ATOMIC\r
- DECLARE x VARCHAR(255);\r
- CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_title', NULL, 'hu_HU', :x);\r
- CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_desc', NULL, 'hu_HU', :x);\r
- CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_houseid', NULL, 'hu_HU', :x);\r
-END\r
-@\r
+--CREATE TRIGGER TRG_INSERT_ITEM\r
+ --AFTER INSERT ON ITEM\r
+ --REFERENCING NEW AS r\r
+ --FOR EACH ROW\r
+--BEGIN ATOMIC\r
+-- DECLARE x VARCHAR(255);\r
+-- CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_title', NULL, 'hu_HU', :x);\r
+-- CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_desc', NULL, 'hu_HU', :x);\r
+-- CALL SYSPROC.SYSTS_UPDATE(NULL, 'item_houseid', NULL, 'hu_HU', :x);\r
+--END\r
+--@\r
+\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_MEDIAFILE_AFTER_INSERT after insert\r
+on mediafile\r
+referencing new as n\r
+for each row\r
+when (n.storeid = 1)\r
+begin atomic\r
+ insert into mediadescription (itemid, mediaid, mediafileid, description)\r
+ select \r
+ itemid,\r
+ mediaid, \r
+ mediafileid,\r
+ COALESCE(hundate(archived), '') concat ' ' \r
+ concat COALESCE(defdate(archived), '') concat ' ' \r
+ concat COALESCE(itemhouseid, '') concat ' ' \r
+ concat COALESCE(itemtitle, '') concat ' ' \r
+ concat COALESCE(itemdescription,'') concat ' ' \r
+ concat COALESCE(mediahouseid, '') concat ' ' \r
+ concat COALESCE(mediatitle, '') concat ' ' \r
+ concat COALESCE(mediadescription, '') concat ' ' \r
+ concat COALESCE(mediafilehouseid, '')\r
+ from vw_items_description \r
+ where mediafileid = n.id;\r
+end\r
+GO\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_MEDIAFILE_AFTER_UPDATE after update of HOUSEID\r
+on mediafile\r
+referencing new as n\r
+for each row\r
+when (n.storeid = 1)\r
+begin atomic\r
+ update mediadescription set description = (\r
+ select \r
+ COALESCE(hundate(archived), '') concat ' ' \r
+ concat COALESCE(defdate(archived), '') concat ' ' \r
+ concat COALESCE(itemhouseid, '') concat ' ' \r
+ concat COALESCE(itemtitle, '') concat ' ' \r
+ concat COALESCE(itemdescription,'') concat ' ' \r
+ concat COALESCE(mediahouseid, '') concat ' ' \r
+ concat COALESCE(mediatitle, '') concat ' ' \r
+ concat COALESCE(mediadescription, '') concat ' ' \r
+ concat COALESCE(mediafilehouseid, '')\r
+ from vw_items_description \r
+ where mediafileid = n.id);\r
+end\r
+GO\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_MEDIA_AFTER_UPDATE after update on media\r
+referencing new as n\r
+for each row\r
+begin atomic\r
+ update mediadescription set description = (\r
+ select \r
+ COALESCE(hundate(archived), '') concat ' ' \r
+ concat COALESCE(defdate(archived), '') concat ' ' \r
+ concat COALESCE(itemhouseid, '') concat ' ' \r
+ concat COALESCE(itemtitle, '') concat ' ' \r
+ concat COALESCE(itemdescription,'') concat ' ' \r
+ concat COALESCE(mediahouseid, '') concat ' ' \r
+ concat COALESCE(mediatitle, '') concat ' ' \r
+ concat COALESCE(mediadescription, '') concat ' ' \r
+ concat COALESCE(mediafilehouseid, '')\r
+ from vw_items_description \r
+ where mediaid = n.id);\r
+end\r
+GO\r
+\r
+CREATE TRIGGER DB2ADMIN.TRG_ITEM_AFTER_UPDATE after update on item\r
+referencing new as n\r
+for each row\r
+begin atomic\r
+ update mediadescription set description = (\r
+ select \r
+ COALESCE(hundate(archived), '') concat ' ' \r
+ concat COALESCE(defdate(archived), '') concat ' ' \r
+ concat COALESCE(itemhouseid, '') concat ' ' \r
+ concat COALESCE(itemtitle, '') concat ' ' \r
+ concat COALESCE(itemdescription,'') concat ' ' \r
+ concat COALESCE(mediahouseid, '') concat ' ' \r
+ concat COALESCE(mediatitle, '') concat ' ' \r
+ concat COALESCE(mediadescription, '') concat ' ' \r
+ concat COALESCE(mediafilehouseid, '')\r
+ from vw_items_description \r
+ where itemid = n.id);\r
+end\r
+GO\r
*/\r
List<IEntityBase> getAllCached(Class<? extends IEntityBase> baseClass);\r
\r
- BasicDBObject getArchiveInfo(Calendar scheduleDate, String houseId);\r
-\r
/**\r
* Visszaadja az entitásnak megfelelő DAO objektumot.\r
*\r
return result;\r
}\r
\r
- @Override\r
- public BasicDBObject getArchiveInfo(Calendar scheduleDate, String houseId) {\r
- BasicDBObject result = null;\r
- ResultSet rs = null;\r
- PreparedStatement st = null;\r
- DefaultContext context = getDbContext();\r
- Connection connection = context.getConnection();\r
- SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");\r
- try {\r
- String date = df.format(scheduleDate.getTime());\r
- String query = String.format(\r
- "SELECT COUNT(*) as count, SUM(length) as duration FROM VW_ITEMS WHERE mediahouseid='%s' AND archived LIKE '%s%%' GROUP BY mediahouseid",\r
- houseId, date);\r
- st = connection.prepareStatement(query);\r
- rs = st.executeQuery();\r
- if (rs.next()) {\r
- result = new BasicDBObject();\r
- result.put("count", rs.getLong("count"));\r
- result.put("duration", rs.getLong("duration"));\r
- }\r
-\r
- connection.commit();\r
- } catch (Exception e) {\r
- try {\r
- connection.rollback();\r
- } catch (Exception e1) {\r
- }\r
- throwError(e);\r
- } finally {\r
- try {\r
- if (rs != null)\r
- rs.close();\r
- } catch (Exception e1) {\r
- }\r
- try {\r
- if (st != null)\r
- st.close();\r
- } catch (Exception e1) {\r
- }\r
- putDbContext(context);\r
- }\r
-\r
- return result;\r
- }\r
-\r
@Override\r
public IEntityBaseDAO getBaseDAO(Class<? extends IEntityBase> classInfo) {\r
IEntityBaseDAO entityBaseDb = null;\r
</listitem>\r
<listitem id="item_description">\r
<listcell label="Anyag leírása" />\r
- <listcell><textbox rows="6" disabled="true" width="99%" value="@load(vm.archivedMedia.item.description)"></textbox></listcell>\r
+ <listcell><textbox rows="6" inplace="true" width="99%" value="@load(vm.archivedMedia.item.description) @save(vm.archivedMedia.item.description,before='save')"></textbox></listcell>\r
</listitem>\r
<listitem id="media_houseid">\r
<listcell label="Média azonosítója:" />\r
\r
@Command\r
public void save() {\r
+ manager.modify(archivedMedia.getItem());\r
manager.modify(archivedMedia.getMedia());\r
- logger.info("Metadat of media was updated by user, id of media: {}", archivedMedia.getMedia().getHouseId());\r
+ logger.info("Metadata modified: {}", archivedMedia.getMedia().getId());\r
wnd.detach();\r
}\r
\r
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");\r
StringBuilder data = new StringBuilder();\r
\r
- boolean headeradded = false;\r
+ for (String column : columnList) {\r
+ data.append(column).append(";");\r
+ }\r
+ data.append("\r\n");\r
+\r
for (BasicDBObject o : dataList) {\r
- if (!headeradded) {\r
- for (String key : o.keySet())\r
- data.append(key).append(";");\r
- data.append("\r\n");\r
- headeradded = true;\r
+ for (String column : columnList) {\r
+ String columnData = NoSQLUtils.asString(o, column);\r
+ columnData = columnData == null ? "" : columnData;\r
+ data.append(columnData).append(";");\r
}\r
- for (String key : o.keySet())\r
- data.append(o.getString(key)).append(";");\r
data.append("\r\n");\r
}\r
\r
}\r
\r
private void processLowresDuplicateGroup(String fileName) {\r
- System.out.println("*** Processing: " + fileName);\r
+ //System.out.println("*** Processing: " + fileName);\r
String query = "select mediafileid, mediafilehouseid, relativepath from vw_items_rd_lh where filename = ?";\r
IStatementDecorator decorator = st -> {\r
st.setString(1, fileName);\r
String mediaFileHouseId = rs.getString("mediafilehouseid");\r
if (masterMediaFile[0] == null) {\r
masterMediaFile[0] = mediaFile;\r
- System.out.println("Skipping: " + mediaFileHouseId);\r
+ //System.out.println("Skipping: " + mediaFileHouseId);\r
return true;\r
}\r
\r
\r
File file = Paths.get(LOWRES_ROOT, path).toFile();\r
duplicateLength[0] += file.length();\r
- System.out.println("Inspecting: " + mediaFileHouseId + " now available " + duplicateLength[0]);\r
+ //System.out.println("Inspecting: " + mediaFileHouseId + " now available " + duplicateLength[0]);\r
return true;\r
};\r
manager.executeQuery(query, consumer, decorator);\r
\r
@Test\r
public void processLowresDuplicates() {\r
- String query = "select filename from vw_items_rd_dup order by filecount";\r
- IResultSetConsumer consumer = rs -> {\r
+ long count[] = { 0, 0 };\r
+ manager.executeQuery("select count(filecount) from vw_items_rd_dup", rs -> {\r
+ count[0] = rs.getLong(1);\r
+ return false;\r
+ }, null);\r
+\r
+ int progress[] = { 0, 0 };\r
+ manager.executeQuery("select filename from vw_items_rd_dup order by filecount desc", rs -> {\r
String fileName = rs.getString("filename");\r
processLowresDuplicateGroup(fileName);\r
+ count[1]++;\r
+ progress[1] = (int) ((double) count[1] * 100 / count[0]);\r
+ if (progress[1] > progress[0]) {\r
+ progress[0] = progress[1];\r
+ }\r
+ System.out.println("Completed " + progress[0] + " " + count[1] + "/" + count[0] + " available " + duplicateLength[0]);\r
return true;\r
- };\r
- manager.executeQuery(query, consumer, null);\r
- System.out.println("Available will " + duplicateLength[0]);\r
+ }, null);\r
}\r
\r
@Test\r