http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/CallTimingFilter.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/CallTimingFilter.java b/server-webapp/src/main/java/org/taverna/server/master/utils/CallTimingFilter.java deleted file mode 100644 index aead6fa..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/CallTimingFilter.java +++ /dev/null @@ -1,65 +0,0 @@ -/** - * - */ -package org.taverna.server.master.utils; - -import static java.lang.String.format; -import static java.lang.System.nanoTime; -import static org.apache.commons.logging.LogFactory.getLog; - -import java.io.IOException; - -import javax.servlet.Filter; -import javax.servlet.FilterChain; -import javax.servlet.FilterConfig; -import javax.servlet.ServletException; -import javax.servlet.ServletRequest; -import javax.servlet.ServletResponse; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.apache.commons.logging.Log; - -/** - * Logs the time it takes to service HTTP calls into Taverna Server. - * <p> - * This class is currently not used. - * - * @author Donal Fellows - */ -public class CallTimingFilter implements Filter { - private Log log; - private String name; - - @Override - public void init(FilterConfig filterConfig) throws ServletException { - log = getLog("Taverna.Server.Performance"); - name = filterConfig.getInitParameter("name"); - } - - @Override - public void doFilter(ServletRequest request, ServletResponse response, - FilterChain chain) throws IOException, ServletException { - if (request instanceof HttpServletRequest) - doFilter((HttpServletRequest) request, - (HttpServletResponse) response, chain); - else - chain.doFilter(request, response); - } - - public void doFilter(HttpServletRequest request, - HttpServletResponse response, FilterChain chain) - throws IOException, ServletException { - long start = nanoTime(); - chain.doFilter(request, response); - long elapsedTime = nanoTime() - start; - log.info(format("%s call to %s %s took %.3fms", name, - request.getMethod(), request.getRequestURI(), - elapsedTime / 1000000.0)); - } - - @Override - public void destroy() { - log = null; - } -}
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/CapabilityLister.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/CapabilityLister.java b/server-webapp/src/main/java/org/taverna/server/master/utils/CapabilityLister.java deleted file mode 100644 index 54b0420..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/CapabilityLister.java +++ /dev/null @@ -1,44 +0,0 @@ -package org.taverna.server.master.utils; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.util.ArrayList; -import java.util.List; -import java.util.Map.Entry; -import java.util.Properties; - -import javax.annotation.PostConstruct; - -import org.taverna.server.master.common.Capability; - -/** - * Utility for listing the capabilities supported by this Taverna Server - * installation. - * - * @author Donal Fellows - */ -public class CapabilityLister { - public static final String CAPABILITY_RESOURCE_FILE = "/capabilities.properties"; - private Properties properties = new Properties(); - - @PostConstruct - void loadCapabilities() throws IOException { - try (InputStream is = getClass().getResourceAsStream( - CAPABILITY_RESOURCE_FILE)) { - if (is != null) - properties.load(is); - } - } - - public List<Capability> getCapabilities() { - List<Capability> caps = new ArrayList<>(); - for (Entry<Object, Object> entry : properties.entrySet()) { - Capability c = new Capability(); - c.capability = URI.create(entry.getKey().toString()); - c.version = entry.getValue().toString(); - caps.add(c); - } - return caps; - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/CertificateChainFetcher.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/CertificateChainFetcher.java b/server-webapp/src/main/java/org/taverna/server/master/utils/CertificateChainFetcher.java deleted file mode 100644 index c27502f..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/CertificateChainFetcher.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (C) 2013 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import static java.util.Arrays.asList; -import static java.util.Collections.unmodifiableList; - -import java.io.IOException; -import java.net.URI; -import java.security.GeneralSecurityException; -import java.security.KeyManagementException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLException; -import javax.net.ssl.SSLSocket; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.TrustManagerFactory; -import javax.net.ssl.X509TrustManager; -import javax.xml.ws.Holder; - -/** - * Obtains the certificate chain for an arbitrary SSL service. Maintains a - * cache. - * - * @author Donal Fellows - */ -public class CertificateChainFetcher { - public String getProtocol() { - return protocol; - } - - public void setProtocol(String protocol) { - this.protocol = protocol; - } - - public String getKeystoreType() { - return keystoreType; - } - - public void setKeystoreType(String keystoreType) { - this.keystoreType = keystoreType; - } - - public String getAlgorithm() { - return algorithm; - } - - public void setAlgorithm(String algorithm) { - this.algorithm = algorithm; - } - - public int getTimeout() { - return timeout; - } - - public void setTimeout(int timeout) { - this.timeout = timeout; - } - - public void setSecure(boolean secure) { - this.secure = secure; - } - - private boolean secure = true; - private String protocol = "TLS"; - private String keystoreType = KeyStore.getDefaultType(); - private String algorithm = TrustManagerFactory.getDefaultAlgorithm(); - private int timeout = 10000; - - /** - * Get the certificate chain for a service. - * - * @param host - * The host (name or IP address) to contact the service on. - * @param port - * The port to contact the service on. - * @return The certificate chain, or <tt>null</tt> if no credentials are - * available. - * @throws NoSuchAlgorithmException - * If the trust manager cannot be set up because of algorithm - * problems. - * @throws KeyStoreException - * If the trust manager cannot be set up because of problems - * with the keystore type. - * @throws CertificateException - * If a bad certificate is present in the default keystore; - * <i>should be impossible</i>. - * @throws IOException - * If problems happen when trying to contact the service. - * @throws KeyManagementException - * If the SSL context can't have its special context manager - * installed. - */ - private X509Certificate[] getCertificateChainForService(String host, - int port) throws NoSuchAlgorithmException, KeyStoreException, - CertificateException, IOException, KeyManagementException { - KeyStore ks = KeyStore.getInstance(keystoreType); - SSLContext context = SSLContext.getInstance(protocol); - TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm); - ks.load(null, null); - tmf.init(ks); - final Holder<X509Certificate[]> chain = new Holder<>(); - final X509TrustManager defaultTrustManager = (X509TrustManager) tmf - .getTrustManagers()[0]; - context.init(null, new TrustManager[] { new X509TrustManager() { - @Override - public void checkClientTrusted(X509Certificate[] clientChain, - String authType) throws CertificateException { - throw new UnsupportedOperationException(); - } - - @Override - public void checkServerTrusted(X509Certificate[] serverChain, - String authType) throws CertificateException { - chain.value = serverChain; - defaultTrustManager.checkServerTrusted(serverChain, authType); - } - - @Override - public X509Certificate[] getAcceptedIssuers() { - throw new UnsupportedOperationException(); - } - } }, null); - SSLSocketFactory factory = context.getSocketFactory(); - try (SSLSocket socket = (SSLSocket) factory.createSocket(host, port)) { - socket.setSoTimeout(timeout); - socket.startHandshake(); - } catch (SSLException e) { - // Ignore - } - return chain.value; - } - - private Map<URI, List<X509Certificate>> cache = new HashMap<>(); - - /** - * Gets the certificate chain for a service identified by URI. - * - * @param uri - * The URI of the (secure) service to identify. - * @return The certificate chain. Will be <tt>null</tt> if the service is - * not secure. - * @throws IOException - * If the service is unreachable or other connection problems - * occur. - * @throws GeneralSecurityException - * If any of a number of security-related problems occur, such - * as an inability to match detailed security protocols. - */ - public List<X509Certificate> getTrustsForURI(URI uri) throws IOException, - GeneralSecurityException { - if (!secure) - return null; - synchronized (this) { - if (!cache.containsKey(uri)) { - int port = uri.getPort(); - if (port == -1) - switch (uri.getScheme()) { - case "http": - port = 80; - break; - case "https": - port = 443; - break; - default: - return null; - } - X509Certificate[] chain = getCertificateChainForService( - uri.getHost(), port); - if (chain != null) - cache.put(uri, unmodifiableList(asList(chain))); - else - cache.put(uri, null); - } - return cache.get(uri); - } - } - - /** - * Flushes the cache. - */ - public void flushCache() { - synchronized (this) { - cache.clear(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/Contextualizer.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/Contextualizer.java b/server-webapp/src/main/java/org/taverna/server/master/utils/Contextualizer.java deleted file mode 100644 index 884ff94..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/Contextualizer.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import javax.servlet.ServletContext; -import javax.ws.rs.core.UriInfo; - -import org.springframework.web.context.ServletContextAware; -import org.taverna.server.master.common.version.Version; - -/** - * Convert a string (URL, etc) to a version that is contextualized to the - * web-application. - * - * @author Donal Fellows - */ -public class Contextualizer implements ServletContextAware { - static final String ROOT_PLACEHOLDER = "%{WEBAPPROOT}"; - static final String VERSION_PLACEHOLDER = "%{VERSION}"; - static final String BASE_PLACEHOLDER = "%{BASEURL}"; - - /** - * Apply the contextualization operation. This consists of replacing the - * string <tt>{@value #ROOT_PLACEHOLDER}</tt> with the real root of the webapp. - * - * @param input - * the string to contextualize - * @return the contextualized string - */ - public String contextualize(String input) { - // Hack to work around bizarre CXF bug - String path = context.getRealPath("/").replace("%2D", "-"); - return input.replace(ROOT_PLACEHOLDER, path).replace( - VERSION_PLACEHOLDER, Version.JAVA); - } - - /** - * Apply the contextualization operation. This consists of replacing the - * string <tt>{@value #ROOT_PLACEHOLDER}</tt> with the real root of the - * webapp. - * - * @param ui - * Where to get information about the URL used to access the - * webapp. - * @param input - * the string to contextualize - * @return the contextualized string - */ - public String contextualize(UriInfo ui, String input) { - // Hack to work around bizarre CXF bug - String baseuri = ui.getBaseUri().toString().replace("%2D", "-"); - if (baseuri.endsWith("/")) - baseuri = baseuri.substring(0, baseuri.length() - 1); - return contextualize(input).replace(BASE_PLACEHOLDER, baseuri); - } - - private ServletContext context; - - @Override - public void setServletContext(ServletContext servletContext) { - context = servletContext; - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/DerbyUtils.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/DerbyUtils.java b/server-webapp/src/main/java/org/taverna/server/master/utils/DerbyUtils.java deleted file mode 100644 index f8b39e3..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/DerbyUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.taverna.server.master.utils; - -import java.io.EOFException; -import java.io.IOException; -import java.io.Writer; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Utility class, used to make Derby less broken. - * - * @see <a - * href="http://stackoverflow.com/questions/1004327/getting-rid-of-derby-log"> - * Getting rid of derby.log </a> - * @see <a - * href="http://stackoverflow.com/questions/3339736/set-system-property-with-spring-configuration-file"> - * Set system property with Spring configuration file </a> - */ -public class DerbyUtils { - /** - * A writer that channels things on to the log. - */ - public static final Writer TO_LOG = new DBLog(); - // Hack - public static final Writer DEV_NULL = TO_LOG; -} - -class DBLog extends Writer { - private Log log = LogFactory.getLog("Taverna.Server.Database"); - private StringBuilder sb = new StringBuilder(); - private boolean closed = false; - - @Override - public void write(char[] cbuf, int off, int len) throws IOException { - if (closed) - throw new EOFException(); - if (!log.isInfoEnabled()) - return; - sb.append(cbuf, off, len); - while (!closed) { - int idx = sb.indexOf("\n"), realIdx = idx; - if (idx < 0) - break; - char ch; - while (idx > 0 && ((ch = sb.charAt(idx - 1)) == '\r' || ch == ' ' || ch == '\t')) - idx--; - if (idx > 0) - log.info(sb.substring(0, idx)); - sb.delete(0, realIdx + 1); - } - } - - @Override - public void flush() throws IOException { - if (sb.length() > 0) { - log.info(sb.toString()); - sb = new StringBuilder(); - } - } - - @Override - public void close() throws IOException { - flush(); - closed = true; - sb = null; - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/FilenameUtils.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/FilenameUtils.java b/server-webapp/src/main/java/org/taverna/server/master/utils/FilenameUtils.java deleted file mode 100644 index 19299e2..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/FilenameUtils.java +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import java.util.List; - -import javax.ws.rs.core.PathSegment; - -import org.taverna.server.master.common.DirEntryReference; -import org.taverna.server.master.exceptions.FilesystemAccessException; -import org.taverna.server.master.exceptions.NoDirectoryEntryException; -import org.taverna.server.master.interfaces.Directory; -import org.taverna.server.master.interfaces.DirectoryEntry; -import org.taverna.server.master.interfaces.File; -import org.taverna.server.master.interfaces.TavernaRun; - -/** - * Utility functions for getting entries from directories. - * - * @author Donal Fellows - */ -public class FilenameUtils { - private static final String TYPE_ERROR = "trying to take subdirectory of file"; - private static final String NO_FILE = "no such directory entry"; - private static final String NOT_A_FILE = "not a file"; - private static final String NOT_A_DIR = "not a directory"; - - /** - * Get a named directory entry from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param name - * The name of the directory entry to look up. - * @return The directory entry whose name is equal to the last part of the - * path; an empty path will retrieve the working directory handle - * itself. - * @throws NoDirectoryEntryException - * If there is no such entry. - * @throws FilesystemAccessException - * If the directory isn't specified or isn't readable. - */ - public DirectoryEntry getDirEntry(TavernaRun run, String name) - throws FilesystemAccessException, NoDirectoryEntryException { - Directory dir = run.getWorkingDirectory(); - if (name == null || name.isEmpty()) - return dir; - DirectoryEntry found = dir; - boolean mustBeLast = false; - - // Must be nested loops; avoids problems with %-encoded "/" chars - for (String bit : name.split("/")) { - if (mustBeLast) - throw new FilesystemAccessException(TYPE_ERROR); - found = getEntryFromDir(bit, dir); - dir = null; - if (found instanceof Directory) { - dir = (Directory) found; - mustBeLast = false; - } else - mustBeLast = true; - } - return found; - } - - /** - * Get a named directory entry from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param d - * The path segments describing what to look up. - * @return The directory entry whose name is equal to the last part of the - * path; an empty path will retrieve the working directory handle - * itself. - * @throws NoDirectoryEntryException - * If there is no such entry. - * @throws FilesystemAccessException - * If the directory isn't specified or isn't readable. - */ - public DirectoryEntry getDirEntry(TavernaRun run, List<PathSegment> d) - throws FilesystemAccessException, NoDirectoryEntryException { - Directory dir = run.getWorkingDirectory(); - if (d == null || d.isEmpty()) - return dir; - DirectoryEntry found = dir; - boolean mustBeLast = false; - - // Must be nested loops; avoids problems with %-encoded "/" chars - for (PathSegment segment : d) - for (String bit : segment.getPath().split("/")) { - if (mustBeLast) - throw new FilesystemAccessException(TYPE_ERROR); - found = getEntryFromDir(bit, dir); - dir = null; - if (found instanceof Directory) { - dir = (Directory) found; - mustBeLast = false; - } else - mustBeLast = true; - } - return found; - } - - /** - * Get a named directory entry from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param d - * The directory reference describing what to look up. - * @return The directory entry whose name is equal to the last part of the - * path in the directory reference; an empty path will retrieve the - * working directory handle itself. - * @throws FilesystemAccessException - * If the directory isn't specified or isn't readable. - * @throws NoDirectoryEntryException - * If there is no such entry. - */ - public DirectoryEntry getDirEntry(TavernaRun run, DirEntryReference d) - throws FilesystemAccessException, NoDirectoryEntryException { - Directory dir = run.getWorkingDirectory(); - if (d == null || d.path == null || d.path.isEmpty()) - return dir; - DirectoryEntry found = dir; - boolean mustBeLast = false; - - for (String bit : d.path.split("/")) { - if (mustBeLast) - throw new FilesystemAccessException(TYPE_ERROR); - found = getEntryFromDir(bit, dir); - dir = null; - if (found instanceof Directory) { - dir = (Directory) found; - mustBeLast = false; - } else - mustBeLast = true; - } - return found; - } - - /** - * Get a named directory entry from a directory. - * - * @param name - * The name of the entry; must be "<tt>/</tt>"-free. - * @param dir - * The directory to look in. - * @return The directory entry whose name is equal to the given name. - * @throws NoDirectoryEntryException - * If there is no such entry. - * @throws FilesystemAccessException - * If the directory isn't specified or isn't readable. - */ - private DirectoryEntry getEntryFromDir(String name, Directory dir) - throws FilesystemAccessException, NoDirectoryEntryException { - if (dir == null) - throw new FilesystemAccessException(NO_FILE); - for (DirectoryEntry entry : dir.getContents()) - if (entry.getName().equals(name)) - return entry; - throw new NoDirectoryEntryException(NO_FILE); - } - - /** - * Get a named directory from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param d - * The directory reference describing what to look up. - * @return The directory whose name is equal to the last part of the path in - * the directory reference; an empty path will retrieve the working - * directory handle itself. - * @throws FilesystemAccessException - * If the directory isn't specified or isn't readable, or if the - * name doesn't refer to a directory. - * @throws NoDirectoryEntryException - * If there is no such entry. - */ - public Directory getDirectory(TavernaRun run, DirEntryReference d) - throws FilesystemAccessException, NoDirectoryEntryException { - DirectoryEntry dirEntry = getDirEntry(run, d); - if (dirEntry instanceof Directory) - return (Directory) dirEntry; - throw new FilesystemAccessException(NOT_A_DIR); - } - - /** - * Get a named directory from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param name - * The name of the directory to look up. - * @return The directory. - * @throws FilesystemAccessException - * If the directory isn't specified or isn't readable, or if the - * name doesn't refer to a directory. - * @throws NoDirectoryEntryException - * If there is no such entry. - */ - public Directory getDirectory(TavernaRun run, String name) - throws FilesystemAccessException, NoDirectoryEntryException { - DirectoryEntry dirEntry = getDirEntry(run, name); - if (dirEntry instanceof Directory) - return (Directory) dirEntry; - throw new FilesystemAccessException(NOT_A_DIR); - } - - /** - * Get a named file from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param d - * The directory reference describing what to look up. - * @return The file whose name is equal to the last part of the path in the - * directory reference; an empty path will retrieve the working - * directory handle itself. - * @throws FilesystemAccessException - * If the file isn't specified or isn't readable, or if the name - * doesn't refer to a file. - * @throws NoDirectoryEntryException - * If there is no such entry. - */ - public File getFile(TavernaRun run, DirEntryReference d) - throws FilesystemAccessException, NoDirectoryEntryException { - DirectoryEntry dirEntry = getDirEntry(run, d); - if (dirEntry instanceof File) - return (File) dirEntry; - throw new FilesystemAccessException(NOT_A_FILE); - } - - /** - * Get a named file from a workflow run. - * - * @param run - * The run whose working directory is to be used as the root of - * the search. - * @param name - * The name of the file to look up. - * @return The file whose name is equal to the last part of the path in the - * directory reference; an empty path will retrieve the working - * directory handle itself. - * @throws FilesystemAccessException - * If the file isn't specified or isn't readable, or if the name - * doesn't refer to a file. - * @throws NoDirectoryEntryException - * If there is no such entry. - */ - public File getFile(TavernaRun run, String name) - throws FilesystemAccessException, NoDirectoryEntryException { - DirectoryEntry dirEntry = getDirEntry(run, name); - if (dirEntry instanceof File) - return (File) dirEntry; - throw new FilesystemAccessException(NOT_A_FILE); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/FlushThreadLocalCacheInterceptor.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/FlushThreadLocalCacheInterceptor.java b/server-webapp/src/main/java/org/taverna/server/master/utils/FlushThreadLocalCacheInterceptor.java deleted file mode 100644 index ff52e81..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/FlushThreadLocalCacheInterceptor.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.taverna.server.master.utils; - -import org.apache.cxf.jaxrs.provider.ProviderFactory; -import org.apache.cxf.message.Message; -import org.apache.cxf.phase.AbstractPhaseInterceptor; -import org.apache.cxf.phase.Phase; - -public class FlushThreadLocalCacheInterceptor extends - AbstractPhaseInterceptor<Message> { - public FlushThreadLocalCacheInterceptor() { - super(Phase.USER_LOGICAL_ENDING); - } - - @Override - public void handleMessage(Message message) { - ProviderFactory.getInstance(message).clearThreadLocalProxies(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/InvocationCounter.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/InvocationCounter.java b/server-webapp/src/main/java/org/taverna/server/master/utils/InvocationCounter.java deleted file mode 100644 index 55a260b..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/InvocationCounter.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Before; - -/** - * This class is responsible for counting all invocations of publicly-exposed - * methods of the webapp. It's connected to the webapp primarily through an - * AspectJ-style pointcut. - * - * @author Donal Fellows - */ -@Aspect -public class InvocationCounter { - private int count; - - @Before("@annotation(org.taverna.server.master.utils.InvocationCounter.CallCounted)") - public synchronized void count() { - count++; - } - - public synchronized int getCount() { - return count; - } - - /** - * Mark methods that should be counted by the invocation counter. - * - * @author Donal Fellows - */ - @Retention(RUNTIME) - @Documented - @Target(METHOD) - public static @interface CallCounted { - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/JCECheck.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/JCECheck.java b/server-webapp/src/main/java/org/taverna/server/master/utils/JCECheck.java deleted file mode 100644 index 252e316..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/JCECheck.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2012 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import static java.lang.Integer.MAX_VALUE; -import static javax.crypto.Cipher.getMaxAllowedKeyLength; -import static org.apache.commons.logging.LogFactory.getLog; - -import java.security.GeneralSecurityException; -import java.security.NoSuchAlgorithmException; - -import javax.annotation.PostConstruct; - -import org.apache.commons.logging.Log; - -/** - * Trivial bean that checks for whether the JCE policy files that allow - * unlimited strength security are present, and warns in the log if not. - * - * @author Donal Fellows - */ -public class JCECheck { - /** - * Write a message to the log that says whether an unlimited strength - * {@linkplain #Cipher cipher} is present. This is the official proxy for - * whether the unlimited strength JCE policy files have been installed; if - * absent, the message is logged as a warning, otherwise it is just - * informational. - */ - @PostConstruct - public void checkForUnlimitedJCE() { - Log log = getLog("Taverna.Server.Utils"); - - try { - if (getMaxAllowedKeyLength("AES") < MAX_VALUE) - log.warn("maximum key length very short; unlimited " - + "strength JCE policy files maybe missing"); - else - log.info("unlimited strength JCE policy in place"); - } catch (GeneralSecurityException e) { - log.warn("problem computing key length limits!", e); - } - } - - /** - * @return Whether the unlimited strength JCE policy files are present (or - * rather whether an unlimited strength {@linkplain #Cipher cipher} - * is permitted). - */ - public boolean isUnlimitedStrength() { - try { - return getMaxAllowedKeyLength("AES") == MAX_VALUE; - } catch (NoSuchAlgorithmException e) { - return false; - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java b/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java deleted file mode 100644 index ba9ec81..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/JDOSupport.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import static java.lang.annotation.ElementType.METHOD; -import static java.lang.annotation.RetentionPolicy.RUNTIME; -import static org.apache.commons.logging.LogFactory.getLog; - -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; -import java.util.WeakHashMap; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.PreDestroy; -import javax.jdo.JDOException; -import javax.jdo.PersistenceManager; -import javax.jdo.PersistenceManagerFactory; -import javax.jdo.Query; -import javax.jdo.Transaction; - -import org.apache.commons.logging.Log; -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.springframework.beans.factory.annotation.Required; - -/** - * Simple support class that wraps up and provides access to the correct parts - * of JDO. - * - * @author Donal Fellows - * - * @param <T> The context class that the subclass will be working with. - */ -public abstract class JDOSupport<T> { - private Class<T> contextClass; - private PersistenceManagerBuilder pmb; - - /** - * Instantiate this class, supplying it a handle to the class that will be - * used to provide context for queries and accesses. - * - * @param contextClass - * Must match the type parameter to the class itself. - */ - protected JDOSupport(@Nonnull Class<T> contextClass) { - this.contextClass = contextClass; - } - - /** - * @param persistenceManagerBuilder - * The JDO engine to use for managing persistence. - */ - @Required - public void setPersistenceManagerBuilder( - PersistenceManagerBuilder persistenceManagerBuilder) { - pmb = persistenceManagerBuilder; - } - - private PersistenceManager pm() { - if (isPersistent()) - return pmb.getPersistenceManager(); - return null; - } - - /** - * Has this class actually been configured with a persistence manager by - * Spring? - * - * @return Whether there is a persistence manager installed. - */ - protected boolean isPersistent() { - return pmb != null; - } - - /** - * Get an instance of a query in JDOQL. - * - * @param filter - * The filter part of the query. - * @return The query, which should be executed to retrieve the results. - */ - @Nonnull - protected Query query(@Nonnull String filter) { - return pm().newQuery(contextClass, filter); - } - - /** - * Get an instance of a named query attached to the context class (as an - * annotation). - * - * @param name - * The name of the query. - * @return The query, which should be executed to retrieve the results. - * @see javax.jdo.annotations.Query - */ - @Nonnull - protected Query namedQuery(@Nonnull String name) { - return pm().newNamedQuery(contextClass, name); - } - - /** - * Make an instance of the context class persist in the database. It's - * identity must not already exist. - * - * @param value - * The instance to persist. - * @return The persistence-coupled instance. - */ - @Nullable - protected T persist(@Nullable T value) { - if (value == null) - return null; - return pm().makePersistent(value); - } - - /** - * Make a non-persistent (i.e., will hold its value past the end of the - * transaction) copy of a persistence-coupled instance of the context class. - * - * @param value - * The value to decouple. - * @return The non-persistent copy. - */ - @Nullable - protected T detach(@Nullable T value) { - if (value == null) - return null; - return pm().detachCopy(value); - } - - /** - * Look up an instance of the context class by its identity. - * - * @param id - * The identity of the object. - * @return The instance, which is persistence-coupled. - */ - @Nullable - protected T getById(Object id) { - try { - return pm().getObjectById(contextClass, id); - } catch (Exception e) { - return null; - } - } - - /** - * Delete a persistence-coupled instance of the context class. - * - * @param value - * The value to delete. - */ - protected void delete(@Nullable T value) { - if (value != null) - pm().deletePersistent(value); - } - - /** - * Manages integration of JDO transactions with Spring. - * - * @author Donal Fellows - */ - @Aspect - public static class TransactionAspect { - private Object lock = new Object(); - private Log log = getLog("Taverna.Server.Utils"); - private volatile int txid; - - @Around(value = "@annotation(org.taverna.server.master.utils.JDOSupport.WithinSingleTransaction) && target(support)", argNames = "support") - Object applyTransaction(ProceedingJoinPoint pjp, JDOSupport<?> support) - throws Throwable { - synchronized (lock) { - PersistenceManager pm = support.pm(); - int id = ++txid; - Transaction tx = (pm == null) ? null : pm.currentTransaction(); - if (tx != null && tx.isActive()) - tx = null; - if (tx != null) { - if (log.isDebugEnabled()) - log.debug("starting transaction #" + id); - tx.begin(); - } - try { - Object result = pjp.proceed(); - if (tx != null) { - tx.commit(); - if (log.isDebugEnabled()) - log.debug("committed transaction #" + id); - } - tx = null; - return result; - } catch (Throwable t) { - try { - if (tx != null) { - tx.rollback(); - if (log.isDebugEnabled()) - log.debug("rolled back transaction #" + id); - } - } catch (JDOException e) { - log.warn("rollback failed unexpectedly", e); - } - throw t; - } - } - } - } - - /** - * Mark a method (of a subclass of {@link JDOSupport}) as having a - * transaction wrapped around it. The transactions are managed correctly in - * the multi-threaded case. - * - * @author Donal Fellows - */ - @Target(METHOD) - @Retention(RUNTIME) - @Documented - public @interface WithinSingleTransaction { - } - - /** - * Manages {@linkplain PersistenceManager persistence managers} in a way - * that doesn't cause problems when the web application is unloaded. - * - * @author Donal Fellows - */ - public static class PersistenceManagerBuilder { - private PersistenceManagerFactory pmf; - private WeakHashMap<Thread, PersistenceManager> cache = new WeakHashMap<>(); - - /** - * @param persistenceManagerFactory - * The JDO engine to use for managing persistence. - */ - @Required - public void setPersistenceManagerFactory( - PersistenceManagerFactory persistenceManagerFactory) { - pmf = persistenceManagerFactory; - } - - @Nonnull - public PersistenceManager getPersistenceManager() { - if (cache == null) - return pmf.getPersistenceManager(); - Thread t = Thread.currentThread(); - PersistenceManager pm = cache.get(t); - if (pm == null && pmf != null) { - pm = pmf.getPersistenceManager(); - cache.put(t, pm); - } - return pm; - } - - @PreDestroy - void clearThreadCache() { - WeakHashMap<Thread, PersistenceManager> cache = this.cache; - this.cache = null; - for (PersistenceManager pm : cache.values()) - if (pm != null) - pm.close(); - cache.clear(); - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/LoggingDerbyAdapter.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/LoggingDerbyAdapter.java b/server-webapp/src/main/java/org/taverna/server/master/utils/LoggingDerbyAdapter.java deleted file mode 100644 index a8aa937..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/LoggingDerbyAdapter.java +++ /dev/null @@ -1,138 +0,0 @@ -package org.taverna.server.master.utils; - -import static java.lang.System.currentTimeMillis; -import static java.lang.Thread.sleep; -import static org.apache.commons.logging.LogFactory.getLog; - -import java.sql.DatabaseMetaData; -import java.util.Properties; - -import org.apache.commons.logging.Log; -import org.datanucleus.store.rdbms.adapter.DerbyAdapter; -import org.datanucleus.store.rdbms.identifier.IdentifierFactory; -import org.datanucleus.store.rdbms.key.CandidateKey; -import org.datanucleus.store.rdbms.key.ForeignKey; -import org.datanucleus.store.rdbms.key.Index; -import org.datanucleus.store.rdbms.key.PrimaryKey; -import org.datanucleus.store.rdbms.sql.SQLTable; -import org.datanucleus.store.rdbms.table.Column; -import org.datanucleus.store.rdbms.table.Table; -import org.datanucleus.store.rdbms.table.TableImpl; -import org.datanucleus.store.rdbms.table.ViewImpl; - -/** - * Evil hack to allow logging of the DDL spat out to Derby. - * - * @author Donal Fellows - */ -public class LoggingDerbyAdapter extends DerbyAdapter { - Log log = getLog("Taverna.Server.SQL"); - - private StringBuilder ddl = new StringBuilder(); - private volatile long timeout; - private Thread timer; - - private synchronized void logDDL() { - if (ddl.length() > 0) { - log.info("Data definition language:\n" + ddl); - ddl.setLength(0); - } - timer = null; - } - - private synchronized void doLog(String item) { - ddl.append(item); - if (!item.endsWith("\n")) - ddl.append('\n'); - timeout = currentTimeMillis() + 5000; - if (timer == null) - timer = new OneShotThread("DDL logger timeout", new Runnable() { - @Override - public void run() { - try { - while (timeout > currentTimeMillis()) - sleep(1000); - } catch (InterruptedException e) { - // Ignore - } - logDDL(); - } - }); - } - - /** - * Creates an Apache Derby adapter based on the given metadata which logs - * the DDL it creates. - */ - public LoggingDerbyAdapter(DatabaseMetaData metadata) { - super(metadata); - } - - @Override - public String getCreateTableStatement(TableImpl table, Column[] columns, - Properties props, IdentifierFactory factory) { - String statement = super.getCreateTableStatement(table, columns, props, - factory); - doLog(statement); - return statement; - } - - @Override - public String getCreateIndexStatement(Index index, IdentifierFactory factory) { - String statement = super.getCreateIndexStatement(index, factory); - doLog(statement); - return statement; - } - - @Override - public String getAddCandidateKeyStatement(CandidateKey ck, - IdentifierFactory factory) { - String statement = super.getAddCandidateKeyStatement(ck, factory); - doLog(statement); - return statement; - } - - @Override - public String getAddPrimaryKeyStatement(PrimaryKey pk, - IdentifierFactory factory) { - String statement = super.getAddPrimaryKeyStatement(pk, factory); - doLog(statement); - return statement; - } - - @Override - public String getAddColumnStatement(Table table, Column col) { - String statement = super.getAddColumnStatement(table, col); - doLog(statement); - return statement; - } - - @Override - public String getAddForeignKeyStatement(ForeignKey fk, - IdentifierFactory factory) { - String statement = super.getAddForeignKeyStatement(fk, factory); - doLog(statement); - return statement; - } - - @Override - public String getDeleteTableStatement(SQLTable tbl) { - String statement = super.getDeleteTableStatement(tbl); - doLog(statement); - return statement; - } - - @Override - public String getDropTableStatement(Table table) { - String statement = super.getDropTableStatement(table); - doLog(statement); - return statement; - } - - @Override - public String getDropViewStatement(ViewImpl view) { - String statement = super.getDropViewStatement(view); - doLog(statement); - return statement; - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/OneShotThread.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/OneShotThread.java b/server-webapp/src/main/java/org/taverna/server/master/utils/OneShotThread.java deleted file mode 100644 index 68b813d..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/OneShotThread.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.taverna.server.master.utils; - -public class OneShotThread extends Thread { - public OneShotThread(String name, Runnable target) { - super(target, name); - setContextClassLoader(null); - setDaemon(true); - start(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/RestUtils.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/RestUtils.java b/server-webapp/src/main/java/org/taverna/server/master/utils/RestUtils.java deleted file mode 100644 index a892b52..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/RestUtils.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2013 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import javax.ws.rs.OPTIONS; -import javax.ws.rs.core.Response; - -/** - * Utilities that make it easier to write REST services. - * - * @author Donal Fellows - */ -public class RestUtils { - /** - * Generate a response to an HTTP OPTIONS request. - * - * @param methods - * The state-changing methods supported, if any. - * @return the required response - * @see OPTIONS - */ - public static Response opt(String... methods) { - StringBuilder sb = new StringBuilder("GET,"); - for (String m : methods) - sb.append(m).append(","); - sb.append("HEAD,OPTIONS"); - return Response.ok().header("Allow", sb.toString()).entity("").build(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/RuntimeExceptionWrapper.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/RuntimeExceptionWrapper.java b/server-webapp/src/main/java/org/taverna/server/master/utils/RuntimeExceptionWrapper.java deleted file mode 100644 index 0b2d4ea..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/RuntimeExceptionWrapper.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import org.aspectj.lang.annotation.AfterThrowing; -import org.aspectj.lang.annotation.Aspect; -import org.taverna.server.master.exceptions.GeneralFailureException; - -/** - * Aspect used to convert {@linkplain RuntimeException runtime exceptions} into - * a form that can be nicely conveyed to the outside world as HTTP errors. - * - * @author Donal Fellows - */ -@Aspect -public class RuntimeExceptionWrapper { - /** - * Map an unexpected exception to one that can be correctly reported as a - * problem. - * - * @param exn - * The runtime exception being trapped. - * @throws GeneralFailureException - * The known exception type that it is mapped to. - */ - @AfterThrowing(pointcut = "execution(* org.taverna.server.master.rest..*(..)) && !bean(*Provider.*)", throwing = "exn") - public void wrapRuntimeException(RuntimeException exn) - throws GeneralFailureException { - // Exclude security-related exceptions - if (exn.getClass().getName().startsWith("org.springframework.security.")) - return; - throw new GeneralFailureException(exn); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/UsernamePrincipal.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/UsernamePrincipal.java b/server-webapp/src/main/java/org/taverna/server/master/utils/UsernamePrincipal.java deleted file mode 100644 index 9bbcc2f..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/UsernamePrincipal.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import java.io.Serializable; -import java.security.Principal; - -import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; - -/** - * A simple serializable principal that just records the name. - * - * @author Donal Fellows - */ -public class UsernamePrincipal implements Principal, Serializable { - private static final long serialVersionUID = 2703493248562435L; - public UsernamePrincipal(String username) { - this.name = username; - } - - public UsernamePrincipal(Principal other) { - this.name = other.getName(); - } - - public UsernamePrincipal(Authentication auth) { - this(auth.getPrincipal()); - } - - public UsernamePrincipal(Object principal) { - if (principal instanceof Principal) - this.name = ((Principal) principal).getName(); - else if (principal instanceof String) - this.name = (String) principal; - else if (principal instanceof UserDetails) - this.name = ((UserDetails) principal).getUsername(); - else - this.name = principal.toString(); - } - - private String name; - - @Override - public String getName() { - return name; - } - - @Override - public String toString() { - return "Principal<" + name + ">"; - } - - @Override - public boolean equals(Object o) { - if (o instanceof Principal) { - Principal p = (Principal) o; - return name.equals(p.getName()); - } - return false; - } - - @Override - public int hashCode() { - return name.hashCode(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/WSDLHeadOptionsInterceptor.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/WSDLHeadOptionsInterceptor.java b/server-webapp/src/main/java/org/taverna/server/master/utils/WSDLHeadOptionsInterceptor.java deleted file mode 100644 index 96cdc6d..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/WSDLHeadOptionsInterceptor.java +++ /dev/null @@ -1,65 +0,0 @@ -package org.taverna.server.master.utils; - -import static org.apache.commons.logging.LogFactory.getLog; -import static org.apache.cxf.common.util.UrlUtils.parseQueryString; -import static org.apache.cxf.message.Message.HTTP_REQUEST_METHOD; -import static org.apache.cxf.message.Message.QUERY_STRING; -import static org.apache.cxf.message.Message.REQUEST_URL; -import static org.apache.cxf.phase.Phase.READ; - -import java.util.Map; - -import org.apache.commons.logging.Log; -import org.apache.cxf.binding.soap.interceptor.EndpointSelectionInterceptor; -import org.apache.cxf.interceptor.Fault; -import org.apache.cxf.message.Message; -import org.apache.cxf.phase.AbstractPhaseInterceptor; - - -/** - * Thunk for TAVSERV-293. - * - * @author Donal Fellows (based on work by Daniel Hagen) - */ -public class WSDLHeadOptionsInterceptor extends - AbstractPhaseInterceptor<Message> { - public static final Log log = getLog("Taverna.Server.Utils"); - - public WSDLHeadOptionsInterceptor() { - super(READ); - getAfter().add(EndpointSelectionInterceptor.class.getName()); - } - - @Override - public void handleMessage(Message message) throws Fault { - String method = (String) message.get(HTTP_REQUEST_METHOD); - String query = (String) message.get(QUERY_STRING); - - if (("HEAD".equals(method) || "OPTIONS".equals(method)) - && query != null && !query.trim().isEmpty() - && isRecognizedQuery(query)) { - log.debug("adjusting message request method " + method + " for " - + message.get(REQUEST_URL) + " to GET"); - message.put(HTTP_REQUEST_METHOD, "GET"); - } - } - - /* - * Stolen from http://permalink.gmane.org/gmane.comp.apache.cxf.user/20037 - * which is itself in turn stolen from - * org.apache.cxf.frontend.WSDLGetInterceptor.isRecognizedQuery - */ - /** - * Is this a query for WSDL or XSD relating to it? - * - * @param query - * The query string to check - * @return If the query is one to handle. - * @see org.apache.cxf.frontend.WSDLGetInterceptor#isRecognizedQuery(Map,String,String,org.apache.cxf.service.model.EndpointInfo) - * WSDLGetInterceptor - */ - private boolean isRecognizedQuery(String query) { - Map<String, String> map = parseQueryString(query); - return map.containsKey("wsdl") || map.containsKey("xsd"); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/WebappAwareDataSource.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/WebappAwareDataSource.java b/server-webapp/src/main/java/org/taverna/server/master/utils/WebappAwareDataSource.java deleted file mode 100644 index 03fc749..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/WebappAwareDataSource.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import static java.lang.Thread.currentThread; -import static java.sql.DriverManager.deregisterDriver; -import static java.sql.DriverManager.getDrivers; -import static org.taverna.server.master.utils.Contextualizer.ROOT_PLACEHOLDER; - -import java.io.PrintWriter; -import java.sql.Connection; -import java.sql.Driver; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Enumeration; - -import javax.annotation.PreDestroy; - -import org.apache.commons.dbcp.BasicDataSource; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Required; - -/** - * Add some awareness of the context so that we can locate databases internally - * to the webapp. - * - * @author Donal Fellows - */ -public class WebappAwareDataSource extends BasicDataSource { - Log log = LogFactory.getLog("Taverna.Server.Utils"); - private transient boolean init; - private Contextualizer ctxt; - private String shutdownUrl; - - @Required - public void setContextualizer(Contextualizer ctxt) { - this.ctxt = ctxt; - } - - /** - * A JDBC connection URL to use on shutting down the database. If not set, - * do nothing special. - * - * @param url - */ - public void setShutdownUrl(String url) { - shutdownUrl = url; - } - - private void doInit() { - synchronized (this) { - if (!init) { - setDriverClassLoader(currentThread().getContextClassLoader()); - String url = getUrl(); - if (url.contains(ROOT_PLACEHOLDER)) { - String newurl = ctxt.contextualize(url); - setUrl(newurl); - log.info("mapped " + url + " to " + newurl); - } else { - log.info("did not find " + ROOT_PLACEHOLDER + " in " + url); - } - init = true; - } - } - } - - // -=-=-=-=-=-=-=-=-=-=- HOOKS -=-=-=-=-=-=-=-=-=-=- - - @Override - public Connection getConnection() throws SQLException { - doInit(); - return super.getConnection(); - } - - @Override - public void setLogWriter(PrintWriter pw) throws SQLException { - doInit(); - super.setLogWriter(pw); - } - - @Override - public void setLoginTimeout(int num) throws SQLException { - doInit(); - super.setLoginTimeout(num); - } - - @Override - public PrintWriter getLogWriter() throws SQLException { - doInit(); - return super.getLogWriter(); - } - - @Override - public int getLoginTimeout() throws SQLException { - doInit(); - return super.getLoginTimeout(); - } - - @PreDestroy - void realClose() { - try { - close(); - } catch (SQLException e) { - log.warn("problem shutting down DB connection", e); - } - try { - if (shutdownUrl != null) - DriverManager.getConnection(ctxt.contextualize(shutdownUrl)); - } catch (SQLException e) { - // Expected; ignore it - } - log = null; - dropDriver(); - } - - private void dropDriver() { - Enumeration<Driver> drivers = getDrivers(); - while (drivers.hasMoreElements()) { - Driver d = drivers.nextElement(); - if (d.getClass().getClassLoader() == getDriverClassLoader() - && d.getClass().getName().equals(getDriverClassName())) { - try { - deregisterDriver(d); - } catch (SQLException e) { - } - break; - } - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/X500Utils.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/X500Utils.java b/server-webapp/src/main/java/org/taverna/server/master/utils/X500Utils.java deleted file mode 100644 index da4cff0..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/X500Utils.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.utils; - -import static javax.security.auth.x500.X500Principal.RFC2253; - -import java.math.BigInteger; -import java.security.cert.X509Certificate; -import java.util.HashMap; -import java.util.Map; - -import javax.annotation.PreDestroy; -import javax.security.auth.x500.X500Principal; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * Support class that factors out some of the messier parts of working with - * X.500 identities and X.509 certificates. - * - * @author Donal Fellows - */ -public class X500Utils { - private Log log = LogFactory.getLog("Taverna.Server.Utils"); - - @PreDestroy - void closeLog() { - log = null; - } - - private static final char DN_SEPARATOR = ','; - private static final char DN_ESCAPE = '\\'; - private static final char DN_QUOTE = '"'; - - /** - * Parse the DN from the Principal and extract the CN field. - * - * @param id - * The identity to extract the distinguished name from. - * @param fields - * The names to look at when finding the field to return. Each - * should be an upper-cased string. - * @return The common-name part of the distinguished name, or the literal - * string "<tt>none</tt>" if there is no CN. - */ - public String getName(X500Principal id, String... fields) { - String dn = id.getName(RFC2253); - - int i = 0; - int startIndex = 0; - boolean ignoreThisChar = false; - boolean inQuotes = false; - Map<String, String> tokenized = new HashMap<>(); - - for (i = 0; i < dn.length(); i++) - if (ignoreThisChar) - ignoreThisChar = false; - else if (dn.charAt(i) == DN_QUOTE) - inQuotes = !inQuotes; - else if (inQuotes) - continue; - else if (dn.charAt(i) == DN_ESCAPE) - ignoreThisChar = true; - else if ((dn.charAt(i) == DN_SEPARATOR) && !ignoreThisChar) { - storeDNField(tokenized, dn.substring(startIndex, i).trim() - .split("=", 2)); - startIndex = i + 1; - } - if (inQuotes || ignoreThisChar) - log.warn("was parsing invalid DN format"); - // Add last token - after the last delimiter - storeDNField(tokenized, dn.substring(startIndex).trim().split("=", 2)); - - for (String field : fields) { - String value = tokenized.get(field); - if (value != null) - return value; - } - return "none"; - } - - private void storeDNField(Map<String, String> container, String[] split) { - if (split == null || split.length != 2) - return; - String key = split[0].toUpperCase(); - if (container.containsKey(key)) - log.warn("duplicate field in DN: " + key); - // LATER: Should the field be de-quoted? - container.put(key, split[1]); - } - - /** - * Get the serial number from a certificate as a hex string. - * - * @param cert - * The certificate to extract from. - * @return A hex string, in upper-case. - */ - public String getSerial(X509Certificate cert) { - return new BigInteger(1, cert.getSerialNumber().toByteArray()) - .toString(16).toUpperCase(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/utils/package-info.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/utils/package-info.java b/server-webapp/src/main/java/org/taverna/server/master/utils/package-info.java deleted file mode 100644 index 612e61c..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/utils/package-info.java +++ /dev/null @@ -1,10 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -/** - * Miscellaneous utility classes. Includes aspects that might be attached - * for purposes such as transaction management and invocation tracking. - */ -package org.taverna.server.master.utils; http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/worker/CompletionNotifier.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/worker/CompletionNotifier.java b/server-webapp/src/main/java/org/taverna/server/master/worker/CompletionNotifier.java deleted file mode 100644 index 10b3830..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/worker/CompletionNotifier.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.worker; - - -/** - * How to convert a notification about the completion of a job into a message. - * - * @author Donal Fellows - */ -public interface CompletionNotifier { - /** - * @return The name of this notifier. - */ - String getName(); - - /** - * Called to get the content of a message that a workflow run has finished. - * - * @param name - * The name of the run. - * @param run - * What run are we talking about. - * @param code - * What the exit code was. - * @return The plain-text content of the message. - */ - String makeCompletionMessage(String name, RemoteRunDelegate run, int code); - - /** - * Called to get the subject of the message to dispatch. - * - * @param name - * The name of the run. - * @param run - * What run are we talking about. - * @param code - * What the exit code was. - * @return The plain-text subject of the message. - */ - String makeMessageSubject(String name, RemoteRunDelegate run, int code); -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/worker/FactoryBean.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/worker/FactoryBean.java b/server-webapp/src/main/java/org/taverna/server/master/worker/FactoryBean.java deleted file mode 100644 index 5d0f371..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/worker/FactoryBean.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2013 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.worker; - -import org.taverna.server.master.notification.atom.EventDAO; - -/** - * What the remote run really needs of its factory. - * - * @author Donal Fellows - */ -public interface FactoryBean { - /** - * @return Whether a run can actually be started at this time. - */ - boolean isAllowingRunsToStart(); - - /** - * @return a handle to the master Atom event feed (<i>not</i> the per-run - * feed) - */ - EventDAO getMasterEventFeed(); -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/worker/PasswordIssuer.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/worker/PasswordIssuer.java b/server-webapp/src/main/java/org/taverna/server/master/worker/PasswordIssuer.java deleted file mode 100644 index d3c5b8a..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/worker/PasswordIssuer.java +++ /dev/null @@ -1,57 +0,0 @@ -package org.taverna.server.master.worker; - -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - -/** - * A simple password issuing bean. - * - * @author Donal Fellows - */ -public class PasswordIssuer { - private static final char[] ALPHABET = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', - 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', - 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', - 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', - '8', '9', '0', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', - ',', '.', '<', '>', '/', '?', ':', ';', '-', '_', '+', '[', ']', - '{', '}', '`', '~' }; - private Log log = LogFactory.getLog("Taverna.Server.Worker"); - private SecureRandom r; - private int length; - - public PasswordIssuer() { - r = new SecureRandom(); - log.info("constructing passwords with " + r.getAlgorithm()); - setLength(8); - } - - public PasswordIssuer(String algorithm) throws NoSuchAlgorithmException { - r = SecureRandom.getInstance(algorithm); - log.info("constructing passwords with " + r.getAlgorithm()); - setLength(8); - } - - public void setLength(int length) { - this.length = length; - log.info("issued password will be " + this.length - + " symbols chosen from " + ALPHABET.length); - } - - /** - * Issue a password. - * - * @return The new password. - */ - public String issue() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < length; i++) - sb.append(ALPHABET[r.nextInt(ALPHABET.length)]); - log.info("issued new password of length " + sb.length()); - return sb.toString(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyImpl.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyImpl.java b/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyImpl.java deleted file mode 100644 index f5613c7..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyImpl.java +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.worker; - -import static org.taverna.server.master.identity.WorkflowInternalAuthProvider.PREFIX; - -import java.net.URI; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.springframework.beans.factory.annotation.Required; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContextHolder; -import org.taverna.server.master.common.Roles; -import org.taverna.server.master.common.Workflow; -import org.taverna.server.master.exceptions.NoCreateException; -import org.taverna.server.master.exceptions.NoDestroyException; -import org.taverna.server.master.exceptions.NoUpdateException; -import org.taverna.server.master.interfaces.Policy; -import org.taverna.server.master.interfaces.TavernaRun; -import org.taverna.server.master.interfaces.TavernaSecurityContext; -import org.taverna.server.master.utils.UsernamePrincipal; - -/** - * Basic policy implementation that allows any workflow to be instantiated by - * any user, but which does not permit users to access each others workflow - * runs. It also imposes a global limit on the number of workflow runs at once. - * - * @author Donal Fellows - */ -class PolicyImpl implements Policy { - Log log = LogFactory.getLog("Taverna.Server.Worker.Policy"); - private PolicyLimits limits; - private RunDBSupport runDB; - - @Required - public void setLimits(PolicyLimits limits) { - this.limits = limits; - } - - @Required - public void setRunDB(RunDBSupport runDB) { - this.runDB = runDB; - } - - @Override - public int getMaxRuns() { - return limits.getMaxRuns(); - } - - @Override - public Integer getMaxRuns(UsernamePrincipal user) { - return null; - } - - @Override - public int getOperatingLimit() { - return limits.getOperatingLimit(); - } - - @Override - public List<URI> listPermittedWorkflowURIs(UsernamePrincipal user) { - return limits.getPermittedWorkflowURIs(); - } - - private boolean isSelfAccess(String runId) { - Authentication auth = SecurityContextHolder.getContext() - .getAuthentication(); - boolean self = false; - String id = null; - for (GrantedAuthority a : auth.getAuthorities()) { - String aa = a.getAuthority(); - if (aa.equals(Roles.SELF)) { - self = true; - continue; - } - if (!aa.startsWith(PREFIX)) - continue; - id = aa.substring(PREFIX.length()); - } - return self && runId.equals(id); - } - - @Override - public boolean permitAccess(UsernamePrincipal user, TavernaRun run) { - String username = user.getName(); - TavernaSecurityContext context = run.getSecurityContext(); - if (context.getOwner().getName().equals(username)) { - if (log.isDebugEnabled()) - log.debug("granted access by " + user.getName() + " to " - + run.getId()); - return true; - } - if (isSelfAccess(run.getId())) { - if (log.isDebugEnabled()) - log.debug("access by workflow to itself: " + run.getId()); - return true; - } - if (log.isDebugEnabled()) - log.debug("considering access by " + user.getName() + " to " - + run.getId()); - return context.getPermittedReaders().contains(username); - } - - @Override - public void permitCreate(UsernamePrincipal user, Workflow workflow) - throws NoCreateException { - if (user == null) - throw new NoCreateException( - "anonymous workflow creation not allowed"); - if (runDB.countRuns() >= getMaxRuns()) - throw new NoCreateException("server load exceeded; please wait"); - } - - @Override - public synchronized void permitDestroy(UsernamePrincipal user, TavernaRun run) - throws NoDestroyException { - if (user == null) - throw new NoDestroyException(); - String username = user.getName(); - TavernaSecurityContext context = run.getSecurityContext(); - if (context.getOwner() == null - || context.getOwner().getName().equals(username)) - return; - if (!context.getPermittedDestroyers().contains(username)) - throw new NoDestroyException(); - } - - @Override - public void permitUpdate(UsernamePrincipal user, TavernaRun run) - throws NoUpdateException { - if (user == null) - throw new NoUpdateException( - "workflow run not owned by you and you're not granted access"); - TavernaSecurityContext context = run.getSecurityContext(); - if (context.getOwner().getName().equals(user.getName())) - return; - if (isSelfAccess(run.getId())) { - if (log.isDebugEnabled()) - log.debug("update access by workflow to itself: " + run.getId()); - return; - } - if (!context.getPermittedUpdaters().contains(user.getName())) - throw new NoUpdateException( - "workflow run not owned by you and you're not granted access"); - } - - @Override - public void setPermittedWorkflowURIs(UsernamePrincipal user, - List<URI> permitted) { - limits.setPermittedWorkflowURIs(permitted); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyLimits.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyLimits.java b/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyLimits.java deleted file mode 100644 index 8cbc7ea..0000000 --- a/server-webapp/src/main/java/org/taverna/server/master/worker/PolicyLimits.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2013 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.worker; - -import java.net.URI; -import java.util.List; - -import org.taverna.server.master.common.Status; - -/** - * The worker policy delegates certain limits to the state model of the - * particular worker. - * - * @author Donal Fellows - */ -public interface PolicyLimits { - /** - * @return the maximum number of extant workflow runs in any state - */ - int getMaxRuns(); - - /** - * @return the maximum number of workflow runs in the - * {@linkplain Status#Operating operating} state. - */ - int getOperatingLimit(); - - /** - * @return the list of URIs to workflows that may be used to create workflow - * runs. If empty or <tt>null</tt>, no restriction is present. - */ - List<URI> getPermittedWorkflowURIs(); - - /** - * @param permitted - * the list of URIs to workflows that may be used to create - * workflow runs. - */ - void setPermittedWorkflowURIs(List<URI> permitted); -}
