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

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 72028f1968 Issue #6042 (clear db cache when switching prj/env) (#6170)
72028f1968 is described below

commit 72028f1968793dcb4f28591382a179da34f0d9e4
Author: Matt Casters <[email protected]>
AuthorDate: Tue Dec 23 14:32:29 2025 +0100

    Issue #6042 (clear db cache when switching prj/env) (#6170)
    
    Co-authored-by: Matt Casters <[email protected]>
---
 .../src/main/java/org/apache/hop/core/DbCache.java | 135 ++----------
 .../apache/hop/projects/config/ProjectsConfig.java | 229 ++-------------------
 .../config/ProjectsConfigOptionPlugin.java         | 182 +++-------------
 .../org/apache/hop/projects/util/ProjectsUtil.java |  10 +
 .../config/messages/messages_en_US.properties      |   1 +
 5 files changed, 78 insertions(+), 479 deletions(-)

diff --git a/core/src/main/java/org/apache/hop/core/DbCache.java 
b/core/src/main/java/org/apache/hop/core/DbCache.java
index 0654791348..396a7ce87c 100644
--- a/core/src/main/java/org/apache/hop/core/DbCache.java
+++ b/core/src/main/java/org/apache/hop/core/DbCache.java
@@ -17,20 +17,11 @@
 
 package org.apache.hop.core;
 
-import java.io.BufferedOutputStream;
-import java.io.DataInputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.util.Enumeration;
 import java.util.Hashtable;
-import org.apache.hop.core.exception.HopEofException;
-import org.apache.hop.core.exception.HopFileException;
-import org.apache.hop.core.logging.ILogChannel;
-import org.apache.hop.core.logging.LogChannel;
+import lombok.Getter;
+import lombok.Setter;
 import org.apache.hop.core.row.IRowMeta;
