Example #1
0
 /// <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);
 }
Example #2
0
        /// <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;
        }
Example #3
0
        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;
		}
Example #7
0
 public DbAttributeSet(EavDataController dc) : base(dc) { }
Example #8
0
		/// <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;
		}
Example #9
0
 public XmlExport(EavDataController c)
     : base(c)
 {
 }
 public DbLoadIntoEavDataStructure(EavDataController cntx)
     : base(cntx)
 {
 }
Example #11
0
        /// <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;
        }
Example #12
0
 /// <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);
 }
Example #13
0
 public DbVersioning(EavDataController cntx)
     : base(cntx)
 {
 }
Example #14
0
        /// <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;
        }