/// <summary>
        ///     Initializes a new instance of the <see cref="SolutionDependency" /> class.
        /// </summary>
        /// <param name="dependency">The dependency.</param>
        /// <exception cref="ArgumentNullException"></exception>
        /// <exception cref="ArgumentException">No dependency id specified.</exception>
        public SolutionDependency(AppPackageDependency dependency)
        {
            if (dependency == null)
            {
                throw new ArgumentNullException(nameof(dependency));
            }

            if (dependency.AppPackageDependencyId == null)
            {
                throw new ArgumentException("No dependency id specified.");
            }

            Name           = dependency.Name;
            DependencyName = dependency.AppPackageDependencyName;

            Version minVersion;

            if (string.IsNullOrEmpty(dependency.AppPackageMinimumVersion) || dependency.AppPackageMinimumVersion.Equals("any", StringComparison.InvariantCultureIgnoreCase) || !Version.TryParse(dependency.AppPackageMinimumVersion, out minVersion))
            {
                MinimumVersion = null;
            }
            else
            {
                MinimumVersion = minVersion;
            }

            Version maxVersion;

            if (string.IsNullOrEmpty(dependency.AppPackageMaximumVersion) || dependency.AppPackageMaximumVersion.Equals("any", StringComparison.InvariantCultureIgnoreCase) || !Version.TryParse(dependency.AppPackageMaximumVersion, out maxVersion))
            {
                MaximumVersion = null;
            }
            else
            {
                MaximumVersion = maxVersion;
            }

            IsRequired            = dependency.AppPackageIsRequired ?? true;
            DependencyApplication = dependency.AppPackageDependencyId.Value;
        }
Esempio n. 2
0
        /// <summary>
        ///     Set the application metadata.
        /// </summary>
        /// <param name="metadata"></param>
        /// <param name="context"></param>
        void IDataTarget.SetMetadata(Metadata metadata, IProcessingContext context)
        {
            if (SkipMetadata)
            {
                context.WriteInfo("Skipping app library metadata");
                return;
            }

            /////
            // Write the application
            /////
            App app = Entity.GetByField <App>(metadata.AppId.ToString( ), new EntityRef("core:applicationId")).FirstOrDefault( );

            if (app == null)
            {
                app = new App
                {
                    Name          = metadata.AppName,
                    Description   = metadata.Description,
                    ApplicationId = metadata.AppId,
                    Publisher     = metadata.Publisher,
                    PublisherUrl  = metadata.PublisherUrl,
                    ReleaseDate   = metadata.ReleaseDate == DateTime.MinValue.ToUniversalTime() ? ( DateTime? )null : metadata.ReleaseDate.ToUniversalTime()
                };

                app.Save( );
            }

            /////
            // Write the app-package
            /////
            AppPackage package = app.ApplicationPackages.FirstOrDefault(ap => ap.AppVerId == metadata.AppVerId);

            if (package == null)
            {
                package = new AppPackage( );

                var version = new Version(metadata.Version);

                AppPackage existingVersion = app.ApplicationPackages.FirstOrDefault(ap => ap.AppVersionString == version.ToString( ));

                bool versionExists = false;

                while (existingVersion != null)
                {
                    versionExists = true;

                    version = new Version(version.Major, version.Minor + 1);

                    existingVersion = app.ApplicationPackages.FirstOrDefault(ap => ap.AppVersionString == version.ToString( ));
                }

                metadata.Version = version.ToString( );

                if (versionExists)
                {
                    context.WriteWarning("Version already exists.. incrementing");
                }
            }
            else
            {
                package = package.AsWritable <AppPackage>( );
                context.WriteWarning("Already installed.. overwriting");
            }

            string solutionNames = app.InSolution?.Name;

            /////
            // Localize the string values.
            /////
            package.Name                  = string.Format("{0} Application Package {1}", solutionNames ?? app.Name, metadata.Version);
            package.Description           = string.Format("Application Package for version {1} of {0}.", app.Name, metadata.Version);
            package.AppVersionString      = metadata.Version;
            package.AppVerId              = metadata.AppVerId;
            package.PackageForApplication = app;

            if (metadata.PublishDate != DateTime.MinValue && metadata.PublishDate > SqlDateTime.MinValue.Value)
            {
                package.PublishDate = metadata.PublishDate;
            }

            if (metadata.Dependencies != null)
            {
                IEntityCollection <AppPackageDependency> dependencies = new EntityCollection <AppPackageDependency>( );

                foreach (SolutionDependency dependency in metadata.Dependencies)
                {
                    AppPackageDependency appPackageDependency = new AppPackageDependency
                    {
                        Name = dependency.Name,
                        AppPackageDependencyName = dependency.DependencyName,
                        AppPackageDependencyId   = dependency.DependencyApplication,
                        AppPackageMinimumVersion = dependency.MinimumVersion == null ? null : dependency.MinimumVersion.ToString(4),
                        AppPackageMaximumVersion = dependency.MaximumVersion == null ? null : dependency.MaximumVersion.ToString(4),
                        AppPackageIsRequired     = dependency.IsRequired
                    };

                    dependencies.Add(appPackageDependency);
                }

                package.DependentAppPackageDetails = dependencies;
            }

            package.Save( );
        }