private void LoadServiceAssembly(string org, string service, ServicePackageDetails servicePackageDetails, ZipArchive zipArchive)
        {
            var assemblykey = org + "_" + service;

            var          assemblyName = servicePackageDetails.AssemblyName + ".dll";
            MemoryStream memoryStream = new MemoryStream();

            using (Stream input = zipArchive.Entries.First(e => e.Name == assemblyName).Open())
            {
                input.CopyTo(memoryStream);
            }

            memoryStream.Position = 0;
            AssemblyLoadContext.Default.LoadFromStream(memoryStream);

            if (_compilation.ServiceReferences.ContainsKey(assemblykey))
            {
                _compilation.ServiceReferences.Remove(assemblykey);
            }

            memoryStream.Seek(0, SeekOrigin.Begin);
            MetadataReference newReference = MetadataReference.CreateFromStream(memoryStream);

            _compilation.ServiceReferences.Add(assemblykey, newReference);
        }
        private string GetActivePackage(string org, string service, string edition)
        {
            List <AltinnCore.ServiceLibrary.ServiceMetadata.ServicePackageDetails> servicePackages = GetServicePackages(org, service, edition);
            ServicePackageDetails servicePackage = servicePackages.OrderBy(s => s.CreatedDateTime).LastOrDefault();

            return(servicePackage.PackageName);
        }
        private List <ServicePackageDetails> GetServicePackages(string org, string service, string edition)
        {
            List <ServicePackageDetails> packageDetails = new List <ServicePackageDetails>();
            string packageDirectory = string.Format(_packageLocation, org, service, edition);

            if (!Directory.Exists(packageDirectory))
            {
                return(packageDetails);
            }

            foreach (string fileName in Directory.EnumerateFiles(packageDirectory))
            {
                ServicePackageDetails details = JsonConvert.DeserializeObject <ServicePackageDetails>(new StreamReader(ZipFile.OpenRead(fileName).Entries.First(e => e.Name == "ServicePackageDetails.json").Open()).ReadToEnd());
                details.PackageName = Path.GetFileName(fileName);
                packageDetails.Add(details);
            }

            return(packageDetails);
        }
        /// <summary>
        /// Creates a zip-file containing all files necessary for executing a service
        /// </summary>
        /// <param name="org">The organization code for the service owner</param>
        /// <param name="service">The service code for the current service</param>
        /// <param name="edition">The edition code for the current service</param>
        /// <returns>Was the package creation successful</returns>
        public bool CreateServicePackage(string org, string service, string edition)
        {
            ServiceMetadata serviceMetadata = _repository.GetServiceMetaData(org, service, edition);

            string packagesDir = _settings.GetServicePackagesPath(org, service, edition, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext));
            string tempDir     = _settings.GetTemporaryPath(org, service, edition, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext));

            string tempDirName = Path.GetRandomFileName();
            string tempDirPath = tempDir + tempDirName + "/";

            CopyDirectoryContents(_settings.GetViewPath(org, service, edition, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext)), tempDirPath + ServiceRepositorySettings.VIEW_FOLDER_NAME);
            CopyDirectoryContents(_settings.GetMetadataPath(org, service, edition, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext)), tempDirPath + ServiceRepositorySettings.METADATA_FOLDER_NAME);
            CopyDirectoryContents(_settings.GetCodelistPath(org, service, edition, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext)), tempDirPath + ServiceRepositorySettings.CODELISTS_FOLDER_NAME);
            CopyDirectoryContents(_settings.GetResourcePath(org, service, edition, AuthenticationHelper.GetDeveloperUserName(_httpContextAccessor.HttpContext)), tempDirPath + ServiceRepositorySettings.RESOURCE_FOLDER_NAME);

            Directory.CreateDirectory(tempDirPath + "/Assemblies/");
            Directory.CreateDirectory(packagesDir);

            string compileResult = string.Empty;
            string assemblyName  = CreateServiceAssembly(org, service, edition, tempDirPath + "/Assemblies/").AssemblyName;

            ServicePackageDetails details = new ServicePackageDetails
            {
                AssemblyName    = assemblyName,
                Organization    = org,
                Service         = service,
                Edition         = edition,
                CreatedDateTime = DateTime.Now
            };

            string detailsAsJson = JsonConvert.SerializeObject(details);
            string filePath      = tempDirPath + "/ServicePackageDetails.json";

            File.WriteAllText(filePath, detailsAsJson, Encoding.UTF8);

            ZipFile.CreateFromDirectory(tempDirPath, packagesDir + tempDirName + ".zip");

            Directory.Delete(tempDirPath, true);

            return(true);
        }
Exemple #5
0
        private bool IsThereANewPackage(string packageFolder, DateTime updated)
        {
            bool isUpdated = false;
            List <ServicePackageDetails> packageDetails = new List <ServicePackageDetails>();

            if (!Directory.Exists(packageFolder))
            {
                return(false);
            }

            foreach (string fileName in Directory.EnumerateFiles(packageFolder))
            {
                ServicePackageDetails details = JsonConvert.DeserializeObject <ServicePackageDetails>(new StreamReader(ZipFile.OpenRead(fileName).Entries.First(e => e.Name == "ServicePackageDetails.json").Open()).ReadToEnd());

                if (details.CreatedDateTime > updated)
                {
                    isUpdated = true;
                }
            }

            return(isUpdated);
        }
        private IServiceImplementation GetServiceImplementation(string org, string service, ServicePackageDetails activePackage, ZipArchive zipArchive)
        {
            LoadServiceAssembly(org, service, activePackage, zipArchive);
            var implementationTypeName = string.Format(CodeGeneration.ServiceNamespaceTemplate, org, service)
                                         + ".ServiceImplementation," + activePackage.AssemblyName;
            var type = Type.GetType(implementationTypeName);

            return((IServiceImplementation)Activator.CreateInstance(type));
        }
Exemple #7
0
        private IList <ViewMetadata> GetViewMetaData(ServicePackageDetails package)
        {
            var archive = _packageRepository.GetZipArchive(package);

            return(GetViewMetaData(archive));
        }