git-tfs-id: [http://tfs.userrendszerhaz.hu:8080/tfs/DefaultCollection]$/MediaCube...
authorVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Fri, 27 Oct 2017 08:06:29 +0000 (08:06 +0000)
committerVásáry Dániel <daniel.vasary@userrendszerhaz.hu>
Fri, 27 Oct 2017 08:06:29 +0000 (08:06 +0000)
client/Maestro/MaestroForm.Designer.cs
client/Maestro/MaestroForm.Metadata.cs
client/Maestro/MaestroForm.Source.cs
client/Maestro/MaestroForm.Target.cs
client/Maestro/Metadata/MetaDataInfo.cs
client/Maestro/Metadata/MetadataType.cs
client/PlanAIRClient/Workers/MaterialWorker.cs
server/user.jobengine.osgi.commons/src/user/commons/octopus/OctopusDataMiner.java

index 6f3803fa693f33318720a584818d8165cf521c6e..f7a220ab4ba1e78f2d2b652d2c7a414298fd3b1f 100644 (file)
@@ -219,6 +219,7 @@ namespace Maestro {
             this.textSelectedSource.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(238)));\r
             this.textSelectedSource.Location = new System.Drawing.Point(3, 28);\r
             this.textSelectedSource.Name = "textSelectedSource";\r
+            this.textSelectedSource.ReadOnly = true;\r
             this.textSelectedSource.Size = new System.Drawing.Size(292, 26);\r
             this.textSelectedSource.TabIndex = 10;\r
             // \r
index 47cd215ac9a92e352956672506ce56e4a1a0a064..7cd744d3bc5b62b46c2971a6cf98f767d041f922 100644 (file)
@@ -36,7 +36,7 @@ namespace Maestro {
                 movieSegments = null;\r
                 segments = null;\r
                 textSelectedMetadata.Text = value?.ID;\r
-                ttMetadata.SetToolTip(textSelectedMetadata, value?.Tooltip);\r
+                ttMetadata.SetToolTip(textSelectedMetadata, GetMetadataTypeTooltip(value?.Kind));\r
             }\r
         }\r
 \r
