Пример #1
0
        public Task RegisterLocallyKnownMediaItemAspectTypeAsync(MediaItemAspectMetadata miam)
        {
            IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>();

            mediaLibrary.AddMediaItemAspectStorage(miam);
            return(Task.CompletedTask);
        }
Пример #2
0
 private static void ShowMIAs(IDictionary <Guid, IList <MediaItemAspect> > aspects, IMediaItemAspectTypeRegistration registration)
 {
     foreach (Guid mia in aspects.Keys)
     {
         MediaItemAspectMetadata metadata = registration.LocallyKnownMediaItemAspectTypes[mia];
         foreach (MediaItemAspect aspect in aspects[mia])
         {
             Console.WriteLine(" {0}:", metadata.Name);
             int    count = 0;
             string sb    = " ";
             foreach (MediaItemAspectMetadata.AttributeSpecification spec in metadata.AttributeSpecifications.Values)
             {
                 object value = aspect[spec];
                 if (value != null)
                 {
                     if (count > 0)
                     {
                         sb += ",";
                     }
                     if (value is IList)
                     {
                         sb += string.Format(" {0}({1}/{2})=[{3}]", spec.AttributeName, spec.AttributeType.Name, spec.Cardinality, string.Join(",", (IList)value));
                     }
                     else
                     {
                         sb += string.Format(" {0}={1}", spec.AttributeName, value.ToString());
                     }
                     count++;
                 }
             }
             Console.WriteLine(sb);
         }
     }
 }
Пример #3
0
        public void TestMultipleMIAM()
        {
            MultipleTestMIA src = TestCommonUtils.CreateMultipleMIA("Multiple", Cardinality.Inline, true, false);

            TextWriter writer     = new StringWriter();
            XmlWriter  serialiser = new XmlTextWriter(writer);

            serialiser.WriteStartElement("Test");
            src.Metadata.Serialize(serialiser);
            serialiser.WriteEndElement();

            Console.WriteLine("XML: {0}", writer);

            XmlReader reader = XmlReader.Create(new StringReader(writer.ToString()));

            reader.Read(); // Test tag

            reader.Read(); // MIAM tag
            MultipleMediaItemAspectMetadata dest = MediaItemAspectMetadata.Deserialize(reader) as MultipleMediaItemAspectMetadata;

            Assert.IsNotNull(dest, "Dest");
            Assert.AreEqual(src.Metadata.AspectId, dest.AspectId, "Aspect ID");
            Assert.AreEqual(src.Metadata.AttributeSpecifications.Count, dest.AttributeSpecifications.Count, "Attribute spec count");

            AssertMultipleMIAMSpec(src.Metadata.AttributeSpecifications.Values, dest.AttributeSpecifications.Values, src.ATTR_STRING);

            Assert.IsNotNull(src.Metadata.UniqueAttributeSpecifications, "Source unique spec");
            Assert.IsNotNull(dest.UniqueAttributeSpecifications, "Source unique spec");

            Assert.AreEqual(src.Metadata.UniqueAttributeSpecifications.Count, dest.UniqueAttributeSpecifications.Count, "Attribute unique spec count");

            AssertMultipleMIAMSpec(src.Metadata.UniqueAttributeSpecifications.Values, dest.UniqueAttributeSpecifications.Values, src.ATTR_ID);
        }
Пример #4
0
        protected override object DoDeserializeValue(XmlReader reader, bool isSimpleValue)
        {
            reader.ReadStartElement(); // Read start of enclosing element
            MediaItemAspectMetadata result = MediaItemAspectMetadata.Deserialize(reader);

            reader.ReadEndElement(); // End of enclosing element
            return(result);
        }
 public async Task AddMediaItemAspectStorageAsync(MediaItemAspectMetadata miam)
 {
     CpAction       action       = GetAction("X_MediaPortal_AddMediaItemAspectStorage");
     IList <object> inParameters = new List <object> {
         miam
     };
     await action.InvokeAsync(inParameters);
 }
Пример #6
0
 public Task RegisterLocallySupportedReimportMediaItemAspectTypeAsync(MediaItemAspectMetadata miaType)
 {
     Console.WriteLine("Registering reimport support " + miaType.Name);
     if (!_locallySupportedReimportMediaItemAspectTypes.ContainsKey(miaType.AspectId))
     {
         _locallySupportedReimportMediaItemAspectTypes.Add(miaType.AspectId, miaType);
     }
     return(Task.CompletedTask);
 }
