git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Tue, 23 Jan 2018 15:44:43 +0000 (15:44 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Tue, 23 Jan 2018 15:44:43 +0000 (15:44 +0000)
24 files changed:
server/-configuration/log4j2.xml
server/-configuration/mediacube-auth.properties
server/-configuration/run-mediacube-server-bsh.launch
server/user.commons.log4j2/src/user/commons/log4j2/appender/SmtpManager.java
server/user.jobengine.executors/src/user/jobengine/server/steps/CopyForArchiveNEXIORecordingsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/FakeNoParamsStep.java
server/user.jobengine.executors/src/user/jobengine/server/steps/OctopusDataMiner.java
server/user.jobengine.executors/src/user/jobengine/server/steps/OctopusDataMinerStable.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/MediaCubeFinishMarker.java [new file with mode: 0644]
server/user.jobengine.osgi.commons/src/user/commons/MediaCubeMarker.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/IOctopusAPI.java
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusAPI.java
server/user.jobengine.osgi.server/.settings/org.eclipse.core.resources.prefs
server/user.jobengine.osgi.server/pages/index.zul
server/user.jobengine.osgi.server/pages/menu.zul
server/user.jobengine.osgi.server/resources/i3-label_hu.properties
server/user.jobengine.osgi.server/src/user/jobengine/server/IJobRuntime.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobRuntime.java
server/user.jobengine.osgi.server/src/user/jobengine/server/JobStepExecutor.java
server/user.jobengine.osgi.server/src/user/jobengine/server/steps/LogCollector.java [deleted file]
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/LDAPHandler.java
server/user.jobengine.osgi.server/src/user/jobengine/zk/util/UserPrincipal.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/ServiceObjectMapper.java
server/user.jobengine.osgi.services/src/user/jobengine/osgi/rest/octopus/OctopusRESTService.java

index b576e7da9434b1675c2a9dd863d0273d6ea59084..74ce51bea57bd9563ed0103737302bc1ba6c7739 100644 (file)
@@ -24,7 +24,9 @@
                        <Filters>\r
                                <MarkerFilter marker="MEDIACUBE" onMatch="ACCEPT" onMismatch="DENY" />\r
                        </Filters>\r
-                       <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n%n A küldő a %F forráskód %L. sorából a %logger{1}.%M függvény volt. %n" />\r
+<!--                   <PatternLayout pattern="%d{HH:mm:ss} %-5level - %msg %n%n A küldő a %F forráskód %L. sorából a %logger{1}.%M függvény volt. %n" /> -->\r
+                       <PatternLayout pattern="%d{HH:mm:ss} %level - %msg %n" />\r
+<!--                           <HTMLLayout /> -->\r
                </HTMLMailAppender>\r
                <RollingFile name="RollingFile" fileName="${fileName}" filePattern="${filePattern}">\r
                        <PatternLayout pattern="%d{HH:mm:ss.SSS} [%-5level] [%t] [%M] [%class{36}] %msg%n %throwable{short}" />\r
index ec8d364000bb8a00533091624aa6c01c06e86a70..1e0709423720ec013b338001b4475a39c0a9208c 100644 (file)
@@ -4,6 +4,6 @@ ad_host=10.10.254.11
 ad_nonsecureport=3268\r
 ad_base_dn=DC=intra,DC=echotv,DC=hu\r
 ad_admin_map=G_ECH_U_INFORMATIKUSOK,G_ECH_U_MUSZAKVEZETOK,ECH-ISILON-ADMINS\r
-local_users=user:password\r
+local_users=user:password;kuka:kuka\r
 local_admins=root:password\r
 local_jobsubmitters=lebony:lebony
\ No newline at end of file
index 164f27ee53c9dfe1cd1a73cd3e5737729eebe4d3..193800bdae679448c8c4db5834008f3c18841850 100644 (file)
@@ -19,7 +19,7 @@
 <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="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-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&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=storyfolders&#13;&#10;-Djobengine.octopus.stories.name=stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Djavax.ws.rs.ext.RuntimeDelegate=org.jboss.resteasy.spi.ResteasyProviderFactory&#13;&#10;-Dorg.eclipse.epp.logging.aeri.skipReports=true &#13;&#10;-Declipse.ignoreApp=true &#13;&#10;-Dosgi.noShutdown=true&#13;&#10;-Djobengine.jobsteps.root=&quot;${workspace_loc}/user.jobengine.executors/config&quot;&#13;&#10;-Djobengine.jobtemplates.root=&quot;${workspace_loc}/user.jobengine.executors/jobtemplates&quot;&#13;&#10;-Djobengine.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.db.user=db2admin&#13;&#10;-Djobengine.db.password=password&#13;&#10;-Djobengine.loglevel=INFO&#13;&#10;-Dlog4j.configurationFile=&quot;${workspace_loc}/-configuration/log4j2.xml&quot;&#13;&#10;-Djobengine.jobsteps.alternate.root=&quot;${workspace_loc}/user.jobengine.executors/bin/user/jobengine/server/steps&quot;&#13;&#10;-Djetty.home=&quot;${workspace_loc:}/-configuration/jetty&quot;&#13;&#10;-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&#13;&#10;-Djobengine.octopus.api.address=http://10.10.1.11/api/v1&#13;&#10;-Djobengine.octopus.api.user=mam&#13;&#10;-Djobengine.octopus.api.password=napocska&#13;&#10;-Djobengine.nosql.db.url=jdbc:db2://10.10.1.27:50000/mc:retrieveMessagesFromServerOnGetMessage=true;&#13;&#10;-Djobengine.nosql.db.user=db2admin&#13;&#10;-Djobengine.nosql.db.password=password&#13;&#10;-Djobengine.nosql.db.schema=test&#13;&#10;-Djobengine.selenio.address=http://10.10.1.71:44000/TranscodeMgrWS?wsdl&#13;&#10;-Djobengine.selenio.projectfilepath=\\10.10.1.71\Data\Blueprints\MP4_H264_AAC.zenium&#13;&#10;-Djobengine.jobscheduling.config=&quot;${workspace_loc}/-configuration/scheduledjobs.json&quot;&#13;&#10;-Dnexio.host=10.10.1.55&#13;&#10;-Dnexio.disable=true&#13;&#10;-Djobengine.octopus.rundowns.name=new-rundowns&#13;&#10;-Djobengine.octopus.storyfolders.name=new-storyfolders&#13;&#10;-Djobengine.octopus.stories.name=new-stories&#13;&#10;-Dmediacube.auth.location=&quot;${workspace_loc}/-configuration/mediacube-auth.properties&quot;"/>\r
 <stringAttribute key="pde.version" value="3.3"/>\r
 <booleanAttribute key="show_selected_only" value="true"/>\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
index 3e7477737ced5bea4b6891c65f61e9319ce8fc83..666e7b038bdfcdd82f4bc8c2f61e2cce8a366cf9 100644 (file)
@@ -19,8 +19,13 @@ package user.commons.log4j2.appender;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Date;
+import java.util.List;
+import java.util.Map;
 import java.util.Properties;
+import java.util.concurrent.ConcurrentHashMap;
 
 import javax.activation.DataSource;
 import javax.mail.Authenticator;
@@ -32,7 +37,6 @@ import javax.mail.Transport;
 import javax.mail.internet.InternetHeaders;
 import javax.mail.internet.MimeBodyPart;
 import javax.mail.internet.MimeMessage;
-import javax.mail.internet.MimeMessage.RecipientType;
 import javax.mail.internet.MimeMultipart;
 import javax.mail.internet.MimeUtility;
 import javax.mail.util.ByteArrayDataSource;
@@ -54,6 +58,7 @@ import org.apache.logging.log4j.message.ReusableMessage;
 import org.apache.logging.log4j.util.PropertiesUtil;
 import org.apache.logging.log4j.util.Strings;
 
+import user.commons.MediaCubeFinishMarker;
 import user.commons.MediaCubeMarker;
 
 /**
@@ -147,6 +152,7 @@ public class SmtpManager extends AbstractManager {
        }
 
        private static final SMTPManagerFactory FACTORY = new SMTPManagerFactory();
+       private static Map<String, List<LogEvent>> sessionEvents = new ConcurrentHashMap<>();
 
        private static MimeMessage createMimeMessage(final FactoryData data, final Session session, final LogEvent appendEvent) throws MessagingException {
                return new MimeMessageBuilder(session).setFrom(data.from).setReplyTo(data.replyto).setRecipients(Message.RecipientType.TO, data.to)
@@ -256,9 +262,9 @@ public class SmtpManager extends AbstractManager {
                return encoded.toByteArray();
        }
 
-       protected byte[] formatContentToBytes(final LogEvent[] priorEvents, final LogEvent appendEvent, final Layout<?> layout) throws IOException {
+       protected byte[] formatContentToBytes(final List<LogEvent> events, final Layout<?> layout) throws IOException {
                final ByteArrayOutputStream raw = new ByteArrayOutputStream();
-               writeContent(priorEvents, appendEvent, layout, raw);
+               writeContent(events, layout, raw);
                return raw.toByteArray();
        }
 
@@ -281,6 +287,30 @@ public class SmtpManager extends AbstractManager {
                return mp;
        }
 
+       private void sendEmail(final String to, byte[] content, String contentType) {
+               try {
+                       final String encoding = getEncoding(content, contentType);
+                       final byte[] encodedBytes = encodeContentToBytes(content, encoding);
+                       final InternetHeaders headers = getHeaders(contentType, encoding);
+                       final MimeMultipart mp = getMimeMultipart(encodedBytes, headers);
+                       sendMultipartMessage(message, mp);
+               } catch (final MessagingException | IOException | RuntimeException e) {
+                       logError("Caught exception while sending e-mail notification.", e);
+                       throw new LoggingException("Error occurred while sending email", e);
+               }
+       }
+
+       private void sendEvents(final Layout<?> layout, final List<LogEvent> events, final String to) {
+               try {
+                       final byte[] rawBytes = formatContentToBytes(events, layout);
+                       final String contentType = layout.getContentType();
+                       sendEmail(to, rawBytes, contentType);
+               } catch (Exception e) {
+                       logError("Caught exception while sending e-mail notification.", e);
+                       throw new LoggingException("Error occurred while sending email", e);
+               }
+       }
+
        /**
         * Send the contents of the cyclic buffer as an e-mail message.
         *
@@ -290,32 +320,31 @@ public class SmtpManager extends AbstractManager {
         *            The event that triggered the send.
         */
        public void sendEvents(final Layout<?> layout, final LogEvent appendEvent) {
-               if (message == null) {
+               if (message == null)
                        connect(appendEvent);
-               }
-               try {
-                       if (appendEvent.getMarker() instanceof MediaCubeMarker) {
-                               MediaCubeMarker mcm = (MediaCubeMarker) appendEvent.getMarker();
-                               message.setRecipients(RecipientType.TO, mcm.getTo());
-                       } else
-                               message.setRecipients(RecipientType.TO, defaultRecipient);
 
-                       //final LogEvent[] priorEvents = buffer.removeAll();
-                       // LOG4J-310: log appendEvent even if priorEvents is empty
-
-                       final byte[] rawBytes = formatContentToBytes(null, appendEvent, layout);
+               //System.out.println(appendEvent.getMarker().getClass().getSimpleName() + " " + new String(layout.toByteArray(appendEvent)));
+               String to = defaultRecipient;
+               if (appendEvent.getMarker() instanceof MediaCubeFinishMarker) {
+                       MediaCubeFinishMarker mcm = (MediaCubeFinishMarker) appendEvent.getMarker();
+                       storeSessionEvent(mcm, appendEvent);
+                       sendSessionEvents(mcm, layout);
+                       return;
+               }
 
-                       final String contentType = layout.getContentType();
-                       final String encoding = getEncoding(rawBytes, contentType);
-                       final byte[] encodedBytes = encodeContentToBytes(rawBytes, encoding);
+               if (appendEvent.getMarker() instanceof MediaCubeMarker) {
+                       MediaCubeMarker mcm = (MediaCubeMarker) appendEvent.getMarker();
+                       if (mcm.getSessionID() == null) {
+                               if (mcm.getTo() != null)
+                                       to = mcm.getTo();
+                       } else {
+                               storeSessionEvent(mcm, appendEvent);
+                               return;
+                       }
 
-                       final InternetHeaders headers = getHeaders(contentType, encoding);
-                       final MimeMultipart mp = getMimeMultipart(encodedBytes, headers);
-                       sendMultipartMessage(message, mp);
-               } catch (final MessagingException | IOException | RuntimeException e) {
-                       logError("Caught exception while sending e-mail notification.", e);
-                       throw new LoggingException("Error occurred while sending email", e);
                }
+
+               sendEvents(layout, Arrays.asList(appendEvent), to);
        }
 
        protected void sendMultipartMessage(final MimeMessage msg, final MimeMultipart mp) throws MessagingException {
@@ -326,20 +355,36 @@ public class SmtpManager extends AbstractManager {
                }
        }
 
-       protected void writeBuffer(final LogEvent[] priorEvents, final LogEvent appendEvent, final Layout<?> layout, final OutputStream out) throws IOException {
-               //              for (final LogEvent priorEvent : priorEvents) {
-               //                      final byte[] bytes = layout.toByteArray(priorEvent);
-               //                      out.write(bytes);
-               //              }
+       private void sendSessionEvents(final MediaCubeMarker mcm, final Layout<?> layout) {
+               String sessionID = mcm.getSessionID();
+               List<LogEvent> events = sessionEvents.get(sessionID);
+               if (events == null)
+                       return;
+               String to = mcm.getTo() == null ? defaultRecipient : mcm.getTo();
+               sendEvents(layout, events, to);
+               sessionEvents.remove(sessionID);
+       }
 
-               final byte[] bytes = layout.toByteArray(appendEvent);
-               out.write(bytes);
+       private void storeSessionEvent(MediaCubeMarker mcm, LogEvent appendEvent) {
+               String sessionID = mcm.getSessionID();
+               List<LogEvent> events = sessionEvents.get(sessionID);
+               if (events == null) {
+                       events = new ArrayList<>();
+                       sessionEvents.put(sessionID, events);
+               }
+               events.add(appendEvent);
+       }
+
+       protected void writeBuffer(List<LogEvent> events, final Layout<?> layout, final OutputStream out) throws IOException {
+               for (final LogEvent priorEvent : events) {
+                       final byte[] bytes = layout.toByteArray(priorEvent);
+                       out.write(bytes);
+               }
        }
 
-       private void writeContent(final LogEvent[] priorEvents, final LogEvent appendEvent, final Layout<?> layout, final ByteArrayOutputStream out)
-                       throws IOException {
+       private void writeContent(final List<LogEvent> events, final Layout<?> layout, final ByteArrayOutputStream out) throws IOException {
                writeHeader(layout, out);
-               writeBuffer(priorEvents, appendEvent, layout, out);
+               writeBuffer(events, layout, out);
                writeFooter(layout, out);
        }
 
index ad37811f1cf819c7f71a9ad43e5cdff8417249b7..958b2a9ccf3e5425ed3f9f9f92f6d9a4511235b8 100644 (file)
@@ -183,7 +183,7 @@ public class CopyForArchiveNEXIORecordingsStep extends JobStep {
                        return null;\r
                DBObject rundown = octopusAPI.getRundown(scheduledStart);\r
                if (rundown == null) {\r
-                       logger.warn(getMarker(), "A '{}' anyaghoz nem talllható tükör '{}' kezdéssel, ezért nem archiválható.", clipName, scheduledStart);\r
+                       logger.error(getMarker(), "A '{}' anyaghoz nem található tükör '{}' kezdéssel, ezért nem archiválható.", clipName, scheduledStart);\r
                        return null;\r
                }\r
 \r
@@ -225,9 +225,6 @@ public class CopyForArchiveNEXIORecordingsStep extends JobStep {
                        return null;\r
                RundownArchive result = new RundownArchive();\r
 \r
-               long id = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
-               if (id == 0)\r
-                       return null;\r
                String name = NoSQLUtils.asString(NoSQLUtils.asDBObject(rundown, IOctopusAPI.RUNDOWN_TYPE), IOctopusAPI.NAME);\r
                if (StringUtils.isBlank(name))\r
                        return null;\r
@@ -237,7 +234,7 @@ public class CopyForArchiveNEXIORecordingsStep extends JobStep {
                        return null;\r
                String start = CalendarUtils.toString(CalendarUtils.createCalendar(scheduledStart), SCHEDULED_FORMAT);\r
                result.setScheduleDate(scheduledStart);\r
-               result.setItemHouseId(String.valueOf(id));\r
+               result.setItemHouseId(String.valueOf(rundownID));\r
                result.setItemTitle(String.format("%s %s %s", start, name, channel));\r
 \r
                StringBuilder sb = new StringBuilder();\r
index abd1b76f51c1c199e916c3b9b99ccd325659c61b..f90b470dcf18056dc261e7f59b83d60c703ed67e 100644 (file)
@@ -3,7 +3,6 @@ package user.jobengine.server.steps;
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 \r
-import user.commons.MediaCubeMarker;\r
 import user.jobengine.server.IJobEngine;\r
 import user.jobengine.server.IJobRuntime;\r
 \r
@@ -13,21 +12,21 @@ public class FakeNoParamsStep extends JobStep {
 \r
        @StepEntry\r
        public Object[] execute(IJobEngine jobEngine, IJobRuntime jobRuntime) throws InterruptedException {\r
-               MediaCubeMarker toMarker = new MediaCubeMarker("vasary@gmail.com");\r
-               logger.info(toMarker, "A folyamat elindult");\r
-               logger.warn(toMarker, "Egy WARN");\r
-               logger.error(toMarker, "Egy ERROR");\r
-               logger.warn(toMarker, "Egy WARN {}", "paraméterrel");\r
-               logger.error(toMarker, "Egy ERROR {}", "paraméterrel");\r
+               logger.info(jobRuntime.getMarker(), "A folyamat elindult");\r
+               logger.warn(jobRuntime.getMarker(), "Egy WARN");\r
+               logger.error(jobRuntime.getMarker(), "Egy ERROR");\r
+               //              logger.warn(toMarker, "Egy WARN {}", "paraméterrel");\r
+               //              logger.error(toMarker, "Egy ERROR {}", "paraméterrel");\r
                for (int i = 0; i < count; i++) {\r
                        if (!canContinue())\r
                                break;\r
                        jobRuntime.incrementProgress((i + 1) * count);\r
                        Thread.sleep(100);\r
-                       logger.info(getMarker(), "Log markered" + i);\r
+                       logger.info(jobRuntime.getMarker(), "Log markered" + i);\r
+                       //                      logger.info(toMarker, "Log markered" + i);\r
                        //logger.info("Progress {}", jobRuntime.getProgress());\r
                }\r
-               logger.info(toMarker, "A folyamat véget ért");\r
+               logger.info(jobRuntime.getFinishMarker(), "A folyamat véget ért");\r
                //logger.info(LogCollector.FINISH);\r
                return null;\r
        }\r
index f710e641ce9ceee73e22ff3a8a240601825c3baf..1f565ec50954415760d21a869fe31125b459a950 100644 (file)
@@ -7,7 +7,6 @@ import java.util.HashSet;
 import java.util.List;\r
 import java.util.Map;\r
 import java.util.Set;\r
-import java.util.concurrent.ConcurrentHashMap;\r
 \r
 import javax.swing.event.EventListenerList;\r
 import javax.ws.rs.client.Entity;\r
@@ -15,6 +14,7 @@ import javax.ws.rs.client.Invocation.Builder;
 import javax.ws.rs.core.MediaType;\r
 import javax.ws.rs.core.Response;\r
 \r
+import org.apache.commons.lang.StringUtils;\r
 import org.apache.logging.log4j.LogManager;\r
 import org.apache.logging.log4j.Logger;\r
 import org.jboss.resteasy.client.jaxrs.BasicAuthentication;\r
@@ -29,8 +29,6 @@ import com.ibm.nosql.json.api.BasicDBObject;
 import com.ibm.nosql.json.api.DB;\r
 import com.ibm.nosql.json.api.DBCollection;\r
 import com.ibm.nosql.json.api.DBCursor;\r
-import com.ibm.nosql.json.api.QueryBuilder;\r
-import com.ibm.nosql.json.api.WriteResult;\r
 \r
 import user.commons.CalendarUtils;\r
 import user.commons.ListUtils;\r
@@ -38,19 +36,16 @@ import user.commons.nosql.NoSQLUtils;
 import user.commons.octopus.IOctopusAPI;\r
 import user.commons.remotestore.IProgressEventListener;\r
 import user.commons.remotestore.ProgressEvent;\r
+import user.jobengine.server.steps.MetadataTypeDetector.MetadataType;\r
 \r
 public class OctopusDataMiner {\r
+       private static final Logger logger = LogManager.getLogger();\r
        private static final String ARCHIVED = "archived";\r
        private static final String FILTER = "filter";\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 static final String SAVING_STORY_ID = "Saving story {}";\r
-       //      private static final String SAVING_RUNDOWN = "Saving rundown : {} {}";\r
-       //      private static final String CHECKING_RUNDOWN = "Checking Rundown {} ({}/{})";\r
-       private static final String FIELDS_STORYFOLDER_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
-       private static final String FIELDS_RUNDOWN_STORIES = "slugs,Slug.story,Slug.position,Story.name,Story.id,Story.modified,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
+       private static final String FIELDS_STORIES = "id,name,modified,type,format,mosObjects,script,customColumns,CustomColumn.label,CustomColumn.value,reporters,User.longName,User.userName";\r
        private static final String FIELDS_RUNDOWN = "id,name,modified,scheduledStart,channel,Channel.name,rundownType,RundownType.name";\r
        private static final String FIELDS_RUNDOWN_STORYIDS = "id,slugs,Slug.storyId,Slug.position";\r
        private static final String FIELDS_STORYFOLDER = "id,name,modified";\r
@@ -59,7 +54,6 @@ public class OctopusDataMiner {
        private static final String OCTOPUS_DEVICE_NAME = "Octopus-Device-Name";\r
        private static final String OCTOPUS_DEVICE_ID = "Octopus-Device-Id";\r
        private static final String FIELDS = "fields";\r
-       private static final String CHECKING_STORY_FOLDER = "Checking StoryFolder %s (%d/%d)";\r
        private static final String EXIT = "Exit";\r
        private static final String RESULT = "result";\r
        private static final String STORY_FOLDER = "StoryFolder";\r
@@ -67,6 +61,7 @@ public class OctopusDataMiner {
        private static final String FINISHED = "Finished";\r
        private static final String STARTING = "Starting";\r
        private static final String MOSOBJECT = "Bejátszó: ";\r
+       private static final Object STORY = "Story";\r
 \r
        private DB db;\r
        private ResteasyWebTarget webTarget;\r
@@ -82,11 +77,10 @@ public class OctopusDataMiner {
        private Map<Long, Object> currentRundowns;\r
        private Map<Long, Object> currentFolder;\r
        private Map<Long, Object> currentStories;\r
-       private String RUNDOWN_COLLECTION;\r
-       private String FOLDER_COLLECTION;\r
-       private String STORY_COLLECTION;\r
        private boolean includeArchived;\r
        private Calendar zeroDate = CalendarUtils.createCalendar(2017, 11, 4);\r
+       private int objectCount;\r
+       private int currentObjectIndex;\r
 \r
        public OctopusDataMiner() {\r
                db = NoSQLUtils.getNoSQLDB();\r
@@ -117,12 +111,15 @@ public class OctopusDataMiner {
                        List<BasicDBObject> stories = NoSQLUtils.asList(storyFolderWithStoryIds, IOctopusAPI.STORIES);\r
                        if (stories == null)\r
                                continue;\r
-                       if (!folderIDs.contains(storyFolderId))\r
-                               folderIDs.add(storyFolderId);\r
+\r
+                       folderIDs.add(storyFolderId);\r
+\r
                        long position = 1;\r
                        for (BasicDBObject story : stories) {\r
                                long storyId = story.getLong(IOctopusAPI.ID);\r
 \r
+                               storyIDs.add(storyId);\r
+\r
                                BasicDBList references = result.get(storyId);\r
                                if (references == null) {\r
                                        references = new BasicDBList();\r
@@ -146,13 +143,15 @@ public class OctopusDataMiner {
                        if (slugs == null)\r
                                continue;\r
 \r
-                       if (!rundownIDs.contains(rundownId))\r
-                               rundownIDs.add(rundownId);\r
+                       rundownIDs.add(rundownId);\r
 \r
                        for (BasicDBObject slug : slugs) {\r
                                if (!slug.containsKey(IOctopusAPI.STORYID))\r
                                        continue;\r
                                long storyId = slug.getLong(IOctopusAPI.STORYID);\r
+\r
+                               storyIDs.add(storyId);\r
+\r
                                BasicDBList references = result.get(storyId);\r
                                if (references == null) {\r
                                        references = new BasicDBList();\r
@@ -168,26 +167,9 @@ public class OctopusDataMiner {
        }\r
 \r
        public void clear() {\r
-               db.getCollection(RUNDOWN_COLLECTION).remove();\r
-               db.getCollection(STORY_COLLECTION).remove();\r
-               db.getCollection(FOLDER_COLLECTION).remove();\r
-               db.getCollection(IOctopusAPI.TIME_COLLECTION_NAME).remove();\r
-       }\r
-\r
-       private String concatParentsToStoryFolder(BasicDBObject actual, String name) {\r
-\r
-               String fields = "name,id,parent";\r
-               Response response = query("StoryFolder/" + actual.getLong("id"), fields).get();\r
-               String json = response.readEntity(String.class);\r
-               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
-               BasicDBObject res = (BasicDBObject) resultObject.get("result");\r
-               BasicDBObject parent = (BasicDBObject) res.get("parent");\r
-               if (parent == null || parent.isEmpty())\r
-                       return name;\r
-               String parentName = parent.getString(IOctopusAPI.NAME);\r
-               String actualName = actual.getString(IOctopusAPI.NAME);\r
-               String newName = String.format("%s/%s", parentName, actualName);\r
-               return concatParentsToStoryFolder(parent, newName);\r
+               db.getCollection(IOctopusAPI.RUNDOWN_COLLECTION).remove();\r
+               db.getCollection(IOctopusAPI.FOLDER_COLLECTION).remove();\r
+               db.getCollection(IOctopusAPI.STORY_COLLECTION).remove();\r
        }\r
 \r
        private void deleteDiff(Set<Long> oldIDs, Set<Long> newIDs, String collectionName) {\r
@@ -202,82 +184,13 @@ public class OctopusDataMiner {
                }\r
        }\r
 \r
-       private void deleteOrphanRundowns() {\r
-               try {\r
-                       DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
-                       BasicDBObject query = (BasicDBObject) QueryBuilder.start().put(IOctopusAPI.ID).notIn(storyRundowns.keySet().toArray()).get();\r
-                       WriteResult res = collection.remove(query);\r
-                       logger.trace(String.format("Deleted orphan rundowns: %d", res.getN()));\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
-               }\r
-       }\r
-\r
-       private void deleteOrphanStories() {\r
-               try {\r
-                       DBCollection collection = db.getCollection(STORY_COLLECTION);\r
-                       BasicDBObject query = (BasicDBObject) QueryBuilder.start().put("id").notIn(storyIDs.toArray()).get();\r
-                       WriteResult res = collection.remove(query);\r
-                       logger.trace(String.format("Deleted orphan stories: %d", res.getN()));\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
-               }\r
-       }\r
-\r
-       private void deleteOrphanStoryFolders() {\r
-               try {\r
-                       DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
-                       BasicDBObject query = (BasicDBObject) QueryBuilder.start().put(IOctopusAPI.ID).notIn(storyStoryFolders.keySet().toArray()).get();\r
-                       WriteResult res = collection.remove(query);\r
-                       logger.trace(String.format("Deleted orphan rundowns: %d", res.getN()));\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
-               }\r
-       }\r
-\r
-       private void ensureIndexes() {\r
-               DBCollection collection = db.getCollection(FOLDER_COLLECTION);\r
-               if (collection.count() == 0)\r
-                       collection.ensureIndex(IOctopusAPI.ID);\r
-               collection = db.getCollection(RUNDOWN_COLLECTION);\r
-               if (collection.count() == 0) {\r
-                       collection.ensureIndex(IOctopusAPI.ID);\r
-                       collection.ensureIndex(IOctopusAPI.SCHEDULED_START);\r
-               }\r
-               collection = db.getCollection(STORY_COLLECTION);\r
-               if (collection.count() == 0)\r
-                       collection.ensureIndex(IOctopusAPI.ID);\r
-       }\r
-\r
        public void execute(boolean includeArchived) throws Exception {\r
                this.includeArchived = includeArchived;\r
                logger.trace(STARTING);\r
-\r
-               //              String MAIN_RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION;\r
-               //              String MAIN_FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
-               //              String MAIN_STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
-\r
-               //              RUNDOWN_COLLECTION = MAIN_RUNDOWN_COLLECTION + _TMP;\r
-               //              FOLDER_COLLECTION = MAIN_FOLDER_COLLECTION + _TMP;\r
-               //              STORY_COLLECTION = MAIN_STORY_COLLECTION + _TMP;\r
-               //\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
-               RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION;\r
-               FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
-               STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
-\r
-               //NoSQLUtils.asList((BasicDBList)\r
-               currentRundowns = getCurrentIDs(RUNDOWN_COLLECTION);\r
-               currentFolder = getCurrentIDs(FOLDER_COLLECTION);\r
-               currentStories = getCurrentIDs(STORY_COLLECTION);\r
+               //current = korábbi szinkronizálás\r
+               currentRundowns = getCurrentIDs(IOctopusAPI.RUNDOWN_COLLECTION);\r
+               currentFolder = getCurrentIDs(IOctopusAPI.FOLDER_COLLECTION);\r
+               currentStories = getCurrentIDs(IOctopusAPI.STORY_COLLECTION);\r
 \r
                BasicDBList rundowns = null;\r
                BasicDBList storyFolders = null;\r
@@ -289,48 +202,16 @@ public class OctopusDataMiner {
                        throw e;\r
                }\r
 \r
-               processRundowns(rundowns);\r
-               processStoryFolders(storyFolders);\r
-\r
-               deleteDiff(currentRundowns.keySet(), rundownIDs, RUNDOWN_COLLECTION);\r
-               deleteDiff(currentFolder.keySet(), folderIDs, FOLDER_COLLECTION);\r
-               deleteDiff(currentStories.keySet(), storyIDs, STORY_COLLECTION);\r
-               //              deleteOrphanRundowns();\r
-               //              deleteOrphanStoryFolders();\r
-               //              deleteOrphanStories();\r
-\r
-               //a sorrend fontos !\r
-               //                              updateDiff(MAIN_STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
-               //                              updateDiff(MAIN_RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
-               //                              updateDiff(MAIN_FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
-               //\r
-               //                              updateDeleteDiff(MAIN_RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
-               //                              updateDeleteDiff(MAIN_FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
-               //                              updateDeleteDiff(MAIN_STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
-\r
-               //              try {\r
-               //                      db.getCollection(RUNDOWN_COLLECTION).rename(MAIN_RUNDOWN_COLLECTION, true);\r
-               //                      db.getCollection(FOLDER_COLLECTION).rename(MAIN_FOLDER_COLLECTION, true);\r
-               //                      db.getCollection(STORY_COLLECTION).rename(MAIN_STORY_COLLECTION, true);\r
-               //              } catch (Exception e) {\r
-               //                      logger.catching(e);\r
-               //                      throw e;\r
-               //              }\r
-\r
-               //              logger.info("Activate");\r
+               objectCount = rundownIDs.size() + folderIDs.size() + storyIDs.size();\r
 \r
-               //              try {\r
-               //                      long ts = new Date().getTime();\r
-               //                      db.getCollection(RUNDOWN_COLLECTION).exportFile(String.format("/opt/mediacube-test/log/%s-%s.js", RUNDOWN_COLLECTION, ts));\r
-               //                      db.getCollection(FOLDER_COLLECTION).exportFile(String.format("/opt/mediacube-test/log/%s-%s.js", FOLDER_COLLECTION, ts));\r
-               //                      db.getCollection(STORY_COLLECTION).exportFile(String.format("/opt/mediacube-test/log/%s-%s.js", STORY_COLLECTION, ts));\r
-               //              } catch (Exception e) {\r
-               //                      logger.catching(e);\r
-               //                      throw e;\r
-               //              }\r
+               storeStories();\r
+               storeRundowns(rundowns);\r
+               storeStoryFolders(storyFolders);\r
 \r
+               deleteDiff(currentRundowns.keySet(), rundownIDs, IOctopusAPI.RUNDOWN_COLLECTION);\r
+               deleteDiff(currentFolder.keySet(), folderIDs, IOctopusAPI.FOLDER_COLLECTION);\r
+               deleteDiff(currentStories.keySet(), storyIDs, IOctopusAPI.STORY_COLLECTION);\r
                logger.trace(FINISHED);\r
-               //throw new Exception("Mérés");\r
        }\r
 \r
        private String extractContent(BasicDBObject content) {\r
@@ -398,6 +279,8 @@ public class OctopusDataMiner {
                List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
                if (mosObjects == null)\r
                        return null;\r
+\r
+               Map<String, String> mosLabels = extractScriptMosObjectIDs(story);\r
                BasicDBList result = null;\r
                for (BasicDBObject mosObject : mosObjects) {\r
                        if (!mosObject.containsKey(IOctopusAPI.MOS_ID))\r
@@ -405,8 +288,19 @@ public class OctopusDataMiner {
                        String mosId = mosObject.getString(IOctopusAPI.MOS_ID);\r
                        if (!IOctopusAPI.NEXIO_MOS.equals(mosId))\r
                                continue;\r
+                       String objId = mosObject.getString(IOctopusAPI.OBJ_ID);\r
+                       if (objId == null)\r
+                               continue;\r
+\r
+                       MetadataType metadataType = MetadataTypeDetector.GuessMetadataType(objId);\r
+                       if (!MetadataType.OCTOPUSPLACEHOLDER.equals(metadataType) && !MetadataType.OCTOPUSSTORY.equals(metadataType))\r
+                               continue;\r
                        if (result == null)\r
                                result = new BasicDBList();\r
+\r
+                       String label = mosLabels.get(objId);\r
+                       if (StringUtils.isNotBlank(label))\r
+                               mosObject.append(IOctopusAPI.LABEL, label);\r
                        result.add(mosObject);\r
                }\r
                return result;\r
@@ -438,6 +332,49 @@ public class OctopusDataMiner {
                return sb.length() == 0 ? null : sb.toString();\r
        }\r
 \r
+       private Map<String, String> extractScriptMosObjectIDs(BasicDBObject story) {\r
+               BasicDBObject script = NoSQLUtils.asDBObject(story, IOctopusAPI.SCRIPT);\r
+               if (script == null || script.isEmpty())\r
+                       return null;\r
+\r
+               List<BasicDBObject> body = NoSQLUtils.asList(script, IOctopusAPI.BODY);\r
+               if (body == null || body.size() == 0)\r
+                       return null;\r
+\r
+               Map<String, String> result = new HashMap<>();\r
+\r
+               for (BasicDBObject bodyItem : body) {\r
+                       String label = bodyItem.getString(IOctopusAPI.LABEL);\r
+                       if (StringUtils.isBlank(label))\r
+                               continue;\r
+                       BasicDBObject clip = NoSQLUtils.asDBObject(bodyItem, IOctopusAPI.CLIP);\r
+                       if (clip == null)\r
+                               continue;\r
+                       BasicDBObject obj = NoSQLUtils.asDBObject(clip, IOctopusAPI.OBJECT);\r
+                       if (obj == null)\r
+                               continue;\r
+                       String mosId = obj.getString(IOctopusAPI.MOS_ID);\r
+                       if (!IOctopusAPI.NEXIO_MOS.equals(mosId))\r
+                               continue;\r
+                       String objId = obj.getString(IOctopusAPI.OBJ_ID);\r
+                       if (objId == null)\r
+                               continue;\r
+                       result.put(mosId, label);\r
+\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void fireProgressEvent() {\r
+               currentObjectIndex++;\r
+               logger.info("currentObjectIndex {}", currentObjectIndex);\r
+               int progress = currentObjectIndex * 100 / objectCount;\r
+               if (progress != progressEvent.getProgress()) {\r
+                       progressEvent.setProgress(progress);\r
+                       fireProgressEvent(progressEvent);\r
+               }\r
+       }\r
+\r
        private void fireProgressEvent(ProgressEvent evt) {\r
                logger.debug("Progress changed to " + evt.getProgress() + "%");\r
                if (progressListenerList == null)\r
@@ -470,36 +407,6 @@ public class OctopusDataMiner {
                return result;\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
                ResteasyWebTarget target = webTarget.path(path).queryParam(FIELDS, fields);\r
                Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
@@ -557,6 +464,20 @@ public class OctopusDataMiner {
                return result;\r
        }\r
 \r
+       private BasicDBObject queryStory(long storyID) {\r
+               logger.trace(ENTER);\r
+               BasicDBObject result = null;\r
+               Response response = query(String.format("%s/%d", STORY, storyID), FIELDS_STORIES).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               if (resultObject == null)\r
+                       logger.error("Story {} is not available", storyID);\r
+               else\r
+                       result = NoSQLUtils.asDBObject(resultObject, RESULT);\r
+               logger.trace(EXIT);\r
+               return result;\r
+       }\r
+\r
        private BasicDBObject queryStoryFolder(BasicDBObject storyFolder, String fields) {\r
                logger.trace(ENTER);\r
                BasicDBObject result = null;\r
@@ -609,50 +530,47 @@ public class OctopusDataMiner {
                logger.trace(ENTER);\r
                String name = rundown.containsKey(IOctopusAPI.NAME) ? rundown.getString(IOctopusAPI.NAME) : null;\r
                logger.debug("Storing rundown {} {}", name, rundown.get(IOctopusAPI.SCHEDULED_START));\r
-               BasicDBObject rundownWithStories = queryRundown(rundown, FIELDS_RUNDOWN_STORIES);\r
-               if (rundownWithStories != null) {\r
-                       Date scheduledStart = toDate(rundown, IOctopusAPI.SCHEDULED_START);\r
-                       if (scheduledStart != null && scheduledStart.after(zeroDate.getTime())) {\r
-                               BasicDBList stories = NoSQLUtils.asDBList(rundownWithStories, IOctopusAPI.SLUGS);\r
-                               if (stories != null)\r
-                                       storeRundownStories(stories);\r
-                               rundown.put(IOctopusAPI.SCHEDULED_START, toDate(rundown, IOctopusAPI.SCHEDULED_START));\r
-                               rundown.put(IOctopusAPI.MODIFIED, toDate(rundown, IOctopusAPI.MODIFIED));\r
-                               DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
-                               long rundownID = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
-                               setObjectID(currentRundowns, rundownID, rundown);\r
-                               collection.save(rundown);\r
-                       }\r
+               Date scheduledStart = toDate(rundown, IOctopusAPI.SCHEDULED_START);\r
+               if (scheduledStart != null && scheduledStart.after(zeroDate.getTime())) {\r
+                       rundown.put(IOctopusAPI.SCHEDULED_START, toDate(rundown, IOctopusAPI.SCHEDULED_START));\r
+                       rundown.put(IOctopusAPI.MODIFIED, toDate(rundown, IOctopusAPI.MODIFIED));\r
+                       DBCollection collection = db.getCollection(IOctopusAPI.RUNDOWN_COLLECTION);\r
+                       long rundownID = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
+                       setObjectID(currentRundowns, rundownID, rundown);\r
+                       collection.save(rundown);\r
                }\r
-               logger.trace(EXIT);\r
+               logger.trace(ENTER);\r
        }\r
 \r
-       private void storeRundowns(BasicDBList rundowns, Date lastUpdateTime) {\r
+       private void storeRundowns(BasicDBList rundowns) {\r
                logger.trace(ENTER);\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
-                       storeRundown(rundown);\r
-                       int progress = idx * 50 / rundownsList.size();\r
-                       if (progress - progressEvent.getProgress() > 0) {\r
-                               progressEvent.setProgress(progress);\r
-                               fireProgressEvent(progressEvent);\r
+                       try {\r
+                               storeRundown(rundown);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                               throw e;\r
                        }\r
-\r
-                       idx++;\r
+                       fireProgressEvent();\r
                }\r
-               logger.trace(EXIT);\r
+               logger.trace(ENTER);\r
        }\r
 \r
-       private void storeRundownStories(BasicDBList slugs) {\r
+       private void storeStories() {\r
                logger.trace(ENTER);\r
-               List<BasicDBObject> slugsList = NoSQLUtils.asList(slugs);\r
-               for (BasicDBObject slug : slugsList) {\r
-                       if (slug.containsKey(IOctopusAPI.STORY))\r
-                               storeStory((BasicDBObject) slug.get(IOctopusAPI.STORY));\r
+               for (long storyID : storyIDs) {\r
+                       try {\r
+                               BasicDBObject story = queryStory(storyID);\r
+                               if (story != null)\r
+                                       storeStory(story);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                               throw e;\r
+                       }\r
+                       fireProgressEvent();\r
                }\r
-               logger.trace(EXIT);\r
+               logger.trace(ENTER);\r
        }\r
 \r
        private void storeStory(BasicDBObject story) {\r
@@ -662,16 +580,12 @@ public class OctopusDataMiner {
                        return;\r
                }\r
                long storyID = story.getLong(IOctopusAPI.ID);\r
-               boolean isContains = storyIDs.contains(storyID);\r
-               if (isContains)\r
-                       return;\r
-               storyIDs.add(storyID);\r
+\r
                story.put(IOctopusAPI.MODIFIED, toDate(story, IOctopusAPI.MODIFIED));\r
                BasicDBList rundownRef = storyRundowns.get(storyID);\r
                BasicDBList storyFolderRef = storyStoryFolders.get(storyID);\r
                BasicDBList modifiedMOS = extractRelevantMOSObjects(story);\r
-\r
-               DBCollection collection = db.getCollection(STORY_COLLECTION);\r
+               DBCollection collection = db.getCollection(IOctopusAPI.STORY_COLLECTION);\r
 \r
                if (rundownRef != null)\r
                        story.put(IOctopusAPI.REF_RUNDOWN, rundownRef);\r
@@ -697,49 +611,33 @@ public class OctopusDataMiner {
                logger.trace(EXIT);\r
        }\r
 \r
-       private void storeStoryFolder(BasicDBObject storyFolder, Date lastUpdateTime) {\r
+       private void storeStoryFolder(BasicDBObject storyFolder) {\r
                logger.trace(ENTER);\r
-               BasicDBObject storyFoldersWithStories = queryStoryFolder(storyFolder, FIELDS_STORYFOLDER_STORIES);\r
-               if (storyFoldersWithStories != null) {\r
-                       BasicDBList stories = NoSQLUtils.asDBList(storyFoldersWithStories, IOctopusAPI.STORIES);\r
-                       if (stories != null)\r
-                               storeStoryFolderStories(stories);\r
-                       storyFolder.put(IOctopusAPI.MODIFIED, toDate(storyFolder, IOctopusAPI.MODIFIED));\r
-                       DBCollection collection = db.getCollection(FOLDER_COLLECTION);\r
-                       String name = storyFolder.getString(IOctopusAPI.NAME);\r
-                       logger.debug("Storing story folder {}", name);\r
-                       long folderID = NoSQLUtils.asLong(storyFolder, IOctopusAPI.ID);\r
-                       setObjectID(currentFolder, folderID, storyFolder);\r
-                       collection.save(storyFolder);\r
-               }\r
+               storyFolder.put(IOctopusAPI.MODIFIED, toDate(storyFolder, IOctopusAPI.MODIFIED));\r
+               DBCollection collection = db.getCollection(IOctopusAPI.FOLDER_COLLECTION);\r
+               String name = storyFolder.getString(IOctopusAPI.NAME);\r
+               logger.debug("Storing story folder {}", name);\r
+               long folderID = NoSQLUtils.asLong(storyFolder, IOctopusAPI.ID);\r
+               setObjectID(currentFolder, folderID, storyFolder);\r
+               collection.save(storyFolder);\r
                logger.trace(EXIT);\r
        }\r
 \r
-       private void storeStoryFolders(BasicDBList storyFolders, Date lastUpdateTime) {\r
+       private void storeStoryFolders(BasicDBList storyFolders) {\r
                logger.trace(ENTER);\r
                List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
-               int idx = 1;\r
                for (BasicDBObject storyFolder : storyFolderList) {\r
-                       logger.debug(String.format(CHECKING_STORY_FOLDER, storyFolder.getLong(IOctopusAPI.ID), storyFolderList.size(), idx));\r
-                       storeStoryFolder(storyFolder, lastUpdateTime);\r
-                       int progress = 50 + (idx * 50 / storyFolderList.size());\r
-                       if (progress - progressEvent.getProgress() > 0) {\r
-                               progressEvent.setProgress(progress);\r
-                               fireProgressEvent(progressEvent);\r
+                       try {\r
+                               storeStoryFolder(storyFolder);\r
+                       } catch (Exception e) {\r
+                               logger.catching(e);\r
+                               throw e;\r
                        }\r
-                       idx++;\r
+                       fireProgressEvent();\r
                }\r
                logger.trace(EXIT);\r
        }\r
 \r
-       private void storeStoryFolderStories(BasicDBList stories) {\r
-               logger.trace(ENTER);\r
-               List<BasicDBObject> list = NoSQLUtils.asList(stories);\r
-               for (BasicDBObject story : list)\r
-                       storeStory(story);\r
-               logger.trace(EXIT);\r
-       }\r
-\r
        private Date toDate(BasicDBObject obj, String name) {\r
                Date result = null;\r
                if (obj.containsKey(name)) {\r
@@ -753,96 +651,4 @@ public class OctopusDataMiner {
                return result;\r
        }\r
 \r
-       private void updateDeleteDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
-               DBCollection oldCollection = db.getCollection(oldCollectionName);\r
-               DBCollection newCollection = db.getCollection(newCollectionName);\r
-               DBCursor oldCollectionCursor = oldCollection.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 = newCollection.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 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 to {} item {}", oldCollectionName, id);\r
-                               oldCollection.save(newItem);\r
-                       }\r
-               }\r
-       }\r
-\r
 }\r
diff --git a/server/user.jobengine.executors/src/user/jobengine/server/steps/OctopusDataMinerStable.java b/server/user.jobengine.executors/src/user/jobengine/server/steps/OctopusDataMinerStable.java
new file mode 100644 (file)
index 0000000..74969ae
--- /dev/null
@@ -0,0 +1,848 @@
+package user.jobengine.server.steps;\r
+\r
+import java.util.Calendar;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.HashSet;\r
+import java.util.List;\r
+import java.util.Map;\r
+import java.util.Set;\r
+import java.util.concurrent.ConcurrentHashMap;\r
+\r
+import javax.swing.event.EventListenerList;\r
+import javax.ws.rs.client.Entity;\r
+import javax.ws.rs.client.Invocation.Builder;\r
+import javax.ws.rs.core.MediaType;\r
+import javax.ws.rs.core.Response;\r
+\r
+import org.apache.logging.log4j.LogManager;\r
+import org.apache.logging.log4j.Logger;\r
+import org.jboss.resteasy.client.jaxrs.BasicAuthentication;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClient;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyClientBuilder;\r
+import org.jboss.resteasy.client.jaxrs.ResteasyWebTarget;\r
+import org.joda.time.DateTime;\r
+\r
+import com.ibm.nosql.json.JSONUtil;\r
+import com.ibm.nosql.json.api.BasicDBList;\r
+import com.ibm.nosql.json.api.BasicDBObject;\r
+import com.ibm.nosql.json.api.DB;\r
+import com.ibm.nosql.json.api.DBCollection;\r
+import com.ibm.nosql.json.api.DBCursor;\r
+import com.ibm.nosql.json.api.QueryBuilder;\r
+import com.ibm.nosql.json.api.WriteResult;\r
+\r
+import user.commons.CalendarUtils;\r
+import user.commons.ListUtils;\r
+import user.commons.nosql.NoSQLUtils;\r
+import user.commons.octopus.IOctopusAPI;\r
+import user.commons.remotestore.IProgressEventListener;\r
+import user.commons.remotestore.ProgressEvent;\r
+\r
+public class OctopusDataMinerStable {\r
+       private static final String ARCHIVED = "archived";\r
+       private static final String FILTER = "filter";\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 static final String SAVING_STORY_ID = "Saving story {}";\r
+       //      private static final String SAVING_RUNDOWN = "Saving rundown : {} {}";\r
+       //      private static final String CHECKING_RUNDOWN = "Checking Rundown {} ({}/{})";\r
+       private static final String FIELDS_STORYFOLDER_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
+       private static final String FIELDS_RUNDOWN_STORIES = "slugs,Slug.story,Slug.position,Story.name,Story.id,Story.modified,Story.mosObjects,Story.script,Story.type,Story.format,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
+       private static final String FIELDS_RUNDOWN = "id,name,modified,scheduledStart,channel,Channel.name,rundownType,RundownType.name";\r
+       private static final String FIELDS_RUNDOWN_STORYIDS = "id,slugs,Slug.storyId,Slug.position";\r
+       private static final String FIELDS_STORYFOLDER = "id,name,modified";\r
+       private static final String FIELDS_STORYFOLDER_STORYIDS = "id,stories,Story.id";\r
+       private static final String RUNDOWN = "Rundown";\r
+       private static final String OCTOPUS_DEVICE_NAME = "Octopus-Device-Name";\r
+       private static final String OCTOPUS_DEVICE_ID = "Octopus-Device-Id";\r
+       private static final String FIELDS = "fields";\r
+       private static final String CHECKING_STORY_FOLDER = "Checking StoryFolder %s (%d/%d)";\r
+       private static final String EXIT = "Exit";\r
+       private static final String RESULT = "result";\r
+       private static final String STORY_FOLDER = "StoryFolder";\r
+       private static final String ENTER = "Enter";\r
+       private static final String FINISHED = "Finished";\r
+       private static final String STARTING = "Starting";\r
+       private static final String MOSOBJECT = "Bejátszó: ";\r
+\r
+       private DB db;\r
+       private ResteasyWebTarget webTarget;\r
+       private String apiUser;\r
+       private String apiPwd;\r
+       private HashSet<Long> storyIDs = new HashSet<>();\r
+       private HashSet<Long> folderIDs = new HashSet<>();\r
+       private HashSet<Long> rundownIDs = new HashSet<>();\r
+       private EventListenerList progressListenerList;\r
+       private ProgressEvent progressEvent = new ProgressEvent(this, 0);\r
+       private Map<Long, BasicDBList> storyRundowns;\r
+       private Map<Long, BasicDBList> storyStoryFolders;\r
+       private Map<Long, Object> currentRundowns;\r
+       private Map<Long, Object> currentFolder;\r
+       private Map<Long, Object> currentStories;\r
+       private String RUNDOWN_COLLECTION;\r
+       private String FOLDER_COLLECTION;\r
+       private String STORY_COLLECTION;\r
+       private boolean includeArchived;\r
+       private Calendar zeroDate = CalendarUtils.createCalendar(2017, 11, 4);\r
+\r
+       public OctopusDataMinerStable() {\r
+               db = NoSQLUtils.getNoSQLDB();\r
+\r
+               String apiAddress = System.getProperty("jobengine.octopus.api.address");\r
+               apiUser = System.getProperty("jobengine.octopus.api.user");\r
+               apiPwd = System.getProperty("jobengine.octopus.api.password");\r
+\r
+               //              ResteasyClient client = new ResteasyClientBuilder().register(JacksonJsonProvider.class).build();\r
+               ResteasyClient client = new ResteasyClientBuilder().build();\r
+               webTarget = client.target(apiAddress).register(new BasicAuthentication(apiUser, apiPwd));\r
+       }\r
+\r
+       public void addProgressListener(IProgressEventListener listener) {\r
+               if (progressListenerList == null)\r
+                       progressListenerList = new EventListenerList();\r
+               progressListenerList.add(IProgressEventListener.class, listener);\r
+       }\r
+\r
+       private Map<Long, BasicDBList> buildFolderReferences(BasicDBList storyFolders) {\r
+               Map<Long, BasicDBList> result = new HashMap<>();\r
+               List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
+               for (BasicDBObject storyFolder : storyFolderList) {\r
+                       if (storyFolder == null || !storyFolder.containsKey(IOctopusAPI.ID))\r
+                               continue;\r
+                       BasicDBObject storyFolderWithStoryIds = queryStoryFolder(storyFolder, FIELDS_STORYFOLDER_STORYIDS);\r
+                       long storyFolderId = storyFolderWithStoryIds.getLong(IOctopusAPI.ID);\r
+                       List<BasicDBObject> stories = NoSQLUtils.asList(storyFolderWithStoryIds, IOctopusAPI.STORIES);\r
+                       if (stories == null)\r
+                               continue;\r
+                       if (!folderIDs.contains(storyFolderId))\r
+                               folderIDs.add(storyFolderId);\r
+                       long position = 1;\r
+                       for (BasicDBObject story : stories) {\r
+                               long storyId = story.getLong(IOctopusAPI.ID);\r
+\r
+                               BasicDBList references = result.get(storyId);\r
+                               if (references == null) {\r
+                                       references = new BasicDBList();\r
+                                       result.put(storyId, references);\r
+                               }\r
+                               references.add(new BasicDBObject(IOctopusAPI.ID, storyFolderId).append(IOctopusAPI.POSITION, position++));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private Map<Long, BasicDBList> buildRundownReferences(BasicDBList rundowns) {\r
+               Map<Long, BasicDBList> result = new HashMap<>();\r
+               List<BasicDBObject> rundownsList = NoSQLUtils.asList(rundowns);\r
+               for (BasicDBObject rundown : rundownsList) {\r
+                       if (rundown == null || !rundown.containsKey(IOctopusAPI.ID))\r
+                               continue;\r
+                       BasicDBObject rundownWithStoryids = queryRundown(rundown, FIELDS_RUNDOWN_STORYIDS);\r
+                       long rundownId = rundownWithStoryids.getLong(IOctopusAPI.ID);\r
+                       List<BasicDBObject> slugs = NoSQLUtils.asList(rundownWithStoryids, IOctopusAPI.SLUGS);\r
+                       if (slugs == null)\r
+                               continue;\r
+\r
+                       if (!rundownIDs.contains(rundownId))\r
+                               rundownIDs.add(rundownId);\r
+\r
+                       for (BasicDBObject slug : slugs) {\r
+                               if (!slug.containsKey(IOctopusAPI.STORYID))\r
+                                       continue;\r
+                               long storyId = slug.getLong(IOctopusAPI.STORYID);\r
+                               BasicDBList references = result.get(storyId);\r
+                               if (references == null) {\r
+                                       references = new BasicDBList();\r
+                                       result.put(storyId, references);\r
+                               }\r
+                               long position = slug.getLong(IOctopusAPI.POSITION);\r
+                               if (slug.containsKey(IOctopusAPI.POSITION))\r
+                                       position = slug.getLong(IOctopusAPI.POSITION);\r
+                               references.add(new BasicDBObject(IOctopusAPI.ID, rundownId).append(IOctopusAPI.POSITION, position));\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       public void clear() {\r
+               db.getCollection(RUNDOWN_COLLECTION).remove();\r
+               db.getCollection(STORY_COLLECTION).remove();\r
+               db.getCollection(FOLDER_COLLECTION).remove();\r
+               db.getCollection(IOctopusAPI.TIME_COLLECTION_NAME).remove();\r
+       }\r
+\r
+       private String concatParentsToStoryFolder(BasicDBObject actual, String name) {\r
+\r
+               String fields = "name,id,parent";\r
+               Response response = query("StoryFolder/" + actual.getLong("id"), fields).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               BasicDBObject res = (BasicDBObject) resultObject.get("result");\r
+               BasicDBObject parent = (BasicDBObject) res.get("parent");\r
+               if (parent == null || parent.isEmpty())\r
+                       return name;\r
+               String parentName = parent.getString(IOctopusAPI.NAME);\r
+               String actualName = actual.getString(IOctopusAPI.NAME);\r
+               String newName = String.format("%s/%s", parentName, actualName);\r
+               return concatParentsToStoryFolder(parent, newName);\r
+       }\r
+\r
+       private void deleteDiff(Set<Long> oldIDs, Set<Long> newIDs, String collectionName) {\r
+               if (oldIDs == null || oldIDs.size() == 0)\r
+                       return;\r
+               if (newIDs != null && newIDs.size() > 0)\r
+                       oldIDs.removeAll(newIDs);\r
+               DBCollection collection = db.getCollection(collectionName);\r
+               for (long id : oldIDs) {\r
+                       logger.info("Deleting {} from {}", id, collectionName);\r
+                       collection.remove(new BasicDBObject(IOctopusAPI.ID, id));\r
+               }\r
+       }\r
+\r
+       private void deleteOrphanRundowns() {\r
+               try {\r
+                       DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
+                       BasicDBObject query = (BasicDBObject) QueryBuilder.start().put(IOctopusAPI.ID).notIn(storyRundowns.keySet().toArray()).get();\r
+                       WriteResult res = collection.remove(query);\r
+                       logger.trace(String.format("Deleted orphan rundowns: %d", res.getN()));\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               }\r
+       }\r
+\r
+       private void deleteOrphanStories() {\r
+               try {\r
+                       DBCollection collection = db.getCollection(STORY_COLLECTION);\r
+                       BasicDBObject query = (BasicDBObject) QueryBuilder.start().put("id").notIn(storyIDs.toArray()).get();\r
+                       WriteResult res = collection.remove(query);\r
+                       logger.trace(String.format("Deleted orphan stories: %d", res.getN()));\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               }\r
+       }\r
+\r
+       private void deleteOrphanStoryFolders() {\r
+               try {\r
+                       DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
+                       BasicDBObject query = (BasicDBObject) QueryBuilder.start().put(IOctopusAPI.ID).notIn(storyStoryFolders.keySet().toArray()).get();\r
+                       WriteResult res = collection.remove(query);\r
+                       logger.trace(String.format("Deleted orphan rundowns: %d", res.getN()));\r
+               } catch (Exception e) {\r
+                       logger.error(e);\r
+               }\r
+       }\r
+\r
+       private void ensureIndexes() {\r
+               DBCollection collection = db.getCollection(FOLDER_COLLECTION);\r
+               if (collection.count() == 0)\r
+                       collection.ensureIndex(IOctopusAPI.ID);\r
+               collection = db.getCollection(RUNDOWN_COLLECTION);\r
+               if (collection.count() == 0) {\r
+                       collection.ensureIndex(IOctopusAPI.ID);\r
+                       collection.ensureIndex(IOctopusAPI.SCHEDULED_START);\r
+               }\r
+               collection = db.getCollection(STORY_COLLECTION);\r
+               if (collection.count() == 0)\r
+                       collection.ensureIndex(IOctopusAPI.ID);\r
+       }\r
+\r
+       public void execute(boolean includeArchived) throws Exception {\r
+               this.includeArchived = includeArchived;\r
+               logger.trace(STARTING);\r
+\r
+               //              String MAIN_RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION;\r
+               //              String MAIN_FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
+               //              String MAIN_STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
+\r
+               //              RUNDOWN_COLLECTION = MAIN_RUNDOWN_COLLECTION + _TMP;\r
+               //              FOLDER_COLLECTION = MAIN_FOLDER_COLLECTION + _TMP;\r
+               //              STORY_COLLECTION = MAIN_STORY_COLLECTION + _TMP;\r
+               //\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
+               RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION;\r
+               FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
+               STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
+\r
+               //current = korábbi szinkronizálás\r
+               currentRundowns = getCurrentIDs(RUNDOWN_COLLECTION);\r
+               currentFolder = getCurrentIDs(FOLDER_COLLECTION);\r
+               currentStories = getCurrentIDs(STORY_COLLECTION);\r
+\r
+               BasicDBList rundowns = null;\r
+               BasicDBList storyFolders = null;\r
+               try {\r
+                       rundowns = queryBuildRefRundowns();\r
+                       storyFolders = queryBuildRefFolders();\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               }\r
+\r
+               processRundowns(rundowns);\r
+               processStoryFolders(storyFolders);\r
+\r
+               deleteDiff(currentRundowns.keySet(), rundownIDs, RUNDOWN_COLLECTION);\r
+               deleteDiff(currentFolder.keySet(), folderIDs, FOLDER_COLLECTION);\r
+               deleteDiff(currentStories.keySet(), storyIDs, STORY_COLLECTION);\r
+               //              deleteOrphanRundowns();\r
+               //              deleteOrphanStoryFolders();\r
+               //              deleteOrphanStories();\r
+\r
+               //a sorrend fontos !\r
+               //                              updateDiff(MAIN_STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
+               //                              updateDiff(MAIN_RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
+               //                              updateDiff(MAIN_FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
+               //\r
+               //                              updateDeleteDiff(MAIN_RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
+               //                              updateDeleteDiff(MAIN_FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
+               //                              updateDeleteDiff(MAIN_STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
+\r
+               //              try {\r
+               //                      db.getCollection(RUNDOWN_COLLECTION).rename(MAIN_RUNDOWN_COLLECTION, true);\r
+               //                      db.getCollection(FOLDER_COLLECTION).rename(MAIN_FOLDER_COLLECTION, true);\r
+               //                      db.getCollection(STORY_COLLECTION).rename(MAIN_STORY_COLLECTION, true);\r
+               //              } catch (Exception e) {\r
+               //                      logger.catching(e);\r
+               //                      throw e;\r
+               //              }\r
+\r
+               //              logger.info("Activate");\r
+\r
+               //              try {\r
+               //                      long ts = new Date().getTime();\r
+               //                      db.getCollection(RUNDOWN_COLLECTION).exportFile(String.format("/opt/mediacube-test/log/%s-%s.js", RUNDOWN_COLLECTION, ts));\r
+               //                      db.getCollection(FOLDER_COLLECTION).exportFile(String.format("/opt/mediacube-test/log/%s-%s.js", FOLDER_COLLECTION, ts));\r
+               //                      db.getCollection(STORY_COLLECTION).exportFile(String.format("/opt/mediacube-test/log/%s-%s.js", STORY_COLLECTION, ts));\r
+               //              } catch (Exception e) {\r
+               //                      logger.catching(e);\r
+               //                      throw e;\r
+               //              }\r
+\r
+               logger.trace(FINISHED);\r
+               //throw new Exception("Mérés");\r
+       }\r
+\r
+       private String extractContent(BasicDBObject content) {\r
+               String scriptContent = "";\r
+               if (!content.containsKey(IOctopusAPI.TYPE))\r
+                       return scriptContent;\r
+               String type = content.getString(IOctopusAPI.TYPE);\r
+               switch (type) {\r
+               case IOctopusAPI.TEXT: {\r
+                       if (content.containsKey(IOctopusAPI.TEXT)) {\r
+                               String text = content.getString(IOctopusAPI.TEXT);\r
+                               if (text != null)\r
+                                       scriptContent += String.format("%s%s", text.replaceAll(SIMPLE_LINEFEED, LINEFEED), LINEFEED);\r
+                       }\r
+                       break;\r
+               }\r
+               case IOctopusAPI.MOS: {\r
+                       BasicDBObject mosObject = NoSQLUtils.asDBObject(content, IOctopusAPI.OBJECT);\r
+                       if (mosObject != null && !mosObject.isEmpty()) {\r
+                               if (mosObject.containsKey(IOctopusAPI.OBJ_ID)) {\r
+                                       String objID = mosObject.getString(IOctopusAPI.OBJ_ID);\r
+                                       scriptContent += String.format("%s %s%s", MOSOBJECT, objID, LINEFEED);\r
+                               }\r
+                       }\r
+                       break;\r
+               }\r
+               default: {\r
+                       if (content.containsKey(IOctopusAPI.CONTENT)) {\r
+                               List<BasicDBObject> innerContents = NoSQLUtils.asList(content, IOctopusAPI.CONTENT);\r
+                               if (innerContents != null) {\r
+                                       for (BasicDBObject actualInnerContent : innerContents) {\r
+                                               if (actualInnerContent != null && actualInnerContent.isEmpty())\r
+                                                       scriptContent += extractContent(actualInnerContent);\r
+                                       }\r
+                               }\r
+                       }\r
+                       break;\r
+               }\r
+               }\r
+               return scriptContent;\r
+       }\r
+\r
+       private String extractCustomColumnValue(String columnName, BasicDBObject story) {\r
+               List<BasicDBObject> customColumns = NoSQLUtils.asList(story, IOctopusAPI.CUSTOM_COLUMNS);\r
+               if (customColumns == null)\r
+                       return null;\r
+               String result = null;\r
+               for (BasicDBObject customColumn : customColumns) {\r
+                       if (!customColumn.containsKey(IOctopusAPI.LABEL))\r
+                               continue;\r
+                       String currentName = customColumn.getString(IOctopusAPI.LABEL);\r
+                       if (currentName == null)\r
+                               continue;\r
+                       if (!currentName.toLowerCase().equals(columnName.toLowerCase()))\r
+                               continue;\r
+                       if (!customColumn.containsKey(IOctopusAPI.VALUE))\r
+                               continue;\r
+                       result = customColumn.getString(IOctopusAPI.VALUE);\r
+                       break;\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private BasicDBList extractRelevantMOSObjects(BasicDBObject story) {\r
+               List<BasicDBObject> mosObjects = NoSQLUtils.asList(story, IOctopusAPI.MOS_OBJECTS);\r
+               if (mosObjects == null)\r
+                       return null;\r
+               BasicDBList result = null;\r
+               for (BasicDBObject mosObject : mosObjects) {\r
+                       if (!mosObject.containsKey(IOctopusAPI.MOS_ID))\r
+                               continue;\r
+                       String mosId = mosObject.getString(IOctopusAPI.MOS_ID);\r
+                       if (!IOctopusAPI.NEXIO_MOS.equals(mosId))\r
+                               continue;\r
+                       if (result == null)\r
+                               result = new BasicDBList();\r
+                       result.add(mosObject);\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private String extractScriptContent(BasicDBObject story) {\r
+               BasicDBObject script = NoSQLUtils.asDBObject(story, IOctopusAPI.SCRIPT);\r
+               if (script == null || script.isEmpty())\r
+                       return null;\r
+\r
+               List<BasicDBObject> body = NoSQLUtils.asList(script, IOctopusAPI.BODY);\r
+               if (body == null || body.size() == 0)\r
+                       return null;\r
+\r
+               StringBuilder sb = new StringBuilder();\r
+\r
+               for (BasicDBObject bodyItem : body) {\r
+                       if (bodyItem.containsKey(IOctopusAPI.LABEL)) {\r
+                               sb.append(bodyItem.getString(IOctopusAPI.LABEL));\r
+                               sb.append(LINEFEED);\r
+                       }\r
+                       List<BasicDBObject> contents = NoSQLUtils.asList(bodyItem, IOctopusAPI.CONTENT);\r
+                       if (contents == null)\r
+                               continue;\r
+                       for (BasicDBObject content : contents) {\r
+                               sb.append(extractContent(content));\r
+                       }\r
+               }\r
+               return sb.length() == 0 ? null : sb.toString();\r
+       }\r
+\r
+       private void fireProgressEvent(ProgressEvent evt) {\r
+               logger.debug("Progress changed to " + evt.getProgress() + "%");\r
+               if (progressListenerList == null)\r
+                       return;\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
+       public Map<Long, Object> getCurrentIDs(String name) {\r
+               Map<Long, Object> result = new HashMap<>();\r
+\r
+               DBCursor cursor = db.getCollection(name).find(new BasicDBObject(), new BasicDBObject(IOctopusAPI.ID, 1));\r
+               if (cursor.hasNext()) {\r
+                       List<BasicDBObject> objects = ListUtils.cast(cursor.toArray());\r
+                       for (BasicDBObject obj : objects) {\r
+                               if (obj == null)\r
+                                       continue;\r
+                               long id = NoSQLUtils.asLong(obj, IOctopusAPI.ID);\r
+                               if (id == 0)\r
+                                       continue;\r
+                               Object _id = obj.getID();\r
+                               if (_id == null)\r
+                                       continue;\r
+                               result.put(id, _id);\r
+                       }\r
+               }\r
+               return result;\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
+               ResteasyWebTarget target = webTarget.path(path).queryParam(FIELDS, fields);\r
+               Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
+               return result;\r
+       }\r
+\r
+       private BasicDBList queryBuildRefFolders() {\r
+               BasicDBList storyFolders;\r
+               logger.info("Fetch story folders");\r
+               storyFolders = queryStoryFolders();\r
+               logger.info("Fetch folder story references");\r
+               storyStoryFolders = buildFolderReferences(storyFolders);\r
+               return storyFolders;\r
+       }\r
+\r
+       private BasicDBList queryBuildRefRundowns() {\r
+               BasicDBList rundowns;\r
+               logger.info("Fetch rundowns");\r
+               rundowns = queryRundowns();\r
+               logger.info("Fetch rundown story references");\r
+               storyRundowns = buildRundownReferences(rundowns);\r
+               return rundowns;\r
+       }\r
+\r
+       private BasicDBObject queryRundown(BasicDBObject rundown, String fields) {\r
+               logger.trace(ENTER);\r
+               BasicDBObject result = null;\r
+               long id = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
+               Response response = query(String.format("%s/%d", RUNDOWN, id), fields).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               if (resultObject == null)\r
+                       logger.error("Rundown {} {} is not available", id, rundown.getString(IOctopusAPI.NAME));\r
+               else\r
+                       result = NoSQLUtils.asDBObject(resultObject, RESULT);\r
+               logger.trace(EXIT);\r
+               return result;\r
+       }\r
+\r
+       private BasicDBList queryRundowns() {\r
+               logger.trace(ENTER);\r
+               BasicDBList result = null;\r
+               Builder query = query(RUNDOWN, FIELDS_RUNDOWN);\r
+               Response response = null;\r
+               if (includeArchived) {\r
+                       response = query.post(Entity.entity(new BasicDBObject(FILTER, new BasicDBObject(ARCHIVED, true)).toString(), MediaType.APPLICATION_JSON));\r
+               } else\r
+                       response = query.get();\r
+\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               if (resultObject != null)\r
+                       result = NoSQLUtils.asDBList(resultObject, RESULT);\r
+               logger.trace(EXIT);\r
+               return result;\r
+       }\r
+\r
+       private BasicDBObject queryStoryFolder(BasicDBObject storyFolder, String fields) {\r
+               logger.trace(ENTER);\r
+               BasicDBObject result = null;\r
+               long id = NoSQLUtils.asLong(storyFolder, IOctopusAPI.ID);\r
+               Response response = query(String.format("%s/%d", STORY_FOLDER, id), fields).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               if (resultObject == null)\r
+                       logger.error("StoryFolder {} {} is not available", id, storyFolder.getString(IOctopusAPI.NAME));\r
+               else\r
+                       result = NoSQLUtils.asDBObject(resultObject, RESULT);\r
+               logger.trace(EXIT);\r
+               return result;\r
+       }\r
+\r
+       private BasicDBList queryStoryFolders() {\r
+               logger.trace(ENTER);\r
+               BasicDBList result = null;\r
+               Response response = query(STORY_FOLDER, FIELDS_STORYFOLDER).get();\r
+               String json = response.readEntity(String.class);\r
+               BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
+               if (resultObject != null)\r
+                       result = NoSQLUtils.asDBList(resultObject, RESULT);\r
+\r
+               //              /* teszt */\r
+               //              List<BasicDBObject> list = NoSQLUtils.asList(result);\r
+               //              for (BasicDBObject actual : list) {\r
+               //                      String fullName = concatParentsToStoryFolder(actual, actual.getString(IOctopusAPI.NAME));\r
+               //                      //logger.info("Checking StoryFolder {}", fullName);\r
+               //                      actual.remove(IOctopusAPI.NAME);\r
+               //                      actual.append(IOctopusAPI.NAME, fullName);\r
+               //              }\r
+               //\r
+               logger.trace(EXIT);\r
+               return result;\r
+       }\r
+\r
+       public void removeProgressListener(IProgressEventListener listener) {\r
+               progressListenerList.remove(IProgressEventListener.class, listener);\r
+       }\r
+\r
+       void setObjectID(Map<Long, Object> current, long id, BasicDBObject objectToSave) {\r
+               Object _id = current.get(id);\r
+               if (_id == null)\r
+                       return;\r
+               objectToSave.put(IOctopusAPI._ID, _id);\r
+       }\r
+\r
+       private void storeRundown(BasicDBObject rundown) {\r
+               logger.trace(ENTER);\r
+               String name = rundown.containsKey(IOctopusAPI.NAME) ? rundown.getString(IOctopusAPI.NAME) : null;\r
+               logger.debug("Storing rundown {} {}", name, rundown.get(IOctopusAPI.SCHEDULED_START));\r
+               BasicDBObject rundownWithStories = queryRundown(rundown, FIELDS_RUNDOWN_STORIES);\r
+               if (rundownWithStories != null) {\r
+                       Date scheduledStart = toDate(rundown, IOctopusAPI.SCHEDULED_START);\r
+                       if (scheduledStart != null && scheduledStart.after(zeroDate.getTime())) {\r
+                               BasicDBList stories = NoSQLUtils.asDBList(rundownWithStories, IOctopusAPI.SLUGS);\r
+                               if (stories != null)\r
+                                       storeRundownStories(stories);\r
+                               rundown.put(IOctopusAPI.SCHEDULED_START, toDate(rundown, IOctopusAPI.SCHEDULED_START));\r
+                               rundown.put(IOctopusAPI.MODIFIED, toDate(rundown, IOctopusAPI.MODIFIED));\r
+                               DBCollection collection = db.getCollection(RUNDOWN_COLLECTION);\r
+                               long rundownID = NoSQLUtils.asLong(rundown, IOctopusAPI.ID);\r
+                               setObjectID(currentRundowns, rundownID, rundown);\r
+                               collection.save(rundown);\r
+                       }\r
+               }\r
+               logger.trace(EXIT);\r
+       }\r
+\r
+       private void storeRundowns(BasicDBList rundowns, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\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
+                       storeRundown(rundown);\r
+                       int progress = idx * 50 / rundownsList.size();\r
+                       if (progress - progressEvent.getProgress() > 0) {\r
+                               progressEvent.setProgress(progress);\r
+                               fireProgressEvent(progressEvent);\r
+                       }\r
+\r
+                       idx++;\r
+               }\r
+               logger.trace(EXIT);\r
+       }\r
+\r
+       private void storeRundownStories(BasicDBList slugs) {\r
+               logger.trace(ENTER);\r
+               List<BasicDBObject> slugsList = NoSQLUtils.asList(slugs);\r
+               for (BasicDBObject slug : slugsList) {\r
+                       if (slug.containsKey(IOctopusAPI.STORY))\r
+                               storeStory((BasicDBObject) slug.get(IOctopusAPI.STORY));\r
+               }\r
+               logger.trace(EXIT);\r
+       }\r
+\r
+       private void storeStory(BasicDBObject story) {\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
+                       return;\r
+               storyIDs.add(storyID);\r
+               story.put(IOctopusAPI.MODIFIED, toDate(story, IOctopusAPI.MODIFIED));\r
+               BasicDBList rundownRef = storyRundowns.get(storyID);\r
+               BasicDBList storyFolderRef = storyStoryFolders.get(storyID);\r
+               BasicDBList modifiedMOS = extractRelevantMOSObjects(story);\r
+\r
+               DBCollection collection = db.getCollection(STORY_COLLECTION);\r
+\r
+               if (rundownRef != null)\r
+                       story.put(IOctopusAPI.REF_RUNDOWN, rundownRef);\r
+               if (storyFolderRef != null)\r
+                       story.put(IOctopusAPI.REF_STORYFOLDER, storyFolderRef);\r
+               String scriptContent = extractScriptContent(story);\r
+               story.put(IOctopusAPI.SCRIPT_CONTENT, scriptContent);\r
+               if (modifiedMOS == null || modifiedMOS.isEmpty()) {\r
+                       if (story.containsKey(IOctopusAPI.MOS_OBJECTS))\r
+                               story.remove(IOctopusAPI.MOS_OBJECTS);\r
+               } else\r
+                       story.put(IOctopusAPI.MOS_OBJECTS, modifiedMOS);\r
+\r
+               String parentStoryId = extractCustomColumnValue(IOctopusAPI.PARENT_STORY_ID, story);\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
+                       story.append(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
+               logger.debug(SAVING_STORY_ID, storyID);\r
+               setObjectID(currentStories, storyID, story);\r
+               collection.save(story);\r
+               logger.trace(EXIT);\r
+       }\r
+\r
+       private void storeStoryFolder(BasicDBObject storyFolder, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               BasicDBObject storyFoldersWithStories = queryStoryFolder(storyFolder, FIELDS_STORYFOLDER_STORIES);\r
+               if (storyFoldersWithStories != null) {\r
+                       BasicDBList stories = NoSQLUtils.asDBList(storyFoldersWithStories, IOctopusAPI.STORIES);\r
+                       if (stories != null)\r
+                               storeStoryFolderStories(stories);\r
+                       storyFolder.put(IOctopusAPI.MODIFIED, toDate(storyFolder, IOctopusAPI.MODIFIED));\r
+                       DBCollection collection = db.getCollection(FOLDER_COLLECTION);\r
+                       String name = storyFolder.getString(IOctopusAPI.NAME);\r
+                       logger.debug("Storing story folder {}", name);\r
+                       long folderID = NoSQLUtils.asLong(storyFolder, IOctopusAPI.ID);\r
+                       setObjectID(currentFolder, folderID, storyFolder);\r
+                       collection.save(storyFolder);\r
+               }\r
+               logger.trace(EXIT);\r
+       }\r
+\r
+       private void storeStoryFolders(BasicDBList storyFolders, Date lastUpdateTime) {\r
+               logger.trace(ENTER);\r
+               List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
+               int idx = 1;\r
+               for (BasicDBObject storyFolder : storyFolderList) {\r
+                       logger.debug(String.format(CHECKING_STORY_FOLDER, storyFolder.getLong(IOctopusAPI.ID), storyFolderList.size(), idx));\r
+                       storeStoryFolder(storyFolder, lastUpdateTime);\r
+                       int progress = 50 + (idx * 50 / storyFolderList.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
+       private void storeStoryFolderStories(BasicDBList stories) {\r
+               logger.trace(ENTER);\r
+               List<BasicDBObject> list = NoSQLUtils.asList(stories);\r
+               for (BasicDBObject story : list)\r
+                       storeStory(story);\r
+               logger.trace(EXIT);\r
+       }\r
+\r
+       private Date toDate(BasicDBObject obj, String name) {\r
+               Date result = null;\r
+               if (obj.containsKey(name)) {\r
+                       String dt = obj.getString(name);\r
+                       if (dt != null) {\r
+                               // create jodatime from date\r
+                               DateTime jdt = new DateTime(dt);\r
+                               result = jdt.toDate();\r
+                       }\r
+               }\r
+               return result;\r
+       }\r
+\r
+       private void updateDeleteDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
+               DBCollection oldCollection = db.getCollection(oldCollectionName);\r
+               DBCollection newCollection = db.getCollection(newCollectionName);\r
+               DBCursor oldCollectionCursor = oldCollection.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 = newCollection.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 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 to {} item {}", oldCollectionName, id);\r
+                               oldCollection.save(newItem);\r
+                       }\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/server/user.jobengine.osgi.commons/src/user/commons/MediaCubeFinishMarker.java b/server/user.jobengine.osgi.commons/src/user/commons/MediaCubeFinishMarker.java
new file mode 100644 (file)
index 0000000..e2b252a
--- /dev/null
@@ -0,0 +1,14 @@
+package user.commons;\r
+\r
+@SuppressWarnings("serial")\r
+public class MediaCubeFinishMarker extends MediaCubeMarker {\r
+\r
+       public MediaCubeFinishMarker(MediaCubeMarker parent) {\r
+               setSessionID(parent.getSessionID());\r
+       }\r
+\r
+       public MediaCubeFinishMarker(MediaCubeMarker parent, String to) {\r
+               super(to);\r
+               setSessionID(parent.getSessionID());\r
+       }\r
+}\r
index 52fe5ed9c6d28aded0b0ebc1422bbcb8ff61d251..f1dbf54ef718a45c1c3fabeca5d72d985b3a5862 100644 (file)
@@ -6,18 +6,40 @@ import org.apache.logging.log4j.MarkerManager.Log4jMarker;
 public class MediaCubeMarker extends Log4jMarker {\r
        private static final String MEDIACUBE = "MEDIACUBE";\r
        private String to;\r
+       private String sessionID;\r
+\r
+       public MediaCubeMarker() {\r
+               super(MEDIACUBE);\r
+       }\r
 \r
        public MediaCubeMarker(String to) {\r
                super(MEDIACUBE);\r
                this.to = to;\r
        }\r
 \r
+       public String getSessionID() {\r
+               return sessionID;\r
+       }\r
+\r
        public String getTo() {\r
                return to;\r
        }\r
 \r
+       public void setSessionID(String sessionID) {\r
+               this.sessionID = sessionID;\r
+       }\r
+\r
        public void setTo(String to) {\r
                this.to = to;\r
        }\r
 \r
+       //      @Override\r
+       //      public boolean equals(Object o) {\r
+       //              if (o == null || !o.getClass().equals(MediaCubeMarker.class))\r
+       //                      return false;\r
+       //\r
+       //\r
+       //              return true;\r
+       //      }\r
+\r
 }\r
index c45058740bfbe711c76074191997eb2d7994d87c..9cdbdd58623d7a64e6506eb6f3e156a4ed35fada 100644 (file)
@@ -22,6 +22,7 @@ public interface IOctopusAPI {
        static final String MOS_OBJECTS = "mosObjects";\r
        static final String NAME = "name";\r
        static final String LABEL = "label";\r
+       static final String CLIP = "clip";\r
        static final String OBJ_ID = "objId";\r
        static final String OBJECT = "object";\r
        static final String MOS = "mos";\r
index b9679a4374fee0d336920bb0ff596138e55e3935..c2eca5bfe47a780fa0c00c6443b0f255481f5080 100644 (file)
@@ -155,7 +155,7 @@ public class OctopusAPI implements IOctopusAPI {
        public List<DBObject> getStories() {\r
                List<DBObject> result = null;\r
                DBCollection collection = db.getCollection(STORY_COLLECTION);\r
-               DBCursor find = collection.find();\r
+               DBCursor find = collection.find().limit(1000);\r
                if (find.hasNext())\r
                        result = find.toArray();\r
                return result;\r
index 0813a5b5a434738416aca88d2e6431470c610eaa..54d10621762b7c71703ef00637f3692075f8ed4d 100644 (file)
@@ -1,3 +1,4 @@
 eclipse.preferences.version=1\r
 encoding//pages/login.zul=UTF-8\r
+encoding//resources/i3-label_hu.properties=UTF-8\r
 encoding//src/user/jobengine/server/JobRuntime.java=UTF-8\r
index 8e44f53b1a198df673fe2927d6de061db96d3f7e..7f68e6687ff725b78e2281064f6e01cd4ddeeaa0 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>\r
 <?init class="user.jobengine.zk.util.AuthInitiator"?>\r
-<zk xmlns:w="http://www.zkoss.org/2005/zk/client" >\r
-       <style src="/css/archivum.css" />\r
+<zk xmlns:w="http://www.zkoss.org/2005/zk/client">\r
+       <style src="/css/archivum.css" />\r
        <zscript><![CDATA[\r
        // Chrome F5 bug workaround (miscalculates 100% width on second refresh)\r
        void onClientInfo(ClientInfoEvent evt) {\r
        </script>\r
        \r
        <window id="zkwindow" border="none" width="100%" height="100%" contentStyle="padding:0;" onClientInfo="onClientInfo(event)">\r
+               <custom-attributes org.zkoss.zul.image.preload="true" />\r
                <borderlayout width="${myWidth}" height="${myHeight}">\r
                        <north border="0">\r
                                <div id="divMenu" apply="org.zkoss.bind.BindComposer" viewModel="@id('mvm') @init('user.jobengine.zk.model.MenuModel')">\r
                                        <borderlayout height="50px">\r
-                                               <west width="400px" border="0">\r
-                                                       <div width="100%" height="100%" style="background: #008AC8;" >\r
-                                                               <image src="/img/mediacube_logo_v2_50x50.png">\r
-<!--                                                           <custom-attributes org.zkoss.zul.image.preload="true" /> -->\r
-                                                               </image>\r
-                                                               <label style="color:#e3e3e3;font-size:20px;font-weight:bold">MediaCube </label><label style="color:#e3e3e3;font-size:10px;font-weight:bold">2.2</label> \r
-                                                       </div>\r
+                                               <west border="0">\r
+                                                       <hbox height="100%" width="100%" align="center" pack="center" style="background: #008AC8;">\r
+                                                               <image src="/img/mediacube_logo_v2_50x50.png" />\r
+                                                               <label style="color:#e3e3e3;font-size:26px;font-weight:bold" value="MediaCube" />\r
+                                                               <label style="color:#e3e3e3;font-size:12px;font-weight:bold" value="v${labels.version}" /> \r
+                                                       </hbox>\r
                                                </west>\r
                                                <center border="0">\r
-                                                       <hbox height="100%" width="100%" align="center" pack="center" style="background: #008AC8;">\r
-                                                               <!--  label sclass="rozsdacoloredlabel" value="MEDIA CUBE" / -->\r
+                                                       <hbox height="100%" width="100%" align="bottom" pack="start" style="background: #008AC8;">\r
                                                        </hbox>\r
                                                </center>\r
                                                <east border="0">\r
-                                                       <hbox height="100%" width="100%" align="center" pack="center">\r
-                                                               <!-- label sclass="rozsdacoloredlabel" value="USERID" / -->\r
+                                                       <hbox height="100%" width="100%" align="bottom" pack="center" style="background: #008AC8;">\r
+                                                               <div style="margin-right: 10px">\r
+                                                                       <label style="color:#e3e3e3;font-size:12px;font-weight:bold" value="Bejelentkezve: ${sessionScope.userPrincipal.displayName}" tooltip="emailPopup, at_pointer" />\r
+                                                                       <popup id="emailPopup">\r
+                                                                       <vlayout>\r
+                                                                           <label value="${sessionScope.userPrincipal.email}"/>\r
+                                                                       </vlayout>\r
+                                                                   </popup>                                                                    \r
+                                                               </div>\r
                                                        </hbox>\r
                                                </east>\r
                                        </borderlayout>\r
index 1e16a07cf630d445ebbd7701e2e0982d88e187a6..a67f28d067f55e0bc975fb69e0b7e128bb8d6ffb 100644 (file)
 </style>\r
 <div apply="org.zkoss.bind.BindComposer" viewModel="@id('lm') @init('user.jobengine.zk.model.MenuModel')">\r
        <menubar id="menubar" hflex="max" sclass="redmenubar">\r
-               <menu sclass="whitemenu" label="Rendszer">\r
-                       <menupopup>\r
-                               <menuitem sclass="rozsda" label="Kilépés" onClick="@command('doLogout',window=zkwindow)" disabled="false" />\r
-                       </menupopup>\r
-               </menu>\r
                <menu sclass="whitemenu" label="Archívum" >\r
                        <menupopup>\r
                                <menuitem sclass="rozsda" label="Keresés" onClick='includeContent.src="/pages/search_items.zul"' disabled="false" />\r
@@ -72,6 +67,7 @@
                                <menuitem sclass="rozsda" label="${labels.menu_version}" href="/resource/help.html" target="_blank" />\r
                        </menupopup>\r
                </menu>\r
+               <menuitem sclass="whitemenu" style="float: right" label="Kilépés" onClick="@command('doLogout',window=zkwindow)" disabled="false" />\r
        </menubar>\r
 </div>\r
 </zk>\r
index 50d11374bb135d1ac89b64315fd44e96eb9581f2..1d9c70ba6182b04afe058efa9688cf555d4e8e1a 100644 (file)
@@ -1,4 +1,5 @@
-footer=2016 © Copyright User Rendszerház Kft.\r
+version=2.2.2\r
+footer=2016 © Copyright User Rendszerház Kft.\r
 \r
 login_info=Információ\r
 login_dialogtitle=Bejelentkezés\r
index 3d6cfe51b703731b3b5ea482a82e55f579a502f9..12276fc6574b91d72a00be193ff2330f495a7928 100644 (file)
@@ -4,6 +4,8 @@ import java.util.Map;
 import java.util.NoSuchElementException;\r
 import java.util.Stack;\r
 \r
+import org.apache.logging.log4j.Marker;\r
+\r
 import user.commons.IEntityPersister;\r
 import user.commons.IJob;\r
 import user.commons.JobStatus;\r
@@ -26,8 +28,12 @@ public interface IJobRuntime extends IJob {
 \r
        IInstruction getCurrentInstruction();\r
 \r
+       Marker getFinishMarker();\r
+\r
        int getIp();\r
 \r
+       Marker getMarker();\r
+\r
        IInstruction getNextInstruction() throws NoSuchElementException;\r
 \r
        Object getParameter(String name);\r
index 12b312c19cef2d654415073e859da6333f37ce85..c4357fc49c7cfc0065b048cf5a0613594786ab42 100644 (file)
@@ -17,12 +17,15 @@ import javax.swing.event.EventListenerList;
 import org.apache.commons.lang.ClassUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
+import org.apache.logging.log4j.Marker;
 import org.apache.logging.log4j.message.Message;
 
 import user.commons.IEntityPersister;
 import user.commons.IJob;
 import user.commons.Job;
 import user.commons.JobStatus;
+import user.commons.MediaCubeFinishMarker;
+import user.commons.MediaCubeMarker;
 import user.jobengine.db.ItemManagerData.SignalType;
 import user.jobengine.db.JobParameters;
 import user.jobengine.server.instructions.CallJobStepInstruction;
@@ -45,6 +48,7 @@ public class JobRuntime extends Job implements IJobRuntime {
        private double currentProgress;
        private int runtimeWeight;
        private List<JobRuntime> children;
+       private MediaCubeMarker sessionMarker;
 
        public JobRuntime() {
                this.listeners = new EventListenerList();
@@ -206,11 +210,25 @@ public class JobRuntime extends Job implements IJobRuntime {
                return program.get(getIp());
        }
 
+       @Override
+       public Marker getFinishMarker() {
+               return new MediaCubeFinishMarker((MediaCubeMarker) getMarker());
+       }
+
        @Override
        public int getIp() {
                return ip;
        }
 
+       @Override
+       public Marker getMarker() {
+               if (sessionMarker == null) {
+                       sessionMarker = new MediaCubeMarker();
+                       sessionMarker.setSessionID(String.valueOf(getId()));
+               }
+               return sessionMarker;
+       }
+
        @Override
        public IInstruction getNextInstruction() throws NoSuchElementException {
                if (!hasNextInstruction())
index 930f5def6be17eda9dad631b9d0859a2dea873c0..b7741fa4f5d694a1b546a9ee02893a2d7675e699 100644 (file)
@@ -64,6 +64,8 @@ public class JobStepExecutor implements IJobStepExecutor {
                                        logger.catching(t);
                                        jobEngine.suspendJob(t, jobRuntime);
                                } finally {
+                                       logger.info(jobRuntime.getFinishMarker(), "A folyamat futása véget ért");
+
                                        if (step != null) {
                                                step.cleanup();
                                                jobRuntime = null;
diff --git a/server/user.jobengine.osgi.server/src/user/jobengine/server/steps/LogCollector.java b/server/user.jobengine.osgi.server/src/user/jobengine/server/steps/LogCollector.java
deleted file mode 100644 (file)
index 09afb95..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-package user.jobengine.server.steps;\r
-\r
-public class LogCollector {\r
-}\r
-//public class LogCollector extends Logger {\r
-//\r
-//     class CollectedMessage {\r
-//             private String message;\r
-//             private Level level;\r
-//\r
-//             CollectedMessage(Level level, Message message) {\r
-//                     this.level = level;\r
-//                     this.message = message.getFormattedMessage();\r
-//             }\r
-//\r
-//             @Override\r
-//             public String toString() {\r
-//                     return String.format("%s %s\r\n", level, message);\r
-//             }\r
-//     }\r
-//\r
-//     private static final String LOGCOLLECTOR_FINISH = "LOGCOLLECTOR_FINISH";\r
-//     public static Marker FINISH = MarkerManager.getMarker(LOGCOLLECTOR_FINISH);\r
-//\r
-//     public static org.apache.logging.log4j.Logger getLogger() {\r
-//             Logger logger = (Logger) LogManager.getLogger(ReflectionUtil.getCallerClass(2));\r
-//             LogCollector result = new LogCollector(logger.getContext(), logger.getName(), logger.getMessageFactory());\r
-//             return result;\r
-//     }\r
-//\r
-//     private Map<Marker, List<CollectedMessage>> messages = new HashMap<>();\r
-//\r
-//     protected LogCollector(LoggerContext context, String name, MessageFactory messageFactory) {\r
-//             super(context, name, messageFactory);\r
-//             //Map<String, Appender> appenders = super.getAppenders();\r
-//     }\r
-//\r
-//     private void collect(Marker marker, Level level, Message message) {\r
-//             //LogEvent event = Log4jLogEvent.newBuilder().setMessage(message).setMarker(marker).setLevel(level).setLoggerName(super.getName()).build();\r
-//             List<CollectedMessage> msgList = messages.get(marker);\r
-//             if (msgList == null) {\r
-//                     msgList = new ArrayList<>();\r
-//                     messages.put(marker, msgList);\r
-//             }\r
-//             msgList.add(new CollectedMessage(level, message));\r
-//     }\r
-//\r
-//     @Override\r
-//     public void error(Marker marker, String message) {\r
-//             Message msg = getMessageFactory().newMessage(message);\r
-//             collect(marker, Level.ERROR, msg);\r
-//             super.error(marker, message);\r
-//     }\r
-//\r
-//     @Override\r
-//     public void error(Marker marker, String message, Object... params) {\r
-//             Message msg = getMessageFactory().newMessage(message, params);\r
-//             collect(marker, Level.ERROR, msg);\r
-//             super.error(marker, message, params);\r
-//     }\r
-//\r
-//     private void finish() {\r
-//             Set<Marker> markers = messages.keySet();\r
-//             for (Marker marker : markers) {\r
-//                     List<CollectedMessage> msgList = messages.get(marker);\r
-//                     StringBuilder sb = new StringBuilder();\r
-//                     for (CollectedMessage msg : msgList) {\r
-//                             sb.append(msg.toString());\r
-//                     }\r
-//                     super.info(marker, sb.toString());\r
-//             }\r
-//             messages.clear();\r
-//     }\r
-//\r
-//     @Override\r
-//     public void info(Marker marker, String message) {\r
-//             Message msg = getMessageFactory().newMessage(message);\r
-//             collect(marker, Level.INFO, msg);\r
-//     }\r
-//\r
-//     @Override\r
-//     public void info(Marker marker, String message, Object... params) {\r
-//             Message msg = getMessageFactory().newMessage(message, params);\r
-//             collect(marker, Level.INFO, msg);\r
-//     }\r
-//\r
-//     @Override\r
-//     public void info(Object message) {\r
-//             if (message instanceof Marker && LOGCOLLECTOR_FINISH.equals(((Marker) message).getName())) {\r
-//                     finish();\r
-//                     return;\r
-//             }\r
-//     }\r
-//\r
-//     @Override\r
-//     public void warn(Marker marker, String message) {\r
-//             Message msg = getMessageFactory().newMessage(message);\r
-//             collect(marker, Level.WARN, msg);\r
-//     }\r
-//\r
-//     @Override\r
-//     public void warn(Marker marker, String message, Object... params) {\r
-//             Message msg = getMessageFactory().newMessage(message, params);\r
-//             collect(marker, Level.WARN, msg);\r
-//     }\r
-//}\r
index 36ad6269ec38024bfd89893173f4d4f509931755..7f2a40b1b5a522959bb8bcb6d8cc4163c022df2a 100644 (file)
@@ -26,10 +26,13 @@ import org.apache.logging.log4j.Logger;
 import user.commons.ListUtils;\r
 \r
 public class LDAPHandler {\r
+       private static final String OTHER_MAILBOX = "otherMailbox";\r
        private static final Logger logger = LogManager.getLogger();\r
        private static final String LDAP_ADDRESS = "ldap://%s:%s";\r
        private static final String AD_NONSECUREPORT = "ad_nonsecureport";\r
        private static final String AD_HOST = "ad_host";\r
+       //      private static final String TECH_ACCOUNT = "tech_account";\r
+       //      private static final String TECH_PASSWORD = "tech_password";\r
        private static final String SIMPLE_AUTH = "simple";\r
        private static final String CTX_FACTORY = "com.sun.jndi.ldap.LdapCtxFactory";\r
        private static final String DOMAIN_ACCOUNT = "%s@%s";\r
@@ -77,7 +80,7 @@ public class LDAPHandler {
                LdapContext ctx = null;\r
                NamingEnumeration<SearchResult> answer = null;\r
                try {\r
-                       ctx = getContext();\r
+                       ctx = getContext(account, password);\r
                        SearchControls searchCtls = new SearchControls();\r
                        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
                        String searchFilter = "(&(objectClass=group))";\r
@@ -113,7 +116,7 @@ public class LDAPHandler {
                return result;\r
        }\r
 \r
-       private LdapContext getContext() throws Exception {\r
+       private LdapContext getContext(String account, String password) throws Exception {\r
                Hashtable<String, String> env = new Hashtable<>();\r
                String ldapURL = String.format(LDAP_ADDRESS, cfg.getProperty(AD_HOST), cfg.getProperty(AD_NONSECUREPORT));\r
                env.put(Context.PROVIDER_URL, ldapURL);\r
@@ -131,7 +134,7 @@ public class LDAPHandler {
                try {\r
                        SearchControls searchCtls = new SearchControls();\r
                        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
-                       String searchFilter = "(&(CN=" + cn + "))";\r
+                       String searchFilter = String.format("(&(CN=%s))", cn);\r
                        String searchBase = cfg.getProperty("ad_base_dn");\r
                        answer = ctx.search(searchBase, searchFilter, searchCtls);\r
                        if (answer.hasMoreElements()) {\r
@@ -172,10 +175,10 @@ public class LDAPHandler {
                LdapContext ctx = null;\r
                NamingEnumeration<SearchResult> answer = null;\r
                try {\r
-                       ctx = getContext();\r
+                       ctx = getContext(account, password);\r
                        SearchControls searchCtls = new SearchControls();\r
                        searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);\r
-                       String searchFilter = "(&(CN=" + account + "))";\r
+                       String searchFilter = String.format("(&(sAMAccountName=%s))", account);\r
                        String searchBase = cfg.getProperty(AD_BASE_DN);\r
                        answer = ctx.search(searchBase, searchFilter, searchCtls);\r
                        if (answer.hasMoreElements()) {\r
@@ -193,7 +196,11 @@ public class LDAPHandler {
                                Attribute email = srAttrs.get(MAIL);\r
                                if (email != null)\r
                                        result.setEmail(String.valueOf(email.get(0)));\r
-\r
+                               else {\r
+                                       email = srAttrs.get(OTHER_MAILBOX);\r
+                                       if (email != null)\r
+                                               result.setEmail(String.valueOf(email.get(0)));\r
+                               }\r
                        }\r
                } catch (Exception e) {\r
                        logger.catching(e);\r
index 9fc4befd05c3fda4a75b5feb055aa6cc3dfcfa18..d5b69338d90fe9a743213960b255112bc562bb00 100644 (file)
@@ -23,13 +23,14 @@ public class UserPrincipal implements java.io.Serializable {
        private String email;\r
 \r
        public UserPrincipal(String account) {\r
-               this.account = account;\r
+               this(account, false, false);\r
        }\r
 \r
        public UserPrincipal(String account, boolean isAdmin, boolean isJobSubmitter) {\r
                this.account = account;\r
-               setAdmin(isAdmin);\r
-               setJobSubmitter(isJobSubmitter);\r
+               this.displayName = account;\r
+               this.admin = isAdmin;\r
+               this.jobSubmitter = isJobSubmitter;\r
        }\r
 \r
        public String getAccount() {\r
index ce0198335fb83011a055984a9f4dd2920f503376..e08be765ca2afe2dad5006ece0916268f0b7fc99 100644 (file)
@@ -9,9 +9,10 @@ import com.fasterxml.jackson.datatype.joda.JodaModule;
 public class ServiceObjectMapper {\r
 \r
        public static ObjectMapper createMapper() {\r
-               return new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)\r
-                               .disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS).registerModule(new JodaModule())\r
-                               .setDateFormat(new RFC3339DateFormat()).setSerializationInclusion(Include.NON_NULL);\r
+               //újraindítás kell a módoosításokhoz\r
+               return new ObjectMapper().disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)\r
+                               .registerModule(new JodaModule()).setDateFormat(new RFC3339DateFormat()).setSerializationInclusion(Include.NON_NULL);\r
+               //                              .enable(SerializationFeature.INDENT_OUTPUT);\r
 \r
        }\r
 }\r
index b92266ccc16d4f192b9642370689f9e13a231e49..67566e6cf522f36031e675d980360db3ad2e3336 100644 (file)
@@ -117,6 +117,23 @@ public class OctopusRESTService {
                return result;
        }
 
+       @GET
+       @Path("/stories")
+       @Consumes({ MediaType.APPLICATION_JSON })
+       @Produces({ MediaType.APPLICATION_JSON })
+       public Response getStories() {
+               logger.trace("Entry");
+               Response result = null;
+               try {
+                       List<DBObject> stories = octopusService.getStories();
+                       result = Response.ok(stories).build();
+               } catch (Exception e) {
+                       result = createErrorResponse(e);
+               }
+               logger.trace("Exit");
+               return result;
+       }
+
        @GET
        @Path("/storiesByID/{id}")
        @Consumes({ MediaType.APPLICATION_JSON })