-import org.apache.hop.core.row.RowMeta;
 
 /**
  * This class caches database queries so that the same query doesn't get 
called twice. Queries are
@@ -40,28 +31,11 @@ public class DbCache {
   private static DbCache dbCache;
 
   private Hashtable<DbCacheEntry, IRowMeta> cache;
-  private boolean usecache;
 
-  private ILogChannel log;
-
-  public void setActive() {
-    setActive(true);
-  }
-
-  public void setInactive() {
-    setActive(false);
-  }
-
-  public void setActive(boolean act) {
-    usecache = act;
-  }
-
-  public boolean isActive() {
-    return usecache;
-  }
+  @Getter @Setter private boolean active;
 
   public void put(DbCacheEntry entry, IRowMeta fields) {
-    if (!usecache) {
+    if (!active) {
       return;
     }
 
@@ -76,7 +50,7 @@ public class DbCache {
    * @return the fields as a row generated by a database cache entry
    */
   public IRowMeta get(DbCacheEntry entry) {
-    if (!usecache) {
+    if (!active) {
       return null;
     }
 
@@ -101,7 +75,6 @@ public class DbCache {
   public void clear(String dbname) {
     if (dbname == null) {
       cache = new Hashtable<>();
-      setActive();
     } else {
       Enumeration<DbCacheEntry> keys = cache.keys();
       while (keys.hasMoreElements()) {
@@ -114,87 +87,9 @@ public class DbCache {
     }
   }
 
-  public String getFilename() {
-    return Const.HOP_AUDIT_FOLDER + Const.FILE_SEPARATOR + "db.cache";
-  }
-
-  private DbCache() throws HopFileException {
-    try {
-      clear(null);
-
-      // Serialization support for the DB cache
-      //
-      log = new LogChannel("DbCache");
-
-      String filename = getFilename();
-      File file = new File(filename);
-      if (file.canRead()) {
-        log.logDetailed("Loading database cache from file: [" + filename + 
"]");
-
-        try (FileInputStream fis = new FileInputStream(file);
-            DataInputStream dis = new DataInputStream(fis)) {
-          int counter = 0;
-          try {
-            while (true) {
-              DbCacheEntry entry = new DbCacheEntry(dis);
-              IRowMeta row = new RowMeta(dis);
-              cache.put(entry, row);
-              counter++;
-            }
-          } catch (HopEofException eof) {
-            log.logDetailed("We read " + counter + " cached rows from the 
database cache!");
-          }
-        } catch (Exception e) {
-          throw new Exception(e);
-        }
-      } else {
-        log.logDetailed("The database cache doesn't exist yet.");
-      }
-    } catch (Exception e) {
-      throw new HopFileException("Couldn't read the database cache", e);
-    }
-  }
-
-  public void saveCache() throws HopFileException {
-    try {
-      // Serialization support for the DB cache
-      //
-      String filename = getFilename();
-      File file = new File(filename);
-      if (!file.exists() || file.canWrite()) {
-
-        try (FileOutputStream fos = new FileOutputStream(file);
-            DataOutputStream dos = new DataOutputStream(new 
BufferedOutputStream(fos, 10000))) {
-
-          int counter = 0;
-
-          Enumeration<DbCacheEntry> keys = cache.keys();
-          while (keys.hasMoreElements()) {
-            // Save the database cache entry
-            DbCacheEntry entry = keys.nextElement();
-            entry.write(dos);
-
-            // Save the corresponding row as well.
-            IRowMeta rowMeta = get(entry);
-            if (rowMeta != null) {
-              rowMeta.writeMeta(dos);
-              counter++;
-            } else {
-              throw new HopFileException(
-                  "The database cache contains an empty row. We can't save 
this!");
-            }
-          }
-
-          log.logDetailed("We wrote " + counter + " cached rows to the 
database cache!");
-        } catch (Exception e) {
-          throw new Exception(e);
-        }
-      } else {
-        throw new HopFileException("We can't write to the cache file: " + 
filename);
-      }
-    } catch (Exception e) {
-      throw new HopFileException("Couldn't write to the database cache", e);
-    }
+  private DbCache() {
+    cache = new Hashtable<>();
+    active = true;
   }
 
   /**
@@ -202,15 +97,15 @@ public class DbCache {
    *
    * @return the database cache instance.
    */
-  public static final DbCache getInstance() {
-    if (dbCache != null) {
-      return dbCache;
-    }
-    try {
+  public static DbCache getInstance() {
+    if (dbCache == null) {
       dbCache = new DbCache();
-    } catch (HopFileException kfe) {
-      throw new RuntimeException("Unable to create the database cache: " + 
kfe.getMessage());
     }
     return dbCache;
   }
+
+  /** Clear the whole cache in one go */
+  public static void clearAll() {
+    getInstance().clear(null);
+  }
 }
diff --git 
a/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfig.java
 
b/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfig.java
index a435acb437..f52b4de15d 100644
--- 
a/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfig.java
+++ 
b/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfig.java
@@ -42,6 +42,7 @@ public class ProjectsConfig {
   private boolean environmentMandatory;
   private boolean environmentsForActiveProject;
   private boolean sortByNameLastUsedProjects;
+  private boolean clearingDbCacheWhenSwitching;
   private String defaultProject;
   private String defaultEnvironment;
   private String standardParentProject;
@@ -58,6 +59,7 @@ public class ProjectsConfig {
     projectConfigurations = new ArrayList<>();
     lifecycleEnvironments = new ArrayList<>();
     projectLifecycles = new ArrayList<>();
+    clearingDbCacheWhenSwitching = true;
   }
 
   public ProjectsConfig(ProjectsConfig config) {
@@ -74,6 +76,7 @@ public class ProjectsConfig {
     standardProjectsFolder = config.standardProjectsFolder;
     defaultProjectConfigFile = config.defaultProjectConfigFile;
     environmentsForActiveProject = config.environmentsForActiveProject;
+    clearingDbCacheWhenSwitching = config.clearingDbCacheWhenSwitching;
     sortByNameLastUsedProjects = config.sortByNameLastUsedProjects;
   }
 
@@ -97,13 +100,12 @@ public class ProjectsConfig {
    */
   public List<LifecycleEnvironment> findEnvironmentsOfProject(String 
projectName) {
     List<LifecycleEnvironment> list = new ArrayList<>();
-    lifecycleEnvironments.stream()
-        .forEach(
-            e -> {
-              if (e.getProjectName().equals(projectName)) {
-                list.add(e);
-              }
-            });
+    lifecycleEnvironments.forEach(
+        e -> {
+          if (e.getProjectName().equals(projectName)) {
+            list.add(e);
+          }
+        });
     return list;
   }
 
@@ -134,7 +136,7 @@ public class ProjectsConfig {
 
   public List<String> listProjectConfigNames() {
     List<String> names = new ArrayList<>();
-    projectConfigurations.stream().forEach(config -> 
names.add(config.getProjectName()));
+    projectConfigurations.forEach(config -> 
names.add(config.getProjectName()));
     Collections.sort(names);
     return names;
   }
@@ -177,13 +179,12 @@ public class ProjectsConfig {
 
   public List<String> listEnvironmentNamesForProject(String projectName) {
     List<String> names = new ArrayList<>();
-    lifecycleEnvironments.stream()
-        .forEach(
-            env -> {
-              if (env.getProjectName().equals(projectName)) {
-                names.add(env.getName());
-              }
-            });
+    lifecycleEnvironments.forEach(
+        env -> {
+          if (env.getProjectName().equals(projectName)) {
+            names.add(env.getName());
+          }
+        });
 
     Collections.sort(names);
     return names;
@@ -200,7 +201,7 @@ public class ProjectsConfig {
       return null;
     }
     for (ProjectLifecycle lifecycle : projectLifecycles) {
-      if (lifecycle.equals(lifecycleName)) {
+      if (lifecycle.getName().equalsIgnoreCase(lifecycleName)) {
         return lifecycle;
       }
     }
@@ -219,14 +220,14 @@ public class ProjectsConfig {
   public ProjectLifecycle removeLifecycle(String lifecycleName) {
     ProjectLifecycle lifecycle = findLifecycle(lifecycleName);
     if (lifecycle != null) {
-      lifecycleEnvironments.remove(lifecycle);
+      projectLifecycles.remove(lifecycle);
     }
     return lifecycle;
   }
 
   public List<String> listLifecycleNames() {
     List<String> names = new ArrayList<>();
-    projectLifecycles.stream().forEach(lifecycle -> 
names.add(lifecycle.getName()));
+    projectLifecycles.forEach(lifecycle -> names.add(lifecycle.getName()));
     Collections.sort(names);
     return names;
   }
@@ -238,196 +239,4 @@ public class ProjectsConfig {
             Collections.emptyList(),
             Collections.emptyList())); // Only considers the name
   }
-
-  /**
-   * Gets enabled
-   *
-   * @return value of enabled
-   */
-  public boolean isEnabled() {
-    return enabled;
-  }
-
-  /**
-   * @param enabled The enabled to set
-   */
-  public void setEnabled(boolean enabled) {
-    this.enabled = enabled;
-  }
-
-  /**
-   * Gets projectConfigurations
-   *
-   * @return value of projectConfigurations
-   */
-  public List<ProjectConfig> getProjectConfigurations() {
-    return projectConfigurations;
-  }
-
-  /**
-   * @param projectConfigurations The projectConfigurations to set
-   */
-  public void setProjectConfigurations(List<ProjectConfig> 
projectConfigurations) {
-    this.projectConfigurations = projectConfigurations;
-  }
-
-  /**
-   * Gets lifecycleEnvironments
-   *
-   * @return value of lifecycleEnvironments
-   */
-  public List<LifecycleEnvironment> getLifecycleEnvironments() {
-    return lifecycleEnvironments;
-  }
-
-  /**
-   * @param lifecycleEnvironments The lifecycleEnvironments to set
-   */
-  public void setLifecycleEnvironments(List<LifecycleEnvironment> 
lifecycleEnvironments) {
-    this.lifecycleEnvironments = lifecycleEnvironments;
-  }
-
-  /**
-   * Gets defaultProject
-   *
-   * @return value of defaultProject
-   */
-  public String getDefaultProject() {
-    return defaultProject;
-  }
-
-  /**
-   * @param defaultProject The defaultProject to set
-   */
-  public void setDefaultProject(String defaultProject) {
-    this.defaultProject = defaultProject;
-  }
-
-  /**
-   * Gets projectMandatory
-   *
-   * @return value of projectMandatory
-   */
-  public boolean isProjectMandatory() {
-    return projectMandatory;
-  }
-
-  /**
-   * @param projectMandatory The projectMandatory to set
-   */
-  public void setProjectMandatory(boolean projectMandatory) {
-    this.projectMandatory = projectMandatory;
-  }
-
-  /**
-   * Gets environmentMandatory
-   *
-   * @return value of environmentMandatory
-   */
-  public boolean isEnvironmentMandatory() {
-    return environmentMandatory;
-  }
-
-  /**
-   * @param environmentMandatory The environmentMandatory to set
-   */
-  public void setEnvironmentMandatory(boolean environmentMandatory) {
-    this.environmentMandatory = environmentMandatory;
-  }
-
-  /**
-   * Gets defaultEnvironment
-   *
-   * @return value of defaultEnvironment
-   */
-  public String getDefaultEnvironment() {
-    return defaultEnvironment;
-  }
-
-  /**
-   * @param defaultEnvironment The defaultEnvironment to set
-   */
-  public void setDefaultEnvironment(String defaultEnvironment) {
-    this.defaultEnvironment = defaultEnvironment;
-  }
-
-  /**
-   * Gets standardParentProject
-   *
-   * @return value of standardParentProject
-   */
-  public String getStandardParentProject() {
-    return standardParentProject;
-  }
-
-  /**
-   * @param standardParentProject The standardParentProject to set
-   */
-  public void setStandardParentProject(String standardParentProject) {
-    this.standardParentProject = standardParentProject;
-  }
-
-  /**
-   * Gets projectLifecycles
-   *
-   * @return value of projectLifecycles
-   */
-  public List<ProjectLifecycle> getProjectLifecycles() {
-    return projectLifecycles;
-  }
-
-  /**
-   * @param projectLifecycles The projectLifecycles to set
-   */
-  public void setProjectLifecycles(List<ProjectLifecycle> projectLifecycles) {
-    this.projectLifecycles = projectLifecycles;
-  }
-
-  /**
-   * Gets standardProjectsFolder
-   *
-   * @return value of standardProjectsFolder
-   */
-  public String getStandardProjectsFolder() {
-    return standardProjectsFolder;
-  }
-
-  /**
-   * @param standardProjectsFolder The standardProjectsFolder to set
-   */
-  public void setStandardProjectsFolder(String standardProjectsFolder) {
-    this.standardProjectsFolder = standardProjectsFolder;
-  }
-
-  /**
-   * Gets defaultProjectConfigFile
-   *
-   * @return value of defaultProjectConfigFile
-   */
-  public String getDefaultProjectConfigFile() {
-    return defaultProjectConfigFile;
-  }
-
-  /**
-   * @param defaultProjectConfigFile The defaultProjectConfigFile to set
-   */
-  public void setDefaultProjectConfigFile(String defaultProjectConfigFile) {
-    this.defaultProjectConfigFile = defaultProjectConfigFile;
-  }
-
-  /**
-   * Gets environmentsForActiveProject
-   *
-   * @return value of environmentsForActiveProject
-   */
-  public boolean isEnvironmentsForActiveProject() {
-    return environmentsForActiveProject;
-  }
-
-  /**
-   * @param environmentsForActiveProject The environmentMandatory to set
-   */
-  public void setEnvironmentsForActiveProject(boolean 
environmentsForActiveProject) {
-    this.environmentsForActiveProject = environmentsForActiveProject;
-  }
 }
diff --git 
a/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfigOptionPlugin.java
 
b/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfigOptionPlugin.java
index f52a6246b9..e6c6414270 100644
--- 
a/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfigOptionPlugin.java
+++ 
b/plugins/misc/projects/src/main/java/org/apache/hop/projects/config/ProjectsConfigOptionPlugin.java
@@ -53,6 +53,8 @@ import picocli.CommandLine;
 @GuiPlugin(
     description = "i18n::ProjectConfig.Tab.Name" // label in options dialog
     )
+@Getter
+@Setter
 public class ProjectsConfigOptionPlugin
     implements IConfigOptions, IGuiPluginCompositeWidgetsListener {
 
@@ -67,6 +69,7 @@ public class ProjectsConfigOptionPlugin
   private static final String WIDGET_ID_STANDARD_PROJECTS_FOLDER = 
"10060-standard-projects-folder";
   private static final String 
WIDGET_ID_RESTRICT_ENVIRONMENTS_TO_ACTIVE_PROJECT =
       "10070-restrict-environments-to-active-project";
+  private static final String WIDGET_ID_CLEAR_DB_CACHE = 
"10080-clear-db-cache";
   private static final String WIDGET_ID_DEFAULT_PROJECT_CONFIG_FILENAME =
       "10070-default-project-config-filename";
   private static final String WIDGET_ID_SORT_BY_NAME_LAST_USED_PROJECTS =
@@ -171,6 +174,17 @@ public class ProjectsConfigOptionPlugin
       description = "Restrict environment list to active project")
   private Boolean environmentsForActiveProject;
 
+  @GuiWidgetElement(
+      id = WIDGET_ID_CLEAR_DB_CACHE,
+      parentId = ConfigPluginOptionsTab.GUI_WIDGETS_PARENT_ID,
+      type = GuiElementType.CHECKBOX,
+      variables = false,
+      label = "i18n::ProjectConfig.ClearDbCache.Message")
+  @CommandLine.Option(
+      names = {"-cdb", "--clear-db-when-env-switching"},
+      description = "Clear database cache when switching project/environment")
+  private Boolean clearingDbCacheWhenSwitching;
+
   @GuiWidgetElement(
       id = WIDGET_ID_SORT_BY_NAME_LAST_USED_PROJECTS,
       parentId = ConfigPluginOptionsTab.GUI_WIDGETS_PARENT_ID,
@@ -200,6 +214,7 @@ public class ProjectsConfigOptionPlugin
     instance.defaultProjectConfigFile = config.getDefaultProjectConfigFile();
     instance.environmentsForActiveProject = 
config.isEnvironmentsForActiveProject();
     instance.sortByNameLastUsedProjects = 
config.isSortByNameLastUsedProjects();
+    instance.clearingDbCacheWhenSwitching = 
config.isClearingDbCacheWhenSwitching();
     return instance;
   }
 
@@ -280,6 +295,17 @@ public class ProjectsConfigOptionPlugin
         }
         changed = true;
       }
+      if (clearingDbCacheWhenSwitching != null) {
+        config.setClearingDbCacheWhenSwitching(clearingDbCacheWhenSwitching);
+        if (clearingDbCacheWhenSwitching) {
+          log.logBasic("Clearing database cache when switching project or 
environment.");
+        } else {
+          log.logBasic(
+              "Keeping the database cache when switching between projects or 
environments.");
+        }
+        changed = true;
+      }
+
       // Save to file if anything changed
       //
       if (changed) {
@@ -388,6 +414,11 @@ public class ProjectsConfigOptionPlugin
           ProjectsConfigSingleton.getConfig()
               .setSortByNameLastUsedProjects(sortByNameLastUsedProjects);
           break;
+        case WIDGET_ID_CLEAR_DB_CACHE:
+          clearingDbCacheWhenSwitching = ((Button) control).getSelection();
+          ProjectsConfigSingleton.getConfig()
+              .setClearingDbCacheWhenSwitching(clearingDbCacheWhenSwitching);
+          break;
         default:
           break;
       }
@@ -406,151 +437,7 @@ public class ProjectsConfigOptionPlugin
   }
 
   /**
-   * Gets projectsEnabled
-   *
-   * @return value of projectsEnabled
-   */
-  public Boolean getProjectsEnabled() {
-    return projectsEnabled;
-  }
-
-  /**
-   * @param projectsEnabled The projectsEnabled to set
-   */
-  public void setProjectsEnabled(Boolean projectsEnabled) {
-    this.projectsEnabled = projectsEnabled;
-  }
-
-  /**
-   * Gets projectMandatory
-   *
-   * @return value of projectMandatory
-   */
-  public Boolean getProjectMandatory() {
-    return projectMandatory;
-  }
-
-  /**
-   * @param projectMandatory The projectMandatory to set
-   */
-  public void setProjectMandatory(Boolean projectMandatory) {
-    this.projectMandatory = projectMandatory;
-  }
-
-  /**
-   * Gets defaultProject
-   *
-   * @return value of defaultProject
-   */
-  public String getDefaultProject() {
-    return defaultProject;
-  }
-
-  /**
-   * @param defaultProject The defaultProject to set
-   */
-  public void setDefaultProject(String defaultProject) {
-    this.defaultProject = defaultProject;
-  }
-
-  /**
-   * Gets standardParentProject
-   *
-   * @return value of standardParentProject
-   */
-  public String getStandardParentProject() {
-    return standardParentProject;
-  }
-
-  /**
-   * @param standardParentProject The standardParentProject to set
-   */
-  public void setStandardParentProject(String standardParentProject) {
-    this.standardParentProject = standardParentProject;
-  }
-
-  /**
-   * Gets environmentMandatory
-   *
-   * @return value of environmentMandatory
-   */
-  public Boolean getEnvironmentMandatory() {
-    return environmentMandatory;
-  }
-
-  /**
-   * @param environmentMandatory The environmentMandatory to set
-   */
-  public void setEnvironmentMandatory(Boolean environmentMandatory) {
-    this.environmentMandatory = environmentMandatory;
-  }
-
-  /**
-   * Gets defaultEnvironment
-   *
-   * @return value of defaultEnvironment
-   */
-  public String getDefaultEnvironment() {
-    return defaultEnvironment;
-  }
-
-  /**
-   * @param defaultEnvironment The defaultEnvironment to set
-   */
-  public void setDefaultEnvironment(String defaultEnvironment) {
-    this.defaultEnvironment = defaultEnvironment;
-  }
-
-  /**
-   * Gets standardProjectsFolder
-   *
-   * @return value of standardProjectsFolder
-   */
-  public String getStandardProjectsFolder() {
-    return standardProjectsFolder;
-  }
-
-  /**
-   * @param standardProjectsFolder The standardProjectsFolder to set
-   */
-  public void setStandardProjectsFolder(String standardProjectsFolder) {
-    this.standardProjectsFolder = standardProjectsFolder;
-  }
-
-  /**
-   * Gets defaultProjectConfigFile
-   *
-   * @return value of defaultProjectConfigFile
-   */
-  public String getDefaultProjectConfigFile() {
-    return defaultProjectConfigFile;
-  }
-
-  /**
-   * @param defaultProjectConfigFile The defaultProjectConfigFile to set
-   */
-  public void setDefaultProjectConfigFile(String defaultProjectConfigFile) {
-    this.defaultProjectConfigFile = defaultProjectConfigFile;
-  }
-
-  /**
-   * Gets environmentsForActiveProject
-   *
-   * @return value of environmentsForActiveProject
-   */
-  public Boolean getEnvironmentsForActiveProject() {
-    return environmentsForActiveProject;
-  }
-
-  /**
-   * @param environmentsForActiveProject The environmentsForActiveProject flag 
to set
-   */
-  public void setEnvironmentsForActiveProject(Boolean 
environmentsForActiveProject) {
-    this.environmentsForActiveProject = environmentsForActiveProject;
-  }
-
-  /**
-   * Used to generate the list that is shown in the mySqlDriverClass GuiWidget
+   * Used to generate the list that is shown in the GUI
    *
    * @param log Logging object
    * @param metadataProvider If shared metadata is needed to get the values
@@ -564,10 +451,7 @@ public class ProjectsConfigOptionPlugin
 
     // Add empty entry for no selection
     prjsList.add("");
-
-    for (String prj : prjs) {
-      prjsList.add(prj);
-    }
+    prjsList.addAll(prjs);
 
     return prjsList;
   }
diff --git 
a/plugins/misc/projects/src/main/java/org/apache/hop/projects/util/ProjectsUtil.java
 
b/plugins/misc/projects/src/main/java/org/apache/hop/projects/util/ProjectsUtil.java
index c1bd913919..e687b9e492 100644
--- 
a/plugins/misc/projects/src/main/java/org/apache/hop/projects/util/ProjectsUtil.java
+++ 
b/plugins/misc/projects/src/main/java/org/apache/hop/projects/util/ProjectsUtil.java
@@ -24,6 +24,7 @@ import org.apache.commons.lang.StringUtils;
 import org.apache.commons.vfs2.FileObject;
 import org.apache.commons.vfs2.FileSystemException;
 import org.apache.hop.core.Const;
+import org.apache.hop.core.DbCache;
 import org.apache.hop.core.exception.HopException;
 import org.apache.hop.core.extension.ExtensionPointHandler;
 import org.apache.hop.core.logging.ILogChannel;
@@ -79,6 +80,15 @@ public class ProjectsUtil {
       throw new HopException("Error enabling project " + projectName + ": it 
is not configured.");
     }
 
+    // Clear the database cache when switching?
+    if (config.isClearingDbCacheWhenSwitching()) {
+      if (log.isDetailed()) {
+        log.logDetailed(
+            "Clearing the database cache when switching between projects or 
environments.");
+      }
+      DbCache.clearAll();
+    }
+
     // Variable system variables but also apply them to variables
     // We'll use those to change the loaded variables in HopGui
     //
diff --git 
a/plugins/misc/projects/src/main/resources/org/apache/hop/projects/config/messages/messages_en_US.properties
 
b/plugins/misc/projects/src/main/resources/org/apache/hop/projects/config/messages/messages_en_US.properties
index 54179949bb..8ddda360c3 100644
--- 
a/plugins/misc/projects/src/main/resources/org/apache/hop/projects/config/messages/messages_en_US.properties
+++ 
b/plugins/misc/projects/src/main/resources/org/apache/hop/projects/config/messages/messages_en_US.properties
@@ -35,3 +35,4 @@ ProjectConfig.StdProjectFilename.Message=The project 
configuration filename for
 ProjectConfig.StdProjectFolder.Description=The standard projects folder for 
new projects
 ProjectConfig.StdProjectFolder.Message=The standard projects folder for new 
projects
 ProjectConfig.Tab.Name=Projects
+ProjectConfig.ClearDbCache.Message=Clear DB cache when switching 
project/environment
\ No newline at end of file

Reply via email to