Пример #7
0
 public void RegisterLocallyKnownMediaItemAspectType(MediaItemAspectMetadata miaType)
 {
     Console.WriteLine("Registering " + miaType.Name);
     if (_locallyKnownMediaItemAspectTypes.ContainsKey(miaType.AspectId))
     {
         return;
     }
     _locallyKnownMediaItemAspectTypes.Add(miaType.AspectId, miaType);
 }
        public void AddMediaItemAspectStorage(MediaItemAspectMetadata miam)
        {
            CpAction       action       = GetAction("AddMediaItemAspectStorage");
            IList <object> inParameters = new List <object> {
                miam
            };

            action.InvokeAction(inParameters);
        }
Пример #9
0
        public bool Connect()
        {
            try
            {
                stateService = new SystemStateService();
                ServiceRegistration.Set <ISystemStateService>(stateService);

                stateService.SwitchSystemState(SystemState.Initializing, false);

                logger.Info("Initialising core services");
                ApplicationCore.RegisterVitalCoreServices(false);
                ApplicationCore.RegisterCoreServices();

                logger.Info("Starting localization");
                ServiceRegistration.Set <ILocalization>(new NoLocalization());

                logger.Info("Initialising system resolver");
                ServiceRegistration.Set <ISystemResolver>(new SystemResolver());

                ServerConnectionReceiver reciever = new ServerConnectionReceiver();

                ServiceRegistration.Get <IMessageBroker>().RegisterMessageReceiver(ServerConnectionMessaging.CHANNEL, reciever);

                logger.Info("Initialising server connection manger");
                connectionManager = new ServerConnectionManager();
                ServiceRegistration.Set <IServerConnectionManager>(connectionManager);

                logger.Info("Starting up server connection manger");
                connectionManager.Startup();

                bool connected = reciever.Connect();

                if (connected)
                {
                    logger.Info("Initialising media item aspect type registration");
                    ServiceRegistration.Set <IMediaItemAspectTypeRegistration>(new MediaItemAspectTypeRegistration());

                    ICollection <Guid> types = GetAllManagedMediaItemAspectTypes();
                    foreach (Guid type in types)
                    {
                        MediaItemAspectMetadata metadata = GetMediaItemAspectMetadata(type);
                        logger.Info("Registering media item {0}...", metadata.Name);
                        ServiceRegistration.Get <IMediaItemAspectTypeRegistration>().RegisterLocallyKnownMediaItemAspectTypeAsync(metadata).Wait();
                    }
                }

                Connected = connected;

                return(connected);
            }
            catch (Exception e)
            {
                logger.Error("Cannot connect", e);
                return(false);
            }
        }
Пример #10
0
 public Task RegisterLocallyKnownMediaItemAspectTypeAsync(MediaItemAspectMetadata miaType)
 {
     Console.WriteLine("Registering " + miaType.Name);
     if (_locallyKnownMediaItemAspectTypes.ContainsKey(miaType.AspectId))
     {
         return(Task.CompletedTask);
     }
     _locallyKnownMediaItemAspectTypes.Add(miaType.AspectId, miaType);
     return(Task.CompletedTask);
 }
Пример #11
0
        private static void ShowMediaItems(Client client, IFilter filter)
        {
            IMediaItemAspectTypeRegistration registration = ServiceRegistration.Get <IMediaItemAspectTypeRegistration>();
            IList <MediaItem> items = client.GetContentDirectory().SearchAsync(new MediaItemQuery(null, registration.LocallyKnownMediaItemAspectTypes.Keys, filter), true, null, true).Result;

            foreach (MediaItem item in items)
            {
                Console.WriteLine("\nItem {0}:", item.MediaItemId);
                foreach (Guid mia in item.Aspects.Keys)
                {
                    MediaItemAspectMetadata metadata = registration.LocallyKnownMediaItemAspectTypes[mia];
                    foreach (MediaItemAspect aspect in item.Aspects[mia])
                    {
                        Console.WriteLine(" {0}:", metadata.Name);
                        int    count = 0;
                        string sb    = " ";
                        foreach (MediaItemAspectMetadata.AttributeSpecification spec in aspect.Metadata.AttributeSpecifications.Values)
                        {
                            string valueStr = null;
                            if (spec.IsCollectionAttribute)
                            {
                                IEnumerable values = aspect.GetCollectionAttribute(spec);
                                if (values != null)
                                {
                                    IList <string> list = new List <string>();
                                    foreach (object value in values)
                                    {
                                        list.Add(GetValue(spec, value));
                                    }
                                    valueStr = string.Format("[{0}]", string.Join(",", list));
                                }
                            }
                            else
                            {
                                valueStr = GetValue(spec, aspect.GetAttributeValue(spec));
                            }
                            if (valueStr != null)
                            {
                                if (count > 0)
                                {
                                    sb += ",";
                                }
                                //sb += string.Format(" {0}{1}{2}({3}/{4})={5}", spec.AttributeName, aspect is MultipleMediaItemAspect ? "," : "", aspect is MultipleMediaItemAspect ? ((MultipleMediaItemAspect)aspect).Index.ToString() : "", spec.AttributeType.Name, spec.Cardinality, valueStr);
                                sb += string.Format(" {0}={1}", spec.AttributeName, valueStr);
                                count++;
                            }
                        }
                        Console.WriteLine(sb);
                    }
                }
            }
        }
