/// <summary> /// Create a simple data controller to create, update and delete entities. /// </summary> /// <param name="zoneId">Zone ID</param> /// <param name="appId">App ID</param> /// <param name="userName">Name of user loged in</param> /// <param name="defaultLanguageCode">Default language of system</param> public SimpleDataController(int zoneId, int appId, string userName, string defaultLanguageCode) { _zoneId = zoneId; _appId = appId; _userName = userName; _defaultLanguageCode = defaultLanguageCode; Context = EavDataController.Instance(zoneId, appId); }
/// <summary> /// Initializes a new instance of the Import class. /// </summary> public Import(int? zoneId, int? appId, string userName, bool dontUpdateExistingAttributeValues = true, bool keepAttributesMissingInImport = true, bool preventUpdateOnDraftEntities = true, bool largeImport = true) { _context = EavDataController.Instance(zoneId, appId); _context.UserName = userName; _dontUpdateExistingAttributeValues = dontUpdateExistingAttributeValues; _keepAttributesMissingInImport = keepAttributesMissingInImport; PreventUpdateOnDraftEntities = preventUpdateOnDraftEntities; _largeImport = largeImport; }
public XmlExporter(int zoneId, int appId, bool appExport, string[] attrSetIds, string[] entityIds) { _isAppExport = appExport; //Sexy = new SxcInstance(_zoneId, _appId); _app = new App(zoneId, appId, PortalSettings.Current); _eavAppContext = _app.EavContext; AttributeSetIDs = attrSetIds; EntityIDs = entityIds; // this must happen very early, to ensure that the file-lists etc. are correct for exporting when used externally InitExportXDocument(); }
/// <summary> /// Save a Pipeline Entity to EAV /// </summary> /// <param name="id">EntityId of the Entity describing the Pipeline</param> /// <param name="appId"></param> /// <param name="pipeline">JSON with the new Entity-Values</param> /// <param name="newDataSources">Array with new DataSources and the unsavedName and final EntityGuid</param> private void SavePipelineEntity(int? id, int appId, dynamic pipeline, IDictionary<string, Guid> newDataSources, EavDataController _context) { // Create a clone so it can be modifie before saving but doesn't affect the underlaying JObject. // A new Pipeline Entity must be saved twice, but some Field-Values are changed before saving it dynamic pipelineClone = pipeline.DeepClone(); // Update Wirings of Entities just added IEnumerable<WireInfo> wirings = pipeline.StreamWiring.ToObject<IEnumerable<WireInfo>>(); if (newDataSources != null) { var wiringsNew = new List<WireInfo>(); foreach (var wireInfo in wirings) { var newWireInfo = wireInfo; if (newDataSources.ContainsKey(wireInfo.From)) newWireInfo.From = newDataSources[wireInfo.From].ToString(); if (newDataSources.ContainsKey(wireInfo.To)) newWireInfo.To = newDataSources[wireInfo.To].ToString(); wiringsNew.Add(newWireInfo); } wirings = wiringsNew; } pipelineClone.StreamWiring = DataPipelineWiring.Serialize(wirings); // Validate Stream Wirings foreach (var wireInfo in wirings.Where(wireInfo => wirings.Count(w => w.To == wireInfo.To && w.In == wireInfo.In) > 1)) throw new Exception( $"DataSource \"{wireInfo.To}\" has multiple In-Streams with Name \"{wireInfo.In}\". Each In-Stream must have an unique Name and can have only one connection."); // Add/Update Entity IDictionary newValues = GetEntityValues(pipelineClone); if (!id.HasValue) { //var attributeSetId = _context.GetAttributeSet(DataSource.DataPipelineStaticName).AttributeSetID; // return _context.AddEntity(attributeSetId, newValues, null, null) throw new NotSupportedException("Saving a new Pipeline directly from the Pipeline-Designer is currently disabled because of Culture/Dimension Issues. Please create a new Pipeline using the Pipeline Management."); } // Guess DimensionIDs for the Pipeline-Entity var source = DataSource.GetInitialDataSource(appId: appId); var pipelineEntity = DataPipeline.GetPipelineEntity(id.Value, source); int[] dimensionIds = null; if (pipelineEntity.Title.Values.Any()) dimensionIds = pipelineEntity.Title.Values.First().Languages.Select(l => l.DimensionId).ToArray(); _context.Entities.UpdateEntity(id.Value, newValues, dimensionIds: dimensionIds); }
/// <summary> /// Delete Pipeline Parts (DataSources) that are not present /// </summary> private void DeletedRemovedPipelineParts(IEnumerable<JToken> dataSources, Dictionary<string, Guid> newDataSources, Guid pipelineEntityGuid, int zoneId, int appId, EavDataController _context) { // Get EntityGuids currently stored in EAV var existingEntityGuids = DataPipeline.GetPipelineParts(zoneId, appId, pipelineEntityGuid).Select(e => e.EntityGuid); // Get EntityGuids from the UI (except Out and unsaved) var newEntityGuids = dataSources.Select(d => (string)((JObject)d).Property("EntityGuid").Value).Where(g => g != "Out" && !g.StartsWith("unsaved")).Select(Guid.Parse).ToList(); newEntityGuids.AddRange(newDataSources.Values); foreach (var entityToDelet in existingEntityGuids.Where(existingGuid => !newEntityGuids.Contains(existingGuid))) _context.Entities.DeleteEntity(entityToDelet); }
/// <summary> /// Save PipelineParts (DataSources) to EAV /// </summary> /// <param name="dataSources">JSON describing the DataSources</param> /// <param name="pipelineEntityGuid">EngityGuid of the Pipeline-Entity</param> /// <param name="pipelinePartAttributeSetId">AttributeSetId of PipelineParts</param> private Dictionary<string, Guid> SavePipelineParts(dynamic dataSources, Guid pipelineEntityGuid, int pipelinePartAttributeSetId, EavDataController _context) { var newDataSources = new Dictionary<string, Guid>(); foreach (var dataSource in dataSources) { // Skip Out-DataSource if (dataSource.EntityGuid == "Out") continue; // Update existing DataSource var newValues = GetEntityValues(dataSource); if (dataSource.EntityId != null) _context.Entities.UpdateEntity((int)dataSource.EntityId, newValues); // Add new DataSource else { var entitiy = _context.Entities.AddEntity(pipelinePartAttributeSetId, newValues, null, pipelineEntityGuid, Constants.AssignmentObjectTypeEntity); newDataSources.Add((string)dataSource.EntityGuid, entitiy.EntityGUID); } } return newDataSources; }
public DbAttributeSet(EavDataController dc) : base(dc) { }
/// <summary> /// Do the import /// </summary> public bool ImportXml(int zoneId, int appId, XDocument doc, bool leaveExistingValuesUntouched = true) { //_sexy = new SxcInstance(zoneId, appId); // 2016-03-26 2dm this used to have a third parameter false = don't enable caching, which hasn't been respected for a while; removed it // App = new App(zoneId, appId, PortalSettings.Current); // 2016-04-07 2dm refactored this out of this, as using App had side-effects _eavContext = EavDataController.Instance(zoneId, appId); _appId = appId; _zoneId = zoneId; if (!IsCompatible(doc)) { ImportLog.Add(new ExportImportMessage("The import file is not compatible with the installed version of 2sxc.", ExportImportMessage.MessageTypes.Error)); return false; } // Get root node "SexyContent" var xmlSource = doc.Element(XmlConstants.RootNode); if (xmlSource == null) { ImportLog.Add(new ExportImportMessage("Xml doesn't have expected root node: " + XmlConstants.RootNode, ExportImportMessage.MessageTypes.Error)); return false; } PrepareFolderIdCorrectionListAndCreateMissingFolders(xmlSource); PrepareFileIdCorrectionList(xmlSource); #region Prepare dimensions _sourceDimensions = xmlSource.Element(XmlConstants.Header)?.Element(XmlConstants.Dimensions)?.Elements(XmlConstants.Dim).Select(p => new Dimension { DimensionID = int.Parse(p.Attribute(XmlConstants.DimId).Value), Name = p.Attribute("Name").Value, SystemKey = p.Attribute("SystemKey").Value, ExternalKey = p.Attribute("ExternalKey").Value, Active = Parse(p.Attribute("Active").Value) }).ToList(); _sourceDefaultLanguage = xmlSource.Element(XmlConstants.Header)?.Element(XmlConstants.Language)?.Attribute(XmlConstants.LangDefault).Value; if (_sourceDimensions == null || _sourceDefaultLanguage == null) { ImportLog.Add(new ExportImportMessage("Cant find source dimensions or source-default language.", ExportImportMessage.MessageTypes.Error)); return false; } _sourceDefaultDimensionId = _sourceDimensions.Any() ? _sourceDimensions.FirstOrDefault(p => p.ExternalKey == _sourceDefaultLanguage)?.DimensionID : new int?(); _targetDimensions = _eavContext.Dimensions.GetDimensionChildren("Culture"); if (_targetDimensions.Count == 0) _targetDimensions.Add(new Dimension { Active = true, ExternalKey = DefaultLanguage, Name = "(added by import System, default language " + DefaultLanguage + ")", SystemKey = "Culture" }); #endregion var atsNodes = xmlSource.Element(XmlConstants.AttributeSets)?.Elements(XmlConstants.AttributeSet); var entNodes = xmlSource.Elements(XmlConstants.Entities).Elements(XmlConstants.Entity); var importAttributeSets = GetImportAttributeSets(atsNodes); var importEntities = GetImportEntities(entNodes, ContentTypeHelpers.AssignmentObjectTypeIDDefault); var import = new Import(_zoneId, _appId, UserName, leaveExistingValuesUntouched); import.RunImport(importAttributeSets, importEntities); ImportLog.AddRange(GetExportImportMessagesFromImportLog(import.ImportLog)); if (xmlSource.Elements(XmlConstants.Templates).Any()) ImportXmlTemplates(xmlSource); return true; }
public XmlExport(EavDataController c) : base(c) { }
public DbLoadIntoEavDataStructure(EavDataController cntx) : base(cntx) { }
/// <summary> /// Returns a new instace of the Eav Context. InitZoneApp must be called afterward. /// </summary> private static EavDataController Instance() { var connectionString = Configuration.GetConnectionString(); var context = new EavContext(connectionString); var dc = new EavDataController {SqlDb = context}; dc.DbS = new DbShortcuts(dc); dc.Versioning = new DbVersioning(dc); dc.Entities = new DbEntity(dc); dc.Values = new DbValue(dc); dc.Attributes = new DbAttribute(dc); dc.Relationships = new DbRelationship(dc); dc.AttribSet = new DbAttributeSet(dc); dc.Publishing = new DbPublishing(dc); dc.Dimensions = new DbDimensions(dc); dc.Zone = new DbZone(dc); dc.App = new DbApp(dc); dc.ContentType = new DbContentType(dc); dc.SqlDb.AlternateSaveHandler += dc.SaveChanges; return dc; }
/// <summary> /// Constructs a new EavSqlStore DataSource /// </summary> public EavSqlStore() { Out.Add(Constants.DefaultStreamName, new DataStream(this, Constants.DefaultStreamName, GetEntities)); Context = EavDataController.Instance(); // DbS = new DbShortcuts(_context); }
public DbVersioning(EavDataController cntx) : base(cntx) { }
/// <summary> /// Instanciates Content and Template-Contexts /// </summary> public SexyContent(int zoneId, int appId, bool enableCaching = true, int? ownerPortalId = null) { OwnerPS = ownerPortalId.HasValue ? new PortalSettings(ownerPortalId.Value) : PortalSettings.Current; PS = PortalSettings.Current; if (zoneId == 0) if (OwnerPS == null || !GetZoneID(OwnerPS.PortalId).HasValue) zoneId = Constants.DefaultZoneId; else zoneId = GetZoneID(OwnerPS.PortalId).Value; if (appId == 0) appId = GetDefaultAppId(zoneId); // Only disable caching of templates and contentgroupitems // if AppSetting "ToSIC_SexyContent_EnableCaching" is disabled if(enableCaching) { var cachingSetting = ConfigurationManager.AppSettings["ToSIC_SexyContent_EnableCaching"]; if (!String.IsNullOrEmpty(cachingSetting) && cachingSetting.ToLower() == "false") enableCaching = false; } Templates = new Templates(zoneId, appId); ContentGroups = new ContentGroups(zoneId, appId); // Set Properties on ContentContext ContentContext = EavDataController.Instance(zoneId, appId); // EavContext.Instance(zoneId, appId); ContentContext.UserName = (HttpContext.Current == null || HttpContext.Current.User == null) ? InternalUserName : HttpContext.Current.User.Identity.Name; ZoneId = zoneId; AppId = appId; }