コード例 #1
0
        public Application AddApplication(string name, ApplicationDefinition applicationDefinition)
        {
            var conf = _configuration.Value;

            if (_applicationStore.Contains(name))
            {
                throw new Exception($"An application with the name '{name}' already exists.");
            }

            var applicationImages = applicationDefinition.Images
                                    .Select(imageSettings =>
            {
                PreviewReleaseDeploymentSettings?previewReleaseDeploymentSettings = null;
                if (imageSettings.PreviewRelease != null)
                {
                    previewReleaseDeploymentSettings = new PreviewReleaseDeploymentSettings(
                        true,
                        imageSettings.PreviewRelease.UpdatePolicy.Type switch
                    {
                        UpdatePolicy.Glob => new GlobImageUpdatePolicy(
                            imageSettings.PreviewRelease.UpdatePolicy.Pattern),
                        UpdatePolicy.Regex => new RegexImageUpdatePolicy(imageSettings.PreviewRelease
                                                                         .UpdatePolicy.Pattern),
                        UpdatePolicy.Semver => new SemverImageUpdatePolicy(imageSettings.PreviewRelease
                                                                           .UpdatePolicy.Pattern),
                        _ => throw new NotImplementedException()
                    },
                        imageSettings.PreviewRelease.Parameters.Regex.Tag
                        );
                }
コード例 #2
0
        public override StartResult Start(ApplicationDefinition applicationDefinition)
        {
            var windowsApplicationDefinition = ToWindowsPhoneApplicationDefinition(applicationDefinition);

            InvokeTrace("launching app...");
            var app = SafeGetApplication(windowsApplicationDefinition.ProductGuid);

            if (app == null)
            {
                InvokeTrace("not installed");
                return(StartResult.NotInstalled);
            }

            /*
             * app.IsRunning is not supported for WP7
             * if (app.IsRunning())
             * {
             *  InvokeTrace("already running");
             *  return StartResult.AlreadyRunning;
             * }
             */

            app.Launch();
            InvokeTrace("app launched");
            return(StartResult.Success);
        }
コード例 #3
0
        public async Task <Response <ApplicationDefinition> > GetAsync(string resourceGroupName, string applicationDefinitionName, CancellationToken cancellationToken = default)
        {
            if (resourceGroupName == null)
            {
                throw new ArgumentNullException(nameof(resourceGroupName));
            }
            if (applicationDefinitionName == null)
            {
                throw new ArgumentNullException(nameof(applicationDefinitionName));
            }

            using var message = CreateGetRequest(resourceGroupName, applicationDefinitionName);
            await _pipeline.SendAsync(message, cancellationToken).ConfigureAwait(false);

            switch (message.Response.Status)
            {
            case 200:
            {
                ApplicationDefinition value = default;
                using var document = await JsonDocument.ParseAsync(message.Response.ContentStream, default, cancellationToken).ConfigureAwait(false);

                if (document.RootElement.ValueKind == JsonValueKind.Null)
                {
                    value = null;
                }
                else
                {
                    value = ApplicationDefinition.DeserializeApplicationDefinition(document.RootElement);
                }
                return(Response.FromValue(value, message.Response));
            }
        /// <summary>
        /// Constructs the resource
        /// </summary>
        private JToken GetResource()
        {
            var applicationDefinitionObject = new ApplicationDefinition
            {
                Name       = this.Name,
                Location   = this.Location,
                Properties = new ApplicationDefinitionProperties
                {
                    LockLevel      = this.LockLevel,
                    Description    = this.Description,
                    DisplayName    = this.DisplayName,
                    PackageFileUri = this.PackageFileUri ?? null,
                    Authorizations = JArray.Parse(this.GetAuthorizationObject(this.Authorization).ToString()).ToJson().FromJson <ApplicationProviderAuthorization[]>()
                },
                Tags = TagsHelper.GetTagsDictionary(this.Tag)
            };

            if (!string.IsNullOrEmpty(this.MainTemplate) && !string.IsNullOrEmpty(this.CreateUiDefinition))
            {
                applicationDefinitionObject.Properties.MainTemplate       = JObject.Parse(this.GetObjectFromParameter(this.MainTemplate).ToString());
                applicationDefinitionObject.Properties.CreateUiDefinition = JObject.Parse(this.GetObjectFromParameter(this.CreateUiDefinition).ToString());
            }

            return(applicationDefinitionObject.ToJToken());
        }
        /// <summary>
        /// Constructs the resource
        /// </summary>
        private JToken GetResource(string resourceId, string apiVersion)
        {
            var resource = this.GetExistingResource(resourceId, apiVersion).Result.ToResource();

            var applicationDefinitionObject = new ApplicationDefinition
            {
                Name       = this.Name,
                Location   = resource.Location,
                Properties = new ApplicationDefinitionProperties
                {
                    LockLevel   = (ApplicationLockLevel)Enum.Parse(typeof(ApplicationLockLevel), resource.Properties["lockLevel"].ToString(), true),
                    Description = this.Description ?? (resource.Properties["description"] != null
                        ? resource.Properties["description"].ToString()
                        : null),
                    DisplayName = this.DisplayName ?? (resource.Properties["displayName"] != null
                        ? resource.Properties["displayName"].ToString()
                        : null),
                    PackageFileUri = this.PackageFileUri ?? null,
                    Authorizations = this.Authorization != null
                        ? JArray.Parse(this.GetAuthorizationObject(this.Authorization).ToString()).ToJson().FromJson <ApplicationProviderAuthorization[]>()
                        : JArray.Parse(resource.Properties["authorizations"].ToString()).ToJson().FromJson <ApplicationProviderAuthorization[]>()
                },
                Tags = TagsHelper.GetTagsDictionary(this.Tag) ?? resource.Tags
            };

            return(applicationDefinitionObject.ToJToken());
        }
コード例 #6
0
ファイル: DemoModel.cs プロジェクト: jonkeda/Plastic
        public static ApplicationDefinition Create()
        {
            ApplicationDefinition application = new ApplicationDefinition
            {
                Name = "Demo"
            };

            DatabaseDefinition database = new DatabaseDefinition()
            {
                Name = "Database"
            };

            application.Databases.Add(database);

            TableDefinition table = new TableDefinition()
            {
                Name = "Customer"
            };

            database.Tables.Add(table);

            table.Fields.Add(new IntFieldDefinition {
                Name = "ID"
            });
            table.Fields.Add(new StringFieldDefinition {
                Name = "FullName"
            });
            table.Fields.Add(new IntFieldDefinition {
                Name = "BirthDate"
            });


            return(application);
        }
        public AppConfigFileBasedConfiguration()
        {
            AutomationControllerName       = ConfigurationManager.AppSettings[EmuStepsAutomationControllerKeyName];
            ControllerInitialisationString = ConfigurationManager.AppSettings[EmuStepsControllerInitialisationKeyName];
            if (string.IsNullOrEmpty(AutomationControllerName))
            {
                AutomationControllerName = "wp";
            }
            if (string.IsNullOrEmpty(ControllerInitialisationString))
            {
                ControllerInitialisationString = string.Empty;
            }

            AutomationIdentification automationIdentification;

            if (Enum.TryParse(ConfigurationManager.AppSettings[EmuStepsAutomationIdentificationKeyName], true, out automationIdentification))
            {
                AutomationIdentification = automationIdentification;
            }
            else
            {
                AutomationIdentification = AutomationIdentification.TryEverything;
            }

            ApplicationDefinition = new ApplicationDefinition();
            foreach (var key in ConfigurationManager.AppSettings.AllKeys)
            {
                if (key.StartsWith(EmuStepsApplicationPrefix) && key.Length > EmuStepsApplicationPrefix.Length)
                {
                    ApplicationDefinition.Fields[key.Substring(EmuStepsApplicationPrefix.Length)] =
                        ConfigurationManager.AppSettings[key];
                }
            }
        }
コード例 #8
0
ファイル: University.cs プロジェクト: jonkeda/Plastic
        public static ApplicationDefinition Create()
        {
            ApplicationDefinition application = new ApplicationDefinition
            {
                Namespace = "ContosoUniversity"
            };

            DatabaseDefinition database = new DatabaseDefinition
            {
                Name = "School"
            };

            application.Databases.Add(database);

            database.AddTable(CourseTableDefinition());
            database.AddTable(DepartmentTableDefinition());
            database.AddTable(EnrollmentTableDefinition());
            database.AddTable(InstructorTableDefinition());
            database.AddTable(OfficeAssignmentTableDefinition());
            database.AddTable(PersonTableDefinition());
            database.AddTable(StudentTableDefinition());

            application.Enumerations.Add(GradeDefinition());

            return(application);
        }
コード例 #9
0
        public void CreateDefinition()
        {
            ApplicationDefinition application = DemoModel.Create();

            Assert.AreEqual("Demo", application.Name);
            Assert.AreEqual(application.Databases.Count, 1);
        }
コード例 #10
0
ファイル: UniversityTest.cs プロジェクト: jonkeda/Plastic
        public void CreateDefinition()
        {
            ApplicationDefinition application     = University.Create();
            ApplicationInfo       applicationInfo = new ApplicationInfo();

            applicationInfo.Set(application);

            CrudCreator crudCreator = new CrudCreator();

            crudCreator.Create(applicationInfo);

            Shipment shipment = new Shipment();

            EfFactory factory = new EfFactory();

            factory.Manufacture(shipment, applicationInfo);

            EnumerationFactory enumerationFactory = new EnumerationFactory();

            enumerationFactory.Manufacture(shipment, applicationInfo);

            MvcFactory mvcFactory = new MvcFactory();

            mvcFactory.Manufacture(shipment, applicationInfo);

            shipment.Save(@"C:\Sources\Plastic\Plastic.University");
        }
コード例 #11
0
        public async Task ListBySubscription()
        {
            Subscription subscription = await Client.GetDefaultSubscriptionAsync();

            string            rgName = Recording.GenerateAssetName("testRg-3-");
            ResourceGroupData rgData = new ResourceGroupData(Location.WestUS2);
            var lro = await subscription.GetResourceGroups().CreateOrUpdateAsync(rgName, rgData);

            ResourceGroup             rg              = lro.Value;
            string                    appDefName      = Recording.GenerateAssetName("appDef-L-");
            ApplicationDefinitionData appDefData      = CreateApplicationDefinitionData(appDefName);
            ApplicationDefinition     appDef          = (await rg.GetApplicationDefinitions().CreateOrUpdateAsync(appDefName, appDefData)).Value;
            string                    appName         = Recording.GenerateAssetName("application-L-");
            ApplicationData           applicationData = CreateApplicationData(appDef.Id, subscription.Id + Recording.GenerateAssetName("/resourceGroups/managed-3-"), Recording.GenerateAssetName("s3"));

            _ = await rg.GetApplications().CreateOrUpdateAsync(appName, applicationData);

            int count = 0;

            await foreach (var tempApplication in subscription.GetApplicationsAsync())
            {
                if (tempApplication.Data.ApplicationDefinitionId == appDef.Id)
                {
                    count++;
                }
            }
            Assert.AreEqual(count, 1);
        }
コード例 #12
0
        public override StopResult Stop(ApplicationDefinition applicationDefinition)
        {
            var windowsApplicationDefinition = ToWindowsPhoneApplicationDefinition(applicationDefinition);

            InvokeTrace("ensuring application is stopped...");

            if (!Device.IsApplicationInstalled(windowsApplicationDefinition.ProductGuid))
            {
                InvokeTrace("application is not installed");
                return(StopResult.NotInstalled);
            }

            var app = SafeGetApplication(windowsApplicationDefinition.ProductGuid);

            if (app == null)
            {
                InvokeTrace("failed to get application");
                return(StopResult.NotInstalled); // really this is an error case - but just return NotInstalled for now
            }

            /*
             * IsRunning is not supported on WP7
             * if (!app.IsRunning())
             * {
             *  InvokeTrace("application is not running");
             *  return StopResult.NotRunning;
             * }
             */

            InvokeTrace("stopping application...");
            try
            {
                app.TerminateRunningInstances();
            }
            catch (Exception ex)
            {
                try
                {
                    InvokeTrace("CurrentDeviceID =" + Device.Id);
                    // An exception here can't be recovered but we can leave things in a better state for the next test if we kill the emulator
                    var processes = Process.GetProcessesByName("Xde");
                    foreach (var process in processes)
                    {
                        InvokeTrace("ProcessId = " + process.Id);
                        process.Kill();
                    }
                }
                catch (Exception)
                {
                    // We can but try, but if we can't let's ignore it
                    InvokeTrace("failed to close emulator");
                }

                throw ex;
            }

            InvokeTrace("application stopped");
            return(StopResult.Success);
        }
コード例 #13
0
ファイル: DatabaseUnitTest.cs プロジェクト: jonkeda/Plastic
        public void CreateDefinition()
        {
            ApplicationDefinition application = DemoModel.Create();

            DatabaseDefinition database = application.Databases.First();

            Assert.AreEqual("Database", database.Name);
            Assert.AreEqual(1, database.Tables.Count);
        }
コード例 #14
0
        public override UninstallationResult Uninstall(ApplicationDefinition applicationDefinition)
        {
            var adbDefinition = new AdbApplicationDefinition(applicationDefinition);

            // first uninstall the stub package
            Uninstall(adbDefinition.StubPackageName);

            // then uninstall the app package
            return(Uninstall(adbDefinition.PackageName));
        }
コード例 #15
0
        public void CreateDefinition()
        {
            ApplicationDefinition application = DemoModel.Create();

            DatabaseDefinition database = application.Databases.First();
            TableDefinition    table    = database.Tables.First();

            Assert.AreEqual("Customer", table.Name);
            Assert.AreEqual(3, table.Fields.Count);
        }
コード例 #16
0
        protected RemoteIsolatedStorageFile GetIsoStorage(ApplicationDefinition applicationDefinition)
        {
            var windowsApplicationDefinition = ToWindowsPhoneApplicationDefinition(applicationDefinition);

            var app = SafeGetApplication(windowsApplicationDefinition.ProductGuid);

            var store = app.GetIsolatedStore();

            return(store);
        }
コード例 #17
0
        public override string GetIsolatedStorage(ApplicationDefinition applicationDefinition)
        {
            var store = GetIsoStorage(applicationDefinition);

            string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\IsolatedStore\Temp\" + Guid.NewGuid().ToString();

            ReceiveDirectory(store, desktopPath);

            return(desktopPath);
        }
コード例 #18
0
ファイル: FieldUnitTest.cs プロジェクト: jonkeda/Plastic
        public void CreateDefinition()
        {
            ApplicationDefinition application = DemoModel.Create();

            DatabaseDefinition database = application.Databases.First();
            TableDefinition    table    = database.Tables.First();
            FieldDefinition    field    = table.Fields.First();

            Assert.AreEqual("ID", field.Name);
        }
コード例 #19
0
 private static ApplicationInfo MapApplicationInfo(ApplicationDefinition definition)
 {
     return(new ApplicationInfo
     {
         ApplicationId = definition.ApplicationId,
         Name = definition.Name,
         Description = definition.Description,
         Metadata = definition.Metadata
     });
 }
コード例 #20
0
        public void CreateInfo()
        {
            ApplicationDefinition application = DemoModel.Create();

            ApplicationInfo applicationInfo = new ApplicationInfo();

            applicationInfo.Set(application);

            Assert.AreEqual("Demo", applicationInfo.Name);
            Assert.AreEqual(applicationInfo.Databases.Count, 1);
        }
コード例 #21
0
        private static ApplicationDefinition MapApplication(ApplicationInfo info)
        {
            var data = new ApplicationDefinition
            {
                Name        = info.Name,
                Description = info.Description,
                Metadata    = info.Metadata
            };

            return(data);
        }
コード例 #22
0
        private async Task <TenantDeployment> ProcessTenantDeploymentAsync(TenantDeployment tenantDeploymentDeployment, CancellationToken cancellationToken)
        {
            var exists = await this.applicationOperator.ApplicationExistsAsync(tenantDeploymentDeployment.ApplicationName, cancellationToken);

            var serviceDefinition = new ServiceDefinition()
            {
                ServiceName = "MC",
                Type        = "MCType",
                Version     = "1.0.0"
            };

            var applicationDefinition = new ApplicationDefinition()
            {
                ApplicationName = tenantDeploymentDeployment.ApplicationName,
                Type            = "mcType",
                Version         = "1.0.0",
                Services        = new List <ServiceDefinition>()
                {
                    serviceDefinition
                }
            };

            if (exists)
            {
                string serviceName = $"{tenantDeploymentDeployment.ApplicationName}/{serviceDefinition.ServiceName}";


                var serviceEndPoint = await this.applicationOperator.GetServiceEndpoint(serviceName, cancellationToken);

                if (serviceEndPoint.HasEndPoint)
                {
                    ServiceEventSource.Current.ServiceMessage(this.Context, "Found new internal endpoint");
                    return(new TenantDeployment(CreationStatus.Created, serviceEndPoint.EndPoint["MCTypeEndpoint"], serviceEndPoint.EndPoint["MCrcon"], tenantDeploymentDeployment));
                }

                // no endpoint yet leave alone.
                return(new TenantDeployment(CreationStatus.InProcess, tenantDeploymentDeployment));
            }
            else
            {
                var(mcPort, rconPort) = await GetNextAvaliablePortsAsync();

                serviceDefinition.Ports = new Dictionary <string, int>()
                {
                    { "MCPORT", mcPort },
                    { "RCONPORT", rconPort }
                };

                await this.applicationOperator.CreateApplicationAsync(applicationDefinition, cancellationToken);

                ServiceEventSource.Current.ServiceMessage(this.Context, "Application created");
                return(new TenantDeployment(CreationStatus.New, tenantDeploymentDeployment));
            }
        }
コード例 #23
0
        public virtual string ImportVersionToApplication(Guid appId, ApplicationDefinition definition, string versionId = "")
        {
            try {
                var result = LuisRepository.ImportVersionToApplication(appId, definition, versionId);

                return(result);
            } catch (Exception ex) {
                Logger.Error("LuisService.GetApplicationVersions failed", this, ex);
            }

            return(null);
        }
コード例 #24
0
        public virtual string ImportApplication(ApplicationDefinition request, string appName = "")
        {
            try {
                var result = LuisRepository.ImportApplication(request, appName);

                return(result);
            } catch (Exception ex) {
                Logger.Error("LuisService.ImportApplication failed", this, ex);
            }

            return(null);
        }
コード例 #25
0
 public virtual string ImportApplication(ApplicationDefinition request, string appName = "")
 {
     return(PolicyService.ExecuteRetryAndCapture400Errors(
                "LuisService.ImportApplication",
                ApiKeys.LuisRetryInSeconds,
                () =>
     {
         var result = LuisRepository.ImportApplication(request, appName);
         return result;
     },
                null));
 }
コード例 #26
0
 public virtual string ImportVersionToApplication(Guid appId, ApplicationDefinition definition, string versionId = "")
 {
     return(PolicyService.ExecuteRetryAndCapture400Errors(
                "LuisService.ImportVersionToApplication",
                ApiKeys.LuisRetryInSeconds,
                () =>
     {
         var result = LuisRepository.ImportVersionToApplication(appId, definition, versionId);
         return result;
     },
                null));
 }
コード例 #27
0
ファイル: DatabaseUnitTest.cs プロジェクト: jonkeda/Plastic
        public void CreateInfo()
        {
            ApplicationDefinition applicationDefinition = DemoModel.Create();

            ApplicationInfo application = new ApplicationInfo();

            application.Set(applicationDefinition);

            DatabaseInfo database = application.Databases.First();

            Assert.AreEqual("Database", database.Name);
            Assert.AreEqual(1, database.Tables.Count);
        }
コード例 #28
0
        public void CreateDefinition()
        {
            ApplicationDefinition application     = DemoModel.Create();
            ApplicationInfo       applicationInfo = new ApplicationInfo();

            applicationInfo.Set(application);

            EfFactory factory = new EfFactory();

            Shipment shipment = new Shipment();

            factory.Manufacture(shipment, applicationInfo);
        }
コード例 #29
0
        public async Task DeleteApplicationDefinitions()
        {
            #region Snippet:Managing_ApplicationDefinitions_DeleteAnApplicationDefinition
            // First we need to get the application definition collection from the resource group
            ApplicationDefinitionCollection applicationDefinitionCollection = resourceGroup.GetApplicationDefinitions();
            // Now we can get the application definition with GetAsync()
            ApplicationDefinition applicationDefinition = await applicationDefinitionCollection.GetAsync("myApplicationDefinition");

            // With DeleteAsync(), we can delete the application definition
            await applicationDefinition.DeleteAsync(WaitUntil.Completed);

            #endregion Snippet:Managing_ApplicationDefinitions_DeleteAnApplicationDefinition
        }
コード例 #30
0
ファイル: FieldUnitTest.cs プロジェクト: jonkeda/Plastic
        public void CreateInfo()
        {
            ApplicationDefinition applicationDefinition = DemoModel.Create();

            ApplicationInfo application = new ApplicationInfo();

            application.Set(applicationDefinition);

            DatabaseInfo database = application.Databases.First();
            TableInfo    table    = database.Tables.First();
            IFieldInfo   field    = table.Fields.First();

            Assert.AreEqual("ID", field.Name);
        }
コード例 #31
0
        private ApplicationDefinition CreateApplicationDefinition( List<Reference> references, IEnumerable<PackageFile> files )
        {
            var defaultEnvironments = DefaultEnvironments.Select(
                e => ( TargetEnvironment )Enum.Parse( typeof( TargetEnvironment ), e ) );

            var scripts = files.Where( f => f.Environment != TargetEnvironment.None );
            var specifiedEnvironments = scripts.Where( f => f.Environment != TargetEnvironment.All ).Select( f => f.Environment ).Distinct();
            specifiedEnvironments = specifiedEnvironments.Union( defaultEnvironments );

            Guid = Guid.Replace( "{", "" ).Replace( "}", "" );
            ApplicationDefinition appdef = new ApplicationDefinition { Name = Name, Guid = Guid };

            // Create the module elements.
            foreach( var env in specifiedEnvironments )
            {
                var module = new ApplicationModule { Environment = env.ToString().ToLower() };
                appdef.Modules.Add( module );

                // Add the bootstrap scripts.
                module.Files.Add( new ApplicationFile { Name = "_package_start.js" } );

                // Add javascript files from the references.
                foreach( var r in references )
                {
                    var referencedScripts = r.GetScriptsForEnvironment( env );
                    foreach( var script in referencedScripts )
                    {
                        var file = new ApplicationFile { Name = r.PackageName + "/" + script };
                        module.Files.Add( file );
                    }
                }

                // Add the application's own javascript files.
                var environmentScripts = scripts.Where( s => s.Environment == TargetEnvironment.All || s.Environment == env );
                foreach( var script in environmentScripts )
                {
                    var file = new ApplicationFile { Name = script.PathInProject };
                    module.Files.Add( file );
                }

                module.Files.Add( new ApplicationFile { Name = "_package_end.js" } );
            }

            foreach( var db in files.Where(f => f.IsDashboard ) )
            {
                var dashboard = new ApplicationDashboard
                {
                    Id = Path.GetFileNameWithoutExtension(db.PathInProject),
                    Content = db.PathInProject
                };
                appdef.Dashboards.Add(dashboard);
            }

            foreach( var r in references )
            {
                foreach( var db in r.GetDashboards() )
                {
                    var dashboard = new ApplicationDashboard
                    {
                        Id = db.Key,
                        Content = r.PackageName + "/" + db.Value
                    };
                    appdef.Dashboards.Add( dashboard );
                }
            }

            return appdef;
        }
コード例 #32
0
        public override bool Execute()
        {
            Log.LogMessage( MessageImportance.Low, "Packing M-Files Application." );

            // Gather all the JavaScript files
            var scripts = new List<string>();
            scripts.AddRange( SourceFiles );

            // Gather all reference files.
            // For now we do not support project or zip references so this step doesn't require anything special.
            var referenceFiles = References ?? new string[] { };

            Log.LogMessage( MessageImportance.Low, "Resolving references." );

            // Make sure the referenced files exist.
            var missingFiles = referenceFiles.Where( r => !File.Exists( r ) ).ToList();
            foreach( var missingFile in missingFiles )
                Log.LogError( "Referenced file '{0}' does not exist.", missingFile );
            if( missingFiles.Count > 0 )
                return false;

            // Resolve references by filename.
            var referencesByName = referenceFiles.GroupBy( f => Path.GetFileName( f ) );

            // Resolve the final filenames.
            var finalReferences = new Dictionary<string, string>();
            foreach( var nameGroup in referencesByName )
            {
                var fileName = nameGroup.Key;
                var files = nameGroup.ToList();

                if( fileName.ToLower() == "appdef.xml" ) continue;
                if( fileName.ToLower() == "_package.js" ) continue;

                for( int i = 0; i < files.Count; i++ )
                {
                    // If there are more than one file with the same name, use a $i as postfix for it.
                    string postfix = "";
                    if( files.Count > 1 )
                        postfix = "$" + i;

                    string finalFileName =
                        Path.GetFileNameWithoutExtension( fileName ) +
                        postfix +
                        Path.GetExtension( fileName );

                    finalReferences[ files[ i ] ] = finalFileName;
                }

            }

            // Generate the package definition.
            var appdef = new ApplicationDefinition();
            appdef.Guid = this.Guid.Replace("{", "").Replace("}", "");
            appdef.Name = this.Name;
            var appfiles = new List<ApplicationFile>();
            appfiles.Add( new ApplicationFile { Name = "_package.js" } );
            foreach( var environment in new[] { "vaultcore", "vaultui", "shellui" } )
            {
                var module = new ApplicationModule { Environment = environment };
                appdef.Modules.Add( module );
                module.Files = appfiles;
            }

            // Build the zip file.

            // Add the local scripts.
            if( File.Exists( OutputFile ) )
                File.Delete( OutputFile );
            var outputZip = new Ionic.Zip.ZipFile( OutputFile );
            foreach( var file in SourceFiles )
            {
                outputZip.AddFile( file );
                appfiles.Add( new ApplicationFile { Name = file } );
            }

            // Add the referenced scripts.
            foreach( var reference in finalReferences )
            {
                var file = reference.Key;
                if( Path.GetExtension( file ) == ".zip" )
                {
                    var inputZip = new Ionic.Zip.ZipFile( file );
                    foreach( var e in inputZip.Entries )
                    {
                        var filename = Path.GetFileName( e.FileName ).ToLower();
                        if( filename == "appdef.xml" ) continue;
                        if( filename == "_package.js" ) continue;

                        var tempStream = new MemoryStream();
                        e.Extract( tempStream );
                        tempStream.Position = 0;
                        var projectName = Path.GetFileNameWithoutExtension( reference.Value );
                        var entryPath = "_references/" + projectName + "/" + e.FileName;
                        outputZip.AddEntry( entryPath, tempStream );
                        appfiles.Add( new ApplicationFile { Name = entryPath } );
                    }
                }
                else
                {
                    var entry = outputZip.AddFile( file );
                    entry.FileName = "_references/" + reference.Value;
                    appfiles.Add( new ApplicationFile { Name = entry.FileName } );
                }
            }

            var stream = new MemoryStream();
            var serializer = new XmlSerializer( typeof( ApplicationDefinition ) );
            serializer.Serialize( stream, appdef );
            stream.Flush();
            stream.Position = 0;
            outputZip.AddEntry( "appdef.xml", stream );

            var packageStream = this.GetType().Assembly.GetManifestResourceStream( "MFiles.SDK.Tasks.Scripts.package.js" );
            outputZip.AddEntry( "_package.js", packageStream );

            outputZip.Save();

            LogArray( "Scripts", outputZip.Entries.Select( e => e.FileName ) );

            return true;
        }