Пример #12
0
 public static void ShowMediaAspects(IDictionary <Guid, IList <MediaItemAspect> > aspects, IDictionary <Guid, MediaItemAspectMetadata> metadatas)
 {
     foreach (Guid mia in aspects.Keys)
     {
         MediaItemAspectMetadata metadata = metadatas[mia];
         foreach (MediaItemAspect aspect in aspects[mia])
         {
             logger.Debug(" {0}:", metadata.Name);
             int    count = 0;
             string sb    = " ";
             foreach (MediaItemAspectMetadata.AttributeSpecification spec in aspect.Metadata.AttributeSpecifications.Values)
             {
                 string valueStr = null;
                 if (spec.IsCollectionAttribute)
                 {
                     IEnumerable values = aspect.GetCollectionAttribute(spec);
                     if (values != null)
                     {
                         IList <string> list = new List <string>();
                         foreach (object value in values)
                         {
                             list.Add(value.ToString());
                         }
                         valueStr = string.Format("[{0}]", string.Join(",", list));
                     }
                 }
                 else
                 {
                     object value = aspect.GetAttributeValue(spec);
                     if (value != null)
                     {
                         valueStr = value.ToString();
                     }
                 }
                 if (valueStr != null)
                 {
                     if (count > 0)
                     {
                         sb += ",";
                     }
                     //sb += string.Format(" {0}{1}{2}({3}/{4})={5}", spec.AttributeName, aspect is MultipleMediaItemAspect ? "," : "", aspect is MultipleMediaItemAspect ? ((MultipleMediaItemAspect)aspect).Index.ToString() : "", spec.AttributeType.Name, spec.Cardinality, valueStr);
                     sb += string.Format(" {0}={1}", spec.AttributeName, valueStr);
                     count++;
                 }
             }
             logger.Debug(sb);
         }
     }
 }
        public async Task RegisterLocallyKnownMediaItemAspectTypeAsync(MediaItemAspectMetadata miaType)
        {
            if (_locallyKnownMediaItemAspectTypes.ContainsKey(miaType.AspectId))
            {
                return;
            }
            _locallyKnownMediaItemAspectTypes.Add(miaType.AspectId, miaType);
            IServerConnectionManager serverConnectionManager = ServiceRegistration.Get <IServerConnectionManager>();
            IContentDirectory        cd = serverConnectionManager?.ContentDirectory;

            if (cd != null)
            {
                await cd.AddMediaItemAspectStorageAsync(miaType);
            }
        }
Пример #14
0
        public void RegisterLocallyKnownMediaItemAspectType(MediaItemAspectMetadata miaType)
        {
            if (_locallyKnownMediaItemAspectTypes.ContainsKey(miaType.AspectId))
            {
                return;
            }
            _locallyKnownMediaItemAspectTypes.Add(miaType.AspectId, miaType);
            IServerConnectionManager serverConnectionManager = ServiceRegistration.Get <IServerConnectionManager>();
            IContentDirectory        cd = serverConnectionManager == null ? null :
                                          serverConnectionManager.ContentDirectory;

            if (cd != null)
            {
                cd.AddMediaItemAspectStorage(miaType);
            }
        }
Пример #15
0
        public Task RegisterLocallyKnownMediaItemAspectTypeAsync(MediaItemAspectMetadata miaType)
        {
            if (_locallyKnownMediaItemAspectTypes.ContainsKey(miaType.AspectId))
            {
                return(Task.CompletedTask);
            }
            _locallyKnownMediaItemAspectTypes.Add(miaType.AspectId, miaType);
            IServerConnectionManager serverConnectionManager = ServiceRegistration.Get <IServerConnectionManager>();
            IContentDirectory        cd = serverConnectionManager == null ? null :
                                          serverConnectionManager.ContentDirectory;

            if (cd != null)
            {
                cd.AddMediaItemAspectStorageAsync(miaType).Wait();
            }
            return(Task.CompletedTask);
        }
