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); }
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)); }
private IList <ViewMetadata> GetViewMetaData(ServicePackageDetails package) { var archive = _packageRepository.GetZipArchive(package); return(GetViewMetaData(archive)); }