// /// <summary> /// Handle component import /// TODO - should a save be done for each component or wait until the end /// </summary> /// <param name="input"></param> /// <param name="pathway"></param> /// <param name="bnodes"></param> /// <param name="status">TODO - do we want to continue using the pathway SaveStatus?</param> /// <returns></returns> public OutputComponent ImportComponent(InputComponent input, ThisEntity pathway, List <BNode> bnodes, SaveStatus status) { MappingHelperV3 helper = new MappingHelperV3(CodesManager.ENTITY_TYPE_PATHWAY_COMPONENT); //do we need to reference blank nodes here? - if so pass to this method helper.entityBlankNodes = bnodes; helper.CurrentEntityCTID = input.CTID; helper.CurrentEntityName = input.Name.ToString(); OutputComponent output = new OutputComponent(); // LoggingHelper.DoTrace(5, "======== Component ======== "); LoggingHelper.DoTrace(5, " type: "+ input.PathwayComponentType.ToString()); LoggingHelper.DoTrace(5, " name: "+ (input.Name ?? new JInput.LanguageMap("componentNameMissing")).ToString()); LoggingHelper.DoTrace(5, " ctid: "+ input.CTID); LoggingHelper.DoTrace(6, " @Id: "+ input.CtdlId); try { //add/updating Pathway if (!DoesComponentExist(input.CTID, ref output)) { //set the rowid now, so that can be referenced as needed //no, the guid comes from the resolving of entity references //actually OK, as earlier references would result in a pending record output.RowId = Guid.NewGuid(); } helper.currentBaseObject = output; if (input.CTID == "ce-fa6c139f-0615-401f-9920-6ec8c445baca") { } //initialize json properties output.JsonProperties = new PathwayComponentProperties(); // output.PathwayComponentType = input.PathwayComponentType; output.Name = helper.HandleLanguageMap(input.Name, output, "Name"); output.Description = helper.HandleLanguageMap(input.Description, output, "Description"); output.SubjectWebpage = input.SubjectWebpage; output.SourceData = input.SourceData; if (!string.IsNullOrWhiteSpace(output.SourceData) && output.SourceData.IndexOf("/resources/") > 0) { var ctid = ResolutionServices.ExtractCtid(output.SourceData); if (!string.IsNullOrWhiteSpace(ctid)) { if (output.PathwayComponentType.ToLower().IndexOf("credential") > -1) { var target = CredentialManager.GetMinimumByCtid(ctid); if (target != null && target.Id > 0) { //this approach 'buries' the cred from external references like credential in pathway output.SourceCredential = new TopLevelEntityReference() { Id = target.Id, Name = target.Name, Description = target.Description, CTID = target.CTID, SubjectWebpage = target.SubjectWebpage, //RowId = target.RowId }; output.JsonProperties.SourceCredential = output.SourceCredential; } } else if (output.PathwayComponentType.ToLower().IndexOf("assessmentcomp") > -1) { var target = AssessmentManager.GetSummaryByCtid(ctid); if (target != null && target.Id > 0) { //may not really need this, just the json output.SourceAssessment = new TopLevelEntityReference() { Id = target.Id, Name = target.Name, Description = target.Description, CTID = target.CTID, SubjectWebpage = target.SubjectWebpage, //RowId = target.RowId }; output.JsonProperties.SourceAssessment = output.SourceAssessment; } } else if (output.PathwayComponentType.ToLower().IndexOf("coursecomp") > -1) { var target = LearningOpportunityManager.GetByCtid(ctid); if (target != null && target.Id > 0) { //may not really need this, just the json output.SourceLearningOpportunity = new TopLevelEntityReference() { Id = target.Id, Name = target.Name, Description = target.Description, CTID = target.CTID, SubjectWebpage = target.SubjectWebpage, //RowId = target.RowId }; output.JsonProperties.SourceLearningOpportunity = output.SourceLearningOpportunity; } } } } output.CTID = input.CTID; output.PathwayCTID = pathway.CTID; //output.CodedNotation = input.CodedNotation; output.Identifier = helper.MapIdentifierValueListInternal(input.Identifier); if (output.Identifier != null && output.Identifier.Count() > 0) { output.IdentifierJson = JsonConvert.SerializeObject(output.Identifier, MappingHelperV3.GetJsonSettings()); } // output.ComponentDesignationList = helper.MapCAOListToList(input.ComponentDesignation); // output.CredentialType = input.CredentialType; output.CreditValue = helper.HandleValueProfileList(input.CreditValue, output.PathwayComponentType + ".CreditValue"); //TBD - how to handle. Will need to have imported the concept scheme/concept if (input.HasProgressionLevel != null && input.HasProgressionLevel.Any()) { foreach (var item in input.HasProgressionLevel) { output.HasProgressionLevels.Add(ResolutionServices.ExtractCtid(item)); } } output.PointValue = helper.HandleQuantitiveValue(input.PointValue, output.PathwayComponentType + ".PointValue"); // output.ProgramTerm = helper.HandleLanguageMap(input.ProgramTerm, output, "ProgramTerm"); //need to get relationshiptype to store-> this can be done by manager //3 output.HasChildList = helper.MapEntityReferenceGuids("PathwayComponent.HasChild", input.HasChild, CodesManager.ENTITY_TYPE_PATHWAY_COMPONENT, ref status); //2 output.HasIsChildOfList = helper.MapEntityReferenceGuids("PathwayComponent.IsChildOf", input.IsChildOf, CodesManager.ENTITY_TYPE_PATHWAY_COMPONENT, ref status); output.HasPrerequisiteList = helper.MapEntityReferenceGuids("PathwayComponent.Prerequisite", input.Prerequisite, CodesManager.ENTITY_TYPE_PATHWAY_COMPONENT, ref status); output.HasPreceedsList = helper.MapEntityReferenceGuids("PathwayComponent.Preceeds", input.Preceeds, CodesManager.ENTITY_TYPE_PATHWAY_COMPONENT, ref status); //populate JSON properties output.JsonProperties.ComponentDesignationList = output.ComponentDesignationList; output.JsonProperties.CreditValue = output.CreditValue; output.JsonProperties.Identifier = output.Identifier; output.JsonProperties.PointValue = output.PointValue; // if (input.HasCondition != null && input.HasCondition.Count() > 0) { output.HasCondition = new List <PathwayComponentCondition>(); foreach (var item in input.HasCondition) { //var jcc = JsonConvert.DeserializeObject<JInput.ComponentCondition>( item.ToString() ); var cc = new PathwayComponentCondition(); cc.Name = helper.HandleLanguageMap(item.Name, cc, "ComponentCondition.Name"); cc.Description = helper.HandleLanguageMap(item.Description, cc, "ComponentCondition.Description"); cc.RequiredNumber = item.RequiredNumber; cc.PathwayCTID = pathway.CTID; cc.HasTargetComponentList = helper.MapEntityReferenceGuids("ComponentCondition.TargetComponent", item.TargetComponent, CodesManager.ENTITY_TYPE_PATHWAY_COMPONENT, ref status); output.HasCondition.Add(cc); } } } catch (Exception ex) { LoggingHelper.LogError(ex, "ImportPathways.ImportComponent"); //status.AddError( string.Format( "ImportPathways.ImportComponent. ComponentType: {0}, Name: {1}, Message: {2}", output.ComponentTypeId, output.Name, ex.Message ) ); } //then save return(output); }
public bool ImportV3(string payload, string envelopeIdentifier, SaveStatus status) { InputEntityV3 input = new InputEntityV3(); var bnodes = new List <BNode>(); var mainEntity = new Dictionary <string, object>(); //status.AddWarning( "The resource uses @graph and is not handled yet" ); Dictionary <string, object> dictionary = RegistryServices.JsonToDictionary(payload); object graph = dictionary["@graph"]; //serialize the graph object var glist = JsonConvert.SerializeObject(graph); //parse graph in to list of objects JArray graphList = JArray.Parse(glist); int cntr = 0; foreach (var item in graphList) { cntr++; if (cntr == 1) { var main = item.ToString(); //may not use this. Could add a trace method mainEntity = RegistryServices.JsonToDictionary(main); input = JsonConvert.DeserializeObject <InputEntityV3>(main); } else { var bn = item.ToString(); bnodes.Add(JsonConvert.DeserializeObject <BNode>(bn)); } } List <string> messages = new List <string>(); bool importSuccessfull = false; EntityServices mgr = new EntityServices(); MappingHelperV3 helper = new MappingHelperV3(); helper.entityBlankNodes = bnodes; string ctid = input.Ctid; string referencedAtId = input.CtdlId; LoggingHelper.DoTrace(5, " name: "+ input.Name.ToString()); LoggingHelper.DoTrace(6, " url: "+ input.SubjectWebpage); LoggingHelper.DoTrace(5, " ctid: "+ input.Ctid); LoggingHelper.DoTrace(5, " @Id: "+ input.CtdlId); status.Ctid = ctid; if (status.DoingDownloadOnly) { return(true); } if (!DoesEntityExist(input.Ctid, ref output)) { //set the rowid now, so that can be referenced as needed output.RowId = Guid.NewGuid(); } helper.currentBaseObject = output; //start with language and may use with language maps foreach (var l in input.InLanguage) { if (!string.IsNullOrWhiteSpace(l)) { var language = CodesManager.GetLanguage(l); output.InLanguageCodeList.Add(new TextValueProfile() { CodeId = language.CodeId, TextTitle = language.Name, TextValue = language.Value }); } } if (input.InLanguage.Count > 0) { //could use to alter helper.DefaultLanguage } output.Name = helper.HandleLanguageMap(input.Name, output, "Name"); output.Description = helper.HandleLanguageMap(input.Description, output, "Description"); output.Keyword = helper.MapToTextValueProfile(input.Keyword, output, "Keyword"); output.CTID = input.Ctid; output.CredentialRegistryId = envelopeIdentifier; output.DateEffective = input.DateEffective; output.SubjectWebpage = input.SubjectWebpage; output.AvailabilityListing = helper.MapListToString(input.AvailabilityListing); output.AvailableOnlineAt = helper.MapListToString(input.AvailableOnlineAt); output.DeliveryType = helper.MapCAOListToEnumermation(input.DeliveryType); output.DeliveryTypeDescription = helper.HandleLanguageMap(input.DeliveryTypeDescription, output, "DeliveryTypeDescription"); //AudienceType output.AudienceType = helper.MapCAOListToEnumermation(input.AudienceType); //CAO output.AudienceLevelType = helper.MapCAOListToEnumermation(input.AudienceLevelType); output.VersionIdentifier = helper.MapIdentifierValueListToString(input.VersionIdentifier); output.VersionIdentifierList = helper.MapIdentifierValueList(input.VersionIdentifier); output.CodedNotation = input.CodedNotation; //handle QuantitativeValue output.CreditValue = helper.HandleQuantitiveValue(input.CreditValue, output, "CreditValue"); // if (!output.CreditValue.HasData()) { //if ( UtilityManager.GetAppKeyValue( "usingQuantitiveValue", false ) ) //{ // //will not handle ranges // output.CreditValue = new workIT.Models.Common.QuantitativeValue // { // Value = input.CreditHourValue, // CreditUnitType = helper.MapCAOToEnumermation( input.CreditUnitType ), // Description = helper.HandleLanguageMap( input.CreditUnitTypeDescription, output, "CreditUnitTypeDescription" ) // }; // //what about hours? // //if there is hour data, can't be unit data, so assign // if ( input.CreditHourValue > 0 ) // { // output.CreditValue.Value = input.CreditHourValue; // output.CreditValue.Description = helper.HandleLanguageMap( input.CreditHourType, output, "CreditHourType" ); // } //} //else //{ // output.CreditHourType = helper.HandleLanguageMap( input.CreditHourType, output, "CreditHourType" ); // output.CreditHourValue = input.CreditHourValue; // output.CreditUnitType = helper.MapCAOToEnumermation( input.CreditUnitType ); // output.CreditUnitValue = input.CreditUnitValue; // output.CreditUnitTypeDescription = helper.HandleLanguageMap( input.CreditUnitTypeDescription, output, "CreditUnitTypeDescription" ); //} } //occupations //output.Occupation = helper.MapCAOListToEnumermation( input.OccupationType ); //actually used by import output.Occupations = helper.MapCAOListToCAOProfileList(input.OccupationType); //just append alternative items. Ensure empty lists are ignored output.Occupations.AddRange(helper.AppendLanguageMapListToCAOProfileList(input.AlternativeOccupationType)); //skip if no occupations if (output.Occupations.Count() == 0 && UtilityManager.GetAppKeyValue("skipCredImportIfNoOccupations", false)) { //LoggingHelper.DoTrace( 2, string.Format( " ***Skipping lopp# {0}, {1} as it has no occupations and this is a special run.", output.Id, output.Name ) ); //return true; } //Industries output.Industries = helper.MapCAOListToCAOProfileList(input.IndustryType); output.Industries.AddRange(helper.AppendLanguageMapListToCAOProfileList(input.AlternativeIndustryType)); //naics //output.Naics = input.Naics; output.InstructionalProgramTypes = helper.MapCAOListToCAOProfileList(input.InstructionalProgramType); output.InstructionalProgramTypes.AddRange(helper.AppendLanguageMapListToCAOProfileList(input.AlternativeInstructionalProgramType)); if (output.InstructionalProgramTypes.Count() == 0 && UtilityManager.GetAppKeyValue("skipAsmtImportIfNoCIP", false)) { //skip //LoggingHelper.DoTrace( 2, string.Format( " ***Skipping lopp# {0}, {1} as it has no InstructionalProgramTypes and this is a special run.", output.Id, output.Name ) ); //return true; } output.LearningMethodType = helper.MapCAOListToEnumermation(input.LearningMethodType); output.Subject = helper.MapCAOListToTextValueProfile(input.Subject, CodesManager.PROPERTY_CATEGORY_SUBJECT); //output.VerificationMethodDescription = helper.HandleLanguageMap( input.VerificationMethodDescription, output, "VerificationMethodDescription" ); //financial assitance output.FinancialAssistance = helper.FormatFinancialAssistance(input.FinancialAssistance, ref status); output.Jurisdiction = helper.MapToJurisdiction(input.Jurisdiction, ref status); //***EstimatedCost //will need to format, all populate Entity.RelatedCosts (for bubble up) - actually this would be for asmts, and lopps output.EstimatedCost = helper.FormatCosts(input.EstimatedCost, ref status); //connections output.AdvancedStandingFrom = helper.FormatConditionProfile(input.AdvancedStandingFrom, ref status); output.AdvancedStandingFor = helper.FormatConditionProfile(input.IsAdvancedStandingFor, ref status); output.PreparationFrom = helper.FormatConditionProfile(input.PreparationFrom, ref status); output.IsPreparationFor = helper.FormatConditionProfile(input.IsPreparationFor, ref status); output.IsRequiredFor = helper.FormatConditionProfile(input.IsRequiredFor, ref status); output.IsRecommendedFor = helper.FormatConditionProfile(input.IsRecommendedFor, ref status); //EstimatedDuration output.EstimatedDuration = helper.FormatDuration(input.EstimatedDuration, ref status); //conditions ====================================== output.Requires = helper.FormatConditionProfile(input.Requires, ref status); output.Recommends = helper.FormatConditionProfile(input.Recommends, ref status); output.EntryCondition = helper.FormatConditionProfile(input.EntryCondition, ref status); output.Corequisite = helper.FormatConditionProfile(input.Corequisite, ref status); //TODO - develope entity for IdentitifierValue output.VersionIdentifier = helper.MapIdentifierValueListToString(input.VersionIdentifier); output.VersionIdentifierList = helper.MapIdentifierValueList(input.VersionIdentifier); //teaches compentencies output.TeachesCompetencies = helper.MapCAOListToCAOProfileList(input.Teaches); if (output.TeachesCompetencies.Count() == 0 && UtilityManager.GetAppKeyValue("skipLoppImportIfNoCompetencies", false)) { //skip LoggingHelper.DoTrace(2, string.Format(" ***Skipping lopp# {0}, {1} as it has no competencies and this is a special run.", output.Id, output.Name)); return(true); } //common conditions output.ConditionManifestIds = helper.MapEntityReferences(input.CommonConditions, CodesManager.ENTITY_TYPE_CONDITION_MANIFEST, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, ref status); //common costs output.CostManifestIds = helper.MapEntityReferences(input.CommonCosts, CodesManager.ENTITY_TYPE_COST_MANIFEST, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, ref status); //ADDRESSES output.Addresses = helper.FormatAvailableAtAddresses(input.AvailableAt, ref status); //BYs output.AccreditedBy = helper.MapOrganizationReferenceGuids(input.AccreditedBy, ref status); output.ApprovedBy = helper.MapOrganizationReferenceGuids(input.ApprovedBy, ref status); output.OwnedBy = helper.MapOrganizationReferenceGuids(input.OwnedBy, ref status); output.OfferedBy = helper.MapOrganizationReferenceGuids(input.OfferedBy, ref status); if (output.OwnedBy != null && output.OwnedBy.Count > 0) { output.OwningAgentUid = output.OwnedBy[0]; } else { //add warning? if (output.OfferedBy == null && output.OfferedBy.Count == 0) { status.AddWarning("document doesn't have an owning or offering organization."); } } output.RecognizedBy = helper.MapOrganizationReferenceGuids(input.RecognizedBy, ref status); output.RegulatedBy = helper.MapOrganizationReferenceGuids(input.RegulatedBy, ref status); //INs output.AccreditedIn = helper.MapToJurisdiction(input.AccreditedIn, ref status); output.ApprovedIn = helper.MapToJurisdiction(input.ApprovedIn, ref status); output.ApprovedIn = helper.MapToJurisdiction(input.ApprovedIn, ref status); output.RecognizedIn = helper.MapToJurisdiction(input.RecognizedIn, ref status); output.RegulatedIn = helper.MapToJurisdiction(input.RegulatedIn, ref status); //var hasPartIds = input.HasPart.Select( x => x.CtdlId ).ToList(); output.HasPartIds = helper.MapEntityReferences(input.HasPart, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, ref status); //var isPartIds = input.IsPartOf.Select( x => x.CtdlId ).ToList(); output.IsPartOfIds = helper.MapEntityReferences(input.IsPartOf, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, ref status); //=== if any messages were encountered treat as warnings for now if (messages.Count > 0) { status.SetMessages(messages, true); } //just in case check if entity added since start if (output.Id == 0) { ThisEntity entity = EntityServices.GetByCtid(ctid); if (entity != null && entity.Id > 0) { output.Id = entity.Id; output.RowId = entity.RowId; } } importSuccessfull = mgr.Import(output, ref status); status.DocumentId = output.Id; status.DetailPageUrl = string.Format("~/learningOpportunity/{0}", output.Id); status.DocumentRowId = output.RowId; //just in case if (status.HasErrors) { importSuccessfull = false; } //if record was added to db, add to/or set EntityResolution as resolved int ierId = new ImportManager().Import_EntityResolutionAdd(referencedAtId, ctid, CodesManager.ENTITY_TYPE_LEARNING_OPP_PROFILE, output.RowId, output.Id, (output.Id > 0), ref messages, output.Id > 0); return(importSuccessfull); }