Пример #16
0
        public static SingleTestMIA CreateSingleMIA(string table, Cardinality cardinality, bool createStringAttribute, bool createIntegerAttribute)
        {
            SingleTestMIA mia = new SingleTestMIA();

            mia.ASPECT_ID = Guid.NewGuid();

            IList <MediaItemAspectMetadata.SingleAttributeSpecification> attributes = new List <MediaItemAspectMetadata.SingleAttributeSpecification>();

            if (createStringAttribute)
            {
                attributes.Add(mia.ATTR_STRING = MediaItemAspectMetadata.CreateSingleStringAttributeSpecification("ATTR_STRING", 10, cardinality, false));
            }
            if (createIntegerAttribute)
            {
                attributes.Add(mia.ATTR_INTEGER = MediaItemAspectMetadata.CreateSingleAttributeSpecification("ATTR_INTEGER", typeof(Int32), cardinality, true));
            }

            mia.Metadata = new SingleMediaItemAspectMetadata(mia.ASPECT_ID, table, attributes.ToArray());

            return(mia);
        }
Пример #17
0
        public void TestSingleMIAM()
        {
            SingleTestMIA src = TestCommonUtils.CreateSingleMIA("Single", Cardinality.Inline, true, false);

            TextWriter writer     = new StringWriter();
            XmlWriter  serialiser = new XmlTextWriter(writer);

            serialiser.WriteStartElement("Test"); // Wrapper around the albums
            src.Metadata.Serialize(serialiser);
            serialiser.WriteEndElement();

            Console.WriteLine("XML: {0}", writer);

            XmlReader reader = XmlReader.Create(new StringReader(writer.ToString()));

            reader.Read(); // Test tag

            reader.Read(); // MIAM tag
            SingleMediaItemAspectMetadata dest = MediaItemAspectMetadata.Deserialize(reader) as SingleMediaItemAspectMetadata;

            Assert.IsNotNull(dest);
            Assert.AreEqual(src.Metadata.AspectId, dest.AspectId);
            Assert.AreEqual(src.Metadata.AttributeSpecifications.Count, dest.AttributeSpecifications.Count);

            MediaItemAspectMetadata.SingleAttributeSpecification srcSpec = src.Metadata.AttributeSpecifications[src.ATTR_STRING.AttributeName] as MediaItemAspectMetadata.SingleAttributeSpecification;
            Assert.IsNotNull(srcSpec);

            MediaItemAspectMetadata.SingleAttributeSpecification destSpec = dest.AttributeSpecifications[src.ATTR_STRING.AttributeName] as MediaItemAspectMetadata.SingleAttributeSpecification;
            Assert.IsNotNull(destSpec);

            Assert.AreEqual(srcSpec.AttributeName, destSpec.AttributeName);
            Assert.AreEqual(srcSpec.AttributeType, destSpec.AttributeType);
            Assert.AreEqual(srcSpec.Cardinality, destSpec.Cardinality);
            Assert.AreEqual(srcSpec.IsCollectionAttribute, destSpec.IsCollectionAttribute);
            Assert.AreEqual(srcSpec.IsIndexed, destSpec.IsIndexed);
            Assert.AreEqual(srcSpec.MaxNumChars, destSpec.MaxNumChars);
        }
Пример #18
0
 /// <summary>
 /// Creates a table query of the main media item aspect table of the given <paramref name="miaType"/>.
 /// </summary>
 /// <param name="miaManagement">MIA management instance.</param>
 /// <param name="miaType">Type of the MIA to request.</param>
 /// <returns>Table query for the given MIA.</returns>
 public static TableQueryData CreateTableQueryOfMIATable(MIA_Management miaManagement,
                                                         MediaItemAspectMetadata miaType)
 {
     return(new TableQueryData(miaManagement.GetMIATableName(miaType)));
 }
Пример #19
0
 public BetweenFilter(MediaItemAspectMetadata.AttributeSpecification attributeType,
     object value1, object value2) : base(attributeType)
 {
   _value1 = value1;
   _value2 = value2;
 }
Пример #20
0
 public EmptyFilter(MediaItemAspectMetadata.AttributeSpecification attributeType) : base(attributeType) { }
Пример #21
0
 public static void AddMediaItemAspectStorage(MediaItemAspectMetadata meta)
 {
     MANAGEMENT.AddMediaItemAspectStorage(meta);
 }
Пример #22
0
 public Task RegisterLocallySupportedReimportMediaItemAspectTypeAsync(MediaItemAspectMetadata miaType)
 {
     _locallySupportedReimportMediaItemAspectTypes.TryAdd(miaType.AspectId, miaType);
     return(Task.CompletedTask);
 }
Пример #23
0
 public LikeFilter(MediaItemAspectMetadata.AttributeSpecification attributeType,
     string expression, char? escapeChar, bool caseSensitive) : base(attributeType, expression, escapeChar) 
 {
   _caseSensitive = caseSensitive;
 }
Пример #24
0
 public LikeFilter(MediaItemAspectMetadata.AttributeSpecification attributeType,
     string expression, char? escapeChar) : this(attributeType, expression, escapeChar, true) { }
