<None Include="Configuration\-ACTIVE-configuration-nle.json">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
</None>\r
- <None Include="Configuration\ACTIVE-configuration-vezerlo.json">\r
+ <None Include="Configuration\-ACTIVE-configuration-vezerlo.json">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
</None>\r
<None Include="Configuration\-configuration-archive.json">\r
<None Include="Configuration\-configuration-sxs.json">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
</None>\r
- <None Include="Configuration\-configuration-studio.json">\r
+ <None Include="Configuration\configuration-studio.json">\r
<CopyToOutputDirectory>Always</CopyToOutputDirectory>\r
</None>\r
</ItemGroup>\r
if (movieSegments == null)\r
movieSegments = new BindingList<MovieSegment>();\r
bool readOnly = true;\r
- if (ArchiveMetadata == null)\r
- MsgBox.Error("A metaadatok nem elérhetők, a szegmens definiálás nem engedélyezett.");\r
- else {\r
+ if (ArchiveMetadata == null) {\r
+ ArchiveMetadata = GetArchiveMetadata();\r
+ if (ArchiveMetadata == null)\r
+ MsgBox.Error("A metaadatok nem elérhetők, a szegmens definiálás nem engedélyezett.");\r
+ else\r
+ readOnly = ArchiveMetadata.ok;\r
+ } else\r
readOnly = ArchiveMetadata.ok;\r
+ if (readOnly && ArchiveMetadata != null)\r
MsgBox.Warning("Az anyag már el van fogadva, a szegmens módosítás nem kerül mentésre. A szegmensek módosításához vissza kell vonni az anyag elfogadását az adástervező rendszerben.");\r
- }\r
OpenFile(SelectedSource.FileInfo, true, readOnly);\r
UpdateDefineSegmentsStatus();\r
}\r
// You can specify all the values or you can default the Build and Revision Numbers\r
// by using the '*' as shown below:\r
// [assembly: AssemblyVersion("1.0.*")]\r
-[assembly: AssemblyVersion("2.0.6.5")]\r
-[assembly: AssemblyFileVersion("2.0.6.5")]\r
+[assembly: AssemblyVersion("2.0.6.6")]\r
+[assembly: AssemblyFileVersion("2.0.6.6")]\r
private const string EXTAGENCY = "extagency";\r
private const string DURATION = "duration";\r
private const string MODIFIED = "modifiedtimestamp";\r
+ private const string MXFEXT = ".MXF";\r
private List<String> acceptableAgencies = new List<string>();\r
private List<NexioSourceItem> cache;\r
private IMessageBus messageBus;\r
}\r
\r
private void OnResponse(object sender, MessageEventArgs e) {\r
- JObject resultObject = JObject.Parse(e.Data);\r
- JToken jToken = resultObject.GetValue(NexioAPI.DATA);\r
+ try {\r
+ JObject resultObject = JObject.Parse(e.Data);\r
+ JToken jToken = resultObject.GetValue(NexioAPI.DATA);\r
\r
- if (!jToken.HasValues)\r
- return;\r
- JToken d = JToken.Parse(jToken.ToString());\r
- string action = resultObject.GetValue(NexioAPI.ACTION).ToString();\r
- switch (action) {\r
- case NexioAPI.LIST:\r
- OnList(d);\r
- break;\r
- case NexioAPI.CREATE:\r
- if (!initialized)\r
- return;\r
- OnCreated(d);\r
- break;\r
- case NexioAPI.DELETE:\r
- if (!initialized)\r
- return;\r
- OnDeleted(d);\r
- break;\r
- case NexioAPI.UPDATE:\r
- if (!initialized)\r
- return;\r
- OnChanged(d);\r
- break;\r
+ if (!jToken.HasValues)\r
+ return;\r
+ JToken d = JToken.Parse(jToken.ToString());\r
+ string action = resultObject.GetValue(NexioAPI.ACTION).ToString();\r
+ switch (action) {\r
+ case NexioAPI.LIST:\r
+ OnList(d);\r
+ break;\r
+ case NexioAPI.CREATE:\r
+ if (!initialized)\r
+ return;\r
+ OnCreated(d);\r
+ break;\r
+ case NexioAPI.DELETE:\r
+ if (!initialized)\r
+ return;\r
+ OnDeleted(d);\r
+ break;\r
+ case NexioAPI.UPDATE:\r
+ if (!initialized)\r
+ return;\r
+ OnChanged(d);\r
+ break;\r
+ }\r
+ }\r
+ catch (Exception ex) {\r
+ logger.Error(ex);\r
+ MsgBox.Error(ex.Message);\r
}\r
}\r
\r
}\r
\r
private void SetItem(ref NexioSourceItem item, JToken token) {\r
- item.ID = token[ID].ToString();\r
- item.Name = token[LONGNAMEID].ToString() + ".MXF";\r
- item.Agency = token[EXTAGENCY]?.ToString();\r
- item.Created = DateTime.Parse(token[RECORDDATE]?.ToString());\r
- item.Modified = DateTime.Parse(token[MODIFIED]?.ToString());\r
- int d = token.Value<int>(DURATION);\r
- if (d < 0)\r
- d = d * -1;\r
- item.Duration = new Timecode(d).ToString();\r
+ try {\r
+ item.ID = token[ID].ToString();\r
+ item.Name = token[LONGNAMEID].ToString() + MXFEXT;\r
+ item.Agency = token[EXTAGENCY]?.ToString();\r
+ item.Created = DateTime.Parse(token[RECORDDATE]?.ToString());\r
+ item.Modified = DateTime.Parse(token[MODIFIED]?.ToString());\r
+ int d = token.Value<int>(DURATION);\r
+ item.Duration = new Timecode(d).ToString();\r
+ }\r
+ catch (Exception e) {\r
+ logger.Error(e.Message);\r
+ }\r
+ \r
}\r
\r
\r
Where(x => x.CanHandle(acceptableAgencies)).\r
OrderByDescending(i => i.Created).\r
ToList().ForEach(i => Add(i));\r
- initialized = true;\r
+ initialized = true;\r
});\r
}\r
\r
<!-- <logger name="org.jboss.resteasy.specimpl" level="debug" /> -->\r
<!-- <logger name="org.jboss.resteasy.plugins.server" level="debug" /> -->\r
<!-- <logger name="org.jboss.resteasy.plugins.providers" level="debug" /> -->\r
- <logger name="user.commons.nexio" level="debug" />\r
+ <logger name="user.commons.nexio" level="info" />\r
</Loggers>\r
</Configuration>
\ No newline at end of file
<stringAttribute key="org.eclipse.jdt.launching.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>\r
<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog -console"/>\r
<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>\r
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.eclipse.equinox.http.jetty.http.port=8080 -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps" -Djobengine.transcoder.source=c:\_Movie\hires\ -Djetty.home="${workspace_loc:-configuration}/jetty" -Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v4.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Dnexio.host=10.10.1.56"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dorg.eclipse.equinox.http.jetty.http.port=8080 -Dorg.eclipse.epp.logging.aeri.skipReports=true -Declipse.ignoreApp=true -Dosgi.noShutdown=true -Djobengine.jobsteps.root="${workspace_loc}/user.jobengine.executors/config" -Djobengine.jobtemplates.root="${workspace_loc}/user.jobengine.executors/jobtemplates" -Djobengine.db.url=jdbc:db2://10.228.198.1:50000/mediaarc:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.db.user=db2admin -Djobengine.db.password=password -Djobengine.nexio.db.url=jdbc:sqlserver://10.10.1.59:1433;databaseName=NXDB; -Djobengine.nexio.db.user=sa -Djobengine.nexio.db.password=resolve -Djobengine.loglevel=INFO -Dlog4j.configurationFile="${workspace_loc}/-configuration/log4j2.xml" -Djobengine.jobsteps.alternate.root="${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps" -Djobengine.transcoder.source=c:\_Movie\hires\ -Djetty.home="${workspace_loc:-configuration}/jetty" -Djetty.etc.config.urls=etc/user-jetty.xml,etc/user-jetty-ssl.xml,etc/user-jetty-ssl-context.xml,,etc/user-jetty-http.xml,etc/user-jetty-https.xml -Djobengine.octopus.api.address=http://10.10.1.11/api/v1 -Djobengine.octopus.api.user=mam -Djobengine.octopus.api.password=napocska -Djobengine.nosql.db.url=jdbc:db2://10.228.198.1:50000/mccache:retrieveMessagesFromServerOnGetMessage=true; -Djobengine.nosql.db.user=db2admin -Djobengine.nosql.db.password=password -Djobengine.nosql.db.schema=test -Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl -Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC_v4.zenium -Djobengine.jobscheduling.config="${workspace_loc}/-configuration/scheduledjobs.json" -Dnexio.host=10.10.1.55 -Dnexio.useMOSGateway=true"/>\r
<stringAttribute key="pde.version" value="3.3"/>\r
<booleanAttribute key="show_selected_only" value="false"/>\r
<stringAttribute key="target_bundles" value="cglib@default:default,com.auth0.java-jwt@default:default,com.fasterxml.jackson.core.jackson-annotations@default:default,com.fasterxml.jackson.core.jackson-core@default:default,com.fasterxml.jackson.core.jackson-databind@default:default,com.fasterxml.jackson.datatype.jackson-datatype-joda@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-base@default:default,com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider@default:default,com.fasterxml.jackson.module.jackson-module-jaxb-annotations@default:default,com.google.guava@default:default,com.ibm.db2jcc4@default:default,com.ibm.nosql@default:default,com.microsoft.sqlserver.sqljdbc@default:default,com.sun.el.javax.el@default:default,commons-logging@default:default,javassist@default:default,javax.annotation-api@default:default,javax.inject@default:default,javax.mail@default:default,javax.servlet-api@default:default,javax.servlet.jsp-api@default:default,javax.validation.api@default:default,javax.ws.rs-api@default:default,jcifs@default:default,joda-time@default:default,org.apache.aries.spifly.dynamic.bundle@default:default,org.apache.aries.util@default:default,org.apache.commons.beanutils@default:default,org.apache.commons.codec@default:default,org.apache.commons.collections@default:default,org.apache.commons.digester@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.commons.lang@default:default,org.apache.commons.logging@default:default,org.apache.commons.net@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.httpcomponents.httpclient@default:default,org.apache.httpcomponents.httpcore@default:default,org.apache.jasper.glassfish@default:default,org.apache.logging.log4j.api@1:true,org.apache.logging.log4j.core@default:default,org.apache.logging.log4j.slf4j-impl@default:default,org.apache.servicemix.bundles.quartz@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.util@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.jetty.client@default:default,org.eclipse.jetty.deploy@default:default,org.eclipse.jetty.http@default:default,org.eclipse.jetty.io@default:default,org.eclipse.jetty.jsp@default:default,org.eclipse.jetty.osgi.boot.jsp@default:false,org.eclipse.jetty.osgi.boot@default:true,org.eclipse.jetty.schemas@default:default,org.eclipse.jetty.security@default:default,org.eclipse.jetty.server@default:default,org.eclipse.jetty.servlet@default:default,org.eclipse.jetty.util@default:default,org.eclipse.jetty.webapp@default:default,org.eclipse.jetty.websocket.api@default:default,org.eclipse.jetty.websocket.client@default:default,org.eclipse.jetty.websocket.common@default:default,org.eclipse.jetty.websocket.server@default:default,org.eclipse.jetty.websocket.servlet@default:default,org.eclipse.jetty.xml@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.hamcrest.core@default:default,org.jboss.resteasy.client@default:default,org.jboss.resteasy.jaxrs@default:default,org.jmock.junit4@default:default,org.jmock@default:default,org.junit@default:default,org.jvnet.mimepull@default:default,org.objectweb.asm.commons@default:default,org.objectweb.asm.tree@default:default,org.objectweb.asm@default:default,org.reflections@default:default,slf4j.api@default:default,slf4j.simple@default:false"/>\r
{\r
"active": false,\r
"name" : "Teszt folyamat",\r
- "template": "fake.xml",\r
+ "template": "fake-noparams.xml",\r
"executeimmediate": false,\r
"cronexpression": "0/10 * * ? * *",\r
"parameters": [ {"name": "itemID", "value": 1, "type": "java.lang.Long"} ]\r
\r
@StepEntry\r
public Object[] execute(long itemID, IJobEngine jobEngine, IJobRuntime jobRuntime) throws Exception {\r
- throw new Exception("42");\r
- // try {\r
- // for (int i = 0; i < count; i++) {\r
- // if (!canContinue())\r
- // break;\r
- // jobRuntime.incrementProgress((i + 1) * count);\r
- // Thread.sleep(1000);\r
- // //logger.info(getMarker(), "Log markered");\r
- // //logger.info("Progress {}", jobRuntime.getProgress());\r
- // }\r
- // } catch (Exception e) {\r
- // logger.error(e.getMessage());\r
- // }\r
- //return null;\r
+ // throw new Exception("42");\r
+ Object[] result = { 1 };\r
+ try {\r
+ for (int i = 0; i < count; i++) {\r
+ if (!canContinue())\r
+ break;\r
+ jobRuntime.incrementProgress((i + 1) * count);\r
+ Thread.sleep(1000);\r
+ //logger.info(getMarker(), "Log markered");\r
+ //logger.info("Progress {}", jobRuntime.getProgress());\r
+ }\r
+ } catch (Exception e) {\r
+ logger.error(e.getMessage());\r
+ }\r
+ return result;\r
}\r
\r
}\r
}\r
\r
@StepEntry\r
- public Object[] execute(boolean forceFull, IJobEngine jobEngine, final IJobRuntime jobRuntime) {\r
+ public Object[] execute(boolean forceFull, IJobEngine jobEngine, final IJobRuntime jobRuntime) throws Exception {\r
OctopusDataMiner dataMiner = null;\r
try {\r
- jobRuntime.incrementProgress(10);\r
+ //jobRuntime.incrementProgress(10);\r
progressListener = createListener(jobRuntime);\r
dataMiner = new OctopusDataMiner();\r
dataMiner.addProgressListener(progressListener);\r
*/\r
\r
public class NexioClipEventDispatcher implements ClipEventListener {\r
+\r
private static final Logger logger = LogManager.getLogger();\r
\r
+ private static final String NEXIO_USE_MOS_GATEWAY = "nexio.useMOSGateway";\r
private static final String ID = "id";\r
private static final String VIDEO_FORMAT = "videoformat";\r
private static final String VIDEO_BITRATE = "videobitrate";\r
BasicDBObject jsClip = new BasicDBObject();\r
jsClip.put(ID, evt.getClip().getId().get()); //Unique internal ID\r
removeDeleted(jsClip);\r
+ } else if (evt.getEventType() == ClipEventType.LISTENER_RESTART_NEEDED) {\r
+ shutdown();\r
+ startup();\r
}\r
} catch (Exception exc) {\r
logger.error("", exc);\r
} catch (Exception e) {\r
// System.out.println(e);\r
}\r
- try {\r
- jsClip.put(FILESIZE, clip.getFileSize());\r
- } catch (Exception e) {\r
- // System.out.println(e);\r
- }\r
try {\r
String agency = new String(clip.getExtendedField(GetExtendedFieldCommand.FN_AGENCY), INexioAPI.ENCODING);\r
jsClip.put(EXTAGENCY, agency);\r
} catch (Exception e) {\r
// System.out.println(e);\r
}\r
- //jsClip.put(RECORDDATE, new DateTime(rs.getString(i++)).toDate());\r
- //jsClip.put(EXTAGENCY, rs.getString(i++));\r
- //jsClip.put(START, rs.getString(i++));\r
//System.out.println(String.format("ID = '%s'\tXID = '%s'\tDuration = '%s'\tModified = '%s'\tVideoFormat = '%s'\tVideoBitrate = '%s'", id, xid, duration, modifiedTimestamp.getTime(), videoFormat, videoBitrate));\r
return jsClip;\r
}\r
logger.debug("Found NEXIO clip: {} XID IS MISSING!!", clip.getId());\r
}\r
} catch (Exception e) {\r
- logger.error("", e);\r
+ logger.catching(e);\r
}\r
}\r
logger.info("NEXIO metadata import completed.");\r
if (!clip.equals(clipForID)) {\r
collection.save(clip);\r
onUpdate(clip);\r
- }\r
+ } else\r
+ logger.warn("Not found {}, XID based clip is {}", id, clipForXID.toPrettyString(null));\r
}\r
}\r
}\r
logger.catching(e);\r
return;\r
}\r
- logger.info("NEXIO server is connected.");\r
+ logger.info("NEXIO server connected");\r
\r
this.progressListenerList = new EventListenerList();\r
this.dropAllClipsFromMongo();\r
this.ensureIndexes();\r
-\r
+ boolean[] useMOSGateway = { false };\r
+ try {\r
+ useMOSGateway[0] = Boolean.parseBoolean(System.getProperty(NEXIO_USE_MOS_GATEWAY));\r
+ } finally {\r
+ }\r
executor.submit(() -> {\r
try {\r
- //1. kezdeti masolas\r
- copyClipsIntoMongo();\r
- //2. esemeny feliratkozas\r
+ if (useMOSGateway[0]) {\r
+ NexioDataMiner dm = new NexioDataMiner();\r
+ dm.transferClips();\r
+ } else {\r
+ copyClipsIntoMongo();\r
+ }\r
NexioClipEventDispatcher.this.controller.getMediabase().startMediaListener();\r
NexioClipEventDispatcher.this.controller.getMediabase().getMediaListener().addClipEventListener(NexioClipEventDispatcher.this);\r
} catch (Exception e) {\r
\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
-import org.joda.time.DateTime;\r
import org.osgi.framework.Bundle;\r
import org.osgi.framework.BundleContext;\r
import org.osgi.framework.FrameworkUtil;\r
private static final String EXTAGENCY = "extagency";\r
private static final String RECORDDATE = "recorddate";\r
private static final String LONGNAMEID = "longnameid";\r
+ private static final String ID = "id";\r
public static final String CLIP_COLLECTION_NAME = "nexioclips";\r
+ private static final String VIDEOBITRATE = "videobitrate";\r
+ private static final String VIDEOFORMAT = "videoformat";\r
+ private static final String KILLDATE = "killdate";\r
private static String url, user, pass;\r
- private EventListenerList progressListenerList;\r
- private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
- private INexioChangeListener nexioChangeListener;\r
- private DB db;\r
-\r
static {\r
url = System.getProperty(JOBENGINE_NEXIO_DB_URL);\r
user = System.getProperty(JOBENGINE_NEXIO_DB_USER);\r
pass = System.getProperty(JOBENGINE_NEXIO_DB_PASSWORD);\r
}\r
\r
+ private static Connection getSQLConnection() throws ClassNotFoundException, SQLException {\r
+ Connection result = null;\r
+ Class.forName(SQLSERVER_JDBC_SQL_SERVER_DRIVER);\r
+ result = DriverManager.getConnection(url, user, pass);\r
+ return result;\r
+ }\r
+\r
+ private EventListenerList progressListenerList;\r
+ private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
+\r
+ private INexioChangeListener nexioChangeListener;\r
+\r
+ private DB db;\r
+\r
public NexioDataMiner() {\r
this.progressListenerList = new EventListenerList();\r
db = NoSQLUtils.getNoSQLDB();\r
progressListenerList.add(IProgressEventListener.class, listener);\r
}\r
\r
- public void removeProgressListener(IProgressEventListener listener) {\r
- progressListenerList.remove(IProgressEventListener.class, listener);\r
+ private void ensureIndexes() {\r
+ DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
+ if (collection.count() == 0)\r
+ collection.ensureIndex(LONGNAMEID);\r
}\r
\r
- private static Connection getSQLConnection() throws ClassNotFoundException, SQLException {\r
- Connection result = null;\r
- Class.forName(SQLSERVER_JDBC_SQL_SERVER_DRIVER);\r
- result = DriverManager.getConnection(url, user, pass);\r
- return result;\r
+ private void fireProgressEvent(ProgressEvent evt) {\r
+ logger.debug("Progress changed to " + evt.getProgress() + "%");\r
+ Object[] listeners = progressListenerList.getListenerList();\r
+ for (int i = 0; i < listeners.length; i += 2) {\r
+ if (listeners[i] == IProgressEventListener.class)\r
+ ((IProgressEventListener) listeners[i + 1]).progressChanged(evt);\r
+ }\r
+ }\r
+\r
+ @Override\r
+ public void onCreate(BasicDBObject data) {\r
+ logger.debug("onCreate clip: " + data);\r
+ if (nexioChangeListener != null)\r
+ nexioChangeListener.onCreate(data);\r
+ }\r
+\r
+ @Override\r
+ public void onDelete(BasicDBObject data) {\r
+ logger.debug("onDelete clip: " + data);\r
+ if (nexioChangeListener != null)\r
+ nexioChangeListener.onDelete(data);\r
+ }\r
+\r
+ @Override\r
+ public void onUpdate(BasicDBObject data) {\r
+ logger.debug("onUpdate clip: " + data);\r
+ if (nexioChangeListener != null)\r
+ nexioChangeListener.onUpdate(data);\r
}\r
\r
public Map<String, BasicDBObject> queryClips(Connection con) {\r
int count = queryClipsCount(con);\r
logger.debug("Clips count is {}", count);\r
\r
- String querySQL = "SELECT c.longnameid, CONVERT(NVARCHAR(30), c.recorddate, 126) as recordate, c.extagency, CONVERT(NVARCHAR(30), cd.modifiedtimestamp, 126) as modifiedtimestamp, cd.start, cd.duration FROM ClipsTbl c LEFT OUTER JOIN ClipsDomainsTbl cd ON (cd.longnameid = c.longnameid)";\r
+ String querySQL = "SELECT cd.id, c.longnameid, c.recorddate, c.extagency, cd.id, cd.modifiedtimestamp, cd.duration, cd.videoformat, cd.videobitrate FROM ClipsTbl c LEFT OUTER JOIN ClipsDomainsTbl cd ON (cd.longnameid = c.longnameid)";\r
logger.debug("Executing statement: {}", querySQL);\r
try (PreparedStatement stmt = con.prepareStatement(querySQL); ResultSet rs = stmt.executeQuery();) {\r
int idx = 1;\r
while (rs.next()) {\r
- int i = 1;\r
BasicDBObject clip = new BasicDBObject();\r
- clip.put(LONGNAMEID, rs.getString(i++));\r
- clip.put(RECORDDATE, new DateTime(rs.getString(i++)).toDate());\r
- clip.put(EXTAGENCY, rs.getString(i++));\r
- clip.put(MODIFIEDTIMESTAMP, new DateTime(rs.getString(i++)).toDate());\r
- clip.put(START, rs.getString(i++));\r
- clip.put(DURATION, rs.getLong(i++));\r
+ clip.put(ID, rs.getString(ID));\r
+ clip.put(LONGNAMEID, rs.getString(LONGNAMEID));\r
+ clip.put(RECORDDATE, rs.getDate(RECORDDATE).getTime());\r
+ clip.put(EXTAGENCY, rs.getString(EXTAGENCY));\r
+ clip.put(MODIFIEDTIMESTAMP, rs.getDate(MODIFIEDTIMESTAMP).getTime());\r
+ clip.put(KILLDATE, rs.getDate(KILLDATE).getTime());\r
+ clip.put(VIDEOBITRATE, rs.getString(VIDEOBITRATE));\r
+ clip.put(VIDEOFORMAT, rs.getString(VIDEOFORMAT));\r
+ clip.put(DURATION, rs.getLong(DURATION));\r
result.put(clip.getString(LONGNAMEID), clip);\r
int progress = idx * 50 / count;\r
if (progress - progressEvent.getProgress() > 0) {\r
return count;\r
}\r
\r
- private void fireProgressEvent(ProgressEvent evt) {\r
- logger.debug("Progress changed to " + evt.getProgress() + "%");\r
- Object[] listeners = progressListenerList.getListenerList();\r
- for (int i = 0; i < listeners.length; i += 2) {\r
- if (listeners[i] == IProgressEventListener.class)\r
- ((IProgressEventListener) listeners[i + 1]).progressChanged(evt);\r
+ private Map<String, BasicDBObject> readClips() {\r
+ Map<String, BasicDBObject> result = new HashMap<>();\r
+ DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
+ DBCursor find = collection.find();\r
+ if (find.hasNext()) {\r
+ List<BasicDBObject> clips = ListUtils.cast(find.toArray());\r
+ result = ListUtils.map(clips, item -> item.getString(LONGNAMEID));\r
+ for (BasicDBObject clip : clips)\r
+ result.put(clip.getString(LONGNAMEID), clip);\r
+ }\r
+ return result;\r
+ }\r
+\r
+ private void removeDeleted(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
+ Set<String> remoteNames = new HashSet<>(remoteClips.keySet());\r
+ Set<String> localNames = new HashSet<>(localClips.keySet());\r
+ localNames.removeAll(remoteNames);\r
+ if (localNames.isEmpty())\r
+ logger.debug("Nothing to remove");\r
+\r
+ DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
+ for (String name : localNames) {\r
+ logger.debug("Removing {}", name);\r
+\r
+ BasicDBObject clip = localClips.get(name);\r
+ collection.remove(clip);\r
+ onDelete(clip);\r
}\r
}\r
\r
+ public void removeProgressListener(IProgressEventListener listener) {\r
+ progressListenerList.remove(IProgressEventListener.class, listener);\r
+ }\r
+\r
+ public void reset() {\r
+ db.getCollection(CLIP_COLLECTION_NAME).drop();\r
+ }\r
+\r
@Override\r
public void run() {\r
try (Connection con = getSQLConnection()) {\r
if (bundle != null) {\r
BundleContext bundleContext = bundle.getBundleContext();\r
if (bundleContext != null) {\r
- ServiceReference<INexioChangeListener> reference = bundleContext\r
- .getServiceReference(INexioChangeListener.class);\r
+ ServiceReference<INexioChangeListener> reference = bundleContext.getServiceReference(INexioChangeListener.class);\r
if (reference != null) {\r
INexioChangeListener service = bundleContext.getService(reference);\r
setNexioChangeListener(service);\r
}\r
}\r
\r
- private void ensureIndexes() {\r
- DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
- if (collection.count() == 0)\r
- collection.ensureIndex(LONGNAMEID);\r
- }\r
-\r
- private void removeDeleted(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
- Set<String> remoteNames = new HashSet<>(remoteClips.keySet());\r
- Set<String> localNames = new HashSet<>(localClips.keySet());\r
- localNames.removeAll(remoteNames);\r
- if (localNames.isEmpty())\r
- logger.debug("Nothing to remove");\r
-\r
- DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
- for (String name : localNames) {\r
- logger.debug("Removing {}", name);\r
-\r
- BasicDBObject clip = localClips.get(name);\r
- collection.remove(clip);\r
- onDelete(clip);\r
- }\r
- }\r
-\r
- private Map<String, BasicDBObject> readClips() {\r
- Map<String, BasicDBObject> result = new HashMap<>();\r
- DBCollection collection = db.getCollection(NexioDataMiner.CLIP_COLLECTION_NAME);\r
- DBCursor find = collection.find();\r
- if (find.hasNext()) {\r
- List<BasicDBObject> clips = ListUtils.cast(find.toArray());\r
- result = ListUtils.map(clips, item -> item.getString(LONGNAMEID));\r
- for (BasicDBObject clip : clips)\r
- result.put(clip.getString(LONGNAMEID), clip);\r
- }\r
- return result;\r
- }\r
-\r
- private void storeClips(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
- logger.trace("Enter");\r
- int idx = 1;\r
- for (BasicDBObject clip : remoteClips.values()) {\r
- storeClip(clip, localClips);\r
- int progress = 50 + (idx * 50 / remoteClips.size());\r
- if (progress - progressEvent.getProgress() > 0) {\r
- progressEvent.setProgress(progress);\r
- fireProgressEvent(progressEvent);\r
- }\r
- idx++;\r
- }\r
- logger.trace("Exit");\r
+ public void setNexioChangeListener(INexioChangeListener nexioChangeListener) {\r
+ this.nexioChangeListener = nexioChangeListener;\r
}\r
\r
private void storeClip(BasicDBObject clip, Map<String, BasicDBObject> localClips) {\r
logger.trace("Exit");\r
}\r
\r
- public void reset() {\r
- db.getCollection(CLIP_COLLECTION_NAME).drop();\r
- }\r
-\r
- public void setNexioChangeListener(INexioChangeListener nexioChangeListener) {\r
- this.nexioChangeListener = nexioChangeListener;\r
- }\r
-\r
- @Override\r
- public void onCreate(BasicDBObject data) {\r
- logger.debug("onCreate clip: " + data);\r
- if (nexioChangeListener != null)\r
- nexioChangeListener.onCreate(data);\r
+ private void storeClips(Map<String, BasicDBObject> remoteClips, Map<String, BasicDBObject> localClips) {\r
+ logger.trace("Enter");\r
+ int idx = 1;\r
+ for (BasicDBObject clip : remoteClips.values()) {\r
+ storeClip(clip, localClips);\r
+ int progress = 50 + (idx * 50 / remoteClips.size());\r
+ if (progress - progressEvent.getProgress() > 0) {\r
+ progressEvent.setProgress(progress);\r
+ fireProgressEvent(progressEvent);\r
+ }\r
+ idx++;\r
+ }\r
+ logger.trace("Exit");\r
}\r
\r
- @Override\r
- public void onDelete(BasicDBObject data) {\r
- logger.debug("onDelete clip: " + data);\r
- if (nexioChangeListener != null)\r
- nexioChangeListener.onDelete(data);\r
+ public void transferClips() {\r
+ try (Connection con = getSQLConnection()) {\r
+ DBCollection collection = db.getCollection(CLIP_COLLECTION_NAME);\r
+ collection.drop();\r
+ transferClips(con, collection);\r
+ } catch (Exception e) {\r
+ logger.error(e);\r
+ }\r
}\r
\r
- @Override\r
- public void onUpdate(BasicDBObject data) {\r
- logger.debug("onUpdate clip: " + data);\r
- if (nexioChangeListener != null)\r
- nexioChangeListener.onUpdate(data);\r
+ private void transferClips(Connection con, DBCollection collection) {\r
+ logger.info("Transfering clips from NEXIO MOS Gateway {}", con.toString());\r
+ String querySQL = "SELECT cd.id, c.longnameid, c.recorddate, c.extagency, c.killdate, cd.modifiedtimestamp, cd.duration, cd.videoformat, cd.videobitrate FROM ClipsTbl c LEFT OUTER JOIN ClipsDomainsTbl cd ON (cd.longnameid = c.longnameid)";\r
+ logger.debug("Executing statement: {}", querySQL);\r
+ int count = 0;\r
+ try (PreparedStatement stmt = con.prepareStatement(querySQL); ResultSet rs = stmt.executeQuery();) {\r
+ while (rs.next()) {\r
+ BasicDBObject clip = new BasicDBObject();\r
+ clip.put(ID, rs.getString(ID));\r
+ clip.put(LONGNAMEID, rs.getString(LONGNAMEID));\r
+ clip.put(EXTAGENCY, rs.getString(EXTAGENCY));\r
+ clip.put(VIDEOBITRATE, rs.getString(VIDEOBITRATE));\r
+ clip.put(VIDEOFORMAT, rs.getString(VIDEOFORMAT));\r
+ clip.put(DURATION, rs.getLong(DURATION));\r
+ clip.put(MODIFIEDTIMESTAMP, rs.getTimestamp(MODIFIEDTIMESTAMP));\r
+ clip.put(RECORDDATE, rs.getTimestamp(RECORDDATE).getTime());\r
+ clip.put(KILLDATE, rs.getTimestamp(KILLDATE));\r
+ collection.insert(clip);\r
+ count++;\r
+ }\r
+ logger.info("Transfered {} clips", count);\r
+ } catch (Exception e) {\r
+ logger.error(e);\r
+ }\r
}\r
\r
}\r
\r
public enum ClipEventType {\r
\r
- CLIP_ADDED,\r
- CLIP_DELETED;\r
+ LISTENER_RESTART_NEEDED, CLIP_ADDED, CLIP_DELETED;\r
\r
- public String value() {\r
- return name();\r
- }\r
+ public static ClipEventType fromValue(String v) {\r
+ return valueOf(v);\r
+ }\r
\r
- public static ClipEventType fromValue(String v) {\r
- return valueOf(v);\r
- }\r
+ public String value() {\r
+ return name();\r
+ }\r
}\r
\r
import java.util.ArrayList;\r
\r
-import org.apache.commons.io.output.ByteArrayOutputStream;\r
import org.apache.logging.log4j.LogManager;\r
import org.apache.logging.log4j.Logger;\r
\r
\r
static private final int NN_ID_ADDED = 0;\r
static private final int NN_ID_DELETED = 1;\r
+ static private final int NN_LISTENER_RESTART = 2;\r
\r
public static String bytesToHex(byte[] bytes) {\r
char[] hexChars = new char[bytes.length * 2];\r
\r
private Connection connection = null;\r
\r
+ private ArrayList<Integer> notificationList = new ArrayList<Integer>();\r
+\r
//KONSTRUKTOR\r
public MediaListener(Mediabase _mediaBase, String _nexioHost, int _nexioPort) {\r
this.mediaBase = _mediaBase;\r
this.clipEventListeners.add(listener);\r
}\r
\r
+ private byte[] collectNotifications(boolean dontAnswer) throws Exception {\r
+\r
+ //kov. notificationnek megfelelo listazas kerese\r
+ if (notificationList.size() > 0 && !dontAnswer) {\r
+ handleNotification(notificationList.get(0));\r
+ }\r
+\r
+ //tovabbi notification-ok gyujtese\r
+ //CHANGE_NOTIFICATION_RESP (BLOCKING READ!) ********\r
+ byte[] buffer = null;\r
+ for (buffer = readBytes(2); CHANGE_NOTIFICATION_RESP_S.equals(bytesToHex(buffer)); buffer = readBytes(2)) {\r
+ buffer = readBytes(2);\r
+ int notNumber = buffer[1];\r
+ notificationList.add(notNumber);\r
+ logger.debug("Nexio MediaListener notification: CFA6" + bytesToHex(buffer));\r
+\r
+ //csak igy jon meg a kesobb kezelt LIST_FIRST_ID_LIST\r
+ if (notificationList.size() == 1 && !dontAnswer) {\r
+ handleNotification(notNumber);\r
+ }\r
+ }\r
+ return buffer;\r
+ }\r
+\r
private void createNexioConnection() throws Exception {\r
this.connection = TCPConnection.getInstance(this.nexioHost, this.nexioPort);\r
logger.info("Nexio MediaListener is connected to NEXIO " + this.nexioHost + " : " + this.nexioPort);\r
} else if (notificationNumber == NN_ID_DELETED) {\r
Clip deletedClip = new ClipImpl(mediaBase.getProtocol(), id);\r
evt = new ClipEvent(deletedClip, ClipEventType.CLIP_DELETED);\r
+ } else if (notificationNumber == NN_LISTENER_RESTART) {\r
+ evt = new ClipEvent(null, ClipEventType.LISTENER_RESTART_NEEDED);\r
}\r
for (ClipEventListener cel : this.clipEventListeners) {\r
cel.clipEventPerformed(evt);\r
}\r
}\r
\r
- private byte[] readBytesOLD(int numberOfBytes) throws Exception {\r
- try {\r
- byte[] ret = new byte[numberOfBytes];\r
- this.connection.read(ret, 0, numberOfBytes);\r
- return ret;\r
- } catch (Exception e) {\r
- restartListener();\r
- throw e;\r
+ private void handleNotification(int notificationNumber) throws Exception {\r
+ //LIST_FIRST_ID_LIST\r
+ /*\r
+ 0x01 Main ID Handle List D8 4C ID\r
+ 0x02 ID Handles Added List D8 4C ID\r
+ 0x03 ID Handles Deleted List D8 4C ID\r
+ 0x11 Main Extended ID List DF 4C BC XID *\r
+ 0x12 Extended IDs Added List DF 4C BC XID *\r
+ 0x13 Extended IDs Deleted List DF 4C BC XID *\r
+ 0x21 Main ID Handle/Extended ID List DF 4C BC ID XID *\r
+ 0x22 ID Handles/Extended IDs Added List DF 4C BC ID XID *\r
+ 0x23 ID Handles/Extended IDs Deleted List DF 4C BC ID XID *\r
+ */\r
+ if (notificationNumber == NN_ID_ADDED) {\r
+ writeBytes(LIST_FIRST_ID_LIST_ADDED);\r
+ } else if (notificationNumber == NN_ID_DELETED) {\r
+ //SEND ACK\r
+ writeBytes(ACK);\r
+ writeBytes(LIST_FIRST_ID_LIST_DELETED);\r
}\r
+\r
}\r
\r
private byte[] readBytes(int numberOfBytes) throws Exception {\r
byte[] ret = new byte[numberOfBytes];\r
try {\r
- for(int c=0; c<numberOfBytes; c++){\r
- ret[c] = (byte)this.connection.read();\r
+ for (int c = 0; c < numberOfBytes; c++) {\r
+ ret[c] = (byte) this.connection.read();\r
}\r
} catch (Exception e) {\r
restartListener();\r
}\r
return ret;\r
}\r
- \r
- \r
+\r
+ private byte[] readBytesOLD(int numberOfBytes) throws Exception {\r
+ try {\r
+ byte[] ret = new byte[numberOfBytes];\r
+ this.connection.read(ret, 0, numberOfBytes);\r
+ return ret;\r
+ } catch (Exception e) {\r
+ restartListener();\r
+ throw e;\r
+ }\r
+ }\r
+\r
public void removeClipEventListener(ClipEventListener listener) {\r
this.clipEventListeners.remove(listener);\r
}\r
} catch (Exception e) {\r
}\r
//new connection / new thread\r
+ //szóljunk a dispatcher-nek, hogy inicializálja újra magát\r
+ //fireEvent(null, NN_LISTENER_RESTART);\r
startListener();\r
}\r
\r
- private ArrayList<Integer> notificationList = new ArrayList<Integer>();\r
- \r
- \r
@Override\r
public void run() {\r
try {\r
byte[] buffer = readBytes(2);\r
logger.info("Nexio MediaListener is waiting for events..");\r
\r
- \r
while (isRunning) {\r
try {\r
\r
//BLOKKOLVA addig olvassa fel es gyujti a notification-oket amig mas adat nem jon.\r
//az elso alkalommal amikor nem notification-t kap, visszater.\r
buffer = collectNotifications(false);\r
- \r
+\r
//LIST_FIRST_ID_LIST response\r
if (LIST_FIRST_ID_LIST_FOUND.equals(bytesToHex(buffer))) {\r
int notificationNumber = notificationList.get(0);\r
notificationList.remove(0);\r
- \r
+\r
//read first id\r
buffer = readBytes(8);\r
String stringId = new String(buffer);\r
//read next ids\r
writeBytes(LIST_NEXT_ID_LIST);\r
//for (buffer = readBytes(2); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer)) && isRunning; buffer = readBytes(2)) {\r
- for (buffer = collectNotifications(true); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer)) && isRunning; buffer = collectNotifications(true)) {\r
+ for (buffer = collectNotifications(true); LIST_NEXT_ID_LIST_FOUND.equals(bytesToHex(buffer))\r
+ && isRunning; buffer = collectNotifications(true)) {\r
\r
byte[] idBuffer = readBytes(8);\r
stringId = new String(idBuffer);\r
logger.debug("Nexio MediaListener end of id list: " + bytesToHex(buffer));\r
//SEND ACK\r
writeBytes(ACK);\r
- \r
- }else\r
- if (LIST_FIRST_ID_LIST_NOT_FOUND.equals(bytesToHex(buffer))) {\r
+\r
+ } else if (LIST_FIRST_ID_LIST_NOT_FOUND.equals(bytesToHex(buffer))) {\r
notificationList.remove(0);\r
logger.debug("Nexio MediaListener LIST_FIRST_ID_LIST ID not found!");\r
- }else{\r
+ } else {\r
logger.debug("Nexio MediaListener unknown answer has arrived for LIST_FIRST_ID_LIST: " + bytesToHex(buffer));\r
}\r
} catch (Exception exc) {\r
}\r
}\r
\r
- \r
- private byte[] collectNotifications(boolean dontAnswer) throws Exception{\r
-\r
- //kov. notificationnek megfelelo listazas kerese\r
- if(notificationList.size() > 0 && !dontAnswer){\r
- handleNotification(notificationList.get(0));\r
- }\r
- \r
- //tovabbi notification-ok gyujtese\r
- //CHANGE_NOTIFICATION_RESP (BLOCKING READ!) ********\r
- byte[] buffer = null;\r
- for(buffer = readBytes(2); CHANGE_NOTIFICATION_RESP_S.equals(bytesToHex(buffer)); buffer = readBytes(2)){\r
- buffer = readBytes(2);\r
- int notNumber = buffer[1];\r
- notificationList.add(notNumber);\r
- logger.debug("Nexio MediaListener notification: CFA6" + bytesToHex(buffer));\r
- \r
- //csak igy jon meg a kesobb kezelt LIST_FIRST_ID_LIST\r
- if(notificationList.size() == 1 && !dontAnswer){\r
- handleNotification(notNumber);\r
- }\r
- }\r
- return buffer;\r
- }\r
- \r
- \r
- private void handleNotification(int notificationNumber) throws Exception{\r
- //LIST_FIRST_ID_LIST\r
- /*\r
- 0x01 Main ID Handle List D8 4C ID\r
- 0x02 ID Handles Added List D8 4C ID\r
- 0x03 ID Handles Deleted List D8 4C ID\r
- 0x11 Main Extended ID List DF 4C BC XID *\r
- 0x12 Extended IDs Added List DF 4C BC XID *\r
- 0x13 Extended IDs Deleted List DF 4C BC XID *\r
- 0x21 Main ID Handle/Extended ID List DF 4C BC ID XID *\r
- 0x22 ID Handles/Extended IDs Added List DF 4C BC ID XID *\r
- 0x23 ID Handles/Extended IDs Deleted List DF 4C BC ID XID *\r
- */\r
- if (notificationNumber == NN_ID_ADDED) {\r
- writeBytes(LIST_FIRST_ID_LIST_ADDED);\r
- }else\r
- if (notificationNumber == NN_ID_DELETED) {\r
- //SEND ACK\r
- writeBytes(ACK);\r
- writeBytes(LIST_FIRST_ID_LIST_DELETED);\r
- }\r
- \r
- }\r
- \r
public void startListener() {\r
try {\r
createNexioConnection();\r
public class NoSQLUtils {\r
private static final Logger logger = LogManager.getLogger();\r
public static final String Url, User, Pass;\r
-\r
+ public static DB noSQLClient = null;\r
static {\r
Url = System.getProperty("jobengine.nosql.db.url");\r
User = System.getProperty("jobengine.nosql.db.user");\r
}\r
\r
public static DB getNoSQLDB() {\r
- DB result = null;\r
try {\r
- result = NoSQLClient.getDB(NoSQLUtils.Url, NoSQLUtils.User, NoSQLUtils.Pass);\r
+ if (noSQLClient == null)\r
+ noSQLClient = NoSQLClient.getDB(NoSQLUtils.Url, NoSQLUtils.User, NoSQLUtils.Pass);\r
} catch (Exception e) {\r
- logger.error(e);\r
+ logger.catching(e);\r
}\r
- return result;\r
- }\r
-\r
- public static DB getNoSQLDB(String url, String user, String pass) {\r
- return NoSQLClient.getDB(Url, User, Pass);\r
+ return noSQLClient;\r
}\r
\r
}\r
static final String TIME_COLLECTION_NAME = "time";\r
static final String LASTUPDATE_TIME = "lastUpdateTime";\r
static final String NEXIO_MOS = "NEXIO.MOS";\r
- static final String PARENT_STORY_ID = "parentStoryId";\r
+ static final String PARENT_STORY_ID = "ParentStoryId";\r
static final String VALUE = "value";\r
static final String CUSTOM_COLUMNS = "customColumns";\r
static final String MOS_ID = "mosId";\r
import java.util.HashSet;\r
import java.util.List;\r
import java.util.Map;\r
+import java.util.concurrent.ConcurrentHashMap;\r
\r
import javax.swing.event.EventListenerList;\r
import javax.ws.rs.client.Invocation.Builder;\r
import com.ibm.nosql.json.api.QueryBuilder;\r
import com.ibm.nosql.json.api.WriteResult;\r
\r
+import user.commons.ListUtils;\r
import user.commons.nosql.NoSQLUtils;\r
import user.commons.remotestore.IProgressEventListener;\r
import user.commons.remotestore.ProgressEvent;\r
\r
public class OctopusDataMiner implements Runnable {\r
- private static final String _TMP = "_tmp1";\r
+ private static final String _TMP = "_tmp";\r
private static final Logger logger = LogManager.getLogger();\r
private static final String LINEFEED = "\r\n";\r
private static final String SIMPLE_LINEFEED = "\n";\r
private String FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
private String STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
\r
+ private Map<Long, BasicDBList> newRundowns = new HashMap<>();\r
+ private Map<Long, BasicDBList> newStoryFolders = new HashMap<>();\r
+ private Map<Long, BasicDBList> newStories = new HashMap<>();\r
+\r
public OctopusDataMiner() {\r
db = NoSQLUtils.getNoSQLDB();\r
\r
return concatParentsToStoryFolder(parent, newName);\r
}\r
\r
+ private void deleteDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
+ DBCollection oldCollection = db.getCollection(oldCollectionName);\r
+ DBCollection newCollection = db.getCollection(newCollectionName);\r
+ DBCursor oldCollectionCursor = newCollection.find(new BasicDBObject(), new BasicDBObject(idFieldName, 1));\r
+ if (!oldCollectionCursor.hasNext()) {\r
+ logger.error("{} collection is empty", newCollectionName);\r
+ return;\r
+ }\r
+ List<BasicDBObject> oldItems = ListUtils.cast(oldCollectionCursor.toArray());\r
+\r
+ DBCursor newCollectionCursor = oldCollection.find();\r
+ ConcurrentHashMap<Long, BasicDBObject> newItems = null;\r
+ if (newCollectionCursor.hasNext()) {\r
+ List<BasicDBObject> newList = ListUtils.cast(newCollectionCursor.toArray());\r
+ newItems = ListUtils.map(newList, item -> item.getLong(IOctopusAPI.ID));\r
+ }\r
+ if (newItems == null)\r
+ newItems = new ConcurrentHashMap<>();\r
+\r
+ for (BasicDBObject oldItem : oldItems) {\r
+ if (oldItem == null) {\r
+ logger.error("Item is null");\r
+ continue;\r
+ }\r
+ if (!oldItem.containsKey(idFieldName)) {\r
+ logger.error("{} is null", idFieldName);\r
+ continue;\r
+ }\r
+ long id = oldItem.getLong(idFieldName);\r
+ BasicDBObject newItem = newItems.get(id);\r
+ if (newItem == null) {\r
+ //remove\r
+ logger.info("Deleting {}", oldItem.toPrettyString(null));\r
+ oldCollection.remove(new BasicDBObject(idFieldName, id));\r
+ }\r
+ }\r
+ }\r
+\r
private void deleteOrphanStories() {\r
try {\r
DBCollection collection = db.getCollection(STORY_COLLECTION);\r
collection.ensureIndex(IOctopusAPI.ID);\r
}\r
\r
- public void execute() {\r
+ public void execute() throws Exception {\r
logger.trace(STARTING);\r
RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION + _TMP;\r
FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION + _TMP;\r
STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION + _TMP;\r
\r
- // ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
- // Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
- // Response r = result.get();\r
- // String x = r.readEntity(String.class);\r
- // logger.info(x);\r
- // return;\r
+ try {\r
+ db.getCollection(RUNDOWN_COLLECTION).drop();\r
+ db.getCollection(FOLDER_COLLECTION).drop();\r
+ db.getCollection(STORY_COLLECTION).drop();\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ throw e;\r
+ }\r
\r
BasicDBList rundowns = null;\r
BasicDBList storyFolders = null;\r
throw e;\r
}\r
\r
- if (rundowns == null || rundowns.size() == 0) {\r
- progressEvent.setProgress(50);\r
- fireProgressEvent(progressEvent);\r
- } else {\r
- logger.info("Process rundowns");\r
- try {\r
- storeRundowns(rundowns, null);\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
- }\r
-\r
- if (storyFolders == null || storyFolders.size() == 0) {\r
- progressEvent.setProgress(100);\r
- fireProgressEvent(progressEvent);\r
- } else {\r
- logger.info("Process story folders");\r
- try {\r
- storeStoryFolders(storyFolders, null);\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
- }\r
- setLastUpdateTime(new Date());\r
- logger.info("Activate");\r
+ processRundowns(rundowns);\r
+ processStoryFolders(storyFolders);\r
\r
- // db.getCollection(IOctopusAPI.RUNDOWN_COLLECTION).drop();\r
- try {\r
- db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
+ //a sorrend fontos !\r
+ updateDiff(IOctopusAPI.STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
+ updateDiff(IOctopusAPI.RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
+ updateDiff(IOctopusAPI.FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
+ deleteDiff(IOctopusAPI.RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
+ deleteDiff(IOctopusAPI.FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
+ deleteDiff(IOctopusAPI.STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
\r
- // db.getCollection(IOctopusAPI.FOLDER_COLLECTION).drop();\r
- try {\r
- db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
+ //setLastUpdateTime(new Date());\r
+ logger.info("Activate");\r
\r
- // db.getCollection(IOctopusAPI.STORY_COLLECTION).drop();\r
- try {\r
- db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
+ // db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
+ // db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
+ // db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
+ logger.trace(FINISHED);\r
\r
- // logger.trace(FINISHED);\r
+ }\r
\r
+ public void executetest() {\r
+ // ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
+ // Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
+ // Response r = result.get();\r
+ // String x = r.readEntity(String.class);\r
+ // logger.info(x);\r
+ // return;\r
}\r
\r
private String extractContent(BasicDBObject content) {\r
return result;\r
}\r
\r
- // private boolean isModified(Date date, BasicDBObject object, String name) {\r
- // Date actualModifiedString = toDate(object, name);\r
- // if (actualModifiedString == null)\r
- // logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
- // int result = date.compareTo(actualModifiedString);\r
- // return result <= 0;\r
- // }\r
-\r
private String extractScriptContent(BasicDBObject story) {\r
BasicDBObject script = NoSQLUtils.asDBObject(story, IOctopusAPI.SCRIPT);\r
if (script == null || script.isEmpty())\r
return result;\r
}\r
\r
+ // private boolean isModified(Date date, BasicDBObject object, String name) {\r
+ // Date actualModifiedString = toDate(object, name);\r
+ // if (actualModifiedString == null)\r
+ // logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
+ // int result = date.compareTo(actualModifiedString);\r
+ // return result <= 0;\r
+ // }\r
+\r
private boolean isModified(Date date, BasicDBObject object) {\r
if (date == null)\r
return true;\r
return result <= 0;\r
}\r
\r
+ private void processRundowns(BasicDBList rundowns) throws Exception {\r
+ if (rundowns == null || rundowns.size() == 0) {\r
+ progressEvent.setProgress(50);\r
+ fireProgressEvent(progressEvent);\r
+ } else {\r
+ logger.info("Process rundowns");\r
+ try {\r
+ storeRundowns(rundowns, null);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ throw e;\r
+ }\r
+ }\r
+ }\r
+\r
+ private void processStoryFolders(BasicDBList storyFolders) throws Exception {\r
+ if (storyFolders == null || storyFolders.size() == 0) {\r
+ progressEvent.setProgress(100);\r
+ fireProgressEvent(progressEvent);\r
+ } else {\r
+ logger.info("Process story folders");\r
+ try {\r
+ storeStoryFolders(storyFolders, null);\r
+ } catch (Exception e) {\r
+ logger.catching(e);\r
+ throw e;\r
+ }\r
+ }\r
+ }\r
+\r
private Builder query(String path, String fields) {\r
//logger.info("Class loader {}", getClass().getClassLoader());\r
// try {\r
List<BasicDBObject> rundownsList = NoSQLUtils.asList(rundowns);\r
int idx = 1;\r
for (BasicDBObject rundown : rundownsList) {\r
- logger.info(CHECKING_RUNDOWN, rundown.getLong(IOctopusAPI.ID), rundownsList.size(), idx);\r
+ //logger.info(CHECKING_RUNDOWN, rundown.getLong(IOctopusAPI.ID), rundownsList.size(), idx);\r
storeRundown(rundown, lastUpdateTime);\r
int progress = idx * 50 / rundownsList.size();\r
if (progress - progressEvent.getProgress() > 0) {\r
\r
private void storeStory(BasicDBObject story, Date lastUpdateTime) {\r
logger.trace(ENTER);\r
+ if (!story.containsKey(IOctopusAPI.ID)) {\r
+ logger.error("Missing id in story {}", story.toPrettyString(null));\r
+ return;\r
+ }\r
long storyID = story.getLong(IOctopusAPI.ID);\r
boolean isContains = storyIDs.contains(storyID);\r
if (isContains)\r
story.put(IOctopusAPI.MOS_OBJECTS, modifiedMOS);\r
\r
String parentStoryId = extractCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\r
- if (parentStoryId == null)\r
+ if (parentStoryId == null) {\r
+ logger.warn("Missing {} in story", IOctopusAPI.PARENT_STORY_ID, story.toPrettyString(null));\r
story.append(IOctopusAPI.PARENT_STORY_ID, storyID);\r
- else\r
+ } else\r
story.append(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
logger.debug(SAVING_STORY_ID, storyID);\r
collection.save(story);\r
return result;\r
}\r
\r
+ private void updateDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
+ DBCollection oldCollection = db.getCollection(oldCollectionName);\r
+ DBCollection newCollection = db.getCollection(newCollectionName);\r
+ DBCursor newCollectionCursor = newCollection.find();\r
+ if (!newCollectionCursor.hasNext()) {\r
+ logger.error("{} collection is empty", newCollectionName);\r
+ return;\r
+ }\r
+\r
+ List<BasicDBObject> newItems = ListUtils.cast(newCollectionCursor.toArray());\r
+\r
+ DBCursor oldCollectionCursor = oldCollection.find();\r
+ ConcurrentHashMap<Long, BasicDBObject> oldItems = null;\r
+ if (oldCollectionCursor.hasNext()) {\r
+ List<BasicDBObject> oldList = ListUtils.cast(oldCollectionCursor.toArray());\r
+ oldItems = ListUtils.map(oldList, item -> item.getLong(IOctopusAPI.ID));\r
+ }\r
+ if (oldItems == null)\r
+ oldItems = new ConcurrentHashMap<>();\r
+ for (BasicDBObject newItem : newItems) {\r
+ if (newItem == null) {\r
+ logger.error("Item is null");\r
+ continue;\r
+ }\r
+ if (!newItem.containsKey(idFieldName)) {\r
+ logger.error("{} is null", idFieldName);\r
+ continue;\r
+ }\r
+ long id = newItem.getLong(idFieldName);\r
+ BasicDBObject oldItem = oldItems.get(id);\r
+ boolean save = false;\r
+ if (oldItem == null) {\r
+ //save\r
+ save = true;\r
+ } else {\r
+ //compare\r
+ Object oldDbId = oldItem.getID();\r
+ newItem.remove(IOctopusAPI._ID);\r
+ oldItem.remove(IOctopusAPI._ID);\r
+\r
+ if (!newItem.equals(oldItem)) {\r
+ //save\r
+ newItem.put(IOctopusAPI._ID, oldDbId);\r
+ save = true;\r
+ }\r
+ }\r
+\r
+ if (save) {\r
+ logger.info("Saving {}", newItem.toPrettyString(null));\r
+ oldCollection.save(newItem);\r
+ }\r
+ }\r
+ }\r
+\r
}\r
private OctopusDataMiner sut;\r
\r
@Test\r
- public void integrationExecute() {\r
+ public void integrationExecute() throws Exception {\r
// fixture\r
sut = new OctopusDataMiner();\r
// Exercise\r
<?xml version="1.0" encoding="UTF-8" standalone="no"?>\r
<launchConfiguration type="org.eclipse.m2e.Maven2LaunchConfigurationType">\r
<booleanAttribute key="M2_DEBUG_OUTPUT" value="true"/>\r
-<stringAttribute key="M2_GOALS" value="clean deploy"/>\r
+<stringAttribute key="M2_GOALS" value="clean install"/>\r
<booleanAttribute key="M2_NON_RECURSIVE" value="false"/>\r
<booleanAttribute key="M2_OFFLINE" value="true"/>\r
<stringAttribute key="M2_PROFILES" value=""/>\r
private NexioClipEventDispatcher dispatcher = null;
public NexioWSServlet() {
- logger.info("NexioAPIServlet created");
+ logger.info("Created");
// messagePool = new NexioAPIServletMessagePool(3, sessions);
instance = this;
dispatcher = new NexioClipEventDispatcher();
dispatcher.setNexioChangeListener(this);
- //dispatcher.startup();
- logger.info("NexioWSServlet has been initialized.");
+ dispatcher.startup();
+ logger.info("Initialized");
/*
BundleContext bundleContext = FrameworkUtil.getBundle(this.getClass()).getBundleContext();
if (bundleContext != null) {