From 042c87dc328304e9d5a125b40dd8c659b826004b Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Mon, 24 Jul 2023 11:49:05 -0400 Subject: [PATCH 1/8] add: separate each level of config as class --- .../portal/classes/config/ConfigLoader.java | 92 +-- .../portal/classes/config/ExeEngine.java | 63 --- .../portal/classes/config/MainConfig.java | 130 +++++ .../portal/classes/config/OntologyConfig.java | 61 ++ .../portal/classes/config/PlannerConfig.java | 33 ++ .../portal/classes/config/PortalConfig.java | 532 ++++-------------- .../portal/classes/config/Publisher.java | 46 +- .../portal/classes/config/ServerDetails.java | 88 ++- .../portal/classes/config/StorageConfig.java | 113 ++++ .../wings/portal/classes/html/JSLoader.java | 14 +- .../portal/controllers/DataController.java | 2 +- .../portal/controllers/DomainController.java | 4 +- .../portal/controllers/RunController.java | 10 +- .../portal/resources/TemplateResource.java | 2 +- .../wings/portal/servlets/ExportGraph.java | 7 +- .../wings/portal/servlets/SparqlEndpoint.java | 6 +- .../isi/wings/portal/servlets/ViewConfig.java | 15 +- .../webapp/jsp/viewers/ComponentViewer.jsp | 4 +- .../main/webapp/jsp/viewers/DataViewer.jsp | 2 +- .../webapp/jsp/viewers/TemplateViewer.jsp | 2 +- .../main/webapp/jsp/viewers/UserViewer.jsp | 2 +- 21 files changed, 631 insertions(+), 597 deletions(-) delete mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/ExeEngine.java create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java index 4bf03de1..b36dacce 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java @@ -74,14 +74,9 @@ public ConfigLoader( String userid, String domain ) { - // Initialize UserDatabase this.contextRootPath = request.getContextPath(); this.initializeUserDatabase(); - - // Initialize portal config portalConfig.initializePortalConfig(request); - - // Initialize user config this.initializeUserConfig(request, userid, domain); } @@ -104,7 +99,7 @@ private void initializeUserConfig( if (this.domainId != null) this.userDomainUrl = this.contextRootPath + "/" + - PortalConfig.USERS_RELATIVE_DIR + + MainConfig.USERS_RELATIVE_DIR + "/" + this.getUserId() + "/" + @@ -120,28 +115,25 @@ private void initializeUserConfig( if (!this.checkUser(null)) return; this.exportUserUrl = - portalConfig.serverUrl + + portalConfig.mainConfig.serverUrl + contextRootPath + - PortalConfig.EXPORT_SERVLET_PATH + + MainConfig.EXPORT_SERVLET_PATH + "/" + - PortalConfig.USERS_RELATIVE_DIR + + MainConfig.USERS_RELATIVE_DIR + "/" + userId; this.userDir = - portalConfig.storageDirectory + + portalConfig.storageConfig.storageDirectory + File.separator + - PortalConfig.USERS_RELATIVE_DIR + + MainConfig.USERS_RELATIVE_DIR + File.separator + userId; this.userPath = - contextRootPath + "/" + PortalConfig.USERS_RELATIVE_DIR + "/" + userId; + contextRootPath + "/" + MainConfig.USERS_RELATIVE_DIR + "/" + userId; // Create userDir (if it doesn't exist) - File uf = new File(this.userDir); - if (!uf.exists() && !uf.mkdirs()) System.err.println( - "Cannot create user directory : " + uf.getAbsolutePath() - ); + StorageConfig.createStorageDirectory(this.userDir); // Get domain and user list DomainController dc = new DomainController(this); @@ -165,7 +157,7 @@ private void initializeUserConfig( this.userDomainUrl = this.contextRootPath + "/" + - PortalConfig.USERS_RELATIVE_DIR + + MainConfig.USERS_RELATIVE_DIR + "/" + this.getUserId() + "/" + @@ -318,52 +310,57 @@ public Properties getProperties() { // Return Properties that are currently used by catalogs & planners public Properties getProperties(Domain domain) { Properties props = new Properties(); + StorageConfig storageConfig = portalConfig.storageConfig; + OntologyConfig ontologyConfig = portalConfig.getOntologyConfig(); + MainConfig mainConfig = portalConfig.mainConfig; if (domain != null) { props = domain.getProperties(); if (domain.isLegacy()) return props; - props.setProperty(ONT_DIR_URL, PortalConfig.ONT_DIR_URL); + props.setProperty(ONT_DIR_URL, OntologyConfig.ONT_DIR_URL); if (!domain.getUseSharedTripleStore()) props.setProperty( ONT_DIR_MAP, "file:" + domain.getDomainDirectory() + File.separator + "ontology" ); - props.setProperty("ont.data.url", portalConfig.getDataOntologyUrl()); + props.setProperty("ont.data.url", ontologyConfig.getDataOntologyUrl()); props.setProperty( "ont.component.url", - portalConfig.getComponentOntologyUrl() + ontologyConfig.getComponentOntologyUrl() ); props.setProperty( "ont.workflow.url", - portalConfig.getWorkflowOntologyUrl() + ontologyConfig.getWorkflowOntologyUrl() ); props.setProperty( "ont.execution.url", - portalConfig.getExecutionOntologyUrl() + ontologyConfig.getExecutionOntologyUrl() + ); + props.setProperty( + "ont.resource.url", + ontologyConfig.getResourceOntologyUrl() ); if (domain.getUseSharedTripleStore()) props.setProperty( "tdb.repository.dir", - portalConfig.getTdbDirectory() + storageConfig.getTdbDirectory() ); - HashMap engines = portalConfig.getEngines(); - ExeEngine pengine = engines.get(domain.getPlanEngine()); - ExeEngine sengine = engines.get(domain.getStepEngine()); + HashMap engines = + portalConfig.executionConfig.getEngines(); + ExecutionEngine pengine = engines.get(domain.getPlanEngine()); + ExecutionEngine sengine = engines.get(domain.getStepEngine()); props.putAll(pengine.getProperties()); props.putAll(sengine.getProperties()); } else { - props.setProperty("tdb.repository.dir", portalConfig.getTdbDirectory()); + props.setProperty("tdb.repository.dir", storageConfig.getTdbDirectory()); } - props.setProperty("logs.dir", portalConfig.getLogsDirectory()); - props.setProperty("dot.path", portalConfig.getDotFile()); - props.setProperty( - "ont.resource.url", - portalConfig.getResourceOntologyUrl() - ); + props.setProperty("logs.dir", storageConfig.getLogsDirectory()); + props.setProperty("dot.path", mainConfig.getDotFile()); props.setProperty( "lib.resource.url", - this.portalConfig.getExportCommunityUrl() + "/resource/library.owl" + this.portalConfig.mainConfig.getExportCommunityUrl() + + "/resource/library.owl" ); if (domain != null && !domain.getUseSharedTripleStore()) props.setProperty( @@ -380,7 +377,8 @@ public Properties getProperties(Domain domain) { props.setProperty( "lib.provenance.url", - this.portalConfig.getExportCommunityUrl() + "/provenance/library.owl" + this.portalConfig.mainConfig.getExportCommunityUrl() + + "/provenance/library.owl" ); if (this.viewerId != null) props.setProperty("viewer.id", this.viewerId); @@ -394,20 +392,24 @@ public Properties getProperties(Domain domain) { } public PlanExecutionEngine getDomainExecutionEngine() { - ExeEngine pengine = portalConfig.engines.get(domain.getPlanEngine()); - ExeEngine sengine = portalConfig.engines.get(domain.getStepEngine()); + ExecutionEngine planEngine = portalConfig.executionConfig.engines.get( + domain.getPlanEngine() + ); + ExecutionEngine stepEngine = portalConfig.executionConfig.engines.get( + domain.getStepEngine() + ); try { - pengine.getProperties().putAll(this.getProperties()); - sengine.getProperties().putAll(this.getProperties()); + planEngine.getProperties().putAll(this.getProperties()); + stepEngine.getProperties().putAll(this.getProperties()); // TODO: Check if the selected engines are compatible // and can be used as plan and step engines respectively PlanExecutionEngine pee = ExecutionFactory.createPlanExecutionEngine( - pengine.getImplementation(), - pengine.getProperties() + planEngine.getImplementation(), + planEngine.getProperties() ); StepExecutionEngine see = ExecutionFactory.createStepExecutionEngine( - sengine.getImplementation(), - sengine.getProperties() + stepEngine.getImplementation(), + stepEngine.getProperties() ); ExecutionLoggerAPI logger = ExecutionToolsFactory.createLogger( this.getProperties() @@ -418,7 +420,9 @@ public PlanExecutionEngine getDomainExecutionEngine() { ExecutionResourceAPI resource = ExecutionToolsFactory.getResourceAPI( this.getProperties() ); - resource.setLocalStorageFolder(portalConfig.getStorageDirectory()); + resource.setLocalStorageFolder( + portalConfig.storageConfig.getStorageDirectory() + ); pee.setStepExecutionEngine(see); pee.setExecutionLogger(logger); pee.setExecutionMonitor(monitor); diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExeEngine.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExeEngine.java deleted file mode 100644 index d94f80bd..00000000 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExeEngine.java +++ /dev/null @@ -1,63 +0,0 @@ -package edu.isi.wings.portal.classes.config; - -import java.util.Properties; - -/** - * Created by varun on 13/07/2015. - */ -public class ExeEngine { - - public static enum Type { - PLAN, - STEP, - BOTH, - } - - ExeEngine.Type type; - String name; - String implementation; - Properties props; - - public ExeEngine(String name, String implementation, ExeEngine.Type type) { - this.type = type; - this.name = name; - this.implementation = implementation; - props = new Properties(); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public ExeEngine.Type getType() { - return type; - } - - public void setType(ExeEngine.Type type) { - this.type = type; - } - - public String getImplementation() { - return implementation; - } - - public void setImplementation(String implementation) { - this.implementation = implementation; - } - - public Properties getProperties() { - return props; - } - - public void setProperties(Properties props) { - this.props = props; - } - - public void addProperty(String key, String value) { - this.props.setProperty(key, value); - } -} diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java new file mode 100644 index 00000000..ef6fcc23 --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java @@ -0,0 +1,130 @@ +package edu.isi.wings.portal.classes.config; + +import java.io.File; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.configuration.plist.PropertyListConfiguration; + +public class MainConfig { + + public static final String MAIN_LIGHT_REASONER_KEY = "light-reasoner"; + public static final String MAIN_CLIENTS_KEY = "clients"; + public static final String MAIN_GRAPHVIZ_KEY = "graphviz"; + public static final String MAIN_METAWORKFLOWS_KEY = "metaworkflows"; + public static final String MAIN_SERVER_KEY = "server"; + public static final String USERS_RELATIVE_DIR = "users"; + public static final String EXPORT_SERVLET_PATH = "/export"; + + public String dotFile; + public String serverUrl; + public boolean hasMetaWorkflows; + public String clients; + public String contextRootPath; + public String exportCommunityUrl; + + public String communityPath; + + public MainConfig( + PropertyListConfiguration serverConfig, + HttpServletRequest request + ) { + this.serverUrl = serverConfig.getString(MAIN_SERVER_KEY); + this.dotFile = serverConfig.getString(MAIN_GRAPHVIZ_KEY); + this.clients = serverConfig.getString(MAIN_CLIENTS_KEY); + this.contextRootPath = request.getContextPath(); + if ( + serverConfig.containsKey(MAIN_METAWORKFLOWS_KEY) + ) this.hasMetaWorkflows = serverConfig.getBoolean(MAIN_METAWORKFLOWS_KEY); + this.exportCommunityUrl = + this.serverUrl + + contextRootPath + + EXPORT_SERVLET_PATH + + "/" + + StorageConfig.COMMUNITY_RELATIVE_DIR; + this.communityPath = + contextRootPath + + "/" + + USERS_RELATIVE_DIR + + "/" + + StorageConfig.COMMUNITY_RELATIVE_DIR; + } + + public MainConfig(String defaultServer, HttpServletRequest request) { + this.serverUrl = defaultServer; + File loc1 = new File("/usr/bin/dot"); + File loc2 = new File("/usr/local/bin/dot"); + dotFile = loc2.exists() ? loc2.getAbsolutePath() : loc1.getAbsolutePath(); + this.contextRootPath = request.getContextPath(); + this.exportCommunityUrl = + this.serverUrl + + contextRootPath + + EXPORT_SERVLET_PATH + + "/" + + StorageConfig.COMMUNITY_RELATIVE_DIR; + this.communityPath = + contextRootPath + + "/" + + USERS_RELATIVE_DIR + + "/" + + StorageConfig.COMMUNITY_RELATIVE_DIR; + } + + public static String getMainLightReasonerKey() { + return MAIN_LIGHT_REASONER_KEY; + } + + public static String getMainClientsKey() { + return MAIN_CLIENTS_KEY; + } + + public static String getMainGraphvizKey() { + return MAIN_GRAPHVIZ_KEY; + } + + public static String getMainMetaworkflowsKey() { + return MAIN_METAWORKFLOWS_KEY; + } + + public static String getMainServerKey() { + return MAIN_SERVER_KEY; + } + + public String getDotFile() { + return dotFile; + } + + public String getServerUrl() { + return serverUrl; + } + + public boolean hasMetaWorkflows() { + return hasMetaWorkflows; + } + + public String getClients() { + return clients; + } + + public String getExportCommunityUrl() { + return exportCommunityUrl; + } + + public static String getUsersRelativeDir() { + return USERS_RELATIVE_DIR; + } + + public static String getExportServletPath() { + return EXPORT_SERVLET_PATH; + } + + public boolean isHasMetaWorkflows() { + return hasMetaWorkflows; + } + + public String getContextRootPath() { + return contextRootPath; + } + + public String getCommunityPath() { + return communityPath; + } +} diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java new file mode 100644 index 00000000..839d1bae --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java @@ -0,0 +1,61 @@ +package edu.isi.wings.portal.classes.config; + +import org.apache.commons.configuration.plist.PropertyListConfiguration; + +public class OntologyConfig { + + public static final String ONTOLOGY_COMPONENT_KEY = "ontology.component"; + public static final String ONTOLOGY_DATA_KEY = "ontology.data"; + public static final String ONTOLOGY_EXECUTION_KEY = "ontology.execution"; + public static final String ONTOLOGY_RESOURCE_KEY = "ontology.resource"; + public static final String ONTOLOGY_WORKFLOW_KEY = "ontology.workflow"; + public static String ONT_DIR_URL = "http://www.wings-workflows.org/ontology"; + + public String componentOntologyUrl = ONT_DIR_URL + "/component.owl"; + public String dataOntologyUrl = ONT_DIR_URL + "/data.owl"; + public String executionOntologyUrl = ONT_DIR_URL + "/execution.owl"; + public String resourceOntologyUrl = ONT_DIR_URL + "/resource.owl"; + public String workflowOntologyUrl = ONT_DIR_URL + "/workflow.owl"; + + public OntologyConfig(PropertyListConfiguration serverConfig) { + if (serverConfig.getString(ONTOLOGY_DATA_KEY) != null) { + this.dataOntologyUrl = serverConfig.getString(ONTOLOGY_DATA_KEY); + } + if (serverConfig.getString(ONTOLOGY_COMPONENT_KEY) != null) { + this.componentOntologyUrl = + serverConfig.getString(ONTOLOGY_COMPONENT_KEY); + } + if (serverConfig.getString(ONTOLOGY_WORKFLOW_KEY) != null) { + this.workflowOntologyUrl = serverConfig.getString(ONTOLOGY_WORKFLOW_KEY); + } + if (serverConfig.getString(ONTOLOGY_EXECUTION_KEY) != null) { + this.executionOntologyUrl = + serverConfig.getString(ONTOLOGY_EXECUTION_KEY); + } + if (serverConfig.getString(ONTOLOGY_RESOURCE_KEY) != null) { + this.resourceOntologyUrl = serverConfig.getString(ONTOLOGY_RESOURCE_KEY); + } + } + + public OntologyConfig() {} + + public String getComponentOntologyUrl() { + return componentOntologyUrl; + } + + public String getDataOntologyUrl() { + return dataOntologyUrl; + } + + public String getExecutionOntologyUrl() { + return executionOntologyUrl; + } + + public String getResourceOntologyUrl() { + return resourceOntologyUrl; + } + + public String getWorkflowOntologyUrl() { + return workflowOntologyUrl; + } +} diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/PlannerConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PlannerConfig.java index 8edd3701..587ca6a3 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/PlannerConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PlannerConfig.java @@ -1,13 +1,46 @@ package edu.isi.wings.portal.classes.config; +import org.apache.commons.configuration.plist.PropertyListConfiguration; + public class PlannerConfig { + private static final String PLANNER_PARALLELISM_KEY = "planner.parallelism"; + private static final String PLANNER_MAX_QUEUE_SIZE_KEY = + "planner.max-queue-size"; + private static final String PLANNER_USE_RULES_KEY = "planner.use-rules"; + private static final String PLANNER_SPECIALIZATION_KEY = + "planner.specialization"; + private static final String PLANNER_DATA_VALIDATION_KEY = + "planner.data-validation"; + boolean dataValidation = true; boolean specialization = true; boolean useRules = true; int maxQueueSize = 1000; int parallelism = 10; + public PlannerConfig(PropertyListConfiguration serverConfig) { + if ( + serverConfig.containsKey(MainConfig.MAIN_LIGHT_REASONER_KEY) + ) this.dataValidation = + !serverConfig.getBoolean(MainConfig.MAIN_LIGHT_REASONER_KEY); + if ( + serverConfig.containsKey(PLANNER_DATA_VALIDATION_KEY) + ) this.dataValidation = + serverConfig.getBoolean(PLANNER_DATA_VALIDATION_KEY); + if ( + serverConfig.containsKey(PLANNER_SPECIALIZATION_KEY) + ) this.specialization = serverConfig.getBoolean(PLANNER_SPECIALIZATION_KEY); + if (serverConfig.containsKey(PLANNER_USE_RULES_KEY)) this.useRules = + serverConfig.getBoolean(PLANNER_USE_RULES_KEY); + + if ( + serverConfig.containsKey(PLANNER_MAX_QUEUE_SIZE_KEY) + ) this.maxQueueSize = serverConfig.getInt(PLANNER_MAX_QUEUE_SIZE_KEY, 1000); + if (serverConfig.containsKey(PLANNER_PARALLELISM_KEY)) this.parallelism = + serverConfig.getInt(PLANNER_PARALLELISM_KEY, 10); + } + public boolean useDataValidation() { return dataValidation; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java index 6add33a7..228be1fe 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java @@ -1,278 +1,108 @@ package edu.isi.wings.portal.classes.config; -import edu.isi.wings.execution.engine.api.impl.distributed.DistributedExecutionEngine; -import edu.isi.wings.execution.engine.api.impl.local.LocalExecutionEngine; import java.io.File; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map.Entry; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.configuration.HierarchicalConfiguration; import org.apache.commons.configuration.plist.PropertyListConfiguration; public class PortalConfig { - public static String EXPORT_SERVLET_PATH = "/export"; - public static String ONT_DIR_URL = "http://www.wings-workflows.org/ontology"; - public static String USERS_RELATIVE_DIR = "users"; - private String COMMUNITY_RELATIVE_DIR = "common"; + public String portalConfigurationFile; + public MainConfig mainConfig; + public OntologyConfig ontologyConfig; + public StorageConfig storageConfig; + public PlannerConfig plannerConfig; + public ExecutionConfig executionConfig; - public String configFile; - public String storageDirectory; - public String tdbDirectory; - public String logsDirectory; - public String dotFile; - public String serverUrl; - - private String exportCommunityUrl; - private String communityPath; - private String communityDir; - - public String workflowOntologyUrl; - public String dataOntologyUrl; - public String componentOntologyUrl; - public String executionOntologyUrl; - public String resourceOntologyUrl = ONT_DIR_URL + "/resource.owl"; - public boolean deleteRunOutputs; - public String contextRootPath; - public HashMap engines; public Publisher publisher; - public PlannerConfig plannerConfig = new PlannerConfig(); - public String clients; - public boolean hasMetaWorkflows; public boolean sandboxed; public void initializePortalConfig(HttpServletRequest request) { - this.contextRootPath = request.getContextPath(); - PropertyListConfiguration serverConfig = getPortalConfiguration(request); - this.storageDirectory = serverConfig.getString("storage.local"); - this.tdbDirectory = serverConfig.getString("storage.tdb"); - this.serverUrl = serverConfig.getString("server"); - this.dotFile = serverConfig.getString("graphviz"); - this.clients = serverConfig.getString("clients"); - this.dataOntologyUrl = serverConfig.getString("ontology.data"); - this.componentOntologyUrl = - serverConfig.containsKey("ontology.component") - ? serverConfig.getString("ontology.component") - : componentOntologyUrl; - this.workflowOntologyUrl = serverConfig.getString("ontology.workflow"); - this.executionOntologyUrl = serverConfig.getString("ontology.execution"); - this.resourceOntologyUrl = - serverConfig.containsKey("ontology.resource") - ? serverConfig.getString("ontology.resource") - : resourceOntologyUrl; - if (serverConfig.containsKey("metaworkflows")) this.hasMetaWorkflows = - serverConfig.getBoolean("metaworkflows"); - - if ( - serverConfig.containsKey("light-reasoner") - ) plannerConfig.dataValidation = !serverConfig.getBoolean("light-reasoner"); - - if ( - serverConfig.containsKey("planner.data-validation") - ) plannerConfig.dataValidation = - serverConfig.getBoolean("planner.data-validation"); - if ( - serverConfig.containsKey("planner.specialization") - ) plannerConfig.specialization = - serverConfig.getBoolean("planner.specialization"); - if (serverConfig.containsKey("planner.use-rules")) plannerConfig.useRules = - serverConfig.getBoolean("planner.use-rules"); - - if ( - serverConfig.containsKey("planner.max-queue-size") - ) plannerConfig.maxQueueSize = - serverConfig.getInt( - "planner.max-queue-size", - 1000 - ); else plannerConfig.maxQueueSize = 1000; - if ( - serverConfig.containsKey("planner.parallelism") - ) plannerConfig.parallelism = - serverConfig.getInt( - "planner.parallelism", - 10 - ); else plannerConfig.parallelism = 10; + getOntologyConfiguration(serverConfig); + getMainConfiguration(serverConfig, request); + getStorageConfiguration(serverConfig); + getPlannerConfiguration(serverConfig); + getEngineNodeConfiguration(serverConfig); + getPublisherConfiguration(serverConfig); + } - if (serverConfig.containsKey("storage.logs")) { - this.logsDirectory = serverConfig.getString("storage.logs"); - } else { - this.logsDirectory = this.storageDirectory + File.separator + "logs"; - } - if (serverConfig.containsKey("storage.delete-run-outputs")) { - this.deleteRunOutputs = - serverConfig.getBoolean("storage.delete-run-outputs"); - } else { - this.deleteRunOutputs = false; - } - // Create logsDir (if it doesn't exist) - File logdir = new File(this.logsDirectory); - if (!logdir.exists() && !logdir.mkdirs()) System.err.println( - "Cannot create logs directory : " + logdir.getAbsolutePath() + public PropertyListConfiguration getPortalConfiguration( + HttpServletRequest request + ) { + ServletContext app = request.getSession().getServletContext(); + this.portalConfigurationFile = obtainConfigPath(app, request); + if (this.portalConfigurationFile == null) createDefaultConfigurationFile( + request ); + checkIfFileExists(this.portalConfigurationFile); + return loadConfigurationOnProps(); + } - this.exportCommunityUrl = - serverUrl + - contextRootPath + - EXPORT_SERVLET_PATH + - "/" + - COMMUNITY_RELATIVE_DIR; - this.communityPath = - contextRootPath + "/" + USERS_RELATIVE_DIR + "/" + COMMUNITY_RELATIVE_DIR; - - this.communityDir = - storageDirectory + File.separator + COMMUNITY_RELATIVE_DIR; - // Create communityDir (if it doesn't exist) - File uf = new File(this.communityDir); - if (!uf.exists() && !uf.mkdirs()) System.err.println( - "Cannot create community directory : " + uf.getAbsolutePath() - ); + private String obtainConfigPath( + ServletContext app, + HttpServletRequest request + ) { + return app.getInitParameter("config.file"); + } - // Load engine configurations - this.engines = new HashMap(); - List enginenodes = serverConfig.configurationsAt( - "execution.engine" - ); - for (HierarchicalConfiguration enode : enginenodes) { - ExeEngine engine = this.getExeEngine(enode); - this.engines.put(engine.getName(), engine); - } - // Add in the distributed engine if it doesn't already exist - if (!this.engines.containsKey("Distributed")) { - ExeEngine distengine = new ExeEngine( - "Distributed", - DistributedExecutionEngine.class.getCanonicalName(), - ExeEngine.Type.BOTH + private PropertyListConfiguration loadConfigurationOnProps() { + PropertyListConfiguration props = new PropertyListConfiguration(); + try { + props.load(this.portalConfigurationFile); + } catch (Exception e) { + throw new RuntimeException( + "Could not load config file: " + this.portalConfigurationFile ); - this.engines.put(distengine.getName(), distengine); - this.addEngineConfig(serverConfig, distengine); - try { - serverConfig.save(this.configFile); - } catch (Exception e) { - e.printStackTrace(); - } } + return props; + } - // Load publishing configuration - String publishUrl = serverConfig.getString("publisher.url"); - String publishExportName = serverConfig.getString("publisher.name"); - String tstorePublishUrl = serverConfig.getString( - "publisher.triple-store.publish" - ); - String tstoreQueryUrl = serverConfig.getString( - "publisher.triple-store.query" - ); - String domainsDir = serverConfig.getString( - "publisher.triple-store.domains-directory" - ); - String uploadUrl = serverConfig.getString("publisher.upload-server.url"); - String uploadUsername = serverConfig.getString( - "publisher.upload-server.username" - ); - String uploadPassword = serverConfig.getString( - "publisher.upload-server.password" - ); - String uploadDir = serverConfig.getString( - "publisher.upload-server.directory" - ); - String uploadHost = serverConfig.getString("publisher.upload-server.host"); - String uploadUserId = serverConfig.getString( - "publisher.upload-server.userid" - ); - String uploadKey = serverConfig.getString( - "publisher.upload-server.private-key" - ); - String sizeString = serverConfig.getString( - "publisher.upload-server.max-upload-size" - ); + private void getPublisherConfiguration( + PropertyListConfiguration serverConfig + ) { + this.publisher = new Publisher(serverConfig); + } - this.publisher = new Publisher(); - this.publisher.setUrl(publishUrl); - this.publisher.setExportName(publishExportName); - this.publisher.setDomainsDir(domainsDir); - this.publisher.setTstorePublishUrl(tstorePublishUrl); - this.publisher.setTstoreQueryUrl(tstoreQueryUrl); + private void getOntologyConfiguration( + PropertyListConfiguration serverConfig + ) { + this.ontologyConfig = new OntologyConfig(serverConfig); + } - ServerDetails upserver = new ServerDetails(); - upserver.setUrl(uploadUrl); - upserver.setUsername(uploadUsername); - upserver.setPassword(uploadPassword); - upserver.setHostUserId(uploadUserId); - upserver.setDirectory(uploadDir); - upserver.setHost(uploadHost); - upserver.setPrivateKey(uploadKey); - if (sizeString != null) { - long size = this.getSizeFromString(sizeString); - upserver.setMaxUploadSize(size); - } - this.publisher.setUploadServer(upserver); + private void getMainConfiguration( + PropertyListConfiguration serverConfig, + HttpServletRequest request + ) { + this.mainConfig = new MainConfig(serverConfig, request); } - private long getSizeFromString(String sizeString) { - long kb = 1024; - long mb = kb * kb; - long gb = kb * mb; - long tb = kb * gb; + private void getStorageConfiguration(PropertyListConfiguration serverConfig) { + this.storageConfig = new StorageConfig(serverConfig); + } - Pattern pat = Pattern.compile("(\\d+)\\s*([KkMmGgTt])[Bb]?"); - Matcher mat = pat.matcher(sizeString); - if (mat.find()) { - long size = Long.parseLong(mat.group(1)); - if (mat.groupCount() > 1) { - String units = mat.group(2).toLowerCase(); - if (units.equals("k")) return size * kb; - if (units.equals("m")) return size * mb; - if (units.equals("g")) return size * gb; - if (units.equals("t")) return size * tb; - } - return size; - } - return 0; + private void getPlannerConfiguration(PropertyListConfiguration serverConfig) { + this.plannerConfig = new PlannerConfig(serverConfig); } - public PropertyListConfiguration getPortalConfiguration( - HttpServletRequest request - ) { - ServletContext app = request.getSession().getServletContext(); - this.configFile = app.getInitParameter("config.file"); - if (this.configFile == null) { - String home = System.getProperty("user.home"); - if (home != null && !home.equals("")) this.configFile = - home + - File.separator + - ".wings" + - File.separator + - "portal.properties"; else this.configFile = - "/etc/wings/portal.properties"; - } - // Create configFile if it doesn't exist (portal.properties) - File cfile = new File(this.configFile); - if (!cfile.exists()) { - File configDir = cfile.getParentFile(); - if (!configDir.exists() && !configDir.mkdirs()) { - System.err.println( - "Cannot create config file directory : " + configDir - ); - return null; - } - if (request != null) createDefaultPortalConfig(request); - } + private void createDefaultConfigurationFile(HttpServletRequest request) { + String configFileName = "portal.properties"; + String configDirectory = createDefaultConfigurationDirectory(); + this.portalConfigurationFile = + configDirectory + File.separator + configFileName; + File cfile = new File(this.portalConfigurationFile); + File configDir = cfile.getParentFile(); + StorageConfig.createStorageDirectory(configDir.getAbsolutePath()); + if (request != null) createDefaultPortalConfig(request); + } - // Load properties from configFile - PropertyListConfiguration props = new PropertyListConfiguration(); - try { - props.load(this.configFile); - } catch (Exception e) { - e.printStackTrace(); - return null; + private String createDefaultConfigurationDirectory() { + String defaultDirectory = ".wings"; + String home = System.getProperty("user.home"); + if (home != null && !home.equals("")) { + return home + File.separator + defaultDirectory; } - return props; + return "/etc/wings/portal.properties"; } private void createDefaultPortalConfig(HttpServletRequest request) { @@ -282,160 +112,57 @@ private void createDefaultPortalConfig(HttpServletRequest request) { request.getServerName() + ":" + request.getServerPort(); - String storageDir = null; - String home = System.getProperty("user.home"); - if (home != null && !home.equals("")) storageDir = - home + - File.separator + - ".wings" + - File.separator + - "storage"; else storageDir = - System.getProperty("java.io.tmpdir") + - File.separator + - "wings" + - File.separator + - "storage"; - - File storageDirFile = new File(storageDir); - if ( - !storageDirFile.exists() && !storageDirFile.mkdirs() - ) System.err.println("Cannot create storage directory: " + storageDir); PropertyListConfiguration config = new PropertyListConfiguration(); - config.addProperty("storage.local", storageDir); - config.addProperty("storage.tdb", storageDir + File.separator + "TDB"); - config.addProperty("server", server); + StorageConfig storageConfig = new StorageConfig(config); + OntologyConfig ontologyDefaultConfig = new OntologyConfig(); + MainConfig mainDefaultConfig = new MainConfig(server, request); + ExecutionConfig executionConfig = new ExecutionConfig(); - File loc1 = new File("/usr/bin/dot"); - File loc2 = new File("/usr/local/bin/dot"); + config.addProperty(MainConfig.MAIN_SERVER_KEY, server); + config.addProperty(MainConfig.MAIN_GRAPHVIZ_KEY, mainDefaultConfig.dotFile); config.addProperty( - "graphviz", - loc2.exists() ? loc2.getAbsolutePath() : loc1.getAbsolutePath() + StorageConfig.STORAGE_LOCAL, + storageConfig.storageDirectory ); - config.addProperty("ontology.data", ONT_DIR_URL + "/data.owl"); - config.addProperty("ontology.component", ONT_DIR_URL + "/component.owl"); - config.addProperty("ontology.workflow", ONT_DIR_URL + "/workflow.owl"); - config.addProperty("ontology.execution", ONT_DIR_URL + "/execution.owl"); - config.addProperty("ontology.resource", ONT_DIR_URL + "/resource.owl"); - - this.addEngineConfig( - config, - new ExeEngine( - "Local", - LocalExecutionEngine.class.getCanonicalName(), - ExeEngine.Type.BOTH - ) - ); - this.addEngineConfig( - config, - new ExeEngine( - "Distributed", - DistributedExecutionEngine.class.getCanonicalName(), - ExeEngine.Type.BOTH - ) - ); - - /* - * this.addEngineConfig(config, new ExeEngine("OODT", - * OODTExecutionEngine.class.getCanonicalName(), ExeEngine.Type.PLAN)); - * - * this.addEngineConfig(config, new ExeEngine("Pegasus", - * PegasusExecutionEngine.class.getCanonicalName(), ExeEngine.Type.PLAN)); - */ + config.addProperty(StorageConfig.STORAGE_TDB, storageConfig.tdbDirectory); + config.addProperty( + OntologyConfig.ONTOLOGY_COMPONENT_KEY, + ontologyDefaultConfig.componentOntologyUrl + ); + config.addProperty( + OntologyConfig.ONTOLOGY_DATA_KEY, + ontologyDefaultConfig.dataOntologyUrl + ); + config.addProperty( + OntologyConfig.ONTOLOGY_EXECUTION_KEY, + ontologyDefaultConfig.executionOntologyUrl + ); + config.addProperty( + OntologyConfig.ONTOLOGY_RESOURCE_KEY, + ontologyDefaultConfig.resourceOntologyUrl + ); + config.addProperty( + OntologyConfig.ONTOLOGY_WORKFLOW_KEY, + ontologyDefaultConfig.workflowOntologyUrl + ); + executionConfig.addDefaultEngineConfig(config); try { - config.save(this.configFile); + config.save(this.portalConfigurationFile); } catch (Exception e) { e.printStackTrace(); } } - @SuppressWarnings("rawtypes") - private ExeEngine getExeEngine(HierarchicalConfiguration node) { - String name = node.getString("name"); - String impl = node.getString("implementation"); - ExeEngine.Type type = ExeEngine.Type.valueOf(node.getString("type")); - ExeEngine engine = new ExeEngine(name, impl, type); - for (Iterator it = node.getKeys("properties"); it.hasNext();) { - String key = (String) it.next(); - String value = node.getString(key); - engine.addProperty(key.replace("properties.", ""), value); - } - return engine; - } - - private void addEngineConfig( - PropertyListConfiguration config, - ExeEngine engine + private void getEngineNodeConfiguration( + PropertyListConfiguration serverConfig ) { - config.addProperty("execution.engine(-1).name", engine.getName()); - config.addProperty( - "execution.engine.implementation", - engine.getImplementation() - ); - config.addProperty("execution.engine.type", engine.getType()); - for (Entry entry : engine - .getProperties() - .entrySet()) config.addProperty( - "execution.engine.properties." + entry.getKey(), - entry.getValue() - ); - } - - public String getConfigFile() { - return configFile; - } - - public String getStorageDirectory() { - return storageDirectory; - } - - public String getTdbDirectory() { - return tdbDirectory; - } - - public String getLogsDirectory() { - return logsDirectory; - } - - public String getDotFile() { - return dotFile; - } - - public String getServerUrl() { - return serverUrl; - } - - public String getWorkflowOntologyUrl() { - return workflowOntologyUrl; - } - - public String getDataOntologyUrl() { - return dataOntologyUrl; - } - - public String getComponentOntologyUrl() { - return componentOntologyUrl; - } - - public String getExecutionOntologyUrl() { - return executionOntologyUrl; - } - - public String getResourceOntologyUrl() { - return resourceOntologyUrl; - } - - public boolean isDeleteRunOutputs() { - return deleteRunOutputs; - } - - public String getContextRootPath() { - return contextRootPath; + this.executionConfig = new ExecutionConfig(serverConfig); } - public HashMap getEngines() { - return engines; + public String getPortalConfigurationFile() { + return portalConfigurationFile; } public Publisher getPublisher() { @@ -446,39 +173,18 @@ public PlannerConfig getPlannerConfig() { return plannerConfig; } - public String getClients() { - return clients; - } - - public boolean isHasMetaWorkflows() { - return hasMetaWorkflows; - } - - public boolean hasMetaWorkflows() { - return hasMetaWorkflows; - } - - public String getTripleStoreDir() { - return tdbDirectory; - } - - public String getExportCommunityUrl() { - return exportCommunityUrl; - } - - public String getCommunityPath() { - return communityPath; - } - - public String getCommunityDir() { - return communityDir; - } - public boolean isSandboxed() { return sandboxed; } - public Set getEnginesList() { - return this.engines.keySet(); + public OntologyConfig getOntologyConfig() { + return ontologyConfig; + } + + private static void checkIfFileExists(String filePath) { + File cfile = new File(filePath); + if (!cfile.exists()) { + throw new RuntimeException("Could not find file: " + filePath); + } } } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java index 0f4dd746..36647111 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java @@ -1,62 +1,64 @@ package edu.isi.wings.portal.classes.config; +import org.apache.commons.configuration.plist.PropertyListConfiguration; + /** * Created by varun on 13/07/2015. */ public class Publisher { + private static final String PUBLISHER_SPARQL_DOMAINS_DIRECTORY_KEY = + "publisher.triple-store.domains-directory"; + private static final String PUBLISHER_ENDPOINT_QUERY_KEY = + "publisher.triple-store.query"; + private static final String PUBLISHER_ENDPOINT_POST_KEY = + "publisher.triple-store.publish"; + private static final String PUBLISHER_NAME_KEY = "publisher.name"; + private static final String PUBLISHER_URL_KEY = "publisher.url"; String url; String tstorePublishUrl; String tstoreQueryUrl; ServerDetails uploadServer; + String domainsDir; String exportName; - public String getExportName() { - return exportName; + public Publisher(PropertyListConfiguration serverConfig) { + this.url = serverConfig.getString(PUBLISHER_URL_KEY); + this.exportName = serverConfig.getString(PUBLISHER_NAME_KEY); + this.tstorePublishUrl = serverConfig.getString(PUBLISHER_ENDPOINT_POST_KEY); + this.tstoreQueryUrl = serverConfig.getString(PUBLISHER_ENDPOINT_QUERY_KEY); + this.domainsDir = + serverConfig.getString(PUBLISHER_SPARQL_DOMAINS_DIRECTORY_KEY); + ServerDetails upserver = new ServerDetails(serverConfig); + this.setUploadServer(upserver); } - public void setExportName(String exportName) { - this.exportName = exportName; + public String getExportName() { + return exportName; } public String getUrl() { return url; } - public void setUrl(String url) { - this.url = url; - } - public String getTstorePublishUrl() { return tstorePublishUrl; } - public void setTstorePublishUrl(String tstorePublishUrl) { - this.tstorePublishUrl = tstorePublishUrl; - } - public String getTstoreQueryUrl() { return tstoreQueryUrl; } - public void setTstoreQueryUrl(String tstoreQueryUrl) { - this.tstoreQueryUrl = tstoreQueryUrl; - } - public ServerDetails getUploadServer() { return uploadServer; } - public void setUploadServer(ServerDetails uploadServer) { - this.uploadServer = uploadServer; - } - public String getDomainsDir() { return domainsDir; } - public void setDomainsDir(String domainsDir) { - this.domainsDir = domainsDir; + public void setUploadServer(ServerDetails uploadServer) { + this.uploadServer = uploadServer; } } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java index 121344fb..85882a42 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java @@ -1,10 +1,30 @@ package edu.isi.wings.portal.classes.config; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import org.apache.commons.configuration.plist.PropertyListConfiguration; + /** * Created by varun on 13/07/2015. */ public class ServerDetails { + private static final String PUBLISHER_UPLOAD_SERVER_MAX_UPLOAD_SIZE = + "publisher.upload-server.max-upload-size"; + private static final String PUBLISHER_UPLOAD_SERVER_PRIVATE_KEY = + "publisher.upload-server.private-key"; + private static final String PUBLISHER_UPLOAD_SERVER_USERID = + "publisher.upload-server.userid"; + private static final String PUBLISHER_UPLOAD_SERVER_HOST = + "publisher.upload-server.host"; + private static final String PUBLISHER_UPLOAD_SERVER_DIRECTORY = + "publisher.upload-server.directory"; + private static final String PUBLISHER_UPLOAD_SERVER_PASSWORD = + "publisher.upload-server.password"; + private static final String PUBLISHER_UPLOAD_SERVER_USERNAME = + "publisher.upload-server.username"; + private static final String PUBLISHER_UPLOAD_SERVER_URL = + "publisher.upload-server.url"; String url; String directory; String host; @@ -14,67 +34,75 @@ public class ServerDetails { String password; long maxUploadSize = 0; // Defaults to No limit - public String getUrl() { - return url; + public ServerDetails(PropertyListConfiguration serverConfig) { + this.url = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_URL); + this.username = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_USERNAME); + this.password = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_PASSWORD); + this.directory = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_DIRECTORY); + this.host = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_HOST); + this.hostUserId = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_USERID); + this.privateKey = + serverConfig.getString(PUBLISHER_UPLOAD_SERVER_PRIVATE_KEY); + String maxUploadSizeString = serverConfig.getString( + PUBLISHER_UPLOAD_SERVER_MAX_UPLOAD_SIZE + ); + if (maxUploadSizeString != null) { + long size = this.getSizeFromString(maxUploadSizeString); + this.maxUploadSize = size; + } } - public void setUrl(String url) { - this.url = url; + public String getUrl() { + return url; } public String getDirectory() { return directory; } - public void setDirectory(String directory) { - this.directory = directory; - } - public String getHost() { return host; } - public void setHost(String host) { - this.host = host; - } - public String getPrivateKey() { return privateKey; } - public void setPrivateKey(String privateKey) { - this.privateKey = privateKey; - } - public String getHostUserId() { return hostUserId; } - public void setHostUserId(String hostUserId) { - this.hostUserId = hostUserId; - } - public long getMaxUploadSize() { return maxUploadSize; } - public void setMaxUploadSize(long maxUploadSize) { - this.maxUploadSize = maxUploadSize; - } - public String getUsername() { return username; } - public void setUsername(String username) { - this.username = username; - } - public String getPassword() { return password; } - public void setPassword(String password) { - this.password = password; + private long getSizeFromString(String sizeString) { + long kb = 1024; + long mb = kb * kb; + long gb = kb * mb; + long tb = kb * gb; + + Pattern pat = Pattern.compile("(\\d+)\\s*([KkMmGgTt])[Bb]?"); + Matcher mat = pat.matcher(sizeString); + if (mat.find()) { + long size = Long.parseLong(mat.group(1)); + if (mat.groupCount() > 1) { + String units = mat.group(2).toLowerCase(); + if (units.equals("k")) return size * kb; + if (units.equals("m")) return size * mb; + if (units.equals("g")) return size * gb; + if (units.equals("t")) return size * tb; + } + return size; + } + return 0; } } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java new file mode 100644 index 00000000..a608d44b --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java @@ -0,0 +1,113 @@ +package edu.isi.wings.portal.classes.config; + +import java.io.File; +import org.apache.commons.configuration.plist.PropertyListConfiguration; + +public class StorageConfig { + + public static final String STORAGE_DELETE_RUN_OUTPUTS = + "storage.delete-run-outputs"; + public static final String STORAGE_LOGS = "storage.logs"; + public static final String STORAGE_LOCAL = "storage.local"; + public static final String STORAGE_TDB = "storage.tdb"; + public static final String COMMUNITY_RELATIVE_DIR = "common"; + private static final String TDB_DIRECTORY = "TDB"; + private static final String LOGS_DIRECTORY = "logs"; + public String storageDirectory; + public String tdbDirectory; + public String logsDirectory; + public String communityDirectory; + public boolean deleteRunOutputs = false; + + public StorageConfig(PropertyListConfiguration serverConfig) { + if (serverConfig.containsKey(STORAGE_LOCAL)) { + this.storageDirectory = serverConfig.getString(STORAGE_LOCAL); + } else { + this.storageDirectory = createDefaultStorageDirectory(); + } + this.logsDirectory = + this.storageDirectory + File.separator + LOGS_DIRECTORY; + this.logsDirectory = this.storageDirectory + File.separator + TDB_DIRECTORY; + this.communityDirectory = + this.storageDirectory + File.separator + COMMUNITY_RELATIVE_DIR; + + if (serverConfig.containsKey(STORAGE_TDB)) { + this.tdbDirectory = serverConfig.getString(STORAGE_TDB); + } + + if (serverConfig.containsKey(STORAGE_LOGS)) { + this.logsDirectory = serverConfig.getString(STORAGE_LOGS); + } + if (serverConfig.containsKey(STORAGE_DELETE_RUN_OUTPUTS)) { + this.deleteRunOutputs = + serverConfig.getBoolean(STORAGE_DELETE_RUN_OUTPUTS); + } + createStorageDirectory(this.communityDirectory); + createStorageDirectory(this.logsDirectory); + } + + private String createDefaultStorageDirectory() { + String parentDirectory = null; + String home = System.getProperty("user.home"); + if (home != null && !home.equals("")) { + parentDirectory = + home + File.separator + ".wings" + File.separator + "storage"; + } else { + parentDirectory = + System.getProperty("java.io.tmpdir") + + File.separator + + "wings" + + File.separator + + "storage"; + } + createStorageDirectory(parentDirectory); + return parentDirectory; + } + + public static void createStorageDirectory(String directory) { + File uf = new File(directory); + if (!uf.exists() && !uf.mkdirs()) throw new RuntimeException( + "Cannot create storage directory: " + directory + ); + } + + public static String getStorageDeleteRunOutputs() { + return STORAGE_DELETE_RUN_OUTPUTS; + } + + public static String getStorageLogs() { + return STORAGE_LOGS; + } + + public static String getStorageLocal() { + return STORAGE_LOCAL; + } + + public static String getStorageTdb() { + return STORAGE_TDB; + } + + public static String getCommunityRelativeDir() { + return COMMUNITY_RELATIVE_DIR; + } + + public String getStorageDirectory() { + return storageDirectory; + } + + public String getTdbDirectory() { + return tdbDirectory; + } + + public String getLogsDirectory() { + return logsDirectory; + } + + public String getCommunityDirectory() { + return communityDirectory; + } + + public boolean isDeleteRunOutputs() { + return deleteRunOutputs; + } +} diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/html/JSLoader.java b/portal/src/main/java/edu/isi/wings/portal/classes/html/JSLoader.java index d912d555..e037a508 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/html/JSLoader.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/html/JSLoader.java @@ -99,7 +99,7 @@ public static void loadConfigurationJS(PrintWriter out, ConfigLoader config) { jsvars.put("VIEWER_ID", config.getViewerId()); jsvars.put("CONTEXT_ROOT", config.getContextRootPath()); - jsvars.put("COM_ROOT", config.portalConfig.getCommunityPath()); + jsvars.put("COM_ROOT", config.portalConfig.mainConfig.getCommunityPath()); jsvars.put("USER_ROOT", config.getUserPath()); jsvars.put("USERDOM_ROOT", config.getUserDomainUrl()); jsvars.put("SCRIPT_PATH", config.getScriptPath()); @@ -107,7 +107,10 @@ public static void loadConfigurationJS(PrintWriter out, ConfigLoader config) { jsvars.put("DOMAINS", config.getDomainsList()); jsvars.put("USERS", config.getUsersList()); jsvars.put("ISADMIN", config.isAdminViewer()); - jsvars.put("METAWORKFLOWS", config.portalConfig.hasMetaWorkflows()); + jsvars.put( + "METAWORKFLOWS", + config.portalConfig.mainConfig.hasMetaWorkflows() + ); JSLoader.showScriptKeyVals(out, jsvars); } @@ -197,7 +200,7 @@ public static String getConfigurationJS(ConfigLoader config) { jsvars.put("VIEWER_ID", config.getViewerId()); jsvars.put("CONTEXT_ROOT", config.getContextRootPath()); - jsvars.put("COM_ROOT", config.portalConfig.getCommunityPath()); + jsvars.put("COM_ROOT", config.portalConfig.mainConfig.getCommunityPath()); jsvars.put("USER_ROOT", config.getUserPath()); jsvars.put("USERDOM_ROOT", config.getUserDomainUrl()); jsvars.put("SCRIPT_PATH", config.getScriptPath()); @@ -205,7 +208,10 @@ public static String getConfigurationJS(ConfigLoader config) { jsvars.put("DOMAINS", config.getDomainsList()); jsvars.put("USERS", config.getUsersList()); jsvars.put("ISADMIN", config.isAdminViewer()); - jsvars.put("METAWORKFLOWS", config.portalConfig.hasMetaWorkflows()); + jsvars.put( + "METAWORKFLOWS", + config.portalConfig.mainConfig.hasMetaWorkflows() + ); return JSLoader.getScriptKeyVals(jsvars); } diff --git a/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java b/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java index cccd76bf..551b0942 100644 --- a/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java +++ b/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java @@ -830,7 +830,7 @@ public String runSensorWorkflow( TemplateBindings tbindings = new TemplateBindings(); tbindings.setCallbackUrl( - this.config.portalConfig.getServerUrl() + + this.config.portalConfig.mainConfig.getServerUrl() + this.config.getUserDomainUrl() + "/data/setMetadataFromSensorOutput?data_id=" + URLEncoder.encode(dataid, "UTF-8") diff --git a/portal/src/main/java/edu/isi/wings/portal/controllers/DomainController.java b/portal/src/main/java/edu/isi/wings/portal/controllers/DomainController.java index f494fd2d..0ccad9a5 100644 --- a/portal/src/main/java/edu/isi/wings/portal/controllers/DomainController.java +++ b/portal/src/main/java/edu/isi/wings/portal/controllers/DomainController.java @@ -90,7 +90,7 @@ public String getDomainsListJSON() { ", selected: " + selected + ", engines: " + - json.toJson(config.portalConfig.getEnginesList()) + + json.toJson(config.portalConfig.executionConfig.getEnginesList()) + "}" ); } @@ -303,7 +303,7 @@ public boolean setDomainExecutionEngine(String domain, String engine) { if (dominfo == null) return false; Domain dom = new Domain(dominfo); - if (config.portalConfig.getEnginesList().contains(engine)) { + if (config.portalConfig.executionConfig.getEnginesList().contains(engine)) { dom.setPlanEngine(engine); dom.setStepEngine(engine); } diff --git a/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java b/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java index 70fae9aa..5e0619b7 100644 --- a/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java +++ b/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java @@ -326,7 +326,10 @@ public String deleteRuns(String rjson, ServletContext context) { for (int i = 0; i < list.size(); i++) { JsonElement el = list.get(i); String runid = el.getAsJsonObject().get("id").getAsString(); - monitor.deleteRun(runid, config.portalConfig.isDeleteRunOutputs()); + monitor.deleteRun( + runid, + config.portalConfig.storageConfig.isDeleteRunOutputs() + ); } ret.put("success", true); @@ -342,7 +345,10 @@ public String deleteRun(String rjson, ServletContext context) { String runid = el.getAsJsonObject().get("id").getAsString(); ExecutionMonitorAPI monitor = config.getDomainExecutionMonitor(); if ( - !monitor.deleteRun(runid, config.portalConfig.isDeleteRunOutputs()) + !monitor.deleteRun( + runid, + config.portalConfig.storageConfig.isDeleteRunOutputs() + ) ) return json.toJson(ret); /* * if (monitor.runExists(runid)) { diff --git a/portal/src/main/java/edu/isi/wings/portal/resources/TemplateResource.java b/portal/src/main/java/edu/isi/wings/portal/resources/TemplateResource.java index 85193057..de497700 100644 --- a/portal/src/main/java/edu/isi/wings/portal/resources/TemplateResource.java +++ b/portal/src/main/java/edu/isi/wings/portal/resources/TemplateResource.java @@ -142,7 +142,7 @@ public String getEditorJSON(@QueryParam("template_id") String template_id) { @Path("layoutTemplate") @Produces(MediaType.APPLICATION_JSON) public String layoutTemplate(@JsonProperty("json") String json) { - String dotexe = config.portalConfig.getDotFile(); + String dotexe = config.portalConfig.mainConfig.getDotFile(); if (this.tc != null) try { return this.tc.layoutTemplate(json, dotexe); } catch (IOException e) { diff --git a/portal/src/main/java/edu/isi/wings/portal/servlets/ExportGraph.java b/portal/src/main/java/edu/isi/wings/portal/servlets/ExportGraph.java index 9f657a36..8ad9c05d 100644 --- a/portal/src/main/java/edu/isi/wings/portal/servlets/ExportGraph.java +++ b/portal/src/main/java/edu/isi/wings/portal/servlets/ExportGraph.java @@ -59,7 +59,7 @@ protected void doGet( response.addHeader( "Access-Control-Allow-Origin", - config.portalConfig.getClients() + config.portalConfig.mainConfig.getClients() ); response.addHeader("Access-Control-Allow-Credentials", "true"); response.addHeader( @@ -72,10 +72,11 @@ protected void doGet( ); String format = request.getParameter("format"); - String uri = config.portalConfig.getServerUrl() + request.getRequestURI(); + String uri = + config.portalConfig.mainConfig.getServerUrl() + request.getRequestURI(); OntFactory tdbfac = new OntFactory( OntFactory.JENA, - config.portalConfig.getTripleStoreDir() + config.portalConfig.storageConfig.getTdbDirectory() ); try { Pattern complibpat = Pattern.compile(".+\\/components\\/(.+)\\.owl"); diff --git a/portal/src/main/java/edu/isi/wings/portal/servlets/SparqlEndpoint.java b/portal/src/main/java/edu/isi/wings/portal/servlets/SparqlEndpoint.java index a5526cd9..d53bff06 100644 --- a/portal/src/main/java/edu/isi/wings/portal/servlets/SparqlEndpoint.java +++ b/portal/src/main/java/edu/isi/wings/portal/servlets/SparqlEndpoint.java @@ -94,7 +94,7 @@ private void showQueryResults( HttpServletResponse response ) throws IOException { ConfigLoader config = new ConfigLoader(request, null, null); - String tdbdir = config.portalConfig.getTripleStoreDir(); + String tdbdir = config.portalConfig.storageConfig.getTdbDirectory(); String format = request.getParameter("format"); this.api = new SparqlAPI(tdbdir); @@ -109,7 +109,7 @@ private void updateDataset( ConfigLoader config = new ConfigLoader(request, null, null); if (!config.checkDomain(request, response)) return; - String tdbdir = config.portalConfig.getTripleStoreDir(); + String tdbdir = config.portalConfig.storageConfig.getTdbDirectory(); this.api = new SparqlAPI(tdbdir); if (updateString.startsWith("__SERVER_RENAME:")) { @@ -121,7 +121,7 @@ private void updateDataset( } private void updateServerURL(String newurl, ConfigLoader config) { - String cururl = config.portalConfig.getServerUrl(); + String cururl = config.portalConfig.mainConfig.getServerUrl(); // Update all graphs in the triple store this.api.updateGraphURLs(cururl, newurl, out); diff --git a/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java b/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java index 47f82d15..2d562b86 100644 --- a/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java @@ -20,6 +20,8 @@ import com.google.gson.Gson; import edu.isi.wings.portal.classes.JsonHandler; import edu.isi.wings.portal.classes.config.ConfigLoader; +import edu.isi.wings.portal.classes.config.MainConfig; +import edu.isi.wings.portal.classes.config.PortalConfig; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; @@ -54,10 +56,15 @@ protected void doGet( ConfigLoader config = new ConfigLoader(request, null, null); Gson json = JsonHandler.createPrettyGson(); HashMap props = new HashMap(); - props.put("internal_server", config.portalConfig.getServerUrl()); - props.put("storage", config.portalConfig.getStorageDirectory()); - props.put("dotpath", config.portalConfig.getDotFile()); - props.put("ontology", config.portalConfig.getWorkflowOntologyUrl()); + PortalConfig portalConfig = config.portalConfig; + MainConfig mainConfig = portalConfig.mainConfig; + props.put("internal_server", mainConfig.getServerUrl()); + props.put("storage", portalConfig.storageConfig.getStorageDirectory()); + props.put("dotpath", mainConfig.getDotFile()); + props.put( + "ontology", + config.portalConfig.getOntologyConfig().getWorkflowOntologyUrl() + ); props.put("planner", config.portalConfig.getPlannerConfig()); out.println(json.toJson(props)); out.close(); diff --git a/portal/src/main/webapp/jsp/viewers/ComponentViewer.jsp b/portal/src/main/webapp/jsp/viewers/ComponentViewer.jsp index 7b3cfc4a..45074c57 100644 --- a/portal/src/main/webapp/jsp/viewers/ComponentViewer.jsp +++ b/portal/src/main/webapp/jsp/viewers/ComponentViewer.jsp @@ -13,8 +13,8 @@ String title = "Manage Components"; boolean isSandboxed = cc.config.portalConfig.isSandboxed(); String uploadApi = cc.config.getUserDomainUrl() + "/upload"; - String resourceApi = cc.config.portalConfig.getCommunityPath() + "/resources"; - String provApi = cc.config.portalConfig.getCommunityPath() + "/provenance"; + String resourceApi = cc.config.portalConfig.mainConfig.getCommunityPath() + "/resources"; + String provApi = cc.config.portalConfig.mainConfig.getCommunityPath() + "/provenance"; String thisApi = cc.config.getScriptPath(); int guid = 1; String tree = cc.getComponentHierarchyJSON(); diff --git a/portal/src/main/webapp/jsp/viewers/DataViewer.jsp b/portal/src/main/webapp/jsp/viewers/DataViewer.jsp index 4b77773a..fe9e9bfd 100644 --- a/portal/src/main/webapp/jsp/viewers/DataViewer.jsp +++ b/portal/src/main/webapp/jsp/viewers/DataViewer.jsp @@ -13,7 +13,7 @@ DataController dc = (DataController) request.getAttribute("controller"); boolean isSandboxed = dc.config.portalConfig.isSandboxed(); String uploadApi = dc.config.getUserDomainUrl() + "/upload"; - String provApi = dc.config.portalConfig.getCommunityPath() + "/provenance"; + String provApi = dc.config.portalConfig.mainConfig.getCommunityPath() + "/provenance"; String runApi = dc.config.getUserDomainUrl() + "/executions"; String thisApi = dc.config.getScriptPath(); int guid = 1; diff --git a/portal/src/main/webapp/jsp/viewers/TemplateViewer.jsp b/portal/src/main/webapp/jsp/viewers/TemplateViewer.jsp index cba54572..04eb90b1 100644 --- a/portal/src/main/webapp/jsp/viewers/TemplateViewer.jsp +++ b/portal/src/main/webapp/jsp/viewers/TemplateViewer.jsp @@ -24,7 +24,7 @@ String wflowns = (String) tc.props.get("ont.workflow.url") + "#"; String planApi = tc.config.getUserDomainUrl() + "/plan"; String runApi = tc.config.getUserDomainUrl() + "/executions"; - String provApi = tc.config.portalConfig.getCommunityPath() + "/provenance"; + String provApi = tc.config.portalConfig.mainConfig.getCommunityPath() + "/provenance"; String thisApi = tc.config.getScriptPath(); String components = tc.json.toJson(tc.cc.getComponentHierarchy(editor).getRoot()); String dataTree = editor ? tc.json.toJson(tc.dc.getDatatypeHierarchy().getRoot()) : null; diff --git a/portal/src/main/webapp/jsp/viewers/UserViewer.jsp b/portal/src/main/webapp/jsp/viewers/UserViewer.jsp index 0a3e2301..0b2e4f45 100644 --- a/portal/src/main/webapp/jsp/viewers/UserViewer.jsp +++ b/portal/src/main/webapp/jsp/viewers/UserViewer.jsp @@ -12,7 +12,7 @@ UserController uc = (UserController) request.getAttribute("controller"); int guid = 1; String thisApi = uc.config.getScriptPath(); - String provApi = uc.config.portalConfig.getCommunityPath() + "/provenance"; + String provApi = uc.config.portalConfig.mainConfig.getCommunityPath() + "/provenance"; String users = uc.json.toJson(uc.api.getUsers()); %> From 53129a5efb5d69a28d3fe6e8838cdf24399b048a Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Mon, 24 Jul 2023 14:42:04 -0400 Subject: [PATCH 2/8] fix: add execution configuration files --- .../classes/config/ExecutionConfig.java | 89 +++++++++++++++++++ .../classes/config/ExecutionEngine.java | 67 ++++++++++++++ 2 files changed, 156 insertions(+) create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java new file mode 100644 index 00000000..29d33633 --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java @@ -0,0 +1,89 @@ +package edu.isi.wings.portal.classes.config; + +import edu.isi.wings.execution.engine.api.impl.distributed.DistributedExecutionEngine; +import edu.isi.wings.execution.engine.api.impl.local.LocalExecutionEngine; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map.Entry; +import java.util.Set; +import org.apache.commons.configuration.HierarchicalConfiguration; +import org.apache.commons.configuration.plist.PropertyListConfiguration; + +public class ExecutionConfig { + + public HashMap engines; + + public ExecutionConfig(PropertyListConfiguration serverConfig) { + this.engines = new HashMap(); + List engineNodes = serverConfig.configurationsAt( + "execution.engine" + ); + for (HierarchicalConfiguration engineNode : engineNodes) { + ExecutionEngine engine = this.getExeEngine(engineNode); + this.engines.put(engine.getName(), engine); + } + } + + public ExecutionConfig() { + this.engines = new HashMap(); + ExecutionEngine defaultLocal = new ExecutionEngine( + "Local", + LocalExecutionEngine.class.getCanonicalName(), + ExecutionEngine.Type.BOTH + ); + ExecutionEngine defaultDistrubited = new ExecutionEngine( + "Distributed", + DistributedExecutionEngine.class.getCanonicalName(), + ExecutionEngine.Type.BOTH + ); + + this.engines.put(defaultLocal.getName(), defaultLocal); + this.engines.put(defaultDistrubited.getName(), defaultDistrubited); + } + + @SuppressWarnings("rawtypes") + private ExecutionEngine getExeEngine(HierarchicalConfiguration node) { + String name = node.getString("name"); + String impl = node.getString("implementation"); + ExecutionEngine.Type type = ExecutionEngine.Type.valueOf( + node.getString("type") + ); + ExecutionEngine engine = new ExecutionEngine(name, impl, type); + for (Iterator it = node.getKeys("properties"); it.hasNext();) { + String key = (String) it.next(); + String value = node.getString(key); + engine.addProperty(key.replace("properties.", ""), value); + } + return engine; + } + + public void addDefaultEngineConfig(PropertyListConfiguration config) { + // loop engines and add them to config + for (Entry entryEngine : this.engines.entrySet()) { + ExecutionEngine engine = entryEngine.getValue(); + config.addProperty("execution.engine(-1).name", engine.getName()); + config.addProperty( + "execution.engine.implementation", + engine.getImplementation() + ); + config.addProperty("execution.engine.type", engine.getType()); + for (Entry entryProperty : engine + .getProperties() + .entrySet()) { + config.addProperty( + "execution.engine.properties." + entryProperty.getKey(), + entryProperty.getValue() + ); + } + } + } + + public HashMap getEngines() { + return engines; + } + + public Set getEnginesList() { + return this.engines.keySet(); + } +} diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java new file mode 100644 index 00000000..042b230d --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java @@ -0,0 +1,67 @@ +package edu.isi.wings.portal.classes.config; + +import java.util.Properties; + +/** + * Created by varun on 13/07/2015. + */ +public class ExecutionEngine { + + public static enum Type { + PLAN, + STEP, + BOTH, + } + + ExecutionEngine.Type type; + String name; + String implementation; + Properties props; + + public ExecutionEngine( + String name, + String implementation, + ExecutionEngine.Type type + ) { + this.type = type; + this.name = name; + this.implementation = implementation; + props = new Properties(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public ExecutionEngine.Type getType() { + return type; + } + + public void setType(ExecutionEngine.Type type) { + this.type = type; + } + + public String getImplementation() { + return implementation; + } + + public void setImplementation(String implementation) { + this.implementation = implementation; + } + + public Properties getProperties() { + return props; + } + + public void setProperties(Properties props) { + this.props = props; + } + + public void addProperty(String key, String value) { + this.props.setProperty(key, value); + } +} From 13b04e5cc36d30eb7179946ea4a28afd4d774243 Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Mon, 24 Jul 2023 14:49:34 -0400 Subject: [PATCH 3/8] fix: remame classes --- ...ecutionEngine.java => ExecutionEngineConfig.java} | 12 ++++++------ ...erverDetails.java => FileUploadServerConfig.java} | 4 ++-- .../config/{Publisher.java => PublisherConfig.java} | 12 ++++++------ .../isi/wings/portal/controllers/DataController.java | 4 ++-- .../isi/wings/portal/controllers/RunController.java | 4 ++-- 5 files changed, 18 insertions(+), 18 deletions(-) rename portal/src/main/java/edu/isi/wings/portal/classes/config/{ExecutionEngine.java => ExecutionEngineConfig.java} (80%) rename portal/src/main/java/edu/isi/wings/portal/classes/config/{ServerDetails.java => FileUploadServerConfig.java} (96%) rename portal/src/main/java/edu/isi/wings/portal/classes/config/{Publisher.java => PublisherConfig.java} (81%) diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngineConfig.java similarity index 80% rename from portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java rename to portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngineConfig.java index 042b230d..b990f558 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngine.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngineConfig.java @@ -5,7 +5,7 @@ /** * Created by varun on 13/07/2015. */ -public class ExecutionEngine { +public class ExecutionEngineConfig { public static enum Type { PLAN, @@ -13,15 +13,15 @@ public static enum Type { BOTH, } - ExecutionEngine.Type type; + ExecutionEngineConfig.Type type; String name; String implementation; Properties props; - public ExecutionEngine( + public ExecutionEngineConfig( String name, String implementation, - ExecutionEngine.Type type + ExecutionEngineConfig.Type type ) { this.type = type; this.name = name; @@ -37,11 +37,11 @@ public void setName(String name) { this.name = name; } - public ExecutionEngine.Type getType() { + public ExecutionEngineConfig.Type getType() { return type; } - public void setType(ExecutionEngine.Type type) { + public void setType(ExecutionEngineConfig.Type type) { this.type = type; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java similarity index 96% rename from portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java rename to portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java index 85882a42..6e2e803b 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java @@ -7,7 +7,7 @@ /** * Created by varun on 13/07/2015. */ -public class ServerDetails { +public class FileUploadServerConfig { private static final String PUBLISHER_UPLOAD_SERVER_MAX_UPLOAD_SIZE = "publisher.upload-server.max-upload-size"; @@ -34,7 +34,7 @@ public class ServerDetails { String password; long maxUploadSize = 0; // Defaults to No limit - public ServerDetails(PropertyListConfiguration serverConfig) { + public FileUploadServerConfig(PropertyListConfiguration serverConfig) { this.url = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_URL); this.username = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_USERNAME); this.password = serverConfig.getString(PUBLISHER_UPLOAD_SERVER_PASSWORD); diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java similarity index 81% rename from portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java rename to portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java index 36647111..e67f1c77 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java @@ -5,7 +5,7 @@ /** * Created by varun on 13/07/2015. */ -public class Publisher { +public class PublisherConfig { private static final String PUBLISHER_SPARQL_DOMAINS_DIRECTORY_KEY = "publisher.triple-store.domains-directory"; @@ -18,19 +18,19 @@ public class Publisher { String url; String tstorePublishUrl; String tstoreQueryUrl; - ServerDetails uploadServer; + FileUploadServerConfig uploadServer; String domainsDir; String exportName; - public Publisher(PropertyListConfiguration serverConfig) { + public PublisherConfig(PropertyListConfiguration serverConfig) { this.url = serverConfig.getString(PUBLISHER_URL_KEY); this.exportName = serverConfig.getString(PUBLISHER_NAME_KEY); this.tstorePublishUrl = serverConfig.getString(PUBLISHER_ENDPOINT_POST_KEY); this.tstoreQueryUrl = serverConfig.getString(PUBLISHER_ENDPOINT_QUERY_KEY); this.domainsDir = serverConfig.getString(PUBLISHER_SPARQL_DOMAINS_DIRECTORY_KEY); - ServerDetails upserver = new ServerDetails(serverConfig); + FileUploadServerConfig upserver = new FileUploadServerConfig(serverConfig); this.setUploadServer(upserver); } @@ -50,7 +50,7 @@ public String getTstoreQueryUrl() { return tstoreQueryUrl; } - public ServerDetails getUploadServer() { + public FileUploadServerConfig getUploadServer() { return uploadServer; } @@ -58,7 +58,7 @@ public String getDomainsDir() { return domainsDir; } - public void setUploadServer(ServerDetails uploadServer) { + public void setUploadServer(FileUploadServerConfig uploadServer) { this.uploadServer = uploadServer; } } diff --git a/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java b/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java index 551b0942..7487d93b 100644 --- a/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java +++ b/portal/src/main/java/edu/isi/wings/portal/controllers/DataController.java @@ -45,7 +45,7 @@ import edu.isi.wings.portal.classes.JsonHandler; import edu.isi.wings.portal.classes.StorageHandler; import edu.isi.wings.portal.classes.config.ConfigLoader; -import edu.isi.wings.portal.classes.config.ServerDetails; +import edu.isi.wings.portal.classes.config.FileUploadServerConfig; import edu.isi.wings.portal.classes.util.CookieHandler; import edu.isi.wings.portal.classes.util.TemplateBindings; import edu.isi.wings.workflow.plan.api.ExecutionPlan; @@ -278,7 +278,7 @@ public String publishData(String dataid) { return null; } - private String uploadFile(ServerDetails server, File datafile) { + private String uploadFile(FileUploadServerConfig server, File datafile) { String upUrl = server.getUrl(); String username = server.getUsername(); String password = server.getPassword(); diff --git a/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java b/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java index 5e0619b7..a79778d5 100644 --- a/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java +++ b/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java @@ -40,8 +40,8 @@ import edu.isi.wings.planner.api.impl.kb.WorkflowGenerationKB; import edu.isi.wings.portal.classes.JsonHandler; import edu.isi.wings.portal.classes.config.ConfigLoader; +import edu.isi.wings.portal.classes.config.FileUploadServerConfig; import edu.isi.wings.portal.classes.config.Publisher; -import edu.isi.wings.portal.classes.config.ServerDetails; import edu.isi.wings.portal.classes.util.ComponentExecutingThread; import edu.isi.wings.portal.classes.util.PlanningAPIBindings; import edu.isi.wings.portal.classes.util.PlanningAndExecutingThread; @@ -640,7 +640,7 @@ public String publishRun(String runid) { Publisher publisher = config.portalConfig.getPublisher(); - ServerDetails publishUrl = publisher.getUploadServer(); + FileUploadServerConfig publishUrl = publisher.getUploadServer(); String tstoreurl = publisher.getTstorePublishUrl(); String tstorequery = publisher.getTstoreQueryUrl(); String exportName = publisher.getExportName(); From e43922a86e056d710a71c20c142870d9b9036031 Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Mon, 24 Jul 2023 14:51:10 -0400 Subject: [PATCH 4/8] fix: missing files --- .../portal/classes/config/ConfigLoader.java | 10 +++---- .../classes/config/ExecutionConfig.java | 28 +++++++++---------- .../portal/classes/config/PortalConfig.java | 6 ++-- .../portal/controllers/RunController.java | 6 ++-- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java index b36dacce..497578c3 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ConfigLoader.java @@ -345,10 +345,10 @@ public Properties getProperties(Domain domain) { storageConfig.getTdbDirectory() ); - HashMap engines = + HashMap engines = portalConfig.executionConfig.getEngines(); - ExecutionEngine pengine = engines.get(domain.getPlanEngine()); - ExecutionEngine sengine = engines.get(domain.getStepEngine()); + ExecutionEngineConfig pengine = engines.get(domain.getPlanEngine()); + ExecutionEngineConfig sengine = engines.get(domain.getStepEngine()); props.putAll(pengine.getProperties()); props.putAll(sengine.getProperties()); } else { @@ -392,10 +392,10 @@ public Properties getProperties(Domain domain) { } public PlanExecutionEngine getDomainExecutionEngine() { - ExecutionEngine planEngine = portalConfig.executionConfig.engines.get( + ExecutionEngineConfig planEngine = portalConfig.executionConfig.engines.get( domain.getPlanEngine() ); - ExecutionEngine stepEngine = portalConfig.executionConfig.engines.get( + ExecutionEngineConfig stepEngine = portalConfig.executionConfig.engines.get( domain.getStepEngine() ); try { diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java index 29d33633..5739a04a 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java @@ -12,30 +12,30 @@ public class ExecutionConfig { - public HashMap engines; + public HashMap engines; public ExecutionConfig(PropertyListConfiguration serverConfig) { - this.engines = new HashMap(); + this.engines = new HashMap(); List engineNodes = serverConfig.configurationsAt( "execution.engine" ); for (HierarchicalConfiguration engineNode : engineNodes) { - ExecutionEngine engine = this.getExeEngine(engineNode); + ExecutionEngineConfig engine = this.getExeEngine(engineNode); this.engines.put(engine.getName(), engine); } } public ExecutionConfig() { - this.engines = new HashMap(); - ExecutionEngine defaultLocal = new ExecutionEngine( + this.engines = new HashMap(); + ExecutionEngineConfig defaultLocal = new ExecutionEngineConfig( "Local", LocalExecutionEngine.class.getCanonicalName(), - ExecutionEngine.Type.BOTH + ExecutionEngineConfig.Type.BOTH ); - ExecutionEngine defaultDistrubited = new ExecutionEngine( + ExecutionEngineConfig defaultDistrubited = new ExecutionEngineConfig( "Distributed", DistributedExecutionEngine.class.getCanonicalName(), - ExecutionEngine.Type.BOTH + ExecutionEngineConfig.Type.BOTH ); this.engines.put(defaultLocal.getName(), defaultLocal); @@ -43,13 +43,13 @@ public ExecutionConfig() { } @SuppressWarnings("rawtypes") - private ExecutionEngine getExeEngine(HierarchicalConfiguration node) { + private ExecutionEngineConfig getExeEngine(HierarchicalConfiguration node) { String name = node.getString("name"); String impl = node.getString("implementation"); - ExecutionEngine.Type type = ExecutionEngine.Type.valueOf( + ExecutionEngineConfig.Type type = ExecutionEngineConfig.Type.valueOf( node.getString("type") ); - ExecutionEngine engine = new ExecutionEngine(name, impl, type); + ExecutionEngineConfig engine = new ExecutionEngineConfig(name, impl, type); for (Iterator it = node.getKeys("properties"); it.hasNext();) { String key = (String) it.next(); String value = node.getString(key); @@ -60,8 +60,8 @@ private ExecutionEngine getExeEngine(HierarchicalConfiguration node) { public void addDefaultEngineConfig(PropertyListConfiguration config) { // loop engines and add them to config - for (Entry entryEngine : this.engines.entrySet()) { - ExecutionEngine engine = entryEngine.getValue(); + for (Entry entryEngine : this.engines.entrySet()) { + ExecutionEngineConfig engine = entryEngine.getValue(); config.addProperty("execution.engine(-1).name", engine.getName()); config.addProperty( "execution.engine.implementation", @@ -79,7 +79,7 @@ public void addDefaultEngineConfig(PropertyListConfiguration config) { } } - public HashMap getEngines() { + public HashMap getEngines() { return engines; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java index 228be1fe..745eeadd 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java @@ -14,7 +14,7 @@ public class PortalConfig { public PlannerConfig plannerConfig; public ExecutionConfig executionConfig; - public Publisher publisher; + public PublisherConfig publisher; public boolean sandboxed; public void initializePortalConfig(HttpServletRequest request) { @@ -61,7 +61,7 @@ private PropertyListConfiguration loadConfigurationOnProps() { private void getPublisherConfiguration( PropertyListConfiguration serverConfig ) { - this.publisher = new Publisher(serverConfig); + this.publisher = new PublisherConfig(serverConfig); } private void getOntologyConfiguration( @@ -165,7 +165,7 @@ public String getPortalConfigurationFile() { return portalConfigurationFile; } - public Publisher getPublisher() { + public PublisherConfig getPublisher() { return publisher; } diff --git a/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java b/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java index a79778d5..77802d95 100644 --- a/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java +++ b/portal/src/main/java/edu/isi/wings/portal/controllers/RunController.java @@ -41,7 +41,7 @@ import edu.isi.wings.portal.classes.JsonHandler; import edu.isi.wings.portal.classes.config.ConfigLoader; import edu.isi.wings.portal.classes.config.FileUploadServerConfig; -import edu.isi.wings.portal.classes.config.Publisher; +import edu.isi.wings.portal.classes.config.PublisherConfig; import edu.isi.wings.portal.classes.util.ComponentExecutingThread; import edu.isi.wings.portal.classes.util.PlanningAPIBindings; import edu.isi.wings.portal.classes.util.PlanningAndExecutingThread; @@ -272,7 +272,7 @@ public String getRunPlanJSON(String runid) { } private String getPublishedURL(String runid) { - Publisher publisher = config.portalConfig.getPublisher(); + PublisherConfig publisher = config.portalConfig.getPublisher(); if (publisher == null) return null; /* TODO: Return already published url for the run id if possible */ @@ -638,7 +638,7 @@ public String publishRun(String runid) { } else try { // Mapper opmm = new Mapper(); - Publisher publisher = config.portalConfig.getPublisher(); + PublisherConfig publisher = config.portalConfig.getPublisher(); FileUploadServerConfig publishUrl = publisher.getUploadServer(); String tstoreurl = publisher.getTstorePublishUrl(); From 5ef1fc371eca899eed93eaa97175f6629e946680 Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Mon, 24 Jul 2023 15:11:16 -0400 Subject: [PATCH 5/8] fix: print configuration --- .../config/FileUploadServerConfig.java | 5 ++++ .../portal/classes/config/MainConfig.java | 12 ++++++++- .../isi/wings/portal/servlets/ViewConfig.java | 25 ++++++++++--------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java index 6e2e803b..7e82dd78 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java @@ -1,5 +1,6 @@ package edu.isi.wings.portal.classes.config; +import com.fasterxml.jackson.annotation.JsonIgnore; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.commons.configuration.plist.PropertyListConfiguration; @@ -64,10 +65,12 @@ public String getHost() { return host; } + @JsonIgnore public String getPrivateKey() { return privateKey; } + @JsonIgnore public String getHostUserId() { return hostUserId; } @@ -76,10 +79,12 @@ public long getMaxUploadSize() { return maxUploadSize; } + @JsonIgnore public String getUsername() { return username; } + @JsonIgnore public String getPassword() { return password; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java index ef6fcc23..6332b64b 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java @@ -1,5 +1,6 @@ package edu.isi.wings.portal.classes.config; +import edu.isi.kcap.wings.opmm_deprecated.Main; import java.io.File; import javax.servlet.http.HttpServletRequest; import org.apache.commons.configuration.plist.PropertyListConfiguration; @@ -20,9 +21,18 @@ public class MainConfig { public String clients; public String contextRootPath; public String exportCommunityUrl; - public String communityPath; + public MainConfig(MainConfig source) { + this.dotFile = source.getDotFile(); + this.serverUrl = source.getServerUrl(); + this.hasMetaWorkflows = source.isHasMetaWorkflows(); + this.clients = source.getClients(); + this.contextRootPath = source.getContextRootPath(); + this.exportCommunityUrl = source.getExportCommunityUrl(); + this.communityPath = source.getCommunityPath(); + } + public MainConfig( PropertyListConfiguration serverConfig, HttpServletRequest request diff --git a/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java b/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java index 2d562b86..1a506cf0 100644 --- a/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/servlets/ViewConfig.java @@ -17,6 +17,7 @@ package edu.isi.wings.portal.servlets; +import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import edu.isi.wings.portal.classes.JsonHandler; import edu.isi.wings.portal.classes.config.ConfigLoader; @@ -54,19 +55,19 @@ protected void doGet( ) throws ServletException, IOException { PrintWriter out = response.getWriter(); ConfigLoader config = new ConfigLoader(request, null, null); - Gson json = JsonHandler.createPrettyGson(); - HashMap props = new HashMap(); PortalConfig portalConfig = config.portalConfig; - MainConfig mainConfig = portalConfig.mainConfig; - props.put("internal_server", mainConfig.getServerUrl()); - props.put("storage", portalConfig.storageConfig.getStorageDirectory()); - props.put("dotpath", mainConfig.getDotFile()); - props.put( - "ontology", - config.portalConfig.getOntologyConfig().getWorkflowOntologyUrl() - ); - props.put("planner", config.portalConfig.getPlannerConfig()); - out.println(json.toJson(props)); + out.println(getJsonString(portalConfig)); out.close(); } + + private String getJsonString(Object obj) { + ObjectMapper mapper = new ObjectMapper(); + String jsonString = ""; + try { + jsonString = mapper.writeValueAsString(obj); + } catch (Exception e) { + e.printStackTrace(); + } + return jsonString; + } } From c129bf61e92a92333bfd42c7136244fa93cc73cd Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Tue, 25 Jul 2023 08:51:20 -0400 Subject: [PATCH 6/8] add: configuration documentation --- README.md | 24 ++++-- docker-compose.yml | 1 + docs/configuration.md | 82 +++++++++++++++++++ .../classes/config/ExecutionConfig.java | 38 ++++----- .../portal/classes/config/MainConfig.java | 55 +++++-------- .../portal/classes/config/OntologyConfig.java | 2 - .../portal/classes/config/PortalConfig.java | 81 ++---------------- .../portal/classes/config/StorageConfig.java | 2 +- wings-docker/config/default/portal.properties | 50 ----------- wings-docker/config/default/wings-portal.xml | 2 +- 10 files changed, 145 insertions(+), 192 deletions(-) create mode 100644 docs/configuration.md diff --git a/README.md b/README.md index 345af156..40c2dc02 100644 --- a/README.md +++ b/README.md @@ -4,28 +4,42 @@ ## Installation -### Docker +### Docker You must install [Docker](https://www.docker.com/) and [docker-compose](https://docs.docker.com/compose/install/). Clone the repository -```bash +```console $ git clone https://github.com/KnowledgeCaptureAndDiscovery/wings.git ``` Deploy the container with the following command: -```bash +```console $ docker-compose up -d ``` - Open the browser [http://localhost:8080/wings-portal](http://localhost:8080/wings-portal) to access the Wings portal. +To stop the container, run the following command: + +```bash +$ docker-compose down +``` + +#### Users + +The default user is `admin` and the password is `4dm1n!23`. You can change the password in the `./wings-docker/config/tomcat/tomcat-users.xml` and rebuild the container. + +``` +$ docker-compose build +$ docker-compose up -d +``` -Go to [README Docker](wings-docker/) for additional instructions on running the Docker image. +#### Configuration +Please follow the instructions in [README Configuration](docs/configuration.md) to configure the Wings project. #### Images diff --git a/docker-compose.yml b/docker-compose.yml index 8d22bc5c..6973163d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -11,6 +11,7 @@ services: - wings_data:/opt/wings - /var/run/docker.sock:/var/run/docker.sock - ./portal.properties:/etc/wings/portal.properties + ports: - 8080:8080 volumes: diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 00000000..6917ec9f --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,82 @@ +# Wings configuration documentation + +The wings configuration file is located at `/etc/wings/portal.properties`. It contains the following sections: + +- **main**: modify main properties +- **storage**: modify the paths where the data and database is stored +- **ontology**: reference to the WINGS ontology +- **execution**: available engines to run the workflow +- **publisher**: describes how the wings system shares data, execution, and provenance. + +Be sure to modify the configuration file carefully, as changes may affect the functionality of the Wings system. + +### Main + +The **main** section of the configuration file allows you to modify the main properties of the Wings system. + +| Name | Description | Default | +| -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | +| server | The URL of the Wings instance is used to generate the accessible URI for resources. For example, if the value is set to the default, the component library of the domain CaesarCypher and user admin will be available at http://localhost:8080/wings-portal/export/users/admin/CaesarCypher/components/library.owl. | Obtained by HTTP request. For example, http://localhost:8080 | +| graphviz | Path where the graphviz software is installed | /usr/bin/dot | +| light-reasoner | Enable or disable validation in the planning of workflow | false | + +### Storage + +The **storage** section of the configuration file allows you to specify the location of the data and database directories. Make sure to set the paths to directories with sufficient storage space and appropriate permissions for the following properties: + +| name | description | default value | +| ------------- | -------------------------------------------------- | -------------------- | +| storage.local | Directory where the data and components are stored | $HOME/.wings/storage | +| storage.local | RDF store database (Apache JENA) | $HOME/.wings/TDB | +| storage.local | Directory where the log files are stored | $HOME/.wings/logs | + +### Ontology + +The following text describes the ontology section of the Wings configuration file. The properties within this section should not be modified unless you are an advanced user with knowledge of the WINGS ontology + +The ontology section of the configuration file specifies the location and URIs of the WINGS ontology files. The following properties defin + +| Name | Description | Default Value | +| ------------------ | ----------------------------------------------------- | ----------------------------------------------------- | +| ontology.component | Location and URI of the WINGS ontology component ont | http://www.wings-workflows.org/ontology/component.owl | +| ontology.data | Location and URI of the WINGS ontology data file | http://www.wings-workflows.org/ontology/data.owl | +| ontology.execution | Location and URI of the WINGS ontology execution file | http://www.wings-workflows.org/ontology/execution.owl | +| ontology.workflow | Location and URI of the WINGS ontology workflow file | http://www.wings-workflows.org/ontology/workflow.owl | + +Again, these properties should not be modified unless you are an advanced user with knowledge of the WINGS ontology. + +### Execution and engine + +The "Execution" section lists the available engines for running your workflows. + +| Name | Description | +| -------------- | ---------------------------------------------------------- | +| name | A short name to describe the engine | +| implementation | Java path where the implementation is | +| type | Modify if the engine is used in the planning, step or both | + +WINGS supports the following engines: + +1. `local` runs the workflow as a UNIX process. +2. `distributed` runs the workflows using round robin, connecting to the server using the SSH protocol. + +By default, the local engine is activated. + +```json +execution = + { + engine = + { + name = Local; + implementation = edu.isi.wings.execution.engine.api.impl.local.LocalExecutionEngine; + type = BOTH; + } + + engine = + { + name = Distributed; + implementation = edu.isi.wings.execution.engine.api.impl.distributed.DistributedExecutionEngine; + type = BOTH; + } + } +``` diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java index 5739a04a..e93af233 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java @@ -16,30 +16,22 @@ public class ExecutionConfig { public ExecutionConfig(PropertyListConfiguration serverConfig) { this.engines = new HashMap(); - List engineNodes = serverConfig.configurationsAt( - "execution.engine" - ); - for (HierarchicalConfiguration engineNode : engineNodes) { - ExecutionEngineConfig engine = this.getExeEngine(engineNode); - this.engines.put(engine.getName(), engine); - } - } - - public ExecutionConfig() { - this.engines = new HashMap(); - ExecutionEngineConfig defaultLocal = new ExecutionEngineConfig( - "Local", - LocalExecutionEngine.class.getCanonicalName(), - ExecutionEngineConfig.Type.BOTH - ); - ExecutionEngineConfig defaultDistrubited = new ExecutionEngineConfig( - "Distributed", - DistributedExecutionEngine.class.getCanonicalName(), - ExecutionEngineConfig.Type.BOTH - ); + if (serverConfig.containsKey("execution.engine")) { + List engineNodes = + serverConfig.configurationsAt("execution.engine"); + for (HierarchicalConfiguration engineNode : engineNodes) { + ExecutionEngineConfig engine = this.getExeEngine(engineNode); + this.engines.put(engine.getName(), engine); + } + } else { + ExecutionEngineConfig defaultLocal = new ExecutionEngineConfig( + "Local", + LocalExecutionEngine.class.getCanonicalName(), + ExecutionEngineConfig.Type.BOTH + ); - this.engines.put(defaultLocal.getName(), defaultLocal); - this.engines.put(defaultDistrubited.getName(), defaultDistrubited); + this.engines.put(defaultLocal.getName(), defaultLocal); + } } @SuppressWarnings("rawtypes") diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java index 6332b64b..28ace81d 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java @@ -15,32 +15,35 @@ public class MainConfig { public static final String USERS_RELATIVE_DIR = "users"; public static final String EXPORT_SERVLET_PATH = "/export"; - public String dotFile; + public String dotFile = "/usr/bin/dot"; public String serverUrl; - public boolean hasMetaWorkflows; - public String clients; + public boolean hasMetaWorkflows = false; + public String clients = null; public String contextRootPath; public String exportCommunityUrl; public String communityPath; - public MainConfig(MainConfig source) { - this.dotFile = source.getDotFile(); - this.serverUrl = source.getServerUrl(); - this.hasMetaWorkflows = source.isHasMetaWorkflows(); - this.clients = source.getClients(); - this.contextRootPath = source.getContextRootPath(); - this.exportCommunityUrl = source.getExportCommunityUrl(); - this.communityPath = source.getCommunityPath(); - } - public MainConfig( PropertyListConfiguration serverConfig, HttpServletRequest request ) { - this.serverUrl = serverConfig.getString(MAIN_SERVER_KEY); - this.dotFile = serverConfig.getString(MAIN_GRAPHVIZ_KEY); - this.clients = serverConfig.getString(MAIN_CLIENTS_KEY); this.contextRootPath = request.getContextPath(); + if (serverConfig.containsKey(MAIN_GRAPHVIZ_KEY)) { + this.dotFile = serverConfig.getString(MAIN_GRAPHVIZ_KEY); + } + if (serverConfig.containsKey(MAIN_SERVER_KEY)) { + this.serverUrl = serverConfig.getString(MAIN_SERVER_KEY); + } else { + this.serverUrl = + request.getScheme() + + "://" + + request.getServerName() + + ":" + + request.getServerPort(); + } + if (serverConfig.containsKey(MAIN_CLIENTS_KEY)) { + this.clients = serverConfig.getString(MAIN_CLIENTS_KEY); + } if ( serverConfig.containsKey(MAIN_METAWORKFLOWS_KEY) ) this.hasMetaWorkflows = serverConfig.getBoolean(MAIN_METAWORKFLOWS_KEY); @@ -58,26 +61,6 @@ public MainConfig( StorageConfig.COMMUNITY_RELATIVE_DIR; } - public MainConfig(String defaultServer, HttpServletRequest request) { - this.serverUrl = defaultServer; - File loc1 = new File("/usr/bin/dot"); - File loc2 = new File("/usr/local/bin/dot"); - dotFile = loc2.exists() ? loc2.getAbsolutePath() : loc1.getAbsolutePath(); - this.contextRootPath = request.getContextPath(); - this.exportCommunityUrl = - this.serverUrl + - contextRootPath + - EXPORT_SERVLET_PATH + - "/" + - StorageConfig.COMMUNITY_RELATIVE_DIR; - this.communityPath = - contextRootPath + - "/" + - USERS_RELATIVE_DIR + - "/" + - StorageConfig.COMMUNITY_RELATIVE_DIR; - } - public static String getMainLightReasonerKey() { return MAIN_LIGHT_REASONER_KEY; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java index 839d1bae..ac7bfc7a 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/OntologyConfig.java @@ -37,8 +37,6 @@ public OntologyConfig(PropertyListConfiguration serverConfig) { } } - public OntologyConfig() {} - public String getComponentOntologyUrl() { return componentOntologyUrl; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java index 745eeadd..ca267dac 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java @@ -32,10 +32,13 @@ public PropertyListConfiguration getPortalConfiguration( ) { ServletContext app = request.getSession().getServletContext(); this.portalConfigurationFile = obtainConfigPath(app, request); - if (this.portalConfigurationFile == null) createDefaultConfigurationFile( - request - ); - checkIfFileExists(this.portalConfigurationFile); + try { + checkIfFileExists(portalConfigurationFile); + } catch (Exception e) { + throw new RuntimeException( + "Could not find config file: " + portalConfigurationFile + ); + } return loadConfigurationOnProps(); } @@ -85,76 +88,6 @@ private void getPlannerConfiguration(PropertyListConfiguration serverConfig) { this.plannerConfig = new PlannerConfig(serverConfig); } - private void createDefaultConfigurationFile(HttpServletRequest request) { - String configFileName = "portal.properties"; - String configDirectory = createDefaultConfigurationDirectory(); - this.portalConfigurationFile = - configDirectory + File.separator + configFileName; - File cfile = new File(this.portalConfigurationFile); - File configDir = cfile.getParentFile(); - StorageConfig.createStorageDirectory(configDir.getAbsolutePath()); - if (request != null) createDefaultPortalConfig(request); - } - - private String createDefaultConfigurationDirectory() { - String defaultDirectory = ".wings"; - String home = System.getProperty("user.home"); - if (home != null && !home.equals("")) { - return home + File.separator + defaultDirectory; - } - return "/etc/wings/portal.properties"; - } - - private void createDefaultPortalConfig(HttpServletRequest request) { - String server = - request.getScheme() + - "://" + - request.getServerName() + - ":" + - request.getServerPort(); - - PropertyListConfiguration config = new PropertyListConfiguration(); - StorageConfig storageConfig = new StorageConfig(config); - OntologyConfig ontologyDefaultConfig = new OntologyConfig(); - MainConfig mainDefaultConfig = new MainConfig(server, request); - ExecutionConfig executionConfig = new ExecutionConfig(); - - config.addProperty(MainConfig.MAIN_SERVER_KEY, server); - config.addProperty(MainConfig.MAIN_GRAPHVIZ_KEY, mainDefaultConfig.dotFile); - config.addProperty( - StorageConfig.STORAGE_LOCAL, - storageConfig.storageDirectory - ); - config.addProperty(StorageConfig.STORAGE_TDB, storageConfig.tdbDirectory); - config.addProperty( - OntologyConfig.ONTOLOGY_COMPONENT_KEY, - ontologyDefaultConfig.componentOntologyUrl - ); - config.addProperty( - OntologyConfig.ONTOLOGY_DATA_KEY, - ontologyDefaultConfig.dataOntologyUrl - ); - config.addProperty( - OntologyConfig.ONTOLOGY_EXECUTION_KEY, - ontologyDefaultConfig.executionOntologyUrl - ); - config.addProperty( - OntologyConfig.ONTOLOGY_RESOURCE_KEY, - ontologyDefaultConfig.resourceOntologyUrl - ); - config.addProperty( - OntologyConfig.ONTOLOGY_WORKFLOW_KEY, - ontologyDefaultConfig.workflowOntologyUrl - ); - executionConfig.addDefaultEngineConfig(config); - - try { - config.save(this.portalConfigurationFile); - } catch (Exception e) { - e.printStackTrace(); - } - } - private void getEngineNodeConfiguration( PropertyListConfiguration serverConfig ) { diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java index a608d44b..fc683297 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/StorageConfig.java @@ -27,7 +27,7 @@ public StorageConfig(PropertyListConfiguration serverConfig) { } this.logsDirectory = this.storageDirectory + File.separator + LOGS_DIRECTORY; - this.logsDirectory = this.storageDirectory + File.separator + TDB_DIRECTORY; + this.tdbDirectory = this.storageDirectory + File.separator + TDB_DIRECTORY; this.communityDirectory = this.storageDirectory + File.separator + COMMUNITY_RELATIVE_DIR; diff --git a/wings-docker/config/default/portal.properties b/wings-docker/config/default/portal.properties index dace1762..2c63c085 100644 --- a/wings-docker/config/default/portal.properties +++ b/wings-docker/config/default/portal.properties @@ -1,52 +1,2 @@ { - storage = - { - local = /opt/wings/storage/default; - tdb = /opt/wings/storage/default/TDB; - } - - server = http://localhost:8080; - graphviz = /usr/bin/dot; - light-reasoner = false; - ontology = - { - data = http://www.wings-workflows.org/ontology/data.owl; - component = http://www.wings-workflows.org/ontology/component.owl; - workflow = http://www.wings-workflows.org/ontology/workflow.owl; - execution = http://www.wings-workflows.org/ontology/execution.owl; - } - - execution = - { - engine = - { - name = Local; - implementation = edu.isi.wings.execution.engine.api.impl.local.LocalExecutionEngine; - type = BOTH; - } - - engine = - { - name = Distributed; - implementation = edu.isi.wings.execution.engine.api.impl.distributed.DistributedExecutionEngine; - type = BOTH; - } - } - - publisher = - { - url = "https://publisher.mint.isi.edu"; - name = "exportTest" - upload-server = - { - url = "https://publisher.mint.isi.edu"; - username = "user"; - password = "password"; - } - triple-store = { - publish = http://ontosoft.isi.edu:3030/provenance/data; - query = http://ontosoft.isi.edu:3030/provenance/sparql; - domains-directory = /opt/wings/storage/default; - } - } } diff --git a/wings-docker/config/default/wings-portal.xml b/wings-docker/config/default/wings-portal.xml index 272e5c07..b27949b0 100644 --- a/wings-docker/config/default/wings-portal.xml +++ b/wings-docker/config/default/wings-portal.xml @@ -2,4 +2,4 @@ - + \ No newline at end of file From c6b447d48b24de9d89f28f27b4b62c26a061a157 Mon Sep 17 00:00:00 2001 From: mosoriob Date: Tue, 25 Jul 2023 12:57:25 +0000 Subject: [PATCH 7/8] Prettified Code! --- .../edu/isi/wings/portal/classes/config/ExecutionConfig.java | 1 - .../java/edu/isi/wings/portal/classes/config/MainConfig.java | 2 -- .../java/edu/isi/wings/portal/classes/config/PortalConfig.java | 2 -- 3 files changed, 5 deletions(-) diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java index 339b6822..e93af233 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java @@ -34,7 +34,6 @@ public ExecutionConfig(PropertyListConfiguration serverConfig) { } } - @SuppressWarnings("rawtypes") private ExecutionEngineConfig getExeEngine(HierarchicalConfiguration node) { String name = node.getString("name"); diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java index a8f96993..5ac2d739 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java @@ -23,7 +23,6 @@ public class MainConfig { public String exportCommunityUrl; public String communityPath; - public MainConfig( PropertyListConfiguration serverConfig, HttpServletRequest request @@ -63,7 +62,6 @@ public MainConfig( StorageConfig.COMMUNITY_RELATIVE_DIR; } - public static String getMainLightReasonerKey() { return MAIN_LIGHT_REASONER_KEY; } diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java index 2e8b2f2a..ca267dac 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PortalConfig.java @@ -49,7 +49,6 @@ private String obtainConfigPath( return app.getInitParameter("config.file"); } - private PropertyListConfiguration loadConfigurationOnProps() { PropertyListConfiguration props = new PropertyListConfiguration(); try { @@ -92,7 +91,6 @@ private void getPlannerConfiguration(PropertyListConfiguration serverConfig) { private void getEngineNodeConfiguration( PropertyListConfiguration serverConfig ) { - this.executionConfig = new ExecutionConfig(serverConfig); } From d5d758874dc909baec1f7f808c12d6801a7367e1 Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Tue, 25 Jul 2023 08:59:15 -0400 Subject: [PATCH 8/8] fix: add documentation --- docs/configuration.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/configuration.md b/docs/configuration.md index 6917ec9f..d48b2dbf 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -10,6 +10,8 @@ The wings configuration file is located at `/etc/wings/portal.properties`. It co Be sure to modify the configuration file carefully, as changes may affect the functionality of the Wings system. +To inspect the configuration file, open a browser and go to [http://localhost:8080/wings-portal/config](http://localhost:8080/wings-portal/config). The sensitive information is hidden. + ### Main The **main** section of the configuration file allows you to modify the main properties of the Wings system.