Пример #25
0
        public void RegisterLocallyKnownMediaItemAspectType(MediaItemAspectMetadata miam)
        {
            IMediaLibrary mediaLibrary = ServiceRegistration.Get <IMediaLibrary>();

            mediaLibrary.AddMediaItemAspectStorage(miam);
        }
Пример #26
0
        protected void RequestSimpleAttribute(QueryAttribute queryAttribute,
                                              IDictionary <object, TableQueryData> tableQueries, IList <TableJoin> tableJoins, string miaJoinType,
                                              IDictionary <QueryAttribute, RequestedAttribute> requestedAttributes,
                                              IDictionary <MediaItemAspectMetadata, TableQueryData> miaTypeTableQueries,
                                              RequestedAttribute miaIdAttribute, out RequestedAttribute requestedAttribute)
        {
            if (requestedAttributes.TryGetValue(queryAttribute, out requestedAttribute))
            {
                // Already requested
                return;
            }
            MediaItemAspectMetadata.AttributeSpecification spec = queryAttribute.Attr;
            MediaItemAspectMetadata miaType = spec.ParentMIAM;
            TableQueryData          tqd;

            switch (spec.Cardinality)
            {
            case Cardinality.Inline:
                // For Inline queries, we request the Inline attribute's column name at the MIA main table, which gets joined
                // with the MIA ID
                if (!tableQueries.TryGetValue(miaType, out tqd))
                {
                    tqd = tableQueries[miaType] = TableQueryData.CreateTableQueryOfMIATable(_miaManagement, miaType);
                    if (miaTypeTableQueries != null)
                    {
                        miaTypeTableQueries.Add(miaType, tqd);
                    }
                    tableJoins.Add(new TableJoin(miaJoinType, tqd, miaIdAttribute,
                                                 new RequestedAttribute(tqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME)));
                }
                requestedAttribute = new RequestedAttribute(tqd, _miaManagement.GetMIAAttributeColumnName(queryAttribute.Attr));
                break;

            case Cardinality.ManyToOne:
                // For MTO queries, we request both the MIA main table and the MTO table
                TableQueryData miaTqd;
                if (!tableQueries.TryGetValue(miaType, out miaTqd))
                {
                    miaTqd = tableQueries[miaType] = TableQueryData.CreateTableQueryOfMIATable(_miaManagement, miaType);
                    if (miaTypeTableQueries != null)
                    {
                        miaTypeTableQueries.Add(miaType, miaTqd);
                    }
                    // Add MIA main table to list of table joins
                    tableJoins.Add(new TableJoin(miaJoinType, miaTqd, miaIdAttribute,
                                                 new RequestedAttribute(miaTqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME)));
                }
                if (!tableQueries.TryGetValue(spec, out tqd))
                {
                    tqd = tableQueries[spec] = TableQueryData.CreateTableQueryOfMTOTable(_miaManagement, spec);
                    // We must use left outer joins for MTO value tables, because if the value is null, the association FK is null
                    tableJoins.Add(new TableJoin("LEFT OUTER JOIN", tqd,
                                                 new RequestedAttribute(miaTqd, _miaManagement.GetMIAAttributeColumnName(queryAttribute.Attr)),
                                                 new RequestedAttribute(tqd, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME)));
                }
                requestedAttribute = new RequestedAttribute(tqd, MIA_Management.COLL_ATTR_VALUE_COL_NAME);
                break;

            default:
                throw new IllegalCallException("Attributes of cardinality '{0}' cannot be queried via the {1}", spec.Cardinality, GetType().Name);
            }
            requestedAttributes.Add(queryAttribute, requestedAttribute);
        }
Пример #27
0
 public SortInformation(MediaItemAspectMetadata.AttributeSpecification attributeType, SortDirection sortDirection)
 {
   _attributeType = attributeType;
   _sortDirection = sortDirection;
 }
 protected AbstractExpressionFilter(MediaItemAspectMetadata.AttributeSpecification attributeType,
     string expression, char? escapeChar) : base(attributeType)
 {
   _expression = expression;
   _escapeChar = escapeChar;
 }
Пример #29
0
 public RelationalFilter(MediaItemAspectMetadata.AttributeSpecification attributeType,
     RelationalOperator op, object filterValue) : base(attributeType)
 {
   _operator = op;
   _filterValue = filterValue;
 }
Пример #30
0
 protected override bool Include(MediaItemAspectMetadata miam)
 {
     return(true);
 }
Пример #31
0
 public static string GetMIATableIdentifier(MediaItemAspectMetadata miam)
 {
     return("T_" + SqlUtils.ToSQLIdentifier(miam.AspectId.ToString()).ToUpperInvariant());
 }
Пример #32
0
 public void RegisterMediaItemAspectRoleHierarchyChildCountAttribute(Guid childRole, Guid parentRole, MediaItemAspectMetadata parentMiaType, MediaItemAspectMetadata.AttributeSpecification childCountAttribute, bool includeVirtual)
 {
 }
