/// Name object, represents a complete MXF file\r
/// </summary>\r
public class MXFFile : MXFObject {\r
+ public MXFTimecodeComponent TimecodeComponent {\r
+ get; internal set;\r
+ }\r
+\r
private MXFReader m_reader;\r
+ private List<MXFValidationResult> m_results;\r
\r
public string Filename { get; set; }\r
public long Filesize { get; set; }\r
public List<MXFPartition> Partitions { get; set; }\r
public MXFRIP RIP { get; set; }\r
\r
+ public List<MXFValidationResult> Results { get { return m_results; } }\r
public MXFSystemItem FirstSystemItem { get; set; }\r
public MXFSystemItem LastSystemItem { get; set; }\r
\r
+ public List<MXFObject> FlatList { get; set; }\r
+\r
public MXFLogicalObject LogicalBase { get; set; }\r
\r
\r
public MXFFile(string fileName) {\r
this.Filename = fileName;\r
this.Partitions = new List<MXFPartition>();\r
+ this.m_results = new List<MXFValidationResult>();\r
+ }\r
+\r
+ public void Inspect(FileParseOptions options = FileParseOptions.FastStartTC) {\r
+ switch (options) {\r
+ case FileParseOptions.Normal:\r
+ ParseFull();\r
+ break;\r
+ case FileParseOptions.Fast:\r
+ ParsePartial();\r
+ break;\r
+ case FileParseOptions.FastStartTC:\r
+ ParsePartial(true);\r
+ break;\r
+ }\r
}\r
\r
- public void Inspect() {\r
- ParsePartial(true);\r
+ /// <summary>\r
+ /// Fully Parse an MXF file \r
+ /// </summary>\r
+ protected void ParseFull() {\r
+ Stopwatch sw = Stopwatch.StartNew();\r
+\r
+ MXFKLVFactory klvFactory = new MXFKLVFactory();\r
+\r
+ MXFPartition currentPartition = null;\r
+ Dictionary<UInt16, MXFEntryPrimer> allPrimerKeys = null;\r
+ int[] counters = new int[Enum.GetNames(typeof(KeyType)).Length];\r
+ using (m_reader = new MXFReader(this.Filename)) {\r
+ this.Filesize = m_reader.Size;\r
+ MXFObject partitions = new MXFNamedObject("Partitions", 0);\r
+ this.AddChild(partitions);\r
+\r
+ int partitionNumber = 0; // For easy partition identification\r
+ while (!m_reader.EOF) {\r
+ MXFKLV klv = klvFactory.CreateObject(m_reader, currentPartition);\r
+\r
+ // Update overall counters\r
+ if (klv.Key.Type == KeyType.None)\r
+ counters[(int)klv.Key.Type]++;\r
+\r
+ // Process the new KLV\r
+ ProcessKLVObject(klv, partitions, ref currentPartition, ref partitionNumber, ref allPrimerKeys);\r
+\r
+ // Next KLV please\r
+ m_reader.Seek(klv.DataOffset + klv.Length);\r
+ }\r
+ }\r
+ // Progress should now be 90%\r
+\r
+ // Update all type descriptions\r
+ klvFactory.UpdateAllTypeDescriptions(allPrimerKeys);\r
+\r
+ Debug.WriteLine("Finished parsing file '{0}' in {1} ms", this.Filename, sw.ElapsedMilliseconds);\r
+ sw.Restart();\r
+\r
+ // Create a list with all UID keys\r
+ Dictionary<string, MXFObject> allKeys = new Dictionary<string, MXFObject>();\r
+ CreateKeyList(allKeys, this);\r
+\r
+ // Resolve the references\r
+ ResolveReferences(allKeys, this);\r
+ Debug.WriteLine("Finished resolving references in {0} ms", sw.ElapsedMilliseconds);\r
+ sw.Restart();\r
+\r
+ this.FlatList = new List<MXFObject>();\r
+ this.AddToList(this.FlatList);\r
+ Debug.WriteLine("Flatlist created in {0} ms", sw.ElapsedMilliseconds);\r
+ sw.Restart();\r
+\r
+\r
+ // Create the logical tree\r
+ CreateLogicalTree();\r
+ Debug.WriteLine("Logical tree created in {0} ms", sw.ElapsedMilliseconds);\r
+ sw.Restart();\r
+\r
+ // And Execute ALL test\r
+ this.ExecuteValidationTest(true);\r
}\r
\r
+\r
/// <summary>\r
/// Partially Parse an MXF file, skip all data\r
/// </summary>\r
protected void ParsePartial(bool stopOnStartTC = false) {\r
MXFKLVFactory klvFactory = new MXFKLVFactory();\r
+\r
MXFPartition currentPartition = null;\r
Dictionary<UInt16, MXFEntryPrimer> allPrimerKeys = null;\r
+ int[] counters = new int[Enum.GetNames(typeof(KeyType)).Length];\r
PartialSeekMode seekMode = PartialSeekMode.Unknown;\r
using (m_reader = new MXFReader(this.Filename)) {\r
this.Filesize = m_reader.Size;\r
while (!m_reader.EOF && seekMode != PartialSeekMode.Backwards) // Eof and NOT searching backwards\r
{\r
MXFKLV klv = klvFactory.CreateObject(m_reader, currentPartition);\r
+ if (klv is MXFTimecodeComponent && stopOnStartTC) {\r
+ TimecodeComponent = klv as MXFTimecodeComponent;\r
+ break;\r
+ }\r
+\r
\r
// Update overall counters\r
//if (klv.Key.Type == KeyType.None)\r
\r
// Process the new KLV\r
\r
- if (!ProcessKLVObject(klv, partitions, ref currentPartition, ref partitionNumber, ref allPrimerKeys, true))\r
+ if (!ProcessKLVObjectOrig(klv, partitions, ref currentPartition, ref partitionNumber, ref allPrimerKeys))\r
break;\r
- Debug.WriteLine("Processed partition {0}/{1} ", currentPartition, partitionNumber);\r
+ Debug.WriteLine("Processed partition {0}/{1} ", klv.Key.Name, partitionNumber);\r
\r
\r
// If we found the second partition \r
return false;\r
}\r
currentPartition.AddChild(klv);\r
- } \r
+ }\r
\r
if (this.FirstSystemItem == null) {\r
this.FirstSystemItem = klv as MXFSystemItem;\r
return true;\r
}\r
\r
+ private bool ProcessKLVObjectOrig(MXFKLV klv, MXFObject partitions, ref MXFPartition currentPartition, ref int partitionNumber, ref Dictionary<UInt16, MXFEntryPrimer> allPrimerKeys) {\r
+ // Is this a header, add to the partitions\r
+ switch (klv.Key.Type) {\r
+ case KeyType.Partition:\r
+ currentPartition = klv as MXFPartition;\r
+ currentPartition.File = this;\r
+ currentPartition.PartitionNumber = partitionNumber;\r
+ this.Partitions.Add(currentPartition);\r
+ partitions.AddChild(currentPartition);\r
+ partitionNumber++;\r
+ break;\r
+\r
+ case KeyType.PrimerPack:\r
+ if (currentPartition != null) {\r
+ MXFPrimerPack primer = klv as MXFPrimerPack;\r
+ if (primer != null) // Just to be sure\r
+ {\r
+ // Let the partition know all primer keys\r
+ allPrimerKeys = primer.AllKeys;\r
+ currentPartition.PrimerKeys = primer.AllKeys;\r
+ }\r
+ currentPartition.AddChild(klv); // Add the primer \r
+ }\r
+ break;\r
+\r
+ case KeyType.RIP:\r
+ // Only add the RIP when not yet present\r
+ if (this.RIP == null) {\r
+ this.AddChild(klv);\r
+ this.RIP = klv as MXFRIP;\r
+ }\r
+ break;\r
+\r
+ case KeyType.SystemItem:\r
+ if (currentPartition != null) {\r
+ // Store the first system item for every partition\r
+ // (required to calculate essence positions)\r
+ if (currentPartition.FirstSystemItem == null) {\r
+ currentPartition.FirstSystemItem = klv as MXFSystemItem;\r
+ }\r
+ currentPartition.AddChild(klv);\r
+ } else\r
+ this.AddChild(klv);\r
+\r
+ // Store the first and the last system item\r
+ if (this.FirstSystemItem == null) {\r
+ this.FirstSystemItem = klv as MXFSystemItem;\r
+ }\r
+ this.LastSystemItem = klv as MXFSystemItem;\r
+ break;\r
+\r
+\r
+ case KeyType.Essence:\r
+ if (currentPartition != null) {\r
+ // Store the first system item for every partition\r
+ // (required to calculate essence positions)\r
+ MXFEssenceElement ee = klv as MXFEssenceElement;\r
+ if (ee.IsPicture && currentPartition.FirstPictureEssenceElement == null)\r
+ currentPartition.FirstPictureEssenceElement = ee;\r
+ currentPartition.AddChild(klv);\r
+ } else\r
+ this.AddChild(klv);\r
+ break;\r
+\r
+ case KeyType.Preface:\r
+ this.LogicalBase = new MXFLogicalObject(klv, klv.ToString());\r
+ // Normal\r
+ if (currentPartition != null)\r
+ currentPartition.AddChild(klv);\r
+ else\r
+ this.AddChild(klv);\r
+ break;\r
+\r
+ default:\r
+ // Normal\r
+ if (currentPartition != null)\r
+ currentPartition.AddChild(klv);\r
+ else\r
+ this.AddChild(klv);\r
+ break;\r
+ }\r
+\r
+ return true;\r
+ }\r
+\r
+\r
/// <summary>\r
/// Try to locate the RIP\r
/// </summary>\r
}\r
\r
\r
+ /// <summary>\r
+ /// Execute all validation tests\r
+ /// </summary>\r
+ public void ExecuteValidationTest(bool extendedTest) {\r
+ // Reset results\r
+ this.m_results.Clear();\r
+\r
+ // Execute validation tests\r
+ List<MXFValidator> allTest = new List<MXFValidator>();\r
+ allTest.Add(new MXFValidatorInfo());\r
+ allTest.Add(new MXFValidatorPartitions());\r
+ allTest.Add(new MXFValidatorRIP());\r
+ if (extendedTest) {\r
+ allTest.Add(new MXFValidatorIndex());\r
+ }\r
+ foreach (MXFValidator mxfTest in allTest) {\r
+ mxfTest.Initialize(this);\r
+ mxfTest.ExecuteTest(ref m_results);\r
+ }\r
+\r
+ if (!extendedTest) {\r
+ MXFValidationResult valResult = new MXFValidationResult("Index Table");\r
+ this.m_results.Add(valResult);\r
+ valResult.SetWarning("Index table test not executed in partial loading mode (to execute test press the execute all test button).");\r
+ //MXFValidationResult valResult = new MXFValidationResult("Index Tables"); \r
+ //this.Results.Add(valResult); // And directly add the results\r
+ }\r
+ }\r
+\r
+ /// <summary>\r
+ /// Create the logical view (starting with the preface)\r
+ /// </summary>\r
+ protected void CreateLogicalTree() {\r
+ if (this.LogicalBase == null)\r
+ return;\r
+\r
+ LogicalAddChilds(this.LogicalBase);\r
+ }\r
+\r
+ /// <summary>\r
+ /// Add all children (recusive)\r
+ /// </summary>\r
+ /// <param name="parent"></param>\r
+ protected MXFLogicalObject LogicalAddChilds(MXFLogicalObject parent) {\r
+ // Check properties for reference\r
+ MXFObject reference = parent.Object;\r
+ if (reference != null) {\r
+ foreach (PropertyInfo propertyInfo in reference.GetType().GetProperties()) {\r
+ if (propertyInfo.CanRead) {\r
+ if (propertyInfo.PropertyType == typeof(MXFRefKey)) {\r
+ // Found one!\r
+ MXFRefKey refKey = (MXFRefKey)propertyInfo.GetValue(reference, null);\r
+ if (refKey != null && refKey.Reference != null) {\r
+ // Add the child\r
+ MXFLogicalObject lo = new MXFLogicalObject(refKey.Reference, refKey.Reference.ToString());\r
+ parent.AddChild(lo);\r
+\r
+ // Add all sub stuff\r
+ LogicalAddChilds(lo);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ if (reference.HasChildren) {\r
+ foreach (MXFObject child in reference.Children) {\r
+ if (child.HasChildren) {\r
+ foreach (MXFObject grandchild in child.Children) {\r
+ MXFRefKey refKey = grandchild as MXFRefKey;\r
+ if (refKey != null && refKey.Reference != null) {\r
+ MXFLogicalObject lo = new MXFLogicalObject(refKey.Reference, refKey.Reference.ToString());\r
+\r
+ // Add the child\r
+ parent.AddChild(lo);\r
+\r
+ // Add all sub stuff\r
+ LogicalAddChilds(lo);\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ }\r
+ return parent;\r
+ }\r
\r
/// <summary>\r
/// Loop through all items, when an item with a reference is found, \r
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 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.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.octopus.OctopusAPI;\r
import user.commons.remotestore.IProgressEventListener;\r
import user.commons.remotestore.ProgressEvent;\r
\r
-public class OctopusDataMiner implements Runnable {\r
+public class OctopusDataMiner {\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 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_STORYIDS = "id,name,modified,scheduledStart,channel,Channel.name,rundownType,RundownType.name,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 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 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
- private Map<Long, BasicDBList> storedStoryMosObjects;\r
- private String RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION;\r
- private String FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION;\r
- private String STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION;\r
-\r
- private Map<Long, BasicDBList> newRundowns = new HashMap<>();\r
- private Map<Long, BasicDBList> newStoryFolders = new HashMap<>();\r
- private Map<Long, BasicDBList> newStories = new HashMap<>();\r
+ 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 OctopusDataMiner() {\r
db = NoSQLUtils.getNoSQLDB();\r
Map<Long, BasicDBList> result = new HashMap<>();\r
List<BasicDBObject> storyFolderList = NoSQLUtils.asList(storyFolders);\r
for (BasicDBObject storyFolder : storyFolderList) {\r
- long storyFolderId = storyFolder.getLong(IOctopusAPI.ID);\r
- List<BasicDBObject> stories = NoSQLUtils.asList(storyFolder, IOctopusAPI.STORIES);\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
long position = 1;\r
Map<Long, BasicDBList> result = new HashMap<>();\r
List<BasicDBObject> rundownsList = NoSQLUtils.asList(rundowns);\r
for (BasicDBObject rundown : rundownsList) {\r
- if (!rundown.containsKey(IOctopusAPI.ID))\r
+ if (rundown == null || !rundown.containsKey(IOctopusAPI.ID))\r
continue;\r
- long rundownId = rundown.getLong(IOctopusAPI.ID);\r
- List<BasicDBObject> slugs = NoSQLUtils.asList(rundown, IOctopusAPI.SLUGS);\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
for (BasicDBObject slug : slugs) {\r
return result;\r
}\r
\r
- private void buildStoriesReferences() {\r
- DBCollection collection = db.getCollection(STORY_COLLECTION);\r
- DBCursor cursor = collection.find(null, new BasicDBObject(IOctopusAPI.ID, 1).append(IOctopusAPI.REF_RUNDOWN, 1).append(IOctopusAPI.REF_STORYFOLDER, 1)\r
- .append(IOctopusAPI.MOS_OBJECTS, 1));\r
- //DBCursor find = collection.find(QueryBuilder.start(ID).greaterThan(0).get());\r
- try {\r
-\r
- while (cursor.hasNext()) {\r
- BasicDBObject story = (BasicDBObject) cursor.next();\r
- long storyId = story.getLong(IOctopusAPI.ID);\r
- BasicDBList rundownRef = NoSQLUtils.asDBList(story, IOctopusAPI.REF_RUNDOWN);\r
- if (rundownRef != null) {\r
- if (storedStoryRundowns == null)\r
- storedStoryRundowns = new HashMap<>();\r
- storedStoryRundowns.put(storyId, rundownRef);\r
- }\r
- BasicDBList storyFolderRef = NoSQLUtils.asDBList(story, IOctopusAPI.REF_STORYFOLDER);\r
- if (storyFolderRef != null) {\r
- if (storedStoryStoryFolders == null)\r
- storedStoryStoryFolders = new HashMap<>();\r
- storedStoryStoryFolders.put(storyId, storyFolderRef);\r
- }\r
-\r
- BasicDBList storyMosObjects = NoSQLUtils.asDBList(story, IOctopusAPI.MOS_OBJECTS);\r
- if (storyMosObjects != null) {\r
- if (storedStoryMosObjects == null)\r
- storedStoryMosObjects = new HashMap<>();\r
- storedStoryMosObjects.put(storyId, storyMosObjects);\r
- }\r
- }\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- } finally {\r
-\r
- }\r
- }\r
-\r
public void clear() {\r
db.getCollection(RUNDOWN_COLLECTION).remove();\r
db.getCollection(STORY_COLLECTION).remove();\r
return concatParentsToStoryFolder(parent, newName);\r
}\r
\r
- private void deleteDiff(String oldCollectionName, String newCollectionName, String idFieldName) {\r
- DBCollection oldCollection = db.getCollection(oldCollectionName);\r
- DBCollection newCollection = db.getCollection(newCollectionName);\r
- DBCursor oldCollectionCursor = 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
+ 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
}\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
}\r
\r
- public void execute() throws Exception {\r
+ public void execute(boolean includeArchived) throws Exception {\r
+ this.includeArchived = includeArchived;\r
logger.trace(STARTING);\r
- //{"filter" :{ "archived" : true }}\r
- Response response = query(RUNDOWN, "id,name,modified,scheduledStart,channel,Channel.name,rundownType,RundownType.name")\r
- .post(Entity.entity(new BasicDBObject("filter", new BasicDBObject("archived", true)).toPrettyString(null), MediaType.APPLICATION_JSON));\r
- String json = response.readEntity(String.class);\r
\r
- RUNDOWN_COLLECTION = IOctopusAPI.RUNDOWN_COLLECTION + _TMP;\r
- FOLDER_COLLECTION = IOctopusAPI.FOLDER_COLLECTION + _TMP;\r
- STORY_COLLECTION = IOctopusAPI.STORY_COLLECTION + _TMP;\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
- 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
+ // 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
BasicDBList rundowns = null;\r
BasicDBList storyFolders = null;\r
\r
processRundowns(rundowns);\r
processStoryFolders(storyFolders);\r
\r
+ deleteOrphanRundowns();\r
+ deleteOrphanStoryFolders();\r
+ deleteOrphanStories();\r
+\r
//a sorrend fontos !\r
- updateDiff(IOctopusAPI.STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
- updateDiff(IOctopusAPI.RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
- updateDiff(IOctopusAPI.FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
- deleteDiff(IOctopusAPI.RUNDOWN_COLLECTION, RUNDOWN_COLLECTION, IOctopusAPI.ID);\r
- //deleteDiff(IOctopusAPI.FOLDER_COLLECTION, FOLDER_COLLECTION, IOctopusAPI.ID);\r
- deleteDiff(IOctopusAPI.STORY_COLLECTION, STORY_COLLECTION, IOctopusAPI.ID);\r
-\r
- //setLastUpdateTime(new Date());\r
- logger.info("Activate");\r
-\r
- // db.getCollection(RUNDOWN_COLLECTION).rename(IOctopusAPI.RUNDOWN_COLLECTION, true);\r
- // db.getCollection(FOLDER_COLLECTION).rename(IOctopusAPI.FOLDER_COLLECTION, true);\r
- // db.getCollection(STORY_COLLECTION).rename(IOctopusAPI.STORY_COLLECTION, true);\r
- logger.trace(FINISHED);\r
+ // 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
- }\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
- public void executetest() {\r
- // ResteasyWebTarget target = webTarget.path(RUNDOWN);\r
- // Builder result = target.request().header(OCTOPUS_DEVICE_ID, apiUser).header(OCTOPUS_DEVICE_NAME, apiPwd);\r
- // Response r = result.get();\r
- // String x = r.readEntity(String.class);\r
- // logger.info(x);\r
- // return;\r
+ // 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
}\r
}\r
\r
- private Date getLastUpdateTime() {\r
- Date result = null;\r
- DBCollection collection = db.getCollection(IOctopusAPI.TIME_COLLECTION_NAME);\r
- DBObject timeObject = collection.findOne();\r
- if (timeObject != null)\r
- result = (Date) timeObject.get(IOctopusAPI.LASTUPDATE_TIME);\r
- return result;\r
- }\r
-\r
- // private boolean isModified(Date date, BasicDBObject object, String name) {\r
- // Date actualModifiedString = toDate(object, name);\r
- // if (actualModifiedString == null)\r
- // logger.trace(ACTUAL_MODIFIED_STRING_IS_NULL);\r
- // int result = date.compareTo(actualModifiedString);\r
- // return result <= 0;\r
- // }\r
-\r
- private boolean isModified(Date date, BasicDBObject object) {\r
- if (date == null)\r
- return true;\r
- Date modified = (Date) object.get(IOctopusAPI.MODIFIED);\r
- int result = date.compareTo(modified);\r
- return result <= 0;\r
- }\r
-\r
private void processRundowns(BasicDBList rundowns) throws Exception {\r
if (rundowns == null || rundowns.size() == 0) {\r
progressEvent.setProgress(50);\r
}\r
\r
private Builder query(String path, String fields) {\r
- //logger.info("Class loader {}", getClass().getClassLoader());\r
- // try {\r
- // //TODO kell e?\r
- // ResteasyDeployment deployment = new ResteasyDeployment();\r
- // deployment.start();\r
- // } catch (Exception e) {\r
- // logger.catching(e);\r
- // }\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
return rundowns;\r
}\r
\r
- private BasicDBObject queryRundown(BasicDBObject rundown) {\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/", RUNDOWN) + id, FIELDS_RUNDOWN_STORIES).get();\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
private BasicDBList queryRundowns() {\r
logger.trace(ENTER);\r
BasicDBList result = null;\r
- Response response = query(RUNDOWN, FIELDS_RUNDOWN_STORYIDS).get();\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
return result;\r
}\r
\r
- private BasicDBObject queryStoryFolder(BasicDBObject storyFolder) {\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/", STORY_FOLDER) + id, FIELDS_STORYFOLDER_STORIES).get();\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
private BasicDBList queryStoryFolders() {\r
logger.trace(ENTER);\r
BasicDBList result = null;\r
- Response response = query(STORY_FOLDER, FIELDS_STORY_FOLDER_LIST).get();\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
+ // /* 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
progressListenerList.remove(IProgressEventListener.class, listener);\r
}\r
\r
- @Override\r
- public void run() {\r
- logger.trace(STARTING);\r
- try {\r
- ensureIndexes();\r
- Date lastUpdateTime = getLastUpdateTime();\r
-\r
- buildStoriesReferences();\r
-\r
- BasicDBList rundowns = queryRundowns();\r
- storyRundowns = buildRundownReferences(rundowns);\r
- BasicDBList storyFolders = queryStoryFolders();\r
- storyStoryFolders = buildFolderReferences(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
- if (storyFolders == null || storyFolders.size() == 0) {\r
- progressEvent.setProgress(100);\r
- fireProgressEvent(progressEvent);\r
- } else {\r
- storeStoryFolders(storyFolders, lastUpdateTime);\r
- }\r
- deleteOrphanStories();\r
- setLastUpdateTime(new Date());\r
- } catch (Exception e) {\r
- logger.catching(e);\r
- throw e;\r
- }\r
- logger.trace(FINISHED);\r
- }\r
-\r
- public void run(boolean forceFull) {\r
- if (forceFull) {\r
- clear();\r
- }\r
- run();\r
- // if (forceFull) {\r
- // RUNDOWN_COLLECTION_NAME = "rundowns";\r
- // STORY_COLLECTION_NAME = "stories";\r
- // STORY_FOLDER_COLLECTION_NAME = "storyfolders";\r
- // TIME_COLLECTION_NAME = "octopusSyncTime";\r
- // db.getCollection("rundowns_tmp").rename(RUNDOWN_COLLECTION_NAME, true);\r
- // db.getCollection("stories_tmp").rename(STORY_COLLECTION_NAME, true);\r
- // db.getCollection("storyfolders_tmp").rename(STORY_FOLDER_COLLECTION_NAME, true);\r
- // db.getCollection("octopusSyncTime_tmp").rename(TIME_COLLECTION_NAME, true);\r
- // //clear();\r
- // }\r
-\r
- //TODO reset collection names\r
- }\r
-\r
- public void setLastUpdateTime(Date lastUpdateTime) {\r
- DBCollection collection = db.getCollection(OctopusAPI.TIME_COLLECTION_NAME);\r
- DBObject timeObject = collection.findOne();\r
- if (timeObject == null)\r
- timeObject = new BasicDBObject();\r
- timeObject.put(IOctopusAPI.LASTUPDATE_TIME, lastUpdateTime);\r
-\r
- collection.save(timeObject);\r
+ void setObjectID(DBCollection collection, BasicDBObject objectToSave) {\r
+ BasicDBObject obj = (BasicDBObject) collection.findOne(new BasicDBObject(IOctopusAPI.ID, NoSQLUtils.asLong(objectToSave, IOctopusAPI.ID)));\r
+ if (obj == null)\r
+ return;\r
+ Object id = obj.getID();\r
+ if (id == null)\r
+ return;\r
+ objectToSave.put(IOctopusAPI._ID, id);\r
}\r
\r
- private void storeRundown(BasicDBObject rundown, Date lastUpdateTime) {\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);\r
+ BasicDBObject rundownWithStories = queryRundown(rundown, FIELDS_RUNDOWN_STORIES);\r
if (rundownWithStories != null) {\r
- BasicDBList stories = NoSQLUtils.asDBList(rundownWithStories, IOctopusAPI.SLUGS);\r
- if (stories != null)\r
- storeRundownStories(stories, lastUpdateTime);\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
- if (lastUpdateTime == null || (lastUpdateTime != null && isModified(lastUpdateTime, rundown))) {\r
- //logger.debug(SAVING_RUNDOWN, rundownID, name);\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
+ setObjectID(collection, rundown);\r
collection.save(rundown);\r
}\r
}\r
int idx = 1;\r
for (BasicDBObject rundown : rundownsList) {\r
//logger.info(CHECKING_RUNDOWN, rundown.getLong(IOctopusAPI.ID), rundownsList.size(), idx);\r
- storeRundown(rundown, lastUpdateTime);\r
+ storeRundown(rundown);\r
int progress = idx * 50 / rundownsList.size();\r
if (progress - progressEvent.getProgress() > 0) {\r
progressEvent.setProgress(progress);\r
logger.trace(EXIT);\r
}\r
\r
- private void storeRundownStories(BasicDBList slugs, Date lastUpdateTime) {\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), lastUpdateTime);\r
+ storeStory((BasicDBObject) slug.get(IOctopusAPI.STORY));\r
}\r
logger.trace(EXIT);\r
}\r
\r
- private void storeStory(BasicDBObject story, Date lastUpdateTime) {\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
BasicDBList storyFolderRef = storyStoryFolders.get(storyID);\r
BasicDBList modifiedMOS = extractRelevantMOSObjects(story);\r
\r
- if (lastUpdateTime != null) {\r
- rundownRef = (rundownRef == null) ? new BasicDBList() : rundownRef;\r
- storyFolderRef = (storyFolderRef == null) ? new BasicDBList() : storyFolderRef;\r
- modifiedMOS = (modifiedMOS == null) ? new BasicDBList() : modifiedMOS;\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
-\r
- if (uptodate) {\r
- BasicDBList storedMOS = storedStoryMosObjects.get(storyID);\r
- storedMOS = (storedMOS == null) ? new BasicDBList() : storedMOS;\r
- uptodate = storedMOS.equals(modifiedMOS);\r
- }\r
-\r
- if (uptodate)\r
- return;\r
- }\r
- }\r
-\r
DBCollection collection = db.getCollection(STORY_COLLECTION);\r
- if (lastUpdateTime != null) {\r
- BasicDBObject orig = (BasicDBObject) collection.findOne(new BasicDBObject(IOctopusAPI.ID, storyID), new BasicDBObject(IOctopusAPI.ID, 1));\r
- if (orig != null)\r
- story.put("_id", orig.getID());\r
- }\r
+\r
if (rundownRef != null)\r
story.put(IOctopusAPI.REF_RUNDOWN, rundownRef);\r
if (storyFolderRef != null)\r
} else\r
story.append(IOctopusAPI.PARENT_STORY_ID, parentStoryId);\r
logger.debug(SAVING_STORY_ID, storyID);\r
+ setObjectID(collection, 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);\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, lastUpdateTime);\r
+ storeStoryFolderStories(stories);\r
storyFolder.put(IOctopusAPI.MODIFIED, toDate(storyFolder, IOctopusAPI.MODIFIED));\r
DBCollection collection = db.getCollection(FOLDER_COLLECTION);\r
- if (lastUpdateTime == null || (lastUpdateTime != null && isModified(lastUpdateTime, storyFolder))) {\r
- String name = storyFolder.getString(IOctopusAPI.NAME);\r
- logger.debug("Storing story folder {}", name);\r
- collection.save(storyFolder);\r
- }\r
+ String name = storyFolder.getString(IOctopusAPI.NAME);\r
+ logger.debug("Storing story folder {}", name);\r
+ setObjectID(collection, storyFolder);\r
+ collection.save(storyFolder);\r
}\r
logger.trace(EXIT);\r
}\r
logger.trace(EXIT);\r
}\r
\r
- private void storeStoryFolderStories(BasicDBList stories, Date lastUpdateTime) {\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, lastUpdateTime);\r
+ storeStory(story);\r
logger.trace(EXIT);\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