@@ -259,11 +259,11 @@ namespace Maestro {
             if (String.IsNullOrEmpty(textSelectedMetadata.Text)) {\r
                 SelectedMetadata = null;\r
             } else {\r
-                if (SelectedMetadata == null || !textSelectedMetadata.Text.Equals(SelectedMetadata.ID)) {\r
+                string text = textSelectedMetadata.Text;\r
+                if (SelectedMetadata == null || !text.Equals(SelectedMetadata.ID)) {\r
                     SelectedMetadata = new MetadataInfo() {\r
-                        Kind = MetadataType.MediaCube,\r
-                        ID = textSelectedMetadata.Text,\r
-                        Tooltip = "MediaCube azonosító"\r
+                        Kind = GuessMetadataType(text),\r
+                        ID = text\r
                     };\r
                 }\r
             }\r
@@ -284,7 +284,6 @@ namespace Maestro {
             }\r
             SelectedMetadata = new MetadataInfo() {\r
                 Kind = MetadataType.OctopusPlaceHolder,\r
-                Tooltip = "Octopus azonosító",\r
                 ID = id,\r
                 VariantID = int.Parse(id)\r
             };\r
@@ -298,6 +297,16 @@ namespace Maestro {
                 return;\r
             }\r
             MetadataType metadataType = GuessMetadataType(selectedID);\r
+            SelectedMetadata = new MetadataInfo() {\r
+                Kind = metadataType,\r
+                ID = selectedID,\r
+                VariantID = variantID\r
+            };\r
+        }\r
+\r
+        private static string GetMetadataTypeTooltip(MetadataType? metadataType) {\r
+            if (metadataType == null)\r
+                return null;\r
             string tooltip = null;\r
             switch (metadataType) {\r
                 case MetadataType.TrafficAD:\r
@@ -309,13 +318,15 @@ namespace Maestro {
                 case MetadataType.TrafficPromo:\r
                     tooltip = "Traffic promó azonosító";\r
                     break;\r
+                case MetadataType.OctopusPlaceHolder:\r
+                    tooltip = "Octopus azonosító";\r
+                    break;\r
+                case MetadataType.MediaCube:\r
+                    tooltip = "MediaCube azonosító";\r
+                    break;\r
             }\r
-            SelectedMetadata = new MetadataInfo() {\r
-                Kind = metadataType,\r
-                Tooltip = tooltip,\r
-                ID = selectedID,\r
-                VariantID = variantID\r
-            };\r
+\r
+            return tooltip;\r
         }\r
 \r
         private void UpdateEditArchiveMetadataEnabled() {\r
index e0f3958c41d541edc3babedbfb57074925daede8..82455b05ace7de7005522dd929dc64da89fd514c 100644 (file)
@@ -305,7 +305,7 @@ namespace Maestro {
 \r
         private void UpdateLookupMetadataEnabled() {\r
             MetadataType metadataType = GuessMetadataType(SelectedSource?.Prefix);\r
-            buttonMetadata.Enabled = !String.IsNullOrEmpty(SelectedSource?.Prefix) && metadataType != MetadataType.MediaCube && metadataType != MetadataType.None;\r
+            buttonMetadata.Enabled = metadataType != MetadataType.MediaCube && metadataType != MetadataType.None;\r
         }\r
 \r
     }\r
index bae458b5f5f404210077886193a4b9e9458ba5d0..47ce78a013c261901f4e9230c0bd4a409477e325 100644 (file)
@@ -208,7 +208,7 @@ namespace Maestro {
 \r
         private void UpdateProcessorButtonsEnabled() {\r
             ClearSelectedProcessors();\r
-            if (!String.IsNullOrEmpty(textSelectedMetadata.Text) && !String.IsNullOrEmpty(textSelectedMetadata.Text)) {\r
+            if (!String.IsNullOrEmpty(textSelectedSource.Text) && !String.IsNullOrEmpty(textSelectedMetadata.Text)) {\r
                 ChangeProcessButtonsState(true);\r
             } else {\r
                 ChangeProcessButtonsState(false);\r
index d0afc2349bad0e9c4f39114d2c2c70aaa832fcbf..bf0b4c196b6a95c2b93837e7e857bdc0731a2a6f 100644 (file)
@@ -1,7 +1,6 @@
 namespace Maestro.Metadata {\r
     public class MetadataInfo {\r
         public string ID { get; set; }\r
-        public string Tooltip { get; set; }\r
         public MetadataType Kind { get; set; }\r
         public int VariantID { get; set; }\r
 \r
index 184ae1742559cd9811016c6a15db2ffa54fe14e3..67a96adfb0684a16bb499419b908ed85d40bdb6d 100644 (file)
@@ -2,6 +2,6 @@
 \r
 namespace Maestro.Metadata {\r
     public enum MetadataType {\r
-        None, MediaCube, OctopusStory, OctopusPlaceHolder, TrafficMaterial = TrafficMetadataType.TrafficMaterial, TrafficPromo = TrafficMetadataType.TrafficPromo, TrafficAD = TrafficMetadataType.TrafficAD \r
+        None = 6, MediaCube = 5, OctopusStory = 4, OctopusPlaceHolder = 3, TrafficMaterial = TrafficMetadataType.TrafficMaterial, TrafficPromo = TrafficMetadataType.TrafficPromo, TrafficAD = TrafficMetadataType.TrafficAD \r
     }\r
 }\r
index 2003a17724167ade715e1f656b478e7fbbf5c932..8f3f47f81aabfc07b8b2414ea7595540ec516456 100644 (file)
@@ -38,7 +38,7 @@ namespace TrafficClient.Workers {
             };\r
         }\r
 \r
-        public List<TrafficItem> GetMaterials(string strParam, bool problematic, DateTime? from, DateTime? to) {\r
+        public List<TrafficItem> GetMaterials(string search, bool problematic, DateTime? from, DateTime? to) {\r
             List<TrafficItem> result = null;\r
             try {\r
                 TryConnect();\r
@@ -51,9 +51,12 @@ namespace TrafficClient.Workers {
                     else \r
                         cmd.Parameters.AddWithValue("@@@Options", 0);\r
                     \r
-                    cmd.Parameters.AddWithValue("@@StrParam1", strParam);\r
-                    cmd.Parameters.AddWithValue("@@DateParam1", from.Value.Date);\r
-                    cmd.Parameters.AddWithValue("@@DateParam2", to.Value.Date);\r
+                    if (!String.IsNullOrEmpty(search))\r
+                        cmd.Parameters.AddWithValue("@@StrParam1", search);\r
+                    if (from != null)\r
+                        cmd.Parameters.AddWithValue("@@DateParam1", from.Value.Date);\r
+                    if (to != null)\r
+                        cmd.Parameters.AddWithValue("@@DateParam2", to.Value.Date);\r
 \r
                     using (SqlDataReader reader = cmd.ExecuteReader()) {\r
                         while (reader.Read()) {\r
index 7da25a28e24e6a4e9c12992d86fdcd6d3b16aca9..e1183b2b5368f1a6594d4a6614b4bd55e76b19a6 100644 (file)
@@ -1,8 +1,10 @@
 package user.commons.octopus;\r
 \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
 \r
 import javax.swing.event.EventListenerList;\r
 import javax.ws.rs.client.Invocation.Builder;\r
@@ -21,6 +23,7 @@ import com.ibm.nosql.json.api.BasicDBList;
 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.DBObject;\r
 import com.ibm.nosql.json.api.NoSQLClient;\r
 import com.ibm.nosql.json.api.QueryBuilder;\r
@@ -31,25 +34,37 @@ import user.commons.remotestore.IProgressEventListener;
 import user.commons.remotestore.ProgressEvent;\r
 \r
 public class OctopusDataMiner implements Runnable {\r
+       private static final String LABEL = "label";\r
+       private static final String SIMPLE_LINEFEED = "\n";\r
+       private static final String MOSOBJECT = "Bejátszó: ";\r
+       private static final String OBJ_ID = "objId";\r
+       private static final String OBJECT = "object";\r
+       private static final String LINEFEED = "\r\n";\r
+       private static final String MOS = "mos";\r
+       private static final String TEXT = "text";\r
+       private static final String TYPE = "type";\r
+       private static final String CONTENT = "content";\r
+       private static final String BODY = "body";\r
+       private static final String SCRIPT = "script";\r
+       private static final String SCRIPT_CONTENT = "script_content";\r
        private static final Logger logger = LogManager.getLogger();\r
-       private static final String SAVING_STORY_D = "Saving story %d";\r
+       private static final String SAVING_STORY_ID = "Saving story {}";\r
        private static final String SAVEING_RUNDOWN_D = "Saveing rundown : %d";\r
-       private static final String ACTUAL_MODIFIED_STRING_IS_NULL = "actualModifiedString is null";\r
-       private static final String PROCESSING_MULTI_REFERENCED_STORY_ID = "Processing multi referenced StoryID ";\r
-       private static final String RUNDOWN2 = "rundown";\r
+       private static final String REF_RUNDOWN = "rundown";\r
+       private static final String REF_STORYFOLDER = "story_folder";\r
        private static final String POSITION = "position";\r
        private static final String STORY = "story";\r
        private static final String SCHEDULED_START = "scheduledStart";\r
        private static final String SLUGS = "slugs";\r
        private static final String CHECKING_RUNDOWN_S_D_D = "Checking Rundown %s (%d/%d)";\r
-       private static final String STORIES_FIELDS = "stories, Story.modified, Story.name, Story.id,Story.mosObjects,Story.script,Story.type,customColumns,CustomColumn.label,CustomColumn.value";\r
-       private static final String SLUGS_FIELDS = "slugs,Slug.story,Slug.position,Story.name,Story.id,Story.modified,Story.mosObjects,Story.script,Story.type,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
+       private static final String FIELDS_STORIES = "stories,Story.modified,Story.name,Story.id,Story.mosObjects,Story.script,Story.type,customColumns,CustomColumn.label,CustomColumn.value";\r
+       private static final String FIELDS_SLUGS = "slugs,Slug.story,Slug.position,Story.name,Story.id,Story.modified,Story.mosObjects,Story.script,Story.type,Story.customColumns,CustomColumn.label,CustomColumn.value";\r
        private static final String RUNDOWN = "Rundown";\r
-       private static final String ID_NAME_MODIFIED_SCHEDULED_START = "id,name,modified,scheduledStart";\r
+       private static final String FIELDS_RUNDOWN_LIST = "id,name,modified,scheduledStart,slugs,Slug.storyId,Slug.position";\r
+       private static final String FIELDS_STORY_FOLDER_LIST = "id,name,modified,stories,Story.id";\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 STORYFOLDER = "story_folder";\r
        private static final String MODIFIED = "modified";\r
        private static final String STORIES = "stories";\r
        private static final String ID = "id";\r
@@ -57,13 +72,13 @@ public class OctopusDataMiner implements Runnable {
        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 ID_NAME_MODIFIED = "id,name,modified";\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 STORYID = "storyId";\r
 \r
        public static final String RUNDOWN_COLLECTION_NAME = "rundowns";\r
-       public static final String STORY_COLLECTION_NAME = STORIES;\r
+       public static final String STORY_COLLECTION_NAME = "stories";\r
        public static final String STORY_FOLDER_COLLECTION_NAME = "story_folders";\r
        public static final String TIME_COLLECTION_NAME = "time";\r
        public static final String LASTUPDATE_TIME = "lastUpdateTime";\r
@@ -75,6 +90,10 @@ public class OctopusDataMiner implements Runnable {
        private HashSet<Long> storyIDs = 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, BasicDBList> storedStoryRundowns;\r
+       private Map<Long, BasicDBList> storedStoryStoryFolders;\r
 \r
        public OctopusDataMiner() {\r
                String jdbcUrl = System.getProperty("jobengine.nosql.db.url");\r
@@ -111,27 +130,77 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
-       private void checkAndStoreStory(BasicDBObject modifiedStory, Date lastUpdateTime, long storyID, int position, long referenceID, String referenceName,\r
-                       DBCollection collection) {\r
-               boolean isContains = storyIDs.contains(storyID);\r
-               if (!isContains)\r
-                       storyIDs.add(storyID);\r
-               if (lastUpdateTime != null && !isModified(lastUpdateTime, modifiedStory))\r
-                       return;\r
-               if (isContains) {\r
-                       logger.trace(PROCESSING_MULTI_REFERENCED_STORY_ID + storyID);\r
-                       modifiedStory = (BasicDBObject) collection.findOne(new BasicDBObject(ID, storyID));\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
+                       long rundownId = rundown.getLong(ID);\r
+                       List<BasicDBObject> slugs = NoSQLUtils.asList(asDBList(rundown, SLUGS));\r
+                       for (BasicDBObject slug : slugs) {\r
+                               if (!slug.containsKey(STORYID))\r
+                                       continue;\r
+                               long storyId = slug.getLong(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(POSITION);\r
+                               references.add(new BasicDBObject(ID, rundownId).append(POSITION, position));\r
+                       }\r
                }\r
-               BasicDBList references = asDBList(modifiedStory, referenceName);\r
-               if (references == null) {\r
-                       references = new BasicDBList();\r
-                       modifiedStory.append(referenceName, references);\r
+               return result;\r
+       }\r
+\r
+       private void buildStoriesReferences() {\r
+               DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+               DBCursor cursor = collection.find(null, new BasicDBObject(ID, 1).append(REF_RUNDOWN, 1).append(REF_STORYFOLDER, 1));\r
+               //DBCursor find = collection.find(QueryBuilder.start(ID).greaterThan(0).get());\r
+               List<DBObject> stories = null;\r
+               try {\r
+\r
+                       while (cursor.hasNext()) {\r
+                               BasicDBObject story = (BasicDBObject) cursor.next();\r
+                               long storyId = story.getLong(ID);\r
+                               BasicDBList rundownRef = asDBList(story, REF_RUNDOWN);\r
+                               if (rundownRef != null) {\r
+                                       if (storedStoryRundowns == null)\r
+                                               storedStoryRundowns = new HashMap<>();\r
+                                       storedStoryRundowns.put(storyId, rundownRef);\r
+                               }\r
+                               BasicDBList storyFolderRef = asDBList(story, REF_STORYFOLDER);\r
+                               if (storyFolderRef != null) {\r
+                                       if (storedStoryStoryFolders == null)\r
+                                               storedStoryStoryFolders = new HashMap<>();\r
+                                       storedStoryStoryFolders.put(storyId, storyFolderRef);\r
+                               }\r
+                       }\r
+               } catch (Exception e) {\r
+                       logger.catching(e);\r
+                       throw e;\r
+               } finally {\r
+\r
                }\r
-               references.add(new BasicDBObject(ID, referenceID).append(POSITION, position));\r
-               String scriptContent = GetScriptContent(modifiedStory);\r
-               modifiedStory.append("script_content", scriptContent);\r
-               logger.info(String.format(SAVING_STORY_D, storyID));\r
-               collection.save(modifiedStory);\r
+       }\r
+\r
+       private Map<Long, BasicDBList> buildStoryFolderReferences(BasicDBList storyFolders) {\r
+               Map<Long, BasicDBList> result = new HashMap<>();\r
+               List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
+               for (BasicDBObject storyFolder : storyFolderList) {\r
+                       long storyFolderId = storyFolder.getLong(ID);\r
+                       List<BasicDBObject> stories = NoSQLUtils.asList(asDBList(storyFolder, STORIES));\r
+                       long position = 1;\r
+                       for (BasicDBObject story : stories) {\r
+                               long storyId = story.getLong(ID);\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(ID, storyFolderId).append(POSITION, position++));\r
+                       }\r
+               }\r
+               return result;\r
        }\r
 \r
        public void clear() {\r
@@ -193,38 +262,52 @@ public class OctopusDataMiner implements Runnable {
                }\r
        }\r
 \r
-       private String GetContent(BasicDBObject actualDBContent) {\r
-               String type = actualDBContent.getString("type");\r
+       private String GetContent(BasicDBObject content) {\r
                String scriptContent = "";\r
+               if (!content.containsKey(TYPE))\r
+                       return scriptContent;\r
+               String type = content.getString(TYPE);\r
                switch (type) {\r
-               case "text": {\r
-                       String text = actualDBContent.getString("text");\r
-                       if (text != null)\r
-                               scriptContent += String.format("%s: %s\r\n", type, text.replaceAll("\n", "\r\n"));\r
+               case TEXT: {\r
+                       if (content.containsKey(TEXT)) {\r
+                               String text = content.getString(TEXT);\r
+                               if (text != null)\r
+                                       scriptContent += String.format("%s%s", text.replaceAll(SIMPLE_LINEFEED, LINEFEED), LINEFEED);\r
+                       }\r
                        break;\r
                }\r
-               case "mos": {\r
-                       BasicDBObject mosObject = (BasicDBObject) actualDBContent.get("object");\r
+               case MOS: {\r
+                       BasicDBObject mosObject = asDBObject(content, OBJECT);\r
                        if (mosObject != null && !mosObject.isEmpty()) {\r
-                               String objID = mosObject.getString("objId");\r
-                               scriptContent += String.format("%s %s\r\n", type.toUpperCase(), objID);\r
+                               if (mosObject.containsKey(OBJ_ID)) {\r
+                                       String objID = mosObject.getString(OBJ_ID);\r
+                                       scriptContent += String.format("%s %s%s", MOSOBJECT, objID, LINEFEED);\r
+                               }\r
                        }\r
                        break;\r
                }\r
                default: {\r
-                       BasicDBList innerContents = (BasicDBList) actualDBContent.get("content");\r
-                       if (innerContents != null && !innerContents.isEmpty())\r
-                               for (Object actualInnerContent : innerContents) {\r
-                                       BasicDBObject actualDBInnerContent = (BasicDBObject) actualInnerContent;\r
-                                       if (actualDBInnerContent != null && actualDBInnerContent.isEmpty())\r
-                                               scriptContent += GetContent(actualDBInnerContent);\r
+                       if (content.containsKey(CONTENT)) {\r
+                               List<BasicDBObject> innerContents = NoSQLUtils.asList(asDBList(content, CONTENT));\r
+                               for (BasicDBObject actualInnerContent : innerContents) {\r
+                                       if (actualInnerContent != null && actualInnerContent.isEmpty())\r
+                                               scriptContent += GetContent(actualInnerContent);\r
                                }\r
+                       }\r
                        break;\r
                }\r
                }\r
                return scriptContent;\r
        }\r
 \r
+       //      private boolean isModified(Date date, BasicDBObject object, String name) {\r
+       //              Date actualModifiedString = toDate(object, name);\r
+       //              if (actualModifiedString == null)\r
+       //                      logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
+       //              int result = date.compareTo(actualModifiedString);\r
+       //              return result <= 0;\r
+       //      }\r
+\r
        private Date getLastUpdateTime() {\r
                Date result = null;\r
                DBCollection collection = db.getCollection(TIME_COLLECTION_NAME);\r
@@ -235,33 +318,32 @@ public class OctopusDataMiner implements Runnable {
        }\r
 \r
        private String GetScriptContent(BasicDBObject story) {\r
-               BasicDBObject script = (BasicDBObject) story.get("script");\r
-               String scriptContent = "text: ";\r
-               if (script != null && !script.isEmpty()) {\r
-                       BasicDBList body = (BasicDBList) script.get("body");\r
-                       if (body != null && !body.isEmpty())\r
-                               for (Object actualBody : body) {\r
-                                       BasicDBObject actualDBBody = (BasicDBObject) actualBody;\r
-                                       BasicDBList contents = (BasicDBList) actualDBBody.get("content");\r
-                                       if (contents != null && !contents.isEmpty())\r
-                                               for (Object actualContent : contents) {\r
-                                                       BasicDBObject actualDBContent = (BasicDBObject) actualContent;\r
-                                                       scriptContent += GetContent(actualDBContent);\r
-                                               }\r
-                               }\r
+               BasicDBObject script = asDBObject(story, SCRIPT);\r
+               if (script == null || script.isEmpty())\r
+                       return null;\r
+\r
+               List<BasicDBObject> body = NoSQLUtils.asList(asDBList(script, BODY));\r
+               if (body.size() == 0)\r
+                       return null;\r
+\r
+               StringBuilder sb = new StringBuilder();\r
+\r
+               for (BasicDBObject bodyItem : body) {\r
+                       if (bodyItem.containsKey(LABEL)) {\r
+                               sb.append(bodyItem.getString(LABEL));\r
+                               sb.append(LINEFEED);\r
+                       }\r
+                       List<BasicDBObject> contents = NoSQLUtils.asList(asDBList(bodyItem, CONTENT));\r
+                       for (BasicDBObject content : contents) {\r
+                               sb.append(GetContent(content));\r
+                       }\r
                }\r
-               return scriptContent;\r
+               return sb.length() == 0 ? null : sb.toString();\r
        }\r
 \r
-       //      private boolean isModified(Date date, BasicDBObject object, String name) {\r
-       //              Date actualModifiedString = toDate(object, name);\r
-       //              if (actualModifiedString == null)\r
-       //                      logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
-       //              int result = date.compareTo(actualModifiedString);\r
-       //              return result <= 0;\r
-       //      }\r
-\r
        private boolean isModified(Date date, BasicDBObject object) {\r
+               if (date == null)\r
+                       return true;\r
                Date modified = (Date) object.get(MODIFIED);\r
                int result = date.compareTo(modified);\r
                return result <= 0;\r
@@ -276,7 +358,7 @@ public class OctopusDataMiner implements Runnable {
        private BasicDBObject queryRundown(long id) {\r
                logger.trace(ENTER);\r
                BasicDBObject result = null;\r
-               String fields = SLUGS_FIELDS;\r
+               String fields = FIELDS_SLUGS;\r
                Response response = query(String.format("%s/", RUNDOWN) + id, fields).get();\r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
@@ -286,11 +368,10 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
-       private BasicDBList queryRundowns(Date lastUpdateTime) {\r
+       private BasicDBList queryRundowns() {\r
                logger.trace(ENTER);\r
                BasicDBList result = null;\r
-               String fields = ID_NAME_MODIFIED_SCHEDULED_START;\r
-               Response response = query(RUNDOWN, fields).get();\r
+               Response response = query(RUNDOWN, FIELDS_RUNDOWN_LIST).get();\r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
                if (resultObject != null)\r
@@ -302,7 +383,7 @@ public class OctopusDataMiner implements Runnable {
        private BasicDBObject queryStoryFolder(long id) {\r
                logger.trace(ENTER);\r
                BasicDBObject result = null;\r
-               String fields = STORIES_FIELDS;\r
+               String fields = FIELDS_STORIES;\r
                Response response = query(String.format("%s/", STORY_FOLDER) + id, fields).get();\r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
@@ -312,11 +393,10 @@ public class OctopusDataMiner implements Runnable {
                return result;\r
        }\r
 \r
-       private BasicDBList queryStoryFolders(Date lastUpdateTime) {\r
+       private BasicDBList queryStoryFolders() {\r
                logger.trace(ENTER);\r
                BasicDBList result = null;\r
-               String fields = ID_NAME_MODIFIED;\r
-               Response response = query(STORY_FOLDER, fields).get();\r
+               Response response = query(STORY_FOLDER, FIELDS_STORY_FOLDER_LIST).get();\r
                String json = response.readEntity(String.class);\r
                BasicDBObject resultObject = (BasicDBObject) JSONUtil.jsonToDbObject(json);\r
                if (resultObject != null)\r
@@ -326,7 +406,7 @@ public class OctopusDataMiner implements Runnable {
                List<BasicDBObject> list = NoSQLUtils.asList(result);\r
                for (BasicDBObject actual : list) {\r
                        String fullName = concatParentsToStoryFolder(actual, actual.getString("name"));\r
-                       logger.info(String.format("fullname %s", fullName));\r
+                       //logger.info("Checking StoryFolder {}", fullName);\r
                        actual.remove("name");\r
                        actual.append("name", fullName);\r
                }\r
@@ -346,24 +426,32 @@ public class OctopusDataMiner implements Runnable {
                        ensureIndexes();\r
                        Date lastUpdateTime = getLastUpdateTime();\r
                        setLastUpdateTime(new Date());\r
-                       BasicDBList rundowns = queryRundowns(lastUpdateTime);\r
-                       if (rundowns != null)\r
-                               storeRundowns(rundowns, lastUpdateTime);\r
-                       else {\r
+\r
+                       buildStoriesReferences();\r
+\r
+                       BasicDBList rundowns = queryRundowns();\r
+                       storyRundowns = buildRundownReferences(rundowns);\r
+\r
+                       BasicDBList storyFolders = queryStoryFolders();\r
+                       storyStoryFolders = buildStoryFolderReferences(storyFolders);\r
+\r
+                       if (rundowns == null || rundowns.size() == 0) {\r
                                progressEvent.setProgress(50);\r
                                fireProgressEvent(progressEvent);\r
+                       } else {\r
+                               storeRundowns(rundowns, lastUpdateTime);\r
                        }\r
 \r
-                       BasicDBList storyFolders = queryStoryFolders(lastUpdateTime);\r
-                       if (storyFolders != null)\r
-                               storeStoryFolders(storyFolders, lastUpdateTime);\r
-                       else {\r
+                       if (storyFolders == null || storyFolders.size() == 0) {\r
                                progressEvent.setProgress(100);\r
                                fireProgressEvent(progressEvent);\r
+                       } else {\r
+                               storeStoryFolders(storyFolders, lastUpdateTime);\r
                        }\r
                        deleteOrphanStories();\r
                } catch (Exception e) {\r
-                       logger.error(e);\r
+                       logger.catching(e);\r
+                       throw e;\r
                }\r
                logger.trace(FINISHED);\r
        }\r
@@ -385,7 +473,7 @@ public class OctopusDataMiner implements Runnable {
                BasicDBObject rundownWithStories = queryRundown(rundownID);\r
                BasicDBList stories = asDBList(rundownWithStories, SLUGS);\r
                if (stories != null)\r
-                       storeRundownStories(stories, rundownID, lastUpdateTime);\r
+                       storeRundownStories(stories, lastUpdateTime);\r
                rundown.put(SCHEDULED_START, toDate(rundown, SCHEDULED_START));\r
                rundown.put(MODIFIED, toDate(rundown, MODIFIED));\r
                DBCollection collection = db.getCollection(RUNDOWN_COLLECTION_NAME);\r
@@ -396,24 +484,6 @@ public class OctopusDataMiner implements Runnable {
                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(String.format(CHECKING_RUNDOWN_S_D_D, rundown.getLong(ID), rundownsList.size(), idx));\r
-                       storeRundown(rundown, lastUpdateTime);\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 insertStoryFoldersToDB2() {\r
        // DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
        // Set<String> storyKeys = storyFolders.keySet();\r
@@ -483,38 +553,75 @@ public class OctopusDataMiner implements Runnable {
        // storyFolders = converter.convertBasicDBObjectFromJson(result);\r
        // }\r
 \r
-       private void storeRundownStories(BasicDBList slugs, long referenceID, Date lastUpdateTime) {\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(String.format(CHECKING_RUNDOWN_S_D_D, rundown.getLong(ID), rundownsList.size(), idx));\r
+                       storeRundown(rundown, lastUpdateTime);\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, Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
                List<BasicDBObject> slugsList = NoSQLUtils.asList(slugs);\r
                for (BasicDBObject slug : slugsList) {\r
                        if (slug.containsKey(STORY))\r
-                               storeStory((BasicDBObject) slug.get(STORY), slug.getInt(POSITION), referenceID, RUNDOWN2, lastUpdateTime);\r
+                               storeStory((BasicDBObject) slug.get(STORY), lastUpdateTime);\r
                }\r
                logger.trace(EXIT);\r
        }\r
 \r
-       private void storeStory(BasicDBObject story, int position, long referenceID, String referenceName, Date lastUpdateTime) {\r
+       private void storeStory(BasicDBObject story, Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
-               try {\r
-                       // a run v�g�n lek�rj�k az �sszes storyID-t az adatb�zisb�l\r
-                       // �s ha van olyan eleme annak a list�nak, ami nincs benne a\r
-                       // mem�ri�ban t�rolt storyIDs setben, t�r�lj�k adatb�zisb�l\r
-                       long storyID = story.getLong(ID);\r
-                       DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
-                       BasicDBObject modifiedStory = story;\r
-                       // boolean trashed = story.getBoolean(TRASHED);\r
-                       // modifiedStory.remove(TRASHED);\r
-                       // nem m�k�dik\r
-                       /*\r
-                        * if (trashed) { modifiedStory = (BasicDBObject)\r
-                        * collection.findOne(new BasicDBObject(ID, storyID), new\r
-                        * BasicDBObject(_ID, 1)); collection.remove(modifiedStory); } else\r
-                        */\r
-                       checkAndStoreStory(modifiedStory, lastUpdateTime, storyID, position, referenceID, referenceName, collection);\r
-               } catch (Exception e) {\r
-                       logger.error(e);\r
-                       throw e;\r
+               long storyID = story.getLong(ID);\r
+               boolean isContains = storyIDs.contains(storyID);\r
+               if (isContains)\r
+                       return;\r
+               storyIDs.add(storyID);\r
+               story.put(MODIFIED, toDate(story, MODIFIED));\r
+               BasicDBList rundownRef = storyRundowns.get(storyID);\r
+               rundownRef = (rundownRef == null) ? new BasicDBList() : rundownRef;\r
+               BasicDBList storyFolderRef = storyStoryFolders.get(storyID);\r
+               storyFolderRef = (storyFolderRef == null) ? new BasicDBList() : storyFolderRef;\r
+\r
+               boolean uptodate = true;\r
+               if (!isModified(lastUpdateTime, story)) {\r
+                       BasicDBList storedRundownRef = storedStoryRundowns.get(storyID);\r
+                       storedRundownRef = (storedRundownRef == null) ? new BasicDBList() : storedRundownRef;\r
+                       uptodate = storedRundownRef.equals(rundownRef);\r
+\r
+                       if (uptodate) {\r
+                               BasicDBList storedStoryFolderRef = storedStoryStoryFolders.get(storyID);\r
+                               storedStoryFolderRef = (storedStoryFolderRef == null) ? new BasicDBList() : storedStoryFolderRef;\r
+                               uptodate = storedStoryFolderRef.equals(storyFolderRef);\r
+                       }\r
+                       if (uptodate)\r
+                               return;\r
+               }\r
+\r
+               DBCollection collection = db.getCollection(STORY_COLLECTION_NAME);\r
+               if (lastUpdateTime != null) {\r
+                       BasicDBObject orig = (BasicDBObject) collection.findOne(new BasicDBObject(ID, storyID), new BasicDBObject(ID, 1));\r
+                       story.put("_id", orig.getID());\r
                }\r
+               if (rundownRef != null)\r
+                       story.put(REF_RUNDOWN, rundownRef);\r
+               if (storyFolderRef != null)\r
+                       story.put(REF_STORYFOLDER, storyFolderRef);\r
+               String scriptContent = GetScriptContent(story);\r
+               story.put(SCRIPT_CONTENT, scriptContent);\r
+               logger.info(SAVING_STORY_ID, storyID);\r
+               collection.save(story);\r
                logger.trace(EXIT);\r
        }\r
 \r
@@ -525,7 +632,7 @@ public class OctopusDataMiner implements Runnable {
                BasicDBObject storyFoldersWithStories = queryStoryFolder(storyFolderID);\r
                BasicDBList stories = asDBList(storyFoldersWithStories, STORIES);\r
                if (stories != null)\r
-                       storeStoryFolderStories(stories, storyFolderID, storyFolderID, lastUpdateTime);\r
+                       storeStoryFolderStories(stories, lastUpdateTime);\r
                storyFolder.put(MODIFIED, toDate(storyFolder, MODIFIED));\r
                DBCollection collection = db.getCollection(STORY_FOLDER_COLLECTION_NAME);\r
                if (lastUpdateTime == null || (lastUpdateTime != null && isModified(lastUpdateTime, storyFolder))) {\r
@@ -552,11 +659,11 @@ public class OctopusDataMiner implements Runnable {
                logger.trace(EXIT);\r
        }\r
 \r
-       private void storeStoryFolderStories(BasicDBList stories, long storyFolderID, long referenceID, Date lastUpdateTime) {\r
+       private void storeStoryFolderStories(BasicDBList stories, Date lastUpdateTime) {\r
                logger.trace(ENTER);\r
                List<BasicDBObject> list = NoSQLUtils.asList(stories);\r
                for (BasicDBObject story : list)\r
-                       storeStory(story, 0, referenceID, STORYFOLDER, lastUpdateTime);\r
+                       storeStory(story, lastUpdateTime);\r
                logger.trace(EXIT);\r
        }\r
 \r