Пример #33
0
 public static string SerializeAttributeTypeReference(MediaItemAspectMetadata.AttributeSpecification attributeType)
 {
   return attributeType.ParentMIAM.AspectId + ":" + attributeType.AttributeName;
 }
Пример #34
0
 public void RegisterLocallyKnownMediaItemAspectType(MediaItemAspectMetadata miaType, MediaItemAspectMetadata.AttributeSpecification[] fkSpecs, MediaItemAspectMetadata refType, MediaItemAspectMetadata.AttributeSpecification[] refSpecs)
 {
 }
Пример #35
0
        /// <summary>
        /// Generates a statement to query the distinct values of the complex <see cref="QueryAttribute"/>, together with their
        /// occurence count.
        /// </summary>
        /// <param name="queryAttributeFilter">Additional filter which is defined on the <see cref="QueryAttribute"/>.
        /// That filter COULD be part of the <see cref="Filter"/> but this method can highly optimize a filter on the
        /// query attribute, so a filter on that attribute should be given in this parameter and should not be part of the <see cref="Filter"/>.
        /// </param>
        /// <param name="valueAlias">Alias for the value column.</param>
        /// <param name="groupSizeAlias">Alias for the column containing the number of items in each group.</param>
        /// <param name="statementStr">Statement which was built by this method.</param>
        /// <param name="bindVars">Bind variables to be inserted into placeholders in the returned <paramref name="statementStr"/>.</param>
        public void GenerateSqlGroupByStatement(IAttributeFilter queryAttributeFilter,
                                                out string valueAlias, out string groupSizeAlias, out string statementStr, out IList <BindVar> bindVars)
        {
            Namespace        ns          = new Namespace();
            BindVarNamespace bvNamespace = new BindVarNamespace();

            // Contains a mapping of each queried (=selected or filtered) attribute to its request attribute instance
            // data (which holds its requested query table instance)
            IDictionary <QueryAttribute, RequestedAttribute> requestedAttributes = new Dictionary <QueryAttribute, RequestedAttribute>();

            // Dictionary containing as key the requested MIAM instance OR attribute specification of cardinality MTO,
            // mapped to the table query data to request its contents.
            IDictionary <object, TableQueryData> tableQueries = new Dictionary <object, TableQueryData>();

            // Contains the same tables as the tableQueries variable, but in order and enriched with table join data
            IList <TableJoin> tableJoins = new List <TableJoin>();

            // First create the request table query data for the MIA main table and the request attribute for the MIA ID.
            // We'll need the requested attribute as join attribute soon.
            MediaItemAspectMetadata queryMIAM     = _queryAttribute.ParentMIAM;
            TableQueryData          miaTableQuery = new TableQueryData(_miaManagement.GetMIATableName(queryMIAM));

            tableQueries.Add(queryMIAM, miaTableQuery);

            RequestedAttribute miaIdAttribute = new RequestedAttribute(miaTableQuery, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME);

            // Ensure that the tables for all necessary MIAs are requested first (INNER JOIN)
            foreach (MediaItemAspectMetadata miaType in _necessaryRequestedMIAs)
            {
                TableQueryData tqd;
                if (!tableQueries.TryGetValue(miaType, out tqd))
                {
                    tqd = tableQueries[miaType] = TableQueryData.CreateTableQueryOfMIATable(_miaManagement, miaType);
                }
                if (miaType != queryMIAM)
                {
                    tableJoins.Add(new TableJoin("INNER JOIN", tqd,
                                                 new RequestedAttribute(tqd, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME), miaIdAttribute));
                }
            }

            CompiledFilter compiledFilter = new CompiledFilter(_miaManagement, _filter, _subqueryFilter, ns, bvNamespace, miaIdAttribute.GetQualifiedName(ns), tableJoins);

            // Build table query data for each Inline attribute which is part of a filter
            // + compile query attribute
            foreach (QueryAttribute attr in compiledFilter.RequiredAttributes)
            {
                if (attr.Attr.Cardinality != Cardinality.Inline && attr.Attr.Cardinality != Cardinality.ManyToOne)
                {
                    continue;
                }
                // Tables of Inline and MTO attributes, which are part of a filter, are joined with main table
                RequestedAttribute ra;
                RequestSimpleAttribute(attr, tableQueries, tableJoins, "LEFT OUTER JOIN", requestedAttributes,
                                       null, miaIdAttribute, out ra);
            }

            TableQueryData     joinTableQuery;
            RequestedAttribute valueAttribute;

            // Build join table for value attribute
            switch (_queryAttribute.Cardinality)
            {
            case Cardinality.OneToMany:
                joinTableQuery = new TableQueryData(_miaManagement.GetMIACollectionAttributeTableName(_queryAttribute));
                tableJoins.Add(new TableJoin("LEFT OUTER JOIN", joinTableQuery,
                                             new RequestedAttribute(joinTableQuery, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME),
                                             new RequestedAttribute(miaTableQuery, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME)));
                valueAttribute = new RequestedAttribute(joinTableQuery, MIA_Management.COLL_ATTR_VALUE_COL_NAME);
                break;

            case Cardinality.ManyToMany:
                joinTableQuery = new TableQueryData(_miaManagement.GetMIACollectionAttributeNMTableName(_queryAttribute));
                tableJoins.Add(new TableJoin("LEFT OUTER JOIN", joinTableQuery,
                                             new RequestedAttribute(joinTableQuery, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME),
                                             new RequestedAttribute(miaTableQuery, MIA_Management.MIA_MEDIA_ITEM_ID_COL_NAME)));
                TableQueryData collAttrTableQuery = new TableQueryData(_miaManagement.GetMIACollectionAttributeTableName(_queryAttribute));
                tableJoins.Add(new TableJoin("LEFT OUTER JOIN", collAttrTableQuery,
                                             new RequestedAttribute(joinTableQuery, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME),
                                             new RequestedAttribute(collAttrTableQuery, MIA_Management.FOREIGN_COLL_ATTR_ID_COL_NAME)));
                valueAttribute = new RequestedAttribute(collAttrTableQuery, MIA_Management.COLL_ATTR_VALUE_COL_NAME);
                break;

            default:
                throw new IllegalCallException("Media item aspect attributes of cardinality '{0}' cannot be requested via the {1}",
                                               _queryAttribute.Cardinality, GetType().Name);
            }

            // Selected attributes
            string valueDeclaration = _selectProjectionFunction == null?
                                      valueAttribute.GetDeclarationWithAlias(ns, out valueAlias) :
                                          valueAttribute.GetDeclarationWithAlias(ns, _selectProjectionFunction, out valueAlias);

            groupSizeAlias = "C";
            StringBuilder result = new StringBuilder("SELECT COUNT(V.ID) ");

            result.Append(groupSizeAlias);
            result.Append(", V.");
            result.Append(valueAlias);
            result.Append(" FROM (");
            result.Append("SELECT DISTINCT ");
            result.Append(miaIdAttribute.GetQualifiedName(ns));
            result.Append(" ID, ");
            result.Append(valueDeclaration);

            string whereStr = compiledFilter.CreateSqlFilterCondition(ns, requestedAttributes, out bindVars);

            result.Append(" FROM ");

            // Always request the mia table
            result.Append(miaTableQuery.GetDeclarationWithAlias(ns));
            result.Append(' ');

            // Other joined tables
            foreach (TableJoin tableJoin in tableJoins)
            {
                result.Append(tableJoin.GetJoinDeclaration(ns));
                result.Append(' ');
            }

            if (!string.IsNullOrEmpty(whereStr) || queryAttributeFilter != null)
            {
                result.Append("WHERE ");
                IList <string> filters = new List <string>(2);
                if (!string.IsNullOrEmpty(whereStr))
                {
                    filters.Add(whereStr);
                }
                if (queryAttributeFilter != null)
                {
                    IList <object> resultParts = new List <object>();
                    CompiledFilter.BuildAttributeFilterExpression(queryAttributeFilter, valueAttribute.GetQualifiedName(ns), bvNamespace,
                                                                  resultParts, bindVars);
                    string filterStr = CompiledFilter.CreateSimpleSqlFilterCondition(ns, resultParts, requestedAttributes);
                    filters.Add(filterStr);
                }
                result.Append(StringUtils.Join(" AND ", filters));
            }

            result.Append(") V GROUP BY V.");
            result.Append(valueAlias);

            statementStr = result.ToString();
        }
