diff --git a/planner/pom.xml b/planner/pom.xml index d2337291..eade5f75 100644 --- a/planner/pom.xml +++ b/planner/pom.xml @@ -17,7 +17,7 @@ 0.1.53 - 1.3.0 + 1.3.1 0.8.11 2.2.4 4.5 diff --git a/portal/pom.xml b/portal/pom.xml index 2228f7c4..978c993e 100644 --- a/portal/pom.xml +++ b/portal/pom.xml @@ -17,7 +17,7 @@ - 1.2.6 + 1.2.7 2.5 4.5.2 2.27 diff --git a/portal/src/main/java/edu/isi/wings/portal/classes/config/Config.java b/portal/src/main/java/edu/isi/wings/portal/classes/config/Config.java index 2ed15c51..ed65d5a7 100644 --- a/portal/src/main/java/edu/isi/wings/portal/classes/config/Config.java +++ b/portal/src/main/java/edu/isi/wings/portal/classes/config/Config.java @@ -62,6 +62,8 @@ public class Config { private String storageDirectory; private String tdbDirectory; private String logsDirectory; + private String provenanceDirectory; + private String dotFile; private String serverUrl; private String workflowOntologyUrl; @@ -83,10 +85,10 @@ public class Config { private boolean isSandboxed = false; private PlannerConfig plannerConfig = new PlannerConfig(); - + // Comma separated list of spellbook client hosts private String clients; - + // The following are set from the "request" variable private String viewerId; private String userId; @@ -123,22 +125,24 @@ public void setUserDomainUrl(String userDomainUrl) { this.userDomainUrl = userDomainUrl; } - public Config() {} - + public Config() { + } + public Config(HttpServletRequest request, String userid, String domain) { - // Initialize UserDatabase - this.initializeUserDatabase(); + // Initialize UserDatabase + this.initializeUserDatabase(); - // Initialize portal config - this.initializePortalConfig(request); + // Initialize portal config + this.initializePortalConfig(request); - // Initialize user config - this.initializeUserConfig(request, userid, domain); - } + // Initialize user config + this.initializeUserConfig(request, userid, domain); + } public void getPermissions() { // Check domain, user & viewerid - // Return Permissions (canRead=true/false, canWrite=true/false, canExecute=true/false) + // Return Permissions (canRead=true/false, canWrite=true/false, + // canExecute=true/false) } public boolean checkUser(HttpServletResponse response) { @@ -165,7 +169,7 @@ public boolean checkUser(HttpServletResponse response) { } public void showError(HttpServletRequest request, - HttpServletResponse response, String message) { + HttpServletResponse response, String message) { try { response.setContentType("text/html"); request.setAttribute("message", message); @@ -177,12 +181,12 @@ public void showError(HttpServletRequest request, } public boolean checkDomain(HttpServletRequest request, - HttpServletResponse response) { + HttpServletResponse response) { return this.checkDomain(request, response, true); } public boolean checkDomain(HttpServletRequest request, - HttpServletResponse response, boolean show_error) { + HttpServletResponse response, boolean show_error) { if (!this.checkUser(response)) return false; @@ -209,7 +213,7 @@ public boolean checkDomain(HttpServletRequest request, && !this.viewerId.equals(this.userId)) { // Check domain permissions // TODO: Check read, write & execute permission based on input - // For now: all or none permissions + // For now: all or none permissions Permission perm = this.domain.getPermissionForUser(this.viewerId); if (!perm.canRead()) { if (show_error) @@ -232,8 +236,8 @@ private void initializeUserConfig(HttpServletRequest request, String userid, Str this.scriptPath = request.getRequestURI(); if (this.domainId != null) - this.userDomainUrl = this.contextRootPath + "/" + this.getUsersRelativeDir() - + "/" + this.getUserId() + "/" + this.getDomainId(); + this.userDomainUrl = this.contextRootPath + "/" + this.getUsersRelativeDir() + + "/" + this.getUserId() + "/" + this.getDomainId(); this.sessionId = request.getSession().getId(); @@ -247,8 +251,8 @@ private void initializeUserConfig(HttpServletRequest request, String userid, Str if (!this.checkUser(null)) return; - this.exportUserUrl = serverUrl + contextRootPath + exportServletPath + "/" + usersRelativeDir - + "/" + userId; + this.exportUserUrl = serverUrl + contextRootPath + exportServletPath + "/" + usersRelativeDir + + "/" + userId; this.userDir = storageDirectory + File.separator + usersRelativeDir + File.separator + userId; this.userPath = contextRootPath + "/" + usersRelativeDir + "/" + userId; @@ -277,9 +281,9 @@ private void initializeUserConfig(HttpServletRequest request, String userid, Str } if (this.domain != null) { - this.domainId = this.domain.getDomainName(); - this.userDomainUrl = this.contextRootPath + "/" + this.getUsersRelativeDir() - + "/" + this.getUserId() + "/" + this.domain.getDomainName(); + this.domainId = this.domain.getDomainName(); + this.userDomainUrl = this.contextRootPath + "/" + this.getUsersRelativeDir() + + "/" + this.getUserId() + "/" + this.domain.getDomainName(); } } @@ -333,50 +337,57 @@ private void initializePortalConfig(HttpServletRequest request) { this.workflowOntologyUrl = serverConfig.getString("ontology.workflow"); this.executionOntologyUrl = serverConfig.getString("ontology.execution"); this.resourceOntologyUrl = serverConfig.getString("ontology.resource"); - - 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); + + 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); + plannerConfig.maxQueueSize = 1000; + if (serverConfig.containsKey("planner.parallelism")) + plannerConfig.parallelism = serverConfig.getInt("planner.parallelism", 10); else - plannerConfig.parallelism = 10; - - if(serverConfig.containsKey("storage.logs")) { - this.logsDirectory = serverConfig.getString("storage.logs"); - } - else { - this.logsDirectory = this.storageDirectory + File.separator + "logs"; + plannerConfig.parallelism = 10; + + 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"); + if (serverConfig.containsKey("storage.provenance")) { + this.provenanceDirectory = serverConfig.getString("storage.provenance"); + } else { + this.provenanceDirectory = this.storageDirectory + File.separator + "provenance"; } - else { - this.deleteRunOutputs = false; + 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()); - + // Create provenanceDirectory (if it doesn't exist) + File provdir = new File(this.provenanceDirectory); + if (!provdir.exists() && !provdir.mkdirs()) + System.err.println("Cannot create provenance directory : " + provdir.getAbsolutePath()); + this.exportCommunityUrl = serverUrl + contextRootPath + exportServletPath + "/" - + communityRelativeDir; + + communityRelativeDir; this.communityPath = contextRootPath + "/" + usersRelativeDir + "/" + communityRelativeDir; - + this.communityDir = storageDirectory + File.separator + communityRelativeDir; // Create communityDir (if it doesn't exist) @@ -405,67 +416,66 @@ private void initializePortalConfig(HttpServletRequest request) { } // 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"); - - this.publisher = new Publisher(); - this.publisher.setUrl(publishUrl); - this.publisher.setExportName(publishExportName); - this.publisher.setDomainsDir(domainsDir); - this.publisher.setTstorePublishUrl(tstorePublishUrl); - this.publisher.setTstoreQueryUrl(tstoreQueryUrl); - - - 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) { + 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"); + + this.publisher = new Publisher(); + this.publisher.setUrl(publishUrl); + this.publisher.setExportName(publishExportName); + this.publisher.setDomainsDir(domainsDir); + this.publisher.setTstorePublishUrl(tstorePublishUrl); + this.publisher.setTstoreQueryUrl(tstoreQueryUrl); + + 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); + } + this.publisher.setUploadServer(upserver); } - + 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; + 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 size; - } - return 0; + return 0; } private void initializeUserDatabase() { @@ -478,7 +488,7 @@ private ExeEngine getExeEngine(HierarchicalConfiguration node) { 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(); ) { + for (Iterator it = node.getKeys("properties"); it.hasNext();) { String key = (String) it.next(); String value = node.getString(key); engine.addProperty(key.replace("properties.", ""), value); @@ -530,7 +540,7 @@ private void createDefaultPortalConfig(HttpServletRequest request) { 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); @@ -554,11 +564,13 @@ private void createDefaultPortalConfig(HttpServletRequest request) { 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));*/ + /* + * this.addEngineConfig(config, new ExeEngine("OODT", + * OODTExecutionEngine.class.getCanonicalName(), ExeEngine.Type.PLAN)); + * + * this.addEngineConfig(config, new ExeEngine("Pegasus", + * PegasusExecutionEngine.class.getCanonicalName(), ExeEngine.Type.PLAN)); + */ try { config.save(this.configFile); @@ -612,15 +624,15 @@ public Properties getProperties(Domain domain) { if (this.getResourceOntologyUrl() == null) this.setResourceOntologyUrl(ontdirurl + "/resource.owl"); props.setProperty("ont.resource.url", this.getResourceOntologyUrl()); - + props.setProperty("lib.resource.url", this.getExportCommunityUrl() + "/resource/library.owl"); if (domain != null && !domain.getUseSharedTripleStore()) - props.setProperty("lib.resource.map", - "file:" + domain.getDomainDirectory() + File.separator + "ontology" - + File.separator + "resource" + File.separator + "library.owl"); - + props.setProperty("lib.resource.map", + "file:" + domain.getDomainDirectory() + File.separator + "ontology" + + File.separator + "resource" + File.separator + "library.owl"); + props.setProperty("lib.provenance.url", this.getExportCommunityUrl() + "/provenance/library.owl"); @@ -766,15 +778,15 @@ public boolean isAdminViewer() { public void setAdminViewer(boolean isAdminViewer) { this.isAdminViewer = isAdminViewer; } - + public boolean hasMetaWorkflows() { - return hasMetaWorkflows; + return hasMetaWorkflows; } - + public void setMetaWorkflows(boolean hasMetaWorkflows) { this.hasMetaWorkflows = hasMetaWorkflows; } - + public void setExportUserUrl(String exportUserUrl) { this.exportUserUrl = exportUserUrl; } @@ -855,12 +867,16 @@ public void setTripleStoreDir(String tripleStoreDir) { this.tdbDirectory = tripleStoreDir; } + public String getProvenanceDirectory() { + return provenanceDirectory; + } + public String getLogsDirectory() { - return logsDirectory; + return logsDirectory; } public void setLogsDirectory(String logsDirectory) { - this.logsDirectory = logsDirectory; + this.logsDirectory = logsDirectory; } public String getSessionId() { @@ -888,11 +904,11 @@ public void setDotFile(String dotFile) { } public boolean isDeleteRunOutputs() { - return deleteRunOutputs; + return deleteRunOutputs; } public void setDeleteRunOutputs(boolean deleteRunOutputs) { - this.deleteRunOutputs = deleteRunOutputs; + this.deleteRunOutputs = deleteRunOutputs; } public String getClients() { @@ -902,7 +918,7 @@ public String getClients() { public void setClients(String clients) { this.clients = clients; } - + public String getStorageDirectory() { return storageDirectory; } @@ -912,15 +928,14 @@ public void setStorageDirectory(String storageDirectory) { } public PlannerConfig getPlannerConfig() { - return plannerConfig; + return plannerConfig; } public void setPlannerConfig(PlannerConfig plannerConfig) { - this.plannerConfig = plannerConfig; + this.plannerConfig = plannerConfig; } public Set getEnginesList() { return this.engines.keySet(); } } - 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 5e0ce89b..46900e15 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 @@ -52,6 +52,7 @@ import edu.isi.kcap.wings.opmm.WorkflowExecutionExport; import edu.isi.kcap.wings.opmm.WorkflowTemplateExport; import edu.isi.kcap.wings.opmm.DataTypes.Links; +import edu.isi.kcap.wings.opmm.DataTypes.ProvenanceResponseSchema; import edu.isi.kcap.ontapi.KBTriple; import edu.isi.wings.catalog.component.ComponentFactory; import edu.isi.wings.catalog.data.DataFactory; @@ -537,11 +538,11 @@ private String urlToString(URL url) { * @return * @throws Exception */ - public HashMap publishRun(String runid) throws Exception { + public ProvenanceResponseSchema publishRun(String runid) throws Exception { HashMap retmap = new HashMap(); ExecutionMonitorAPI monitor = config.getDomainExecutionMonitor(); RuntimePlan plan = monitor.getRunDetails(runid); - HashMap response = null; + ProvenanceResponseSchema response = null; if (plan.getRuntimeInfo().getStatus() != Status.SUCCESS) { throw new Exception("Can only publish successfully completed runs"); } else @@ -662,12 +663,6 @@ public HashMap publishRun(String runid) throws Exception { componentLibraryFilePath.getAbsolutePath(), planFilePath.getAbsolutePath(), endpointQueryURI, endpointPostURI, executionFilePath, expandedTemplateFilePath, abstractFilePath, filePublisher, serialization); - System.out.println(executionFilePath); - System.out.println(expandedTemplateFilePath); - System.out.println(abstractFilePath); - - System.out.println("Response: " + response); - System.out.println("Published ended"); } catch (Exception e) { throw new Exception("Error publishing run: " + e.getMessage()); } diff --git a/portal/src/main/java/edu/isi/wings/portal/resources/RunResource.java b/portal/src/main/java/edu/isi/wings/portal/resources/RunResource.java index 95874f62..922513c5 100644 --- a/portal/src/main/java/edu/isi/wings/portal/resources/RunResource.java +++ b/portal/src/main/java/edu/isi/wings/portal/resources/RunResource.java @@ -19,6 +19,7 @@ import com.google.gson.Gson; import edu.isi.kcap.wings.opmm.DataTypes.Links; +import edu.isi.kcap.wings.opmm.DataTypes.ProvenanceResponseSchema; import edu.isi.wings.portal.classes.util.TemplateBindings; import edu.isi.wings.portal.controllers.RunController; @@ -181,11 +182,9 @@ public String publishRun( @FormParam("run_id") String run_id) { if (this.rc != null) { try { - HashMap responseQuery = this.rc.publishRun(run_id); + ProvenanceResponseSchema responseQuery = this.rc.publishRun(run_id); Gson gson = new Gson(); String json = gson.toJson(responseQuery); - Links catalog = responseQuery.get("catalog"); - System.out.println(json); return json; } catch (Exception e) { // TODO Auto-generated catch block diff --git a/portal/src/main/java/edu/isi/wings/portal/servlets/ProvenanceFileServlet.java b/portal/src/main/java/edu/isi/wings/portal/servlets/ProvenanceFileServlet.java new file mode 100644 index 00000000..e3c4f381 --- /dev/null +++ b/portal/src/main/java/edu/isi/wings/portal/servlets/ProvenanceFileServlet.java @@ -0,0 +1,65 @@ +package edu.isi.wings.portal.servlets; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.OutputStream; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import edu.isi.wings.portal.classes.config.Config; + +public class ProvenanceFileServlet extends HttpServlet { + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) + throws ServletException, IOException { + Config config = new Config(request, null, null); + String provenanceDirectoryPath = config.getProvenanceDirectory(); + File provenanceDirectory = new File(provenanceDirectoryPath); + + String requestFile = request.getPathInfo(); + String filePath = provenanceDirectoryPath + File.separator + requestFile; + System.out.println("FileServlet: " + filePath); + + File file = new File(filePath); + if (!file.exists()) { + response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404. + return; + } + // check if filepath is in allowed directory + if (!isInsideDirectory(file, provenanceDirectory)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN); + return; + } + // Set content type and headers for the response + response.setContentType("application/octet-stream"); + response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\""); + + // Read the file and write its contents to the response output stream + try (FileInputStream fis = new FileInputStream(filePath); + OutputStream out = response.getOutputStream()) { + byte[] buffer = new byte[4096]; + int bytesRead; + while ((bytesRead = fis.read(buffer)) != -1) { + out.write(buffer, 0, bytesRead); + } + } catch (IOException e) { + // Handle exception + e.printStackTrace(); + } + } + + private static boolean isInsideDirectory(File file, File directory) { + File parent = file.getParentFile(); + if (parent == null) { + return false; + } else if (parent.equals(directory)) { + return true; + } else { + return isInsideDirectory(parent, directory); + } + } +} \ No newline at end of file diff --git a/portal/src/main/webapp/WEB-INF/web.xml b/portal/src/main/webapp/WEB-INF/web.xml index f211dfc2..11c49601 100644 --- a/portal/src/main/webapp/WEB-INF/web.xml +++ b/portal/src/main/webapp/WEB-INF/web.xml @@ -1,8 +1,8 @@ + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee" + xmlns:web="http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" + version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee"> Wings Portal Login page @@ -14,7 +14,7 @@ Login /login/* - + Servlet to Export Graph Graph Exporter @@ -26,6 +26,17 @@ /export/* + + Servlet to obtain the Provenance Files + Provenance Files + ProvenanceFile + edu.isi.wings.portal.servlets.ProvenanceFileServlet + + + ProvenanceFile + /provenance/* + + SparqlEndpoint @@ -36,7 +47,7 @@ SparqlEndpoint /sparql - + Wings Config Wings config @@ -46,9 +57,9 @@ ViewConfig /config - - - @@ -78,11 +89,11 @@ REQUEST FORWARD - + 43200 - + WingsUser @@ -111,7 +122,7 @@ WingsAdmin - + FORM @@ -119,5 +130,5 @@ /jsp/login/login_failed.jsp - - + + \ No newline at end of file