/// <summary> /// Helper method to get the identifier from merrit. /// </summary> /// <param name="postFileData"></param> /// <param name="authorization"></param> /// <returns></returns> protected string GetIdentifier(PublishMessage postFileData, string authorization, string identifierUrl, Citation citation) { Check.IsNotNull(postFileData, "postFileData"); Check.IsNotNull(authorization, "authorization"); Check.IsNotNull(identifierUrl, "identifierUrl"); var file = this.GetFileByFileId(postFileData.FileId); MerritQueryData queryData = new MerritQueryData(); queryData.KeyValuePair = new List<DKeyValuePair<string, string>>() { new DKeyValuePair<string, string> { Key = "Profile", Value = "oneshare_ark_only" }, new DKeyValuePair<string, string> { Key = "Who", Value = citation.Publisher }, new DKeyValuePair<string, string> { Key = "What", Value = citation.Title}, new DKeyValuePair<string, string> { Key = "When", Value = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture) } }.ToArray(); RepositoryModel repositoryModel = new RepositoryModel() { Authorization = authorization, RepositoryLink = identifierUrl, RepositoryName = MerritConstants.OneShare }; return this.RepositoryAdapter.GetIdentifier(queryData, repositoryModel); }
/// <summary> /// Helper method to get the post query data. /// </summary> /// <param name="identifier">Unique identifier.</param> /// <param name="fileData">File information.</param> /// <param name="postFileData">Post file indormation.</param> /// <returns></returns> protected MerritQueryData GetPostQueryData(string identifier, DM.File fileData, Citation citation, Repository repository, PublishMessage postFileData) { Check.IsNotNull(identifier, "identifier"); MerritQueryData queryData = new MerritQueryData(); // TODO: Currently hard coded, needs to be replaced with specific value queryData.MetadataXML = @"<eml:eml packageId=""doi:10.5072/12345?"" system=""DCXL"" xmlns:eml=""eml://ecoinformatics.org/eml2.1.0"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xsi:schemaLocation=""eml://ecoinformatics.org/eml-2.1.0 eml.xsd""> <dataset id=""doi:10.5072/12345""> <creator> <!-- http://knb.ecoinformatics.org/software/eml/eml-2.1.0/eml-resource.html#creator --> <!-- multiple creators allowed --> <individualName> <givenName></givenName> <surName></surName> </individualName> <address> <deliveryPoint></deliveryPoint> <city></city> <administrativeArea></administrativeArea><postalCode></postalCode><country></country></address><phone></phone><electronicMailAddress></electronicMailAddress><organizationName></organizationName></creator><title></title><pubDate></pubDate><abstract><para></para></abstract><publisher><para></para></publisher><url></url><contact><individualName><givenName></givenName><surName></surName></individualName><address><deliveryPoint></deliveryPoint><city></city><administrativeArea></administrativeArea><postalCode></postalCode><country></country></address><phone></phone><electronicMailAddress></electronicMailAddress><organizationName></organizationName></contact><keywordSet><keyword></keyword><keywordThesaurus></keywordThesaurus></keywordSet><coverage><!-- http://knb.ecoinformatics.org/software/eml/eml-2.1.0/eml-resource.html#coverage --> <geographicCoverage><geographicDescription></geographicDescription><boundingCoordinates><westBoundingCoordinate></westBoundingCoordinate><eastBoundingCoordinate></eastBoundingCoordinate><northBoundingCoordinate></northBoundingCoordinate><southBoundingCoordinate></southBoundingCoordinate></boundingCoordinates></geographicCoverage><temporalCoverage id=""tempcov""><rangeOfDates> <beginDate><calendarDate></calendarDate></beginDate><endDate><calendarDate></calendarDate></endDate></rangeOfDates></temporalCoverage></coverage><project><!-- http://knb.ecoinformatics.org/software/eml/eml-2.1.0/eml-dataset.html#project --><title></title><abstract><para></para></abstract><funding><para></para></funding></project> <intellectualRights> <para></para> </intellectualRights> <dataTable> <!-- http://knb.ecoinformatics.org/software/eml/eml-2.1.0/eml-dataTable.html#dataTable --> <!-- dataTable is equivalent to a single tab in the excel spreadsheet. One can have multiple data tables within the document. --> <entityName></entityName> <entityDescription></entityDescription> <attributeList> <!-- http://knb.ecoinformatics.org/software/eml/eml-2.1.0/eml-dataTable.html#attributeList --> <!-- attribute list is equivalent to the parameter table from the requirements document. One can have many attributes in a single table. --> <attribute> <attributeName> <!-- non-empty string --></attributeName> <attributeDefinition> <!-- non-empty string --></attributeDefinition> </attribute> </attributeList> </dataTable> </dataset> <additionalMetadata> <describes>tempcov</describes> <metadata> <description> <!-- non-empty string describing temporal coverage --> </description> </metadata> </additionalMetadata> <additionalMetadata> <metadata> <formattedCitation> <!-- non-empty string --> </formattedCitation> </metadata> </additionalMetadata></eml:eml>"; List<DKeyValuePair<string, string>> content = new List<DKeyValuePair<string, string>>(); Check.IsNotNull<DM.Repository>(repository, "selectedRepository"); var repositoryMetadata = repository.RepositoryMetadata.FirstOrDefault(); if (repositoryMetadata != null) { foreach (var repositoryMetaData in repositoryMetadata.RepositoryMetadataFields) { DKeyValuePair<string, string> metadata = new DKeyValuePair<string, string>(); metadata.Key = repositoryMetaData.Name; var metadataField = fileData.FileMetadataFields.Where(f => f.RepositoryMetadataFieldId == repositoryMetaData.RepositoryMetadataFieldId).FirstOrDefault(); if (metadataField != null) { metadata.Value = fileData.FileMetadataFields.Where(f => f.RepositoryMetadataFieldId == repositoryMetaData.RepositoryMetadataFieldId).FirstOrDefault().MetadataValue; } content.Add(metadata); } } //set the data to filemetadata fields //postFileData.FileMetaDataFields = fileData.FileMetadataFields; content.Add(new DKeyValuePair<string, string>() { Key = "Profile", Value = ConfigReader<string>.GetSetting("Profile_Post") }); content.Add(new DKeyValuePair<string, string>() { Key = "who", Value = citation.Publisher }); content.Add(new DKeyValuePair<string, string>() { Key = "what", Value = citation.Title }); content.Add(new DKeyValuePair<string, string>() { Key = "when", Value = DateTime.UtcNow.ToString(CultureInfo.InvariantCulture) }); content.Add(new DKeyValuePair<string, string>() { Key = "where", Value = identifier }); content.Add(new DKeyValuePair<string, string>() { Key = "ARK", Value = identifier }); queryData.KeyValuePair = content.ToArray(); return queryData; }
/// <summary> /// Method to publish file /// </summary> /// <param name="postFileData">PublishMessage object</param> /// <returns>returns File Identifier</returns> public override string PublishFile(PublishMessage postFileData) { var file = this.GetFileByFileId(postFileData.FileId); IEnumerable<DM.FileColumnType> fileColumnTypes = null; IEnumerable<DM.FileColumnUnit> fileColumnUnits = null; OperationStatus status = null; Encoding encoding = Encoding.UTF8; string identifier = string.Empty; var repository = this.RepositoryService.GetRepositoryById(postFileData.RepositoryId); // TODO: Needs to check Filling repository credintials in case of system provided repository type if (repository.BaseRepositoryId == Constants.MerritRepositoryTypeID && repository.IsImpersonating == true) { postFileData.UserName = repository.ImpersonatingUserName; postFileData.Password = repository.ImpersonatingPassword; } string authorization = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes(postFileData.UserName /*UserName*/ + ":" + postFileData.Password /*Password*/)); string baseRepoName = this.RepositoryDetails.GetBaseRepositoryName(repository.BaseRepositoryId); this.RepositoryAdapter = new MerritAdapter(); // This is a temporary fix to initialize citation for // Merritt repository. // TBD: move this to the base class Citation citation = default(Citation); if (string.IsNullOrWhiteSpace(file.Citation)) { User user = this.userService.GetUserById(postFileData.UserId); citation = new Citation(); citation.Title = Path.GetFileNameWithoutExtension(file.Name); citation.Publisher = string.Join(",", user.LastName, user.FirstName); } else { citation = JsonConvert.DeserializeObject<Citation>(file.Citation); } identifier = this.GetIdentifier(postFileData, authorization, repository.HttpIdentifierUriTemplate, citation); if (identifier.StartsWith("true")) { identifier = identifier.Substring(identifier.IndexOf("ark:", StringComparison.Ordinal)).Trim(); var postQueryData = GetPostQueryData(identifier, file, citation, repository, postFileData); var dataFile = this.GetDataFile(file); var repositoryModel = GetRepositoryModel(repository, authorization); if (file.FileColumns != null && file.FileColumns.Count > 0) { // before posting the file set file column units and types fileColumnTypes = this.RetrieveFileColumnTypes(); fileColumnUnits = this.RetrieveFileColumnUnits(); } PublishMerritFileModel publishMerritFileModel = new PublishMerritFileModel() { File = dataFile, RepositoryModel = repositoryModel, FileColumnTypes = fileColumnTypes, FileColumnUnits = fileColumnUnits, MerritQueryData = postQueryData }; //post the file status = this.RepositoryAdapter.PostFile(publishMerritFileModel); } else { string message = identifier.Replace("false|", ""); // Todo need to throw a custom exception throw new SystemException(message); } return identifier; }
public HttpResponseMessage SaveCitation(int fileId, Citation citation) { HttpResponseMessage httpResponseMessage; try { Check.IsNotNull(citation, "citation"); DM.File file = this.fileService.GetFileByFileId(fileId); if (null == file) { diagnostics.WriteErrorTrace(TraceEventId.Exception, "File is null"); return Request.CreateErrorResponse(HttpStatusCode.NotFound, MessageStrings.Invalid_File_Id); } file.Citation = JsonConvert.SerializeObject(citation); file.ModifiedOn = DateTime.UtcNow; fileService.UpdateFile(file); httpResponseMessage = Request.CreateResponse(HttpStatusCode.OK, true); } catch (ArgumentException ex) { diagnostics.WriteErrorTrace(TraceEventId.Exception, ex); message = string.Format(CultureInfo.CurrentCulture, MessageStrings.Argument_Error_Message_Template, ex.ParamName); httpResponseMessage = Request.CreateErrorResponse(HttpStatusCode.BadRequest, message); } return httpResponseMessage; }
public HttpResponseMessage GetCitation(int fileId, int repositoryId) { DM.File file = fileService.GetFileByFileId(fileId); if (file == null) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, MessageStrings.FileNotFound); } DM.Repository repository = this.repositoryService.GetRepositoryById(repositoryId); if (repository == null) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, MessageStrings.Repository_Not_Found); } else if (repository.BaseRepository.BaseRepositoryId != 1) { return Request.CreateErrorResponse(HttpStatusCode.NotImplemented, string.Format(MessageStrings.CitationNotSupportedMessage, repository.BaseRepository.Name)); } Citation citation = new Citation() { PublicationYear = DateTime.Now.Year.ToString(), Title = file.Title, Publisher = string.Concat(this.user.LastName, ", ", this.user.FirstName) }; if (!string.IsNullOrWhiteSpace(file.Citation)) { citation = JsonConvert.DeserializeObject<Citation>(file.Citation); } return Request.CreateResponse(HttpStatusCode.OK, citation); }
public HttpResponseMessage GetFiles(int id) { // Check if the model binding was successful and is in a valid state if (!ModelState.IsValid) { return Request.CreateErrorResponse(HttpStatusCode.BadRequest, string.Empty); } try { // Check if the file service is valid Check.IsNotNull(this.fileService, "fileService"); IEnumerable<DM.File> filesList = this.fileService.GetAllFiles(this.user.UserId); foreach (DM.File file in filesList) { if (file.Status.Equals(FileStatus.Posted.ToString(), StringComparison.OrdinalIgnoreCase)) { Citation citation = new Citation(); if (!string.IsNullOrWhiteSpace(file.Citation)) { citation = JsonConvert.DeserializeObject<Citation>(file.Citation); } file.Citation = string.Format(Constants.CitationStringFormat, citation.Publisher ?? string.Empty, citation.PublicationYear ?? string.Empty, citation.Title ?? string.Empty, citation.Version ?? string.Empty, file.Identifier ?? string.Empty); } } return Request.CreateResponse<IEnumerable<DM.File>>(status, filesList); } catch (ArgumentNullException ane) { if (ane.ParamName.Equals("fileService")) { message = MessageStrings.File_Service_Is_Null; status = HttpStatusCode.InternalServerError; } message = MessageStrings.Invalid_File_Id; status = HttpStatusCode.BadRequest; } catch (Exception ex) { message = ex.Message + ex.StackTrace + ex.GetType().ToString(); if (null != ex.InnerException) { message += ex.InnerException.Message + ex.InnerException.StackTrace + ex.InnerException.GetType().ToString(); } status = HttpStatusCode.InternalServerError; } return Request.CreateErrorResponse(status, message); }