Пример #36
0
        protected override void DoSerializeValue(object value, bool forceSimpleValue, XmlWriter writer)
        {
            MediaItemAspectMetadata miam = (MediaItemAspectMetadata)value;

            miam.Serialize(writer);
        }
Пример #37
0
 public void AddMediaItemAspectStorage(MediaItemAspectMetadata miam)
 {
     throw new NotImplementedException();
 }
Пример #38
0
 public InFilter(MediaItemAspectMetadata.AttributeSpecification attributeType,
     IEnumerable<object> values) : base(attributeType)
 {
   _values = new List<object>(values);
 }
 protected AbstractAttributeFilter(MediaItemAspectMetadata.AttributeSpecification attributeType)
 {
   _attributeType = attributeType;
 }
Пример #40
0
        const string PROPERTY_CREATION_TEMPLATE_CONTROL = "{0} = new SProperty(typeof({1}));"; // Strong references allowed for Controls, but not for models

        #endregion

        /// <summary>
        /// Creates a class that exposes <see cref="MediaItemAspectMetadata.AttributeSpecification"/> as properties that can be used from xaml.
        /// This helper can create different class styles, depending on <paramref name="createAsControl"/>:
        /// <para>
        /// <c>false</c>: Create a standalone class using WProperty as property type (for models)
        /// <c>true</c>:  Create a class that derives from Control using SProperty as property type. This class can be used as custom control.
        /// </para>
        /// </summary>
        /// <param name="aspectType">MediaAspect type.</param>
        /// <param name="classNamespace">Namespace of generated class.</param>
        /// <param name="createAsControl">Create a control (see remarks on class).</param>
        /// <param name="exposeNullable">Internal value types are exposed as C# Nullable.</param>
        /// <returns>Source code of created class.</returns>
        public string BuildCodeTemplate(Type aspectType, string classNamespace, bool createAsControl, bool exposeNullable)
        {
            MediaItemAspectMetadata metadata = GetMetadata(aspectType);

            _createAsControl = createAsControl;
            _exposeNullable  = exposeNullable;
            string baseClass  = _createAsControl ? ": Control" : "";
            string aspectName = aspectType.Name;
            IDictionary <string, MediaItemAspectMetadata.AttributeSpecification> attributeSpecifications = metadata.AttributeSpecifications;

            foreach (KeyValuePair <string, MediaItemAspectMetadata.AttributeSpecification> attributeSpecification in attributeSpecifications)
            {
                MediaItemAspectMetadata.AttributeSpecification spec = attributeSpecification.Value;
                string attrName = attributeSpecification.Key;
                Type   attrType = spec.AttributeType;

                CreateProperty(attrName, attrType, spec.IsCollectionAttribute);
            }

            #region Copyright

            // Copyright
            _copyright.Add(@"/*
    Copyright (C) 2007-2014 Team MediaPortal
    http://www.team-mediaportal.com

    This file is part of MediaPortal 2

    MediaPortal 2 is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    MediaPortal 2 is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with MediaPortal 2. If not, see <http://www.gnu.org/licenses/>.
*/");
            #endregion

            #region Headers

            // Usings
            _usings.Add("using System;");
            _usings.Add("using System.Collections.Generic;");
            _usings.Add("using MediaPortal.Common.General;");
            _usings.Add("using MediaPortal.Common.MediaManagement;");
            _usings.Add("using MediaPortal.Common.MediaManagement.DefaultItemAspects;");
            if (_createAsControl)
            {
                _usings.Add("using MediaPortal.UI.SkinEngine.Controls.Visuals;");
            }

            // Constants
            _consts.Add("public static readonly ICollection<string> EMPTY_STRING_COLLECTION = new List<string>().AsReadOnly();");

            // Common properties
            CreateProperty("MediaItem", typeof(MediaItem));
            _propertyCreation.Add("_mediaItemProperty.Attach(MediaItemChanged);");

            #endregion

            // Construct source file
            StringBuilder result = new StringBuilder();

            AppendRegion(result, "Copyright (C) 2007-2014 Team MediaPortal", _copyright, false);

            AppendRegion(result, null, _usings, false);

            result.AppendLine();
            result.AppendLine();
            result.AppendFormat("namespace {0}\r\n{{\r\n", classNamespace); // Begin of namespace

            result.AppendLine("/// <summary>");
            result.AppendFormat("/// {0}Wrapper wraps the contents of <see cref=\"{0}\"/> into properties that can be bound from xaml controls.\r\n", aspectName);
            result.AppendLine("/// Note: this code was automatically created by the MediaItemAspectModelBuilder helper tool under Resources folder.");
            result.AppendLine("/// </summary>");                                                // Begin of class
            result.AppendFormat("public class {0}Wrapper{1}\r\n{{\r\n", aspectName, baseClass); // Begin of class

            AppendRegion(result, "Constants", _consts, false);
            AppendRegion(result, "Fields", _fields, false);
            AppendRegion(result, "Properties", _properties);

            List <string> ctors = new List <string> {
                string.Format("public {0}Wrapper()\r\n{{\r\n  {1}\r\n}}", aspectName, string.Join("\r\n  ", _propertyCreation.ToArray()))
            };
            AppendRegion(result, "Constructor", ctors);

            _members.Add(@"private void MediaItemChanged(AbstractProperty property, object oldvalue)
{
  Init(MediaItem);
}");

            CreateMembers(aspectType, _members);
            AppendRegion(result, "Members", _members);

            result.AppendLine("}");     // End of class
            result.AppendLine("\r\n}"); // End of namespace

            return(result.ToString());
        }