From 794c264374df8444b71d340ef0bbdced4962a817 Mon Sep 17 00:00:00 2001 From: Maximiliano Osorio Date: Mon, 24 Jul 2023 15:34:54 -0400 Subject: [PATCH] add: separate each level of config as class (#164) * add: separate each level of config as class * fix: add execution configuration files * fix: remame classes * fix: missing files * fix: print configuration --- .../portal/classes/config/ConfigLoader.java | 92 +-- .../classes/config/ExecutionConfig.java | 89 +++ ...Engine.java => ExecutionEngineConfig.java} | 14 +- .../config/FileUploadServerConfig.java | 113 ++++ .../portal/classes/config/MainConfig.java | 140 +++++ .../portal/classes/config/OntologyConfig.java | 61 ++ .../portal/classes/config/PlannerConfig.java | 33 ++ .../portal/classes/config/PortalConfig.java | 536 ++++-------------- .../portal/classes/config/Publisher.java | 62 -- .../classes/config/PublisherConfig.java | 64 +++ .../portal/classes/config/ServerDetails.java | 80 --- .../portal/classes/config/StorageConfig.java | 113 ++++ .../wings/portal/classes/html/JSLoader.java | 14 +- .../portal/controllers/DataController.java | 6 +- .../portal/controllers/DomainController.java | 4 +- .../portal/controllers/RunController.java | 20 +- .../portal/resources/TemplateResource.java | 2 +- .../wings/portal/servlets/ExportGraph.java | 7 +- .../wings/portal/servlets/SparqlEndpoint.java | 6 +- .../isi/wings/portal/servlets/ViewConfig.java | 24 +- .../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 +- 24 files changed, 848 insertions(+), 642 deletions(-) create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java rename portal/src/main/java/edu/isi/wings/portal/classes/config/{ExeEngine.java => ExecutionEngineConfig.java} (76%) create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.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 delete mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java create mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java delete mode 100644 portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.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..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 @@ -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(); + ExecutionEngineConfig pengine = engines.get(domain.getPlanEngine()); + ExecutionEngineConfig 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()); + ExecutionEngineConfig planEngine = portalConfig.executionConfig.engines.get( + domain.getPlanEngine() + ); + ExecutionEngineConfig 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/ExecutionConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionConfig.java new file mode 100644 index 00000000..5739a04a --- /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) { + 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 + ); + + this.engines.put(defaultLocal.getName(), defaultLocal); + this.engines.put(defaultDistrubited.getName(), defaultDistrubited); + } + + @SuppressWarnings("rawtypes") + private ExecutionEngineConfig getExeEngine(HierarchicalConfiguration node) { + String name = node.getString("name"); + String impl = node.getString("implementation"); + ExecutionEngineConfig.Type type = ExecutionEngineConfig.Type.valueOf( + node.getString("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); + 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()) { + ExecutionEngineConfig 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/ExeEngine.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngineConfig.java similarity index 76% rename from portal/src/main/java/edu/isi/wings/portal/classes/config/ExeEngine.java rename to portal/src/main/java/edu/isi/wings/portal/classes/config/ExecutionEngineConfig.java index d94f80bd..b990f558 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ExeEngine.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 ExeEngine { +public class ExecutionEngineConfig { public static enum Type { PLAN, @@ -13,12 +13,16 @@ public static enum Type { BOTH, } - ExeEngine.Type type; + ExecutionEngineConfig.Type type; String name; String implementation; Properties props; - public ExeEngine(String name, String implementation, ExeEngine.Type type) { + public ExecutionEngineConfig( + String name, + String implementation, + ExecutionEngineConfig.Type type + ) { this.type = type; this.name = name; this.implementation = implementation; @@ -33,11 +37,11 @@ public void setName(String name) { this.name = name; } - public ExeEngine.Type getType() { + public ExecutionEngineConfig.Type getType() { return type; } - public void setType(ExeEngine.Type type) { + public void setType(ExecutionEngineConfig.Type type) { this.type = type; } 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 new file mode 100644 index 00000000..7e82dd78 --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/FileUploadServerConfig.java @@ -0,0 +1,113 @@ +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; + +/** + * Created by varun on 13/07/2015. + */ +public class FileUploadServerConfig { + + 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; + String privateKey; + String hostUserId; + String username; + String password; + long maxUploadSize = 0; // Defaults to No limit + + 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); + 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 String getUrl() { + return url; + } + + public String getDirectory() { + return directory; + } + + public String getHost() { + return host; + } + + @JsonIgnore + public String getPrivateKey() { + return privateKey; + } + + @JsonIgnore + public String getHostUserId() { + return hostUserId; + } + + public long getMaxUploadSize() { + return maxUploadSize; + } + + @JsonIgnore + public String getUsername() { + return username; + } + + @JsonIgnore + public String getPassword() { + return 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/MainConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java new file mode 100644 index 00000000..6332b64b --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/MainConfig.java @@ -0,0 +1,140 @@ +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; + +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(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_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..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 @@ -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 PublisherConfig publisher; 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 PublisherConfig(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,163 +112,60 @@ 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() { + public PublisherConfig getPublisher() { return publisher; } @@ -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 deleted file mode 100644 index 0f4dd746..00000000 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/Publisher.java +++ /dev/null @@ -1,62 +0,0 @@ -package edu.isi.wings.portal.classes.config; - -/** - * Created by varun on 13/07/2015. - */ -public class Publisher { - - String url; - String tstorePublishUrl; - String tstoreQueryUrl; - ServerDetails uploadServer; - String domainsDir; - String exportName; - - public String getExportName() { - return exportName; - } - - public void setExportName(String exportName) { - this.exportName = 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; - } -} diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java new file mode 100644 index 00000000..e67f1c77 --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/PublisherConfig.java @@ -0,0 +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 PublisherConfig { + + 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; + FileUploadServerConfig uploadServer; + + String domainsDir; + String exportName; + + 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); + FileUploadServerConfig upserver = new FileUploadServerConfig(serverConfig); + this.setUploadServer(upserver); + } + + public String getExportName() { + return exportName; + } + + public String getUrl() { + return url; + } + + public String getTstorePublishUrl() { + return tstorePublishUrl; + } + + public String getTstoreQueryUrl() { + return tstoreQueryUrl; + } + + public FileUploadServerConfig getUploadServer() { + return uploadServer; + } + + public String getDomainsDir() { + return domainsDir; + } + + public void setUploadServer(FileUploadServerConfig 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 deleted file mode 100644 index 121344fb..00000000 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/ServerDetails.java +++ /dev/null @@ -1,80 +0,0 @@ -package edu.isi.wings.portal.classes.config; - -/** - * Created by varun on 13/07/2015. - */ -public class ServerDetails { - - String url; - String directory; - String host; - String privateKey; - String hostUserId; - String username; - String password; - long maxUploadSize = 0; // Defaults to No limit - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = 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; - } -} 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..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(); @@ -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..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 @@ -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.Publisher; -import edu.isi.wings.portal.classes.config.ServerDetails; +import edu.isi.wings.portal.classes.config.FileUploadServerConfig; +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 */ @@ -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)) { @@ -632,9 +638,9 @@ public String publishRun(String runid) { } else try { // Mapper opmm = new Mapper(); - Publisher publisher = config.portalConfig.getPublisher(); + PublisherConfig publisher = config.portalConfig.getPublisher(); - ServerDetails publishUrl = publisher.getUploadServer(); + FileUploadServerConfig publishUrl = publisher.getUploadServer(); String tstoreurl = publisher.getTstorePublishUrl(); String tstorequery = publisher.getTstoreQueryUrl(); String exportName = publisher.getExportName(); 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..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,9 +17,12 @@ 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; +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; @@ -52,14 +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(); - 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()); - props.put("planner", config.portalConfig.getPlannerConfig()); - out.println(json.toJson(props)); + PortalConfig portalConfig = config.portalConfig; + 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; + } } 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()); %>