This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git

commit f797c4dbfbd0d94cf74a51f54741c39aef861e74
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Sun Aug 25 12:44:52 2024 -0400

    Project and File events
---
 .../org/apache/camel/karavan/KaravanCache.java     | 38 ++++++++++++++++++----
 .../org/apache/camel/karavan/KaravanEvents.java    |  6 ++++
 .../apache/camel/karavan/KaravanStartupLoader.java | 18 +++++-----
 .../camel/karavan/api/ProjectFileResource.java     |  7 ++--
 .../apache/camel/karavan/service/CodeService.java  | 14 +++++++-
 .../camel/karavan/service/ConfigService.java       |  2 +-
 .../camel/karavan/service/ProjectService.java      | 22 ++++++-------
 7 files changed, 75 insertions(+), 32 deletions(-)

diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
index f60877d5..5d1ead6d 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
@@ -16,7 +16,10 @@
  */
 package org.apache.camel.karavan;
 
+import io.vertx.core.eventbus.EventBus;
+import io.vertx.core.json.JsonObject;
 import jakarta.enterprise.inject.Default;
+import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 import org.apache.camel.karavan.model.*;
 
@@ -29,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 import static org.apache.camel.karavan.KaravanConstants.DEV;
+import static org.apache.camel.karavan.KaravanEvents.*;
 
 @Default
 @Singleton
