X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=enrichment-coordinator-service%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fenrichment%2Frepository%2FEiTypes.java;h=6a1b8a114566831ff96f2ebf5306fc0a435a5a26;hb=5c4ddbe493fbe301364a499b3ae01650be566b53;hp=6397c2f094564c1fc59fd35efe025e8c478dd676;hpb=9e3bf9348a6f2a739411316591093f3b9a0fc937;p=nonrtric.git diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiTypes.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiTypes.java index 6397c2f0..6a1b8a11 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiTypes.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/repository/EiTypes.java @@ -20,15 +20,29 @@ package org.oransc.enrichment.repository; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.TypeAdapterFactory; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.PrintStream; import java.lang.invoke.MethodHandles; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Collection; import java.util.HashMap; import java.util.Map; +import java.util.ServiceLoader; import java.util.Vector; +import org.oransc.enrichment.configuration.ApplicationConfig; import org.oransc.enrichment.exceptions.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.util.FileSystemUtils; /** * Dynamic representation of all EI types in the system. @@ -37,19 +51,40 @@ import org.slf4j.LoggerFactory; public class EiTypes { private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); private final Map allEiTypes = new HashMap<>(); + private final ApplicationConfig config; + private final Gson gson; + + public EiTypes(ApplicationConfig config) { + this.config = config; + GsonBuilder gsonBuilder = new GsonBuilder(); + ServiceLoader.load(TypeAdapterFactory.class).forEach(gsonBuilder::registerTypeAdapterFactory); + this.gson = gsonBuilder.create(); + } + + public synchronized void restoreTypesFromDatabase() throws IOException { + Files.createDirectories(Paths.get(getDatabaseDirectory())); + File dbDir = new File(getDatabaseDirectory()); + + for (File file : dbDir.listFiles()) { + String json = Files.readString(file.toPath()); + EiType type = gson.fromJson(json, EiType.class); + allEiTypes.put(type.getId(), type); + } + } public synchronized void put(EiType type) { allEiTypes.put(type.getId(), type); + storeInFile(type); } - public synchronized Collection getAllEiTypes() { + public synchronized Collection getAllInfoTypes() { return new Vector<>(allEiTypes.values()); } public synchronized EiType getType(String id) throws ServiceException { EiType type = allEiTypes.get(id); if (type == null) { - throw new ServiceException("Could not find EI type: " + id); + throw new ServiceException("Information type not found: " + id); } return type; } @@ -58,12 +93,13 @@ public class EiTypes { return allEiTypes.get(id); } - public synchronized void remove(String id) { - allEiTypes.remove(id); - } - public synchronized void remove(EiType type) { - this.remove(type.getId()); + allEiTypes.remove(type.getId()); + try { + Files.delete(getPath(type)); + } catch (IOException e) { + logger.warn("Could not remove file: {} {}", type.getId(), e.getMessage()); + } } public synchronized int size() { @@ -72,14 +108,41 @@ public class EiTypes { public synchronized void clear() { this.allEiTypes.clear(); + clearDatabase(); } - public void deregisterType(EiType type, EiJobs eiJobs) { - this.remove(type); - for (EiJob job : eiJobs.getJobsForType(type.getId())) { - eiJobs.remove(job); - this.logger.warn("Deleted job {} because no producers left", job.id()); + private void clearDatabase() { + try { + FileSystemUtils.deleteRecursively(Path.of(getDatabaseDirectory())); + Files.createDirectories(Paths.get(getDatabaseDirectory())); + } catch (IOException e) { + logger.warn("Could not delete database : {}", e.getMessage()); } } + private void storeInFile(EiType type) { + try { + try (PrintStream out = new PrintStream(new FileOutputStream(getFile(type)))) { + out.print(gson.toJson(type)); + } + } catch (Exception e) { + logger.warn("Could not save job: {} {}", type.getId(), e.getMessage()); + } + } + + private File getFile(EiType type) { + return getPath(type).toFile(); + } + + private Path getPath(EiType type) { + return getPath(type.getId()); + } + + private Path getPath(String typeId) { + return Path.of(getDatabaseDirectory(), typeId); + } + + private String getDatabaseDirectory() { + return config.getVardataDirectory() + "/database/eitypes"; + } }