public bool MaybeUpdateRecordColumns(String callingUserLogin, WBDocument documentToCopy, IEnumerable <WBColumn> columnsToCopy, String reasonForUpdate) { WBLogging.RecordsTypes.Verbose("In WBDocument.MaybeUpdateRecordColumns() for " + DebugName); bool updateRequired = false; foreach (WBColumn column in columnsToCopy) { if (Item.WBxGet(column) != documentToCopy[column]) { updateRequired = true; } } if (updateRequired) { WBLogging.RecordsTypes.Verbose("In WBDocument.MaybeUpdateRecordColumns() An update is required."); UpdateRecordColumns(callingUserLogin, documentToCopy, columnsToCopy, reasonForUpdate); } else { WBLogging.RecordsTypes.Verbose("In WBDocument.MaybeUpdateRecordColumns() There is no need for an update."); } return(updateRequired); }
public void UpdateRecordColumns(String callingUserLogin, WBDocument documentToCopy, IEnumerable <WBColumn> columnsToCopy, String reasonForUpdate) { // WindowsIdentity identity = WindowsIdentity.GetCurrent(); WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns() running as: " + Web.CurrentUser.Name); WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns() SPSite system account: " + Site.SystemAccount.Name); WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns() for " + DebugName); bool previousSetting = RecordsLibrary.Web.AllowUnsafeUpdates; RecordsLibrary.Web.AllowUnsafeUpdates = true; WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns() About to bypass locks on " + DebugName); Records.BypassLocks(this.Item, delegate(SPListItem item) { WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns() inside BypassLocks() for " + DebugName); if (item.File.CheckOutType != SPFile.SPCheckOutType.None) { WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns() Somehow the record being updated (Record ID = " + this.RecordID + ") was checked out to: " + item.File.CheckedOutByUser.LoginName); item.File.UndoCheckOut(); } WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns(): Checkingout the record copy"); item.File.CheckOut(); WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns(): done check out for " + DebugName); foreach (WBColumn column in columnsToCopy) { if (Item.WBxGet(column) != documentToCopy[column]) { item.WBxSet(column, documentToCopy[column]); } } WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns(): Finished setting all of the columns that needed to be set"); SPUser callingUser = item.Web.WBxEnsureUserOrNull(callingUserLogin); if (callingUserLogin != null) { WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns(): Updating with callingUserLogin = "******" and callingUser = "******"In WBDocument.UpdateRecordColumns(): Updating withtout a calling user (callingUserLogin = "******")"); } item.Update(); WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns(): Done the actual item.Update()"); item.File.WBxCheckInAs(reasonForUpdate, callingUser); WBLogging.RecordsTypes.Verbose("In WBDocument.UpdateRecordColumns(): Done the check in with user from callingUserLogin = " + callingUserLogin); }); RecordsLibrary.Web.AllowUnsafeUpdates = previousSetting; }
public WBRecord(WBRecordsLibraries libraries, SPListItem masterRecordItem) { _libraries = libraries; _protectedMasterRecord = new WBDocument(libraries.ProtectedMasterLibrary, masterRecordItem);; _recordID = _protectedMasterRecord.RecordID; if (String.IsNullOrEmpty(_recordID)) { throw new Exception("You cannot create a WBRecord with a SPListItem that doesn't have a RecordID value!"); } }
public TreeViewLocation(TreeViewLocation parent, WBRecordsManager manager, string mode, string minimumProtectiveZone, WBDocument masterRecord) { _type = LOCATION_TYPE__DOCUMENT; _parent = parent; _manager = manager; _mode = mode; _minimumProtectiveZone = minimumProtectiveZone; _masterRecord = masterRecord; _name = _masterRecord.Name; _guidString = _masterRecord.Item.ID.ToString(); }
/// <summary> /// This constructor should only be used to create a newly declared record /// </summary> /// <param name="libraries"></param> /// <param name="newMasterRecordDocument"></param> public WBRecord(WBRecordsLibraries libraries, SPListItem newRecordItem, String newRecordID, WBDocument originalDocument, WBItem extraMetadata) { _libraries = libraries; _protectedMasterRecord = new WBDocument(libraries.ProtectedMasterLibrary, newRecordItem); _recordID = newRecordID; Metadata.CopyColumns(originalDocument, WBRecord.DefaultColumnsToCopy); Metadata.CopyColumns(extraMetadata); // Now make sure that the record ID is set correctly: Metadata.RecordID = newRecordID; // UpdateWhichLibrariesNeedACopy(); // CheckAllCopiesAreLoaded(); }
private void CheckAllCopiesAreCreatedAndLoaded(WBTaskFeedback feedback) { if (_allCopiesLoaded) { return; } foreach (String libraryURL in _librariesNeedingACopy) { WBDocument document = _libraries[libraryURL].GetOrCreateRecordCopy(feedback, this); _recordCopies[libraryURL] = document; } _allCopiesLoaded = true; }
public WBDocument GetOrCreateRecordCopy(WBTaskFeedback feedback, WBRecord record) { WBDocument masterRecordDocument = record.ProtectedMasterRecord; WBDocument recordCopyDocument = GetDocumentByID(record.RecordID); if (recordCopyDocument == null) { Web.AllowUnsafeUpdates = true; bool forPublicWeb = true; if (ProtectiveZone == WBRecordsLibrary.PROTECTIVE_ZONE__PROTECTED) { forPublicWeb = false; } List <String> path = masterRecordDocument.Item.WBxGetFolderPath(); SPFolder rootFolder = List.RootFolder; SPFolder actualDestinationFolder = rootFolder.WBxGetOrCreateFolderPath(path, forPublicWeb); string filename = masterRecordDocument.Item.Name; if (forPublicWeb) { filename = WBUtils.PrepareFilenameForPublicWeb(filename); } if (Web.WBxFileExists(actualDestinationFolder, filename)) { throw new Exception("The file being copied already exists in the library - this should never happen!"); } SPFile copiedFile = null; using (Stream stream = masterRecordDocument.OpenBinaryStream()) { copiedFile = actualDestinationFolder.Files.Add(filename, stream); stream.Close(); } recordCopyDocument = new WBDocument(this, copiedFile.Item); recordCopyDocument.MaybeCopyColumns(record.Metadata, WBRecord.DefaultColumnsToCopy); recordCopyDocument.Item.UpdateOverwriteVersion(); // If the new file is checked out by this creation process - then check it in: if (copiedFile.CheckOutType != SPFile.SPCheckOutType.None) { copiedFile.CheckIn("Document published here from a workbox. The original source URL was: " + masterRecordDocument.AbsoluteURL, SPCheckinType.MajorCheckIn); } Web.AllowUnsafeUpdates = false; recordCopyDocument.DebugName = "Copy of " + record.RecordID + " for: " + this.URL; if (feedback != null) { String folderURL = recordCopyDocument.AbsoluteURL.Replace(recordCopyDocument.Name, ""); feedback.Created("Created copy: <a href='" + recordCopyDocument.AbsoluteURL + "' target='_blank'>" + recordCopyDocument.AbsoluteURL + "</a>"); feedback.Created("In folder: <a href='" + folderURL + "' target='_blank'>" + folderURL + "</a>"); } } return(recordCopyDocument); }
public WBRecord DeclareNewRecord(WBTaskFeedback feedback, String callingUserLogin, WBDocument document, WBRecord recordToReplace, String replacingAction, WBItem extraMetadata) { WBTerm functionalArea = document.FunctionalArea[0]; WBRecordsType recordsType = document.RecordsType; string fullClassPath = WBUtils.NormalisePath(functionalArea.Name + "/" + recordsType.FullPath); WBLogging.RecordsTypes.HighLevel("Declaring a document to the library with path: " + fullClassPath); string datePath = "NO DATE SET"; string dateForName = "YYYY-MM-DD"; string oldDateFormat = "YYYYMMDD-"; // If nothing else we'll use the time now (which will be roughly the date / time declared as the date for the naming convention: DateTime referenceDate = DateTime.Now; if (document.HasReferenceDate && recordsType.DocumentReferenceDateRequirement != WBRecordsType.METADATA_REQUIREMENT__HIDDEN) { referenceDate = document.ReferenceDate; } else { document.ReferenceDate = referenceDate; } int year = referenceDate.Year; int month = referenceDate.Month; if (month >= 4) { datePath = String.Format("{0}-{1}", year.ToString("D4"), (year + 1).ToString("D4")); } else { datePath = String.Format("{0}-{1}", (year - 1).ToString("D4"), year.ToString("D4")); } dateForName = String.Format("{0}-{1}-{2}", referenceDate.Year.ToString("D4"), referenceDate.Month.ToString("D2"), referenceDate.Day.ToString("D2")); oldDateFormat = String.Format("{0}{1}{2}-", referenceDate.Year.ToString("D4"), referenceDate.Month.ToString("D2"), referenceDate.Day.ToString("D2")); string fullFilingPath = String.Join("/", recordsType.FilingPathForDocument(document).ToArray()); WBLogging.Debug("The original filename is set as: " + document.OriginalFilename); String extension = Path.GetExtension(document.OriginalFilename); String filename = WBUtils.RemoveDisallowedCharactersFromFilename(document.OriginalFilename); String titleForFilename = document[WBColumn.Title].WBxToString(); String referenceID = document.ReferenceID; // We don't want to use a title that is too long: if (String.IsNullOrEmpty(titleForFilename) || titleForFilename.Length > 50) { titleForFilename = ""; } if (String.IsNullOrEmpty(titleForFilename) && String.IsNullOrEmpty(referenceID)) { titleForFilename = Path.GetFileNameWithoutExtension(filename); // Let's now remove the old date format if the date is the same as the one // that is going to be used for the new date format: titleForFilename = titleForFilename.Replace(oldDateFormat, ""); } if (String.IsNullOrEmpty(referenceID)) { filename = "(" + dateForName + ") " + titleForFilename + extension; } else { if (String.IsNullOrEmpty(titleForFilename)) { filename = "(" + dateForName + ") " + referenceID + extension; } else { filename = "(" + dateForName + ") " + referenceID + " - " + titleForFilename + extension; } } filename = WBUtils.RemoveDisallowedCharactersFromFilename(filename); SPContentType classFolderType = null; SPContentType filePartFolderType = null; try { classFolderType = ProtectedMasterLibrary.Site.RootWeb.ContentTypes[WBRecordsType.RECORDS_LIBRARY__CLASS_FOLDER_CONTENT_TYPE]; filePartFolderType = ProtectedMasterLibrary.Site.RootWeb.ContentTypes[WBRecordsType.RECORDS_LIBRARY__FILE_PART_FOLDER_CONTENT_TYPE]; } catch (Exception exception) { WBLogging.RecordsTypes.Unexpected("Couldn't find the class and/or file part folder content types."); throw new Exception("Couldn't find the class and/or file part folder content types.", exception); } if (classFolderType == null) { classFolderType = ProtectedMasterLibrary.Site.RootWeb.ContentTypes[WBRecordsType.RECORDS_LIBRARY__FALL_BACK_FOLDER_CONTENT_TYPE]; } if (filePartFolderType == null) { filePartFolderType = ProtectedMasterLibrary.Site.RootWeb.ContentTypes[WBRecordsType.RECORDS_LIBRARY__FALL_BACK_FOLDER_CONTENT_TYPE]; } SPFolder protectedLibraryRootFolder = ProtectedMasterLibrary.List.RootFolder; protectedLibraryRootFolder.WBxGetOrCreateFolderPath(fullClassPath, classFolderType.Id); SPFolder actualDestinationFolder = protectedLibraryRootFolder.WBxGetOrCreateFolderPath(fullFilingPath, filePartFolderType.Id); /* * // This next bit is all because we've been having problems when new folders had to be created: * if (actualDestinationFolder == null) * { * WBLogging.RecordsTypes.HighLevel("We have to create part of the folder path: " + fullFilingPath); * actualDestinationFolder = protectedLibraryRootFolder.WBxGetOrCreateFolderPath(fullFilingPath, filePartFolderType.Id); * * WBLogging.RecordsTypes.HighLevel("Now we're going to add a dummy first file:"); * * MemoryStream memoryStream = new MemoryStream(Encoding.UTF8.GetBytes("Please ignore this file.")); * SPFile dummyFile = actualDestinationFolder.Files.Add("FirstFile.txt", memoryStream); * * WBLogging.RecordsTypes.HighLevel("Now we're going to try to update the file"); * try * { * dummyFile.Item.Update(); * } * catch (Exception e) * { * WBLogging.RecordsTypes.Unexpected("And exception did occur while updating the dummy item", e); * } * * memoryStream.Dispose(); * * WBLogging.RecordsTypes.HighLevel("Now re-opening the whole ProtectedMasterLibrary object"); * * ProtectedMasterLibrary.ReOpen(); * * WBLogging.RecordsTypes.HighLevel("Have re-opened the whole ProtectedMasterLibrary object - now re-getting the SPFolder:"); * * protectedLibraryRootFolder = ProtectedMasterLibrary.List.RootFolder; * actualDestinationFolder = protectedLibraryRootFolder.WBxGetFolderPath(fullFilingPath); * } */ if (ProtectedMasterLibrary.Web.WBxFileExists(actualDestinationFolder, filename)) { filename = ProtectedMasterLibrary.Web.WBxMakeFilenameUnique(actualDestinationFolder, filename); } SPFile uploadedFile = actualDestinationFolder.Files.Add(filename, document.OpenBinaryStream()); SPListItem uploadedItem = uploadedFile.Item; if (extraMetadata == null) { extraMetadata = new WBItem(); } if (!extraMetadata.IsUsingColumn(WBColumn.DatePublished)) { extraMetadata[WBColumn.DatePublished] = DateTime.Now; } if (!extraMetadata.IsUsingColumn(WBColumn.PublishedBy) && SPContext.Current != null) { extraMetadata[WBColumn.PublishedBy] = SPContext.Current.Web.CurrentUser; } WBRecord newRecord = new WBRecord(this, uploadedItem, uploadedItem.ID.ToString(), document, extraMetadata); if (feedback != null) { String urlToFolder = newRecord.ProtectedMasterRecord.AbsoluteURL.Replace(newRecord.Name, ""); feedback.AddFeedback("Uploaded file to protected, master records library"); feedback.AddFeedback("Master record: <a href='" + newRecord.ProtectedMasterRecord.AbsoluteURL + "' target='_blank'>" + newRecord.ProtectedMasterRecord.AbsoluteURL + "</a>"); feedback.AddFeedback("In folder: <a href='" + urlToFolder + "' target='_blank'>" + urlToFolder + "</a>"); } if (recordToReplace != null) { // OK so actually we need to do the replacement actions with elevated priviledges: //bool digestOK = SPContext.Current.Web.ValidateFormDigest(); //if (digestOK) //{ SPSecurity.RunWithElevatedPrivileges(delegate() { using (WBRecordsManager manager = new WBRecordsManager(callingUserLogin)) { WBRecord elevatedRecordToReplace = manager.Libraries.GetRecordByID(recordToReplace.RecordID); if (replacingAction == WBPublishingProcess.REPLACE_ACTION__ARCHIVE_FROM_IZZI) { elevatedRecordToReplace.LiveOrArchived = WBColumn.LIVE_OR_ARCHIVED__ARCHIVED; elevatedRecordToReplace.RecordSeriesStatus = WBColumn.RECORD_SERIES_STATUS__ARCHIVED; } else { elevatedRecordToReplace.RecordSeriesStatus = WBColumn.RECORD_SERIES_STATUS__RETIRED; } elevatedRecordToReplace.Update(callingUserLogin, "Record was " + elevatedRecordToReplace.RecordSeriesStatus + " because it was replaced through publishing process"); if (feedback != null) { feedback.AddFeedback("Archived record being replaced"); } WBLogging.Debug("WBRecordsLibraries.DeclareNewRecord(): Archived the record being replaced Record ID = " + recordToReplace.RecordID); } }); newRecord.ReplacesRecordID = recordToReplace.RecordID; newRecord.RecordSeriesID = recordToReplace.RecordSeriesID; newRecord.RecordSeriesIssue = "" + (recordToReplace.RecordSeriesIssue.WBxToInt() + 1); newRecord.RecordSeriesStatus = WBColumn.RECORD_SERIES_STATUS__LATEST; } else { newRecord.ReplacesRecordID = null; newRecord.RecordSeriesID = newRecord.RecordID; newRecord.RecordSeriesIssue = "1"; newRecord.RecordSeriesStatus = WBColumn.RECORD_SERIES_STATUS__LATEST; } newRecord.LiveOrArchived = WBColumn.LIVE_OR_ARCHIVED__LIVE; newRecord.UpdateMasterAndCreateCopies(feedback, callingUserLogin); bool beforeForDocument = document.Web.AllowUnsafeUpdates; document.Web.AllowUnsafeUpdates = true; // And now just copy back to the original document any metadata changes: document.MaybeCopyColumns(newRecord.Metadata, WBRecord.DefaultColumnsToCopy); // And let's make sure that the original document is using the work box document content type: if (document.IsSPListItem) { SPContentType workBoxDocumentType = document.Item.ParentList.ContentTypes[WBFarm.Local.WorkBoxDocumentContentTypeName]; if (workBoxDocumentType != null) { document.Item["ContentTypeId"] = workBoxDocumentType.Id; } } document.Update(); // uploadedItem.Update(); // uploadedFile.Update(); bool beforeForUploadedFile = uploadedFile.Web.AllowUnsafeUpdates; uploadedFile.Web.AllowUnsafeUpdates = true; if (uploadedFile.CheckOutType != SPFile.SPCheckOutType.None) { uploadedFile.WBxCheckInAs("Declared new major version of record.", SPCheckinType.MajorCheckIn, callingUserLogin); } else { WBLogging.Migration.Verbose("There was no need to check in file: " + uploadedFile.Name); } uploadedFile.Web.AllowUnsafeUpdates = beforeForUploadedFile; document.Web.AllowUnsafeUpdates = beforeForDocument; return(newRecord); }
private void MigrateOneDocumentToLibrary( WBMigrationMapping mapping, SPSite sourceSite, SPWeb sourceWeb, SPDocumentLibrary sourceLibrary, SPSite destinationSite, SPWeb destinationWeb, SPFolder destinationRootFolder, SPSite controlSite, SPWeb controlWeb, SPList controlList, SPView controlView, SPListItem migrationItem) { WBFarm farm = WBFarm.Local; //foreach (SPField field in migrationItem.Fields) //{ // WBLogging.Migration.Verbose("Field InternalName: " + field.InternalName + " Field Title: " + field.Title + " item[field.Title] : " + migrationItem[field.Title]); //} String sourceFilePath = migrationItem.WBxGetAsString(WBColumn.SourceFilePath); String mappingPath = WBUtils.NormalisePath(migrationItem.WBxGetAsString(WBColumn.MappingPath)); WBLogging.Migration.Verbose("Trying to migrate file : " + sourceFilePath); WBLogging.Migration.Verbose("Migrating with mapping path : " + mappingPath); WBMappedPath mappedPath = mapping[mappingPath]; SPListItem controlItem = migrationItem; SPListItem mappingItem = null; SPListItem subjectItem = null; String documentumSourceID = ""; if (MigrationSourceSystem == MIGRATION_SOURCE__DOCUMENTUM_WEB_DOCUMENTS) { documentumSourceID = controlItem.WBxGetAsString(WBColumn.SourceID); if (!String.IsNullOrEmpty(documentumSourceID)) { mappingItem = WBUtils.FindItemByColumn(controlSite, MigrationMappingList, WBColumn.SourceID, documentumSourceID); subjectItem = WBUtils.FindItemByColumn(controlSite, MigrationSubjectsList, WBColumn.SourceID, documentumSourceID); } } if (mappedPath.InErrorStatus) { WBLogging.Migration.HighLevel("WBMigrationTimerJob.MigrateOneDocumentToLibrary(): There was an error with the mapped path: " + mappedPath.ErrorStatusMessage); return; } // OK so let's first get the various WBTerms from the mapped path so that if these // fail they fail before we copy the document! WBRecordsType recordsType = null; WBTermCollection <WBTerm> functionalArea = null; WBTermCollection <WBSubjectTag> subjectTags = null; if (MigrationSourceSystem == MIGRATION_SOURCE__DOCUMENTUM_WEB_DOCUMENTS) { string recordsTypePath = controlItem.WBxGetAsString(WBColumn.RecordsTypePath); if (String.IsNullOrEmpty(recordsTypePath) && mappingItem != null) { recordsTypePath = mappingItem.WBxGetAsString(WBColumn.RecordsTypePath); } Term rterm = mapping.RecordsTypesTaxonomy.GetSelectedTermByPath(recordsTypePath); if (rterm != null) { recordsType = new WBRecordsType(mapping.RecordsTypesTaxonomy, rterm); } string functionalAreaPath = controlItem.WBxGetAsString(WBColumn.FunctionalAreaPath); if (String.IsNullOrEmpty(functionalAreaPath) && mappingItem != null) { functionalAreaPath = mappingItem.WBxGetAsString(WBColumn.FunctionalAreaPath); } if (!String.IsNullOrEmpty(functionalAreaPath)) { string[] paths = functionalAreaPath.Split(';'); List <WBTerm> fterms = new List <WBTerm>(); foreach (string path in paths) { WBLogging.Migration.Verbose("Trying to get a Functional Area by path with: " + path); Term fterm = mapping.FunctionalAreasTaxonomy.GetOrCreateSelectedTermByPath(path); if (fterm != null) { fterms.Add(new WBTerm(mapping.FunctionalAreasTaxonomy, fterm)); } else { WBLogging.Debug("Coundn't find the functional area with path: " + path); } } if (fterms.Count > 0) { functionalArea = new WBTermCollection <WBTerm>(mapping.FunctionalAreasTaxonomy, fterms); } } string subjectTagsPaths = controlItem.WBxGetAsString(WBColumn.SubjectTagsPaths); if (String.IsNullOrEmpty(subjectTagsPaths) && mappingItem != null) { subjectTagsPaths = mappingItem.WBxGetAsString(WBColumn.SubjectTagsPaths); } if (!String.IsNullOrEmpty(subjectTagsPaths)) { List <WBSubjectTag> sterms = new List <WBSubjectTag>(); // Note that it is not necessarily an error for the subject tags to be empty. if (!String.IsNullOrEmpty(subjectTagsPaths) && subjectTagsPaths != "/") { string[] paths = subjectTagsPaths.Split(';'); foreach (string path in paths) { WBLogging.Migration.Verbose("Trying to get a Subject Tag by path with: " + path); if (path != "/") { Term sterm = mapping.SubjectTagsTaxonomy.GetOrCreateSelectedTermByPath(path); if (sterm != null) { sterms.Add(new WBSubjectTag(mapping.SubjectTagsTaxonomy, sterm)); } else { WBLogging.Debug("Coundn't find the subject tag with path: " + path); } } } } subjectTags = new WBTermCollection <WBSubjectTag>(mapping.SubjectTagsTaxonomy, sterms); } } else { recordsType = mappedPath.RecordsType; functionalArea = mappedPath.FunctionalArea; subjectTags = mappedPath.SubjectTags; } if (MigrationSubjectsList != null && MigrationSourceSystem == MIGRATION_SOURCE__HFI_INTRANET_DOCUMENTS) { //foreach (SPField field in migrationItem.Fields) //{ // WBLogging.Debug("Found field: " + field.Title + " field inner name: " + field.InternalName); //} subjectTags = AddAdditionalSubjectTags(controlSite, subjectTags, migrationItem.WBxGetAsString(WBColumn.SourceID)); } if (recordsType == null) { MigrationError(migrationItem, "The records type for this item could not be found. Looked for: " + mappedPath.RecordsTypePath); return; } if (functionalArea == null || functionalArea.Count == 0) { MigrationError(migrationItem, "The functional area for this item could not be found. Looked for: " + mappedPath.FunctionalAreaPath); return; } // OK so we can start building up our information about the document we are going to declare: WBDocument document = new WBDocument(); document.RecordsType = recordsType; document.FunctionalArea = functionalArea; document.SubjectTags = subjectTags; document[WBColumn.SourceFilePath] = sourceFilePath; string sourceSystem = migrationItem.WBxGetAsString(WBColumn.SourceSystem); if (String.IsNullOrEmpty(sourceSystem)) { sourceSystem = farm.MigrationSourceSystem; } if (String.IsNullOrEmpty(sourceSystem)) { sourceSystem = farm.MigrationControlListUrl; } document[WBColumn.SourceSystem] = sourceSystem; String sourceID = migrationItem.WBxGetAsString(WBColumn.SourceID); if (String.IsNullOrEmpty(sourceID) && MigrationSourceSystem != MIGRATION_SOURCE__DOCUMENTUM_WEB_DOCUMENTS) { sourceID = sourceFilePath; } document[WBColumn.SourceID] = sourceID; SPFile sourceFile = null; SPListItem sourceItem = null; if (MigrationSourceSystem == MIGRATION_SOURCE__DOCUMENTUM_WEB_DOCUMENTS) { if (String.IsNullOrEmpty(sourceID)) { sourceItem = sourceWeb.GetListItem(sourceFilePath); document[WBColumn.SourceID] = sourceFilePath; document[WBColumn.SourceSystem] = "Initial SharePoint Web Docs"; } else { sourceItem = WBUtils.FindItemByColumn(sourceSite, (SPList)sourceLibrary, WBColumn.Source_ID, sourceID); } if (sourceItem == null) { MigrationError(migrationItem, "Could not find the doc with source id = " + sourceFilePath); return; } sourceFile = sourceItem.File; } if (migrationItem.WBxIsNotBlank(WBColumn.ReferenceDateString)) { document.ReferenceDate = WBUtils.ParseDate(migrationItem.WBxGetAsString(WBColumn.ReferenceDateString)); } if (migrationItem.WBxIsNotBlank(WBColumn.ModifiedDateString)) { document.Modified = WBUtils.ParseDate(migrationItem.WBxGetAsString(WBColumn.ModifiedDateString)); } else { if (mappingItem != null) { if (mappingItem.WBxIsNotBlank(WBColumn.ModifiedDateString)) { document.Modified = WBUtils.ParseDate(mappingItem.WBxGetAsString(WBColumn.ModifiedDateString)); } } else if (subjectItem != null) { if (subjectItem.WBxIsNotBlank(WBColumn.ModifiedDateString)) { document.Modified = WBUtils.ParseDate(subjectItem.WBxGetAsString(WBColumn.ModifiedDateString)); } } else if (sourceItem != null) { if (sourceItem.WBxHasValue(WBColumn.Modified)) { document.Modified = (DateTime)sourceItem["Modified"]; } } } if (migrationItem.WBxIsNotBlank(WBColumn.DeclaredDateString)) { document.DeclaredRecord = WBUtils.ParseDate(migrationItem.WBxGetAsString(WBColumn.DeclaredDateString)); } if (migrationItem.WBxIsNotBlank(WBColumn.ScanDateString)) { document.ScanDate = WBUtils.ParseDate(migrationItem.WBxGetAsString(WBColumn.ScanDateString)); } if (migrationItem.WBxIsNotBlank(WBColumn.OwningTeamPath) || !String.IsNullOrEmpty(mappedPath.OwningTeamPath)) { WBTaxonomy teamsTaxonomy = mapping.TeamsTaxonomy; string owningTeamPath = migrationItem.WBxGetAsString(WBColumn.OwningTeamPath); if (owningTeamPath == "") { owningTeamPath = mappedPath.OwningTeamPath; } WBTeam foundTeam = teamsTaxonomy.GetSelectedTeam(WBUtils.NormalisePath(owningTeamPath)); if (foundTeam != null) { WBLogging.Migration.Verbose("Found the owning team: " + foundTeam.Name); document.OwningTeam = foundTeam; } else { MigrationError(migrationItem, "Could not find the owning team at: " + owningTeamPath); return; } } if (migrationItem.WBxIsNotBlank(WBColumn.Title)) { document[WBColumn.Title] = migrationItem.WBxGetAsString(WBColumn.Title); } if (MigrationSourceSystem == MIGRATION_SOURCE__HFI_INTRANET_DOCUMENTS) { document.Modified = File.GetLastWriteTime(sourceFilePath); WBLogging.Debug("Found the last modified date to be: " + document.Modified); } // We'll set the reference date for these imported files based on their existing declared date or modified date if it exists. if (!document.HasReferenceDate) { if (document.HasDeclaredRecord) { document.ReferenceDate = document.DeclaredRecord; } else if (document.HasScanDate) { document.ReferenceDate = document.ScanDate; } else if (document.HasModified) { document.ReferenceDate = document.Modified; } } if (migrationItem.WBxHasValue(WBColumn.ReferenceID)) { document.ReferenceID = migrationItem.WBxGetAsString(WBColumn.ReferenceID); } string protectiveZone = migrationItem.WBxGetAsString(WBColumn.ProtectiveZone); if (String.IsNullOrEmpty(protectiveZone)) { protectiveZone = mappedPath.ProtectiveZone; if (String.IsNullOrEmpty(protectiveZone)) { protectiveZone = WBRecordsType.PROTECTIVE_ZONE__PROTECTED; } } document[WBColumn.ProtectiveZone] = protectiveZone; string liveOrArchived = migrationItem.WBxGetAsString(WBColumn.LiveOrArchived); if (String.IsNullOrEmpty(liveOrArchived)) { liveOrArchived = mappedPath.LiveOrArchived; if (String.IsNullOrEmpty(liveOrArchived)) { liveOrArchived = WBColumn.LIVE_OR_ARCHIVED__LIVE; } } document[WBColumn.LiveOrArchived] = liveOrArchived; bool downloadFromWebSite = false; if (MigrationSourceSystem == MIGRATION_SOURCE__ALFRESCO_RECORDS) { downloadFromWebSite = true; } String originalFileName = migrationItem.WBxGetAsString(WBColumn.OriginalFilename).Trim(); if (String.IsNullOrEmpty(originalFileName)) { originalFileName = Path.GetFileName(sourceFilePath); } if (MigrationSourceSystem == MIGRATION_SOURCE__DOCUMENTUM_WEB_DOCUMENTS) { originalFileName = sourceFile.Name; } if (downloadFromWebSite) { originalFileName = HttpUtility.UrlDecode(originalFileName); } document.OriginalFilename = originalFileName; //String extension = Path.GetExtension(filename); WBItemMessages metadataErrors = recordsType.CheckMetadataIsOK(document); if (metadataErrors.Count > 0) { string message = "There were problems with the prepared metadata. "; foreach (WBColumn column in metadataErrors.Keys) { message += "Error for column: " + column.DisplayName + " message: " + metadataErrors[column] + " "; } MigrationError(migrationItem, message); return; } Stream fileStream = null; if (downloadFromWebSite) { WebClient webClient = new WebClient(); if (!String.IsNullOrEmpty(farm.MigrationUserName) && !String.IsNullOrEmpty(farm.MigrationPassword)) { webClient.Credentials = new NetworkCredential(farm.MigrationUserName, farm.MigrationPassword); } string tempFile = @"C:\Temp\tmp.bin"; if (farm.FarmInstance == WBFarm.FARM_INSTANCE__PROTECTED_INTERNAL_FARM) { tempFile = @"E:\Temp\tmp.bin"; } webClient.DownloadFile(sourceFilePath, tempFile); WBLogging.Migration.Verbose("Downloaded to local tmp file using webClient.DownloadFile() successfully"); fileStream = File.OpenRead(tempFile); WBLogging.Migration.Verbose("Opened local tmp file using File.OpenRead() successfully"); } else if (MigrationSourceSystem == MIGRATION_SOURCE__DOCUMENTUM_WEB_DOCUMENTS) { fileStream = sourceFile.OpenBinaryStream(); WBLogging.Migration.Verbose("Opened using sourceFile.OpenBinaryStream() successfully"); } else { fileStream = File.OpenRead(sourceFilePath); WBLogging.Migration.Verbose("Opened using File.OpenRead() successfully"); } SPListItem uploadedItem = null; try { uploadedItem = recordsType.PublishDocument(destinationWeb, destinationRootFolder, document, fileStream); } finally { fileStream.Close(); fileStream.Dispose(); } if (uploadedItem == null) { MigrationError(migrationItem, "There was a problem in the call to recordsType.PublishDocument() as the uploaded item is null."); return; } migrationItem.WBxSet(WBColumn.DateMigrated, DateTime.Now); migrationItem.WBxSet(WBColumn.MigratedToUrl, uploadedItem.WBxGet(WBColumn.EncodedAbsoluteURL)); migrationItem.WBxSet(WBColumn.RecordID, uploadedItem.WBxGet(WBColumn.RecordID)); migrationItem.WBxSet(WBColumn.MigrationStatus, WBColumn.MIGRATION_STATUS__DONE); migrationItem.Update(); }
internal String GetDocumentType(WBDocument document) { SPListItem fileTypeInfo = GetFileTypeInfo(document.FileType); return(fileTypeInfo.WBxGetAsString(WBColumn.DocumentType)); }
public WBPublishingProcess PublishDocument(WBPublishingProcess process) { SPListItem currentItem = process.CurrentItem; WBDocument document = new WBDocument(process.WorkBox, currentItem); WBTaskFeedback feedback = new WBTaskFeedback(WBTaskFeedback.TASK_TYPE__PUBLISH, process.CurrentItemID); feedback.PrettyName = document.Name; process.LastTaskFeedback = feedback; // Just check that the IAO at time of publishing is captured: process.AddExtraMetadata(WBColumn.IAOAtTimeOfPublishing, process.OwningTeamsIAOAtTimeOfPublishing); if (SPContext.Current != null) { process.AddExtraMetadataIfMissing(WBColumn.PublishedBy, SPContext.Current.Web.CurrentUser); } process.AddExtraMetadataIfMissing(WBColumn.DatePublished, DateTime.Now); if (process.ProtectiveZone != WBRecordsType.PROTECTIVE_ZONE__PROTECTED) { // If the document is going on the public or public extranet zones then let's set a review date for 2 years from now: process.AddExtraMetadataIfMissing(WBColumn.ReviewDate, DateTime.Now.AddYears(2)); } if (process.RecordsTypeTaxonomy == null) { WBLogging.Debug("Yeah - the process.RecordsTypeTaxonomy == null !! "); } else { WBLogging.Debug("No - the process.RecordsTypeTaxonomy was NOT null !! "); } try { // Setting the various keys metadata values on the document to be published: WBRecordsType recordsType = new WBRecordsType(process.RecordsTypeTaxonomy, process.RecordsTypeUIControlValue); document.RecordsType = recordsType; document.FunctionalArea = new WBTermCollection <WBTerm>(process.FunctionalAreasTaxonomy, process.FunctionalAreaUIControlValue); document.SubjectTags = new WBTermCollection <WBSubjectTag>(process.SubjectTagsTaxonomy, process.SubjectTagsUIControlValue); document.OwningTeam = new WBTeam(process.TeamsTaxonomy, process.OwningTeamUIControlValue); document.InvolvedTeams = new WBTermCollection <WBTeam>(process.TeamsTaxonomy, process.InvolvedTeamsUIControlValue); document.ProtectiveZone = process.ProtectiveZone; document.Title = process.CurrentShortTitle; WBLogging.Debug("Set document.Title = " + document.Title); document.Update(); document.Reload(); process.WorkBox.GenerateAndSetFilename(recordsType, document); document.Update(); document.Reload(); process.ReloadCurrentItem(); } catch (Exception e) { feedback.Failed("It was not possible to save the metadata to the document before publishing it", e); WBLogging.Debug("It was not possible to save the metadata to the document before publishing it"); process.CurrentItemFailed(); return(process); } WBLogging.Debug("Starting WBRecordsManager.PublishDocument()"); if (!document.IsSPListItem) { feedback.Failed("You can currently only publish SPListItem backed WBDocument objects"); WBLogging.Debug("WBRecordsManager.PublishDocument(): WBDocument wasn't a list item"); process.CurrentItemFailed(); return(process); } WBRecord recordToReplace = null; if (!String.IsNullOrEmpty(process.ToReplaceRecordID)) { WBLogging.Debug("WBRecordsManager.PublishDocument(): Replacing record with id: " + process.ToReplaceRecordID); recordToReplace = Libraries.GetRecordByID(process.ToReplaceRecordID); if (recordToReplace == null) { feedback.Failed("Couldn't find the record that is meant to be replaced with Record ID = " + process.ToReplaceRecordID); WBLogging.Debug("WBRecordsManager.PublishDocument(): Couldn't find the record that is meant to be replaced with Record ID = " + process.ToReplaceRecordID); process.CurrentItemFailed(); return(process); } } WBLogging.Debug("WBRecordsManager.PublishDocument(): About to declare new record"); WBRecord newRecord = null; try { newRecord = Libraries.DeclareNewRecord(feedback, _callingUserLogin, document, recordToReplace, process.ReplaceAction, process.ExtraMetadata); } catch (Exception e) { feedback.AddFeedback("Something went wrong with first attempt to publish document"); feedback.AddException(e); WBLogging.RecordsTypes.Unexpected("Something went wrong with first attempt to publish document", e); } if (newRecord == null) { WBLogging.RecordsTypes.Unexpected("Making a second attempt to publish document"); try { newRecord = Libraries.DeclareNewRecord(feedback, _callingUserLogin, document, recordToReplace, process.ReplaceAction, process.ExtraMetadata); } catch (Exception e) { feedback.Failed("Something went wrong with the second attempt to publish document", e); WBLogging.RecordsTypes.Unexpected("Something went wrong with the second attempt to publish document", e); process.CurrentItemFailed(); return(process); } } WBLogging.Debug("WBRecordsManager.PublishDocument(): Declared new record"); feedback.Success(); process.CurrentItemSucceeded(); if (newRecord != null && newRecord.ProtectiveZone != WBRecordsType.PROTECTIVE_ZONE__PROTECTED) { String documentType = GetDocumentType(newRecord.ProtectedMasterRecord); bool needsEmailToIAONow = (documentType == WBColumn.DOCUMENT_TYPE__SPREADSHEET); bool needsEmailToWebteamNow = !String.IsNullOrEmpty(process.WebPageURL); if (needsEmailToIAONow || needsEmailToWebteamNow) { //WBLogging.Debug("WBRecordsManager.PublishDocument(): process.WebPageURL has been set - so creating or updating alert email"); SPUser publisehdByUser = newRecord.ProtectedMasterRecord[WBColumn.PublishedBy] as SPUser; String publishedByString = "Published by: <unknown>"; if (publisehdByUser != null) { publishedByString = "Published by: " + publisehdByUser.Name; } List <SPUser> approvedByUsers = newRecord.ProtectedMasterRecord[WBColumn.PublishingApprovedBy] as List <SPUser>; String approvedByString = "Approved by: <unknown>"; if (approvedByUsers != null) { approvedByString = "Approved by: " + approvedByUsers.WBxToPrettyString(); } if (needsEmailToWebteamNow && String.IsNullOrEmpty(process.WebteamEmailAlertMessage)) { process.WebteamEmailAlertMessage = @"<p>Dear Webteam,</p> <p>One or more documents have been published to the Public Records Library that should be put on a web page.</p> <p>Web page URL: " + process.WebPageURL + @"</p> <p>Please find details of the published documents below.</p> <p>" + publishedByString + "<br/>\n" + approvedByString + "</p>\n\n<p><b>Published Documents:</b></p>\n\n"; } if (needsEmailToIAONow && String.IsNullOrEmpty(process.IAOEmailAlertMessage)) { process.IAOEmailAlertMessage = @"<p>Dear Information Asset Owner,</p> <p>An Excel document has been published to the Public Records Library by a member of your team.</p> <p>As the responsible Information Asset Owner for this document, please find details of the publication below along with a link.</p> <p>" + publishedByString + "<br/>\n" + approvedByString + "</p>\n\n<p><b>Published Documents:</b></p>\n\n"; } String functionalAreaString = ""; if (newRecord.FunctionalArea.Count > 0) { functionalAreaString = newRecord.FunctionalArea[0].FullPath; } if (needsEmailToWebteamNow) { process.WebteamEmailAlertMessage += "<p><a href=\"" + newRecord.ProtectedMasterRecord.AbsoluteURL + "\">" + newRecord.ProtectedMasterRecord.Name + "</a><br/>\n(" + newRecord.ProtectiveZone + "): " + functionalAreaString + "/" + newRecord.RecordsType.FullPath + "</p>\n"; } if (needsEmailToIAONow) { process.IAOEmailAlertMessage += "<p><a href=\"" + newRecord.ProtectedMasterRecord.AbsoluteURL + "\">" + newRecord.ProtectedMasterRecord.Name + "</a><br/>\nLocation: (" + newRecord.ProtectiveZone + "): " + functionalAreaString + "/" + newRecord.RecordsType.FullPath + "</p>\n"; } if (process.PublishMode != WBPublishingProcess.PUBLISH_MODE__ALL_TOGETHER || !process.HasMoreDocumentsToPublish) { if (needsEmailToWebteamNow) { WBLogging.Debug("WBRecordsManager.PublishDocument(): Webteam Email Alert Message: " + process.WebteamEmailAlertMessage); StringDictionary headers = new StringDictionary(); headers.Add("to", WBFarm.Local.PublicWebsiteTeamEmail); headers.Add("cc", WBFarm.Local.PublicDocumentEmailAlertsTo); headers.Add("content-type", "text/html"); headers.Add("bcc", WBFarm.Local.SendErrorReportEmailsTo); headers.Add("subject", "New documents published for a web page"); WBUtils.SendEmail(Libraries.ProtectedMasterLibrary.Web, headers, process.WebteamEmailAlertMessage); } process.WebteamEmailAlertMessage = null; WBLogging.Debug("WBRecordsManager.PublishDocument(): Webteam Email Alert Message: " + process.WebteamEmailAlertMessage); if (needsEmailToIAONow) { StringDictionary headers = new StringDictionary(); SPUser teamsIAO = Libraries.ProtectedMasterLibrary.Web.WBxEnsureUserOrNull(process.OwningTeamsIAOAtTimeOfPublishing); if (teamsIAO != null) { headers.Add("to", teamsIAO.Email); headers.Add("cc", WBFarm.Local.PublicDocumentEmailAlertsTo); } else { headers.Add("to", WBFarm.Local.PublicDocumentEmailAlertsTo); } headers.Add("content-type", "text/html"); headers.Add("bcc", WBFarm.Local.SendErrorReportEmailsTo); headers.Add("subject", "New Excel documents published for which you are IAO"); WBUtils.SendEmail(Libraries.ProtectedMasterLibrary.Web, headers, process.IAOEmailAlertMessage); process.IAOEmailAlertMessage = null; } } } } else { WBLogging.Debug("WBRecordsManager.PublishDocument(): Either publishing failed - or web page URL was not set"); } return(process); }
/* * public WBPublishingProcess PublishDocument(String documentURL) * { * WBTaskFeedback feedback = null; * * using (WorkBox workBox = new WorkBox(documentURL)) * { * feedback = PublishDocument(workBox, documentURL); * } * * return feedback; * } * * public WBPublishingProcess PublishDocument(String documentURL, String replacingRecordID, String replacingAction) * { * WBTaskFeedback feedback = null; * * using (WorkBox workBox = new WorkBox(documentURL)) * { * feedback = PublishDocument(workBox, documentURL, replacingRecordID, replacingAction); * } * * return feedback; * } * * public WBPublishingProcess PublishDocument(WorkBox workBox, String documentURL) * { * return PublishDocument(workBox, documentURL, null, null); * } * * public WBPublishingProcess PublishDocument(WorkBox workBox, String documentURL, String replacingRecordID, String replacingAction) * { * SPListItem item = workBox.Web.GetListItem(documentURL); * if (item == null) * { * WBTaskFeedback feedback = new WBTaskFeedback(WBTaskFeedback.TASK_TYPE__PUBLISH, documentURL); * feedback.Failed("Couldn't find document to publish with URL: " + documentURL); * return feedback; * } * * return PublishDocument(workBox, new WBDocument(item), replacingRecordID, replacingAction, new WBItem()); * } * */ public WBPublishingProcess PublishDocument(WorkBox workBox, WBDocument document) { throw new NotImplementedException("This method is no longer being used!!"); // return PublishDocument(workBox, document, null, null, new WBItem()); }