@@ -44,6 +48,9 @@ public class KaravanCache {
     private final Map<String, ServiceStatus> serviceStatuses = new 
ConcurrentHashMap<>();
     private final Map<String, CamelStatus> camelStatuses = new 
ConcurrentHashMap<>();
 
+    @Inject
+    EventBus eventBus;
+
 
     // lists of copies
     private List<Project> getCopyProjects() {
@@ -93,9 +100,12 @@ public class KaravanCache {
         return new ArrayList<>(getCopyProjects());
     }
 
-    public void saveProject(Project project) {
+    public void saveProject(Project project, boolean startup) {
         var key = GroupedKey.create(project.getProjectId(), DEV, 
project.getProjectId());
         projects.put(key, project);
+        if (!startup) {
+            eventBus.publish(PROJECT_SAVED, JsonObject.mapFrom(project));
+        }
     }
 
     public List<ProjectFile> getProjectFiles(String projectId) {
@@ -117,8 +127,11 @@ public class KaravanCache {
         return getCopyProjectFiles().stream().filter(pf -> 
Objects.equals(pf.getName(), filename)).toList();
     }
 
-    public void saveProjectFile(ProjectFile file, boolean commited) {
+    public void saveProjectFile(ProjectFile file, boolean commited, boolean 
startup) {
         files.put(GroupedKey.create(file.getProjectId(), DEV, file.getName()), 
file);
+        if (!startup) {
+            eventBus.publish(PROJECT_FILE_SAVED, JsonObject.mapFrom(file));
+        }
         if (commited) {
             filesCommited.put(GroupedKey.create(file.getProjectId(), DEV, 
file.getName()), file);
         }
@@ -136,14 +149,21 @@ public class KaravanCache {
                 .forEach(es -> filesCommited.put(es.getKey(), 
es.getValue().copy()));
     }
 
-    public void saveProjectFiles(Map<String, ProjectFile> filesToSave) {
+    public void saveProjectFiles(Map<String, ProjectFile> filesToSave, boolean 
startup) {
         long lastUpdate = Instant.now().toEpochMilli();
         filesToSave.forEach((groupedKey, projectFile) -> 
projectFile.setLastUpdate(lastUpdate));
         files.putAll(filesToSave);
+        if (!startup) {
+            files.forEach((s, file) -> eventBus.publish(PROJECT_FILE_SAVED, 
JsonObject.mapFrom(file)));
+        }
     }
 
-    public void deleteProjectFile(String projectId, String filename) {
-        files.remove(GroupedKey.create(projectId, DEV, filename));
+    public void deleteProjectFile(String projectId, String filename, boolean 
startup) {
+        var key = new GroupedKey(projectId, DEV, filename);
+        files.remove(key.getCacheKey());
+        if (!startup) {
+            eventBus.publish(PROJECT_FILE_DELETED, JsonObject.mapFrom(key));
+        }
     }
 
     public List<ProjectFile> getProjectFilesCommited(String projectId) {
@@ -159,8 +179,12 @@ public class KaravanCache {
         filesCommited.remove(GroupedKey.create(projectId, DEV, filename));
     }
 
-    public void deleteProject(String projectId) {
-        projects.remove(GroupedKey.create(projectId, DEV, projectId));
+    public void deleteProject(String projectId, boolean startup) {
+        var key = new GroupedKey(projectId, DEV, projectId);
+        projects.remove(key.getCacheKey());
+        if (!startup) {
+            eventBus.publish(PROJECT_DELETED, JsonObject.mapFrom(key));
+        }
     }
 
     public Project getProject(String projectId) {
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java
index b4f806bd..f2fa16d7 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java
@@ -18,7 +18,13 @@ package org.apache.camel.karavan;
 
 public class KaravanEvents {
 
+    public static final String PROJECT_SAVED = "PROJECT_SAVED";
+    public static final String PROJECT_DELETED = "PROJECT_DELETED";
+    public static final String PROJECT_FILE_SAVED = "PROJECT_FILE_SAVED";
+    public static final String PROJECT_FILE_DELETED = "PROJECT_FILE_DELETED";
+
     public static final String CMD_PUSH_PROJECT = "CMD_PUSH_PROJECT";
+
     public static final String NOTIFICATION_PROJECTS_STARTED = 
"NOTIFICATION_PROJECTS_STARTED";
     public static final String COMMIT_HAPPENED = "COMMIT_HAPPENED";
     public static final String NOTIFICATION_IMAGES_LOADED = 
"NOTIFICATION_IMAGES_LOADED";
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java
index 7e38894b..5b760eff 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java
@@ -131,11 +131,11 @@ public class KaravanStartupLoader implements HealthCheck {
                 } else {
                     project = projectService.getProjectFromRepo(repo);
                 }
-                karavanCache.saveProject(project);
+                karavanCache.saveProject(project, true);
 
                 repo.getFiles().forEach(repoFile -> {
                     ProjectFile file = new ProjectFile(repoFile.getName(), 
repoFile.getBody(), folderName, repoFile.getLastCommitTimestamp());
-                    karavanCache.saveProjectFile(file, true);
+                    karavanCache.saveProjectFile(file, true, true);
                 });
             });
         } catch (Exception e) {
@@ -149,7 +149,7 @@ public class KaravanStartupLoader implements HealthCheck {
             if (kamelets == null) {
                 LOGGER.info("Add custom kamelets project");
                 kamelets = new Project(Project.Type.kamelets.name(), "Custom 
Kamelets", "", Instant.now().toEpochMilli(), Project.Type.kamelets);
-                karavanCache.saveProject(kamelets);
+                karavanCache.saveProject(kamelets, true);
             }
         } catch (Exception e) {
             LOGGER.error("Error during custom kamelets project creation", e);
@@ -162,11 +162,11 @@ public class KaravanStartupLoader implements HealthCheck {
             if (templates == null) {
                 LOGGER.info("Add templates project");
                 templates = new Project(Project.Type.templates.name(), 
"Templates", "", Instant.now().toEpochMilli(), Project.Type.templates);
-                karavanCache.saveProject(templates);
+                karavanCache.saveProject(templates, true);
 
                 codeService.getTemplates().forEach((name, value) -> {
                     ProjectFile file = new ProjectFile(name, value, 
Project.Type.templates.name(), Instant.now().toEpochMilli());
-                    karavanCache.saveProjectFile(file, false);
+                    karavanCache.saveProjectFile(file, false, true);
                 });
             } else {
                 codeService.getTemplates().forEach((name, value) -> {
@@ -174,7 +174,7 @@ public class KaravanStartupLoader implements HealthCheck {
                     if (f == null) {
                         LOGGER.info("Add new template " + name);
                         ProjectFile file = new ProjectFile(name, value, 
Project.Type.templates.name(), Instant.now().toEpochMilli());
-                        karavanCache.saveProjectFile(file, false);
+                        karavanCache.saveProjectFile(file, false, true);
                     }
                 });
             }
@@ -189,11 +189,11 @@ public class KaravanStartupLoader implements HealthCheck {
             if (configuration == null) {
                 LOGGER.info("Add configuration project");
                 configuration = new Project(Project.Type.configuration.name(), 
"Configuration", "", Instant.now().toEpochMilli(), Project.Type.configuration);
-                karavanCache.saveProject(configuration);
+                karavanCache.saveProject(configuration, true);
 
                 codeService.getConfigurationFiles().forEach((name, value) -> {
                     ProjectFile file = new ProjectFile(name, value, 
Project.Type.configuration.name(), Instant.now().toEpochMilli());
-                    karavanCache.saveProjectFile(file, false);
+                    karavanCache.saveProjectFile(file, false, true);
                 });
             } else {
                 codeService.getConfigurationFiles().forEach((name, value) -> {
@@ -201,7 +201,7 @@ public class KaravanStartupLoader implements HealthCheck {
                     if (f == null) {
                         LOGGER.info("Add new configuration " + name);
                         ProjectFile file = new ProjectFile(name, value, 
Project.Type.configuration.name(), Instant.now().toEpochMilli());
-                        karavanCache.saveProjectFile(file, false);
+                        karavanCache.saveProjectFile(file, false, true);
                     }
                 });
             }
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
index 8085037b..f8310f08 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
@@ -100,7 +100,7 @@ public class ProjectFileResource {
         if (projectFileExists) {
             return Response.serverError().entity("File with given name already 
exists").build();
         } else {
-            karavanCache.saveProjectFile(file, false);
+            karavanCache.saveProjectFile(file, false, false);
             return Response.ok(file).build();
         }
     }
@@ -110,7 +110,7 @@ public class ProjectFileResource {
     @Consumes(MediaType.APPLICATION_JSON)
     public ProjectFile update(ProjectFile file) throws Exception {
         file.setLastUpdate(Instant.now().toEpochMilli());
-        karavanCache.saveProjectFile(file, false);
+        karavanCache.saveProjectFile(file, false, false);
         return file;
     }
 
@@ -121,7 +121,8 @@ public class ProjectFileResource {
                        @PathParam("filename") String filename) throws 
Exception {
         karavanCache.deleteProjectFile(
                 URLDecoder.decode(project, StandardCharsets.UTF_8),
-                URLDecoder.decode(filename, StandardCharsets.UTF_8)
+                URLDecoder.decode(filename, StandardCharsets.UTF_8),
+                false
         );
     }
 }
\ No newline at end of file
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
index 75539cf1..5d1a5bbf 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
@@ -75,6 +75,9 @@ public class CodeService {
     @ConfigProperty(name = "karavan.gav")
     Optional<String> gav;
 
+    @Inject
+    ConfigService configService;
+
     @Inject
     KaravanCache karavanCache;
 
@@ -109,6 +112,7 @@ public class CodeService {
                 .filter(f -> !f.getName().endsWith(MARKDOWN_EXTENSION))
                 .filter(f -> !Objects.equals(f.getName(), 
PROJECT_COMPOSE_FILENAME))
                 .filter(f -> !f.getName().endsWith(PROJECT_JKUBE_EXTENSION))
+                .filter(this::isDevFile)
                 .collect(Collectors.toMap(ProjectFile::getName, 
ProjectFile::getCode));
 
         if (withKamelets) {
@@ -118,6 +122,13 @@ public class CodeService {
         return files;
     }
 
+    private boolean isDevFile(ProjectFile f) {
+        var filename = f.getName();
+        var parts = filename.split("\\.");
+        var prefix = parts[0];
+        return !configService.getEnvs().contains(prefix);
+    }
+
     public String getBuilderPodFragment() {
         ProjectFile projectFile = 
karavanCache.getProjectFile(Project.Type.configuration.name(), 
BUILDER_POD_FRAGMENT_FILENAME);
         return projectFile != null ? projectFile.getCode() : null;
@@ -357,7 +368,7 @@ public class CodeService {
             service.setImage(imageName);
             String code = DockerComposeConverter.toCode(service);
             compose.setCode(code);
-            karavanCache.saveProjectFile(compose, false);
+            karavanCache.saveProjectFile(compose, false, false);
         }
     }
 
@@ -382,6 +393,7 @@ public class CodeService {
     private static String toEnvFormat(String input) {
         return input.replaceAll("[^a-zA-Z0-9]", "_").toUpperCase();
     }
+
     private static Set<String> findVariables(String template) {
         Set<String> variables = new HashSet<>();
 
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java
index 165c0728..0ee504e2 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java
@@ -157,7 +157,7 @@ public class ConfigService {
         }
     }
 
-    private List<String> getEnvs() {
+    protected List<String> getEnvs() {
         return environments.orElse(List.of(DEV));
     }
 
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
index e1340087..1c2f6995 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
@@ -86,7 +86,7 @@ public class ProjectService {
             Long lastUpdate = commit.getCommitTime() * 1000L;
             p.setLastCommit(commitId);
             p.setLastCommitTimestamp(lastUpdate);
-            karavanCache.saveProject(p);
+            karavanCache.saveProject(p, false);
             return p;
         } else {
             throw new RuntimeException("Unsupported environment: " + 
environment);
@@ -158,10 +158,10 @@ public class ProjectService {
         LOGGER.info("Import project from GitRepo " + repo.getName());
         try {
             Project project = getProjectFromRepo(repo);
-            karavanCache.saveProject(project);
+            karavanCache.saveProject(project, false);
             repo.getFiles().forEach(repoFile -> {
                 ProjectFile file = new ProjectFile(repoFile.getName(), 
repoFile.getBody(), repo.getName(), repoFile.getLastCommitTimestamp());
-                karavanCache.saveProjectFile(file, true);
+                karavanCache.saveProjectFile(file, true, false);
             });
         } catch (Exception e) {
             LOGGER.error("Error during project import", e);
@@ -234,15 +234,15 @@ public class ProjectService {
         if (projectIdExists) {
             throw new Exception("Project with id " + project.getProjectId() + 
" already exists");
         } else {
-            karavanCache.saveProject(project);
+            karavanCache.saveProject(project, false);
             ProjectFile appProp = 
codeService.generateApplicationProperties(project);
-            karavanCache.saveProjectFile(appProp, false);
+            karavanCache.saveProjectFile(appProp, false, false);
             if (!ConfigService.inKubernetes()) {
                 ProjectFile projectCompose = 
codeService.createInitialProjectCompose(project, getMaxPortMappedInProjects() + 
1);
-                karavanCache.saveProjectFile(projectCompose, false);
+                karavanCache.saveProjectFile(projectCompose, false, false);
             } else {
                 ProjectFile projectDeployment = 
codeService.createInitialDeployment(project);
-                karavanCache.saveProjectFile(projectDeployment, false);
+                karavanCache.saveProjectFile(projectDeployment, false, false);
             }
         }
         return project;
@@ -258,7 +258,7 @@ public class ProjectService {
             Project sourceProject = karavanCache.getProject(sourceProjectId);
 
             // Save project
-            karavanCache.saveProject(project);
+            karavanCache.saveProject(project, false);
 
             // Copy files from the source and make necessary modifications
             Map<String, ProjectFile> filesMap = 
karavanCache.getProjectFilesMap(sourceProjectId).entrySet().stream()
@@ -276,14 +276,14 @@ public class ProjectService {
                                 return file;
                             })
                     );
-            karavanCache.saveProjectFiles(filesMap);
+            karavanCache.saveProjectFiles(filesMap, false);
 
             if (!ConfigService.inKubernetes()) {
                 ProjectFile projectCompose = 
codeService.createInitialProjectCompose(project, getMaxPortMappedInProjects() + 
1);
-                karavanCache.saveProjectFile(projectCompose, false);
+                karavanCache.saveProjectFile(projectCompose, false, false);
             } else {
                 ProjectFile projectCompose = 
codeService.createInitialDeployment(project);
-                karavanCache.saveProjectFile(projectCompose, false);
+                karavanCache.saveProjectFile(projectCompose, false, false);
             }
 
             return project;

Reply via email to