http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/misc/xsd/persistence_1_0.xsd ---------------------------------------------------------------------- diff --git a/server-webapp/src/misc/xsd/persistence_1_0.xsd b/server-webapp/src/misc/xsd/persistence_1_0.xsd deleted file mode 100644 index a485e30..0000000 --- a/server-webapp/src/misc/xsd/persistence_1_0.xsd +++ /dev/null @@ -1,305 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- persistence.xml schema --> -<xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence" - xmlns:xsd="http://www.w3.org/2001/XMLSchema" - xmlns:persistence="http://java.sun.com/xml/ns/persistence" - elementFormDefault="qualified" - attributeFormDefault="unqualified" - version="1.0"> - - <xsd:annotation> - <xsd:documentation> - @(#)persistence_1_0.xsd 1.0 Feb 9 2006 - </xsd:documentation> - </xsd:annotation> - - <xsd:annotation> - <xsd:documentation> - - DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. - - Copyright 2005-2007 Sun Microsystems, Inc. All rights reserved. - - The contents of this file are subject to the terms of either the - GNU General Public License Version 2 only ("GPL") or the Common - Development and Distribution License("CDDL") (collectively, the - "License"). You may not use this file except in compliance with - the License. You can obtain a copy of the License at - https://glassfish.dev.java.net/public/CDDL+GPL.html or - glassfish/bootstrap/legal/LICENSE.txt. See the License for the - specific language governing permissions and limitations under the - License. - - When distributing the software, include this License Header - Notice in each file and include the License file at - glassfish/bootstrap/legal/LICENSE.txt. Sun designates this - particular file as subject to the "Classpath" exception as - provided by Sun in the GPL Version 2 section of the License file - that accompanied this code. If applicable, add the following - below the License Header, with the fields enclosed by brackets [] - replaced by your own identifying information: - "Portions Copyrighted [year] [name of copyright owner]" - - Contributor(s): - - If you wish your version of this file to be governed by only the - CDDL or only the GPL Version 2, indicate your decision by adding - "[Contributor] elects to include this software in this - distribution under the [CDDL or GPL Version 2] license." If you - don't indicate a single choice of license, a recipient has the - option to distribute your version of this file under either the - CDDL, the GPL Version 2 or to extend the choice of license to its - licensees as provided above. However, if you add GPL Version 2 - code and therefore, elected the GPL Version 2 license, then the - option applies only if the new code is made subject to such - option by the copyright holder. - - </xsd:documentation> - </xsd:annotation> - - <xsd:annotation> - <xsd:documentation><![CDATA[ - - This is the XML Schema for the persistence configuration file. - The file must be named "META-INF/persistence.xml" in the - persistence archive. - Persistence configuration files must indicate - the persistence schema by using the persistence namespace: - - http://java.sun.com/xml/ns/persistence - - and indicate the version of the schema by - using the version element as shown below: - - <persistence xmlns="http://java.sun.com/xml/ns/persistence" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://java.sun.com/xml/ns/persistence - http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" - version="1.0"> - ... - </persistence> - - ]]></xsd:documentation> - </xsd:annotation> - - <xsd:simpleType name="versionType"> - <xsd:restriction base="xsd:token"> - <xsd:pattern value="[0-9]+(\.[0-9]+)*"/> - </xsd:restriction> - </xsd:simpleType> - - <!-- **************************************************** --> - - <xsd:element name="persistence"> - <xsd:complexType> - <xsd:sequence> - - <!-- **************************************************** --> - - <xsd:element name="persistence-unit" - minOccurs="0" maxOccurs="unbounded"> - <xsd:complexType> - <xsd:annotation> - <xsd:documentation> - - Configuration of a persistence unit. - - </xsd:documentation> - </xsd:annotation> - <xsd:sequence> - - <!-- **************************************************** --> - - <xsd:element name="description" type="xsd:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - Textual description of this persistence unit. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="provider" type="xsd:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - Provider class that supplies EntityManagers for this - persistence unit. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="jta-data-source" type="xsd:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The container-specific name of the JTA datasource to use. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="non-jta-data-source" type="xsd:string" - minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - The container-specific name of a non-JTA datasource to use. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="mapping-file" type="xsd:string" - minOccurs="0" maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation> - - File containing mapping information. Loaded as a resource - by the persistence provider. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="jar-file" type="xsd:string" - minOccurs="0" maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation> - - Jar file that should be scanned for entities. - Not applicable to Java SE persistence units. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="class" type="xsd:string" - minOccurs="0" maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation> - - Class to scan for annotations. It should be annotated - with either @Entity, @Embeddable or @MappedSuperclass. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="exclude-unlisted-classes" type="xsd:boolean" - default="false" minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - When set to true then only listed classes and jars will - be scanned for persistent classes, otherwise the enclosing - jar or directory will also be scanned. Not applicable to - Java SE persistence units. - - </xsd:documentation> - </xsd:annotation> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:element name="properties" minOccurs="0"> - <xsd:annotation> - <xsd:documentation> - - A list of vendor-specific properties. - - </xsd:documentation> - </xsd:annotation> - <xsd:complexType> - <xsd:sequence> - <xsd:element name="property" - minOccurs="0" maxOccurs="unbounded"> - <xsd:annotation> - <xsd:documentation> - A name-value pair. - </xsd:documentation> - </xsd:annotation> - <xsd:complexType> - <xsd:attribute name="name" type="xsd:string" - use="required"/> - <xsd:attribute name="value" type="xsd:string" - use="required"/> - </xsd:complexType> - </xsd:element> - </xsd:sequence> - </xsd:complexType> - </xsd:element> - - </xsd:sequence> - - <!-- **************************************************** --> - - <xsd:attribute name="name" type="xsd:string" use="required"> - <xsd:annotation> - <xsd:documentation> - - Name used in code to reference this persistence unit. - - </xsd:documentation> - </xsd:annotation> - </xsd:attribute> - - <!-- **************************************************** --> - - <xsd:attribute name="transaction-type" - type="persistence:persistence-unit-transaction-type"> - <xsd:annotation> - <xsd:documentation> - - Type of transactions used by EntityManagers from this - persistence unit. - - </xsd:documentation> - </xsd:annotation> - </xsd:attribute> - - </xsd:complexType> - </xsd:element> - </xsd:sequence> - <xsd:attribute name="version" type="persistence:versionType" - fixed="1.0" use="required"/> - </xsd:complexType> - </xsd:element> - - <!-- **************************************************** --> - - <xsd:simpleType name="persistence-unit-transaction-type"> - <xsd:annotation> - <xsd:documentation> - - public enum TransactionType { JTA, RESOURCE_LOCAL }; - - </xsd:documentation> - </xsd:annotation> - <xsd:restriction base="xsd:token"> - <xsd:enumeration value="JTA"/> - <xsd:enumeration value="RESOURCE_LOCAL"/> - </xsd:restriction> - </xsd:simpleType> - -</xsd:schema> -
http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/JaxbSanityTest.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/JaxbSanityTest.java b/server-webapp/src/test/java/org/taverna/server/master/JaxbSanityTest.java deleted file mode 100644 index 79c026b..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/JaxbSanityTest.java +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Copyright (C) 2010-2012 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.Arrays; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.SchemaOutputResolver; -import javax.xml.transform.Result; -import javax.xml.transform.stream.StreamResult; - -import org.junit.Before; -import org.junit.Test; -import org.taverna.server.master.admin.Admin; -import org.taverna.server.master.common.Credential.KeyPair; -import org.taverna.server.master.common.Credential.Password; -import org.taverna.server.master.common.Capability; -import org.taverna.server.master.common.DirEntryReference; -import org.taverna.server.master.common.InputDescription; -import org.taverna.server.master.common.Permission; -import org.taverna.server.master.common.ProfileList; -import org.taverna.server.master.common.RunReference; -import org.taverna.server.master.common.Status; -import org.taverna.server.master.common.Trust; -import org.taverna.server.master.common.Uri; -import org.taverna.server.master.common.Workflow; -import org.taverna.server.master.rest.DirectoryContents; -import org.taverna.server.master.rest.ListenerDefinition; -import org.taverna.server.master.rest.MakeOrUpdateDirEntry; -import org.taverna.server.master.rest.TavernaServerInputREST.InDesc; -import org.taverna.server.master.rest.TavernaServerInputREST.InputsDescriptor; -import org.taverna.server.master.rest.TavernaServerListenersREST.ListenerDescription; -import org.taverna.server.master.rest.TavernaServerListenersREST.Listeners; -import org.taverna.server.master.rest.TavernaServerListenersREST.Properties; -import org.taverna.server.master.rest.TavernaServerListenersREST.PropertyDescription; -import org.taverna.server.master.rest.TavernaServerREST.EnabledNotificationFabrics; -import org.taverna.server.master.rest.TavernaServerREST.PermittedListeners; -import org.taverna.server.master.rest.TavernaServerREST.PermittedWorkflows; -import org.taverna.server.master.rest.TavernaServerREST.PolicyView.CapabilityList; -import org.taverna.server.master.rest.TavernaServerREST.PolicyView.PolicyDescription; -import org.taverna.server.master.rest.TavernaServerREST.RunList; -import org.taverna.server.master.rest.TavernaServerREST.ServerDescription; -import org.taverna.server.master.rest.TavernaServerRunREST.RunDescription; -import org.taverna.server.master.rest.TavernaServerSecurityREST; -import org.taverna.server.master.rest.TavernaServerSecurityREST.CredentialHolder; -import org.taverna.server.master.soap.DirEntry; -import org.taverna.server.master.soap.FileContents; -import org.taverna.server.master.soap.PermissionList; - -/** - * This test file ensures that the JAXB bindings will work once deployed instead - * of mysteriously failing in service. - * - * @author Donal Fellows - */ -public class JaxbSanityTest { - SchemaOutputResolver sink; - StringWriter schema; - - String schema() { - return schema.toString(); - } - - @Before - public void init() { - schema = new StringWriter(); - sink = new SchemaOutputResolver() { - @Override - public Result createOutput(String namespaceUri, - String suggestedFileName) throws IOException { - StreamResult sr = new StreamResult(schema); - sr.setSystemId("/dev/null"); - return sr; - } - }; - assertEquals("", schema()); - } - - private boolean printSchema = false; - - private void testJAXB(Class<?>... classes) throws Exception { - JAXBContext.newInstance(classes).generateSchema(sink); - if (printSchema) - System.out.println(schema()); - assertTrue(schema().length() > 0); - } - - @Test - public void testJAXBForDirEntryReference() throws Exception { - JAXBContext.newInstance(DirEntryReference.class).generateSchema(sink); - assertTrue(schema().length() > 0); - } - - @Test - public void testJAXBForInputDescription() throws Exception { - testJAXB(InputDescription.class); - } - - @Test - public void testJAXBForRunReference() throws Exception { - testJAXB(RunReference.class); - } - - @Test - public void testJAXBForWorkflow() throws Exception { - testJAXB(Workflow.class); - } - - @Test - public void testJAXBForStatus() throws Exception { - testJAXB(Status.class); - } - - @Test - public void testJAXBForUri() throws Exception { - testJAXB(Uri.class); - } - - @Test - public void testJAXBForDirectoryContents() throws Exception { - testJAXB(DirectoryContents.class); - } - - @Test - public void testJAXBForListenerDefinition() throws Exception { - testJAXB(ListenerDefinition.class); - } - - @Test - public void testJAXBForMakeOrUpdateDirEntry() throws Exception { - testJAXB(MakeOrUpdateDirEntry.class); - } - - @Test - public void testJAXBForInDesc() throws Exception { - testJAXB(InDesc.class); - } - - @Test - public void testJAXBForInputsDescriptor() throws Exception { - testJAXB(InputsDescriptor.class); - } - - @Test - public void testJAXBForListenerDescription() throws Exception { - testJAXB(ListenerDescription.class); - } - - @Test - public void testJAXBForListeners() throws Exception { - testJAXB(Listeners.class); - } - - @Test - public void testJAXBForProperties() throws Exception { - testJAXB(Properties.class); - } - - @Test - public void testJAXBForPropertyDescription() throws Exception { - testJAXB(PropertyDescription.class); - } - - @Test - public void testJAXBForPermittedListeners() throws Exception { - testJAXB(PermittedListeners.class); - } - - @Test - public void testJAXBForPermittedWorkflows() throws Exception { - testJAXB(PermittedWorkflows.class); - } - - @Test - public void testJAXBForEnabledNotifiers() throws Exception { - testJAXB(EnabledNotificationFabrics.class); - } - - @Test - public void testJAXBForServerDescription() throws Exception { - testJAXB(ServerDescription.class); - } - - @Test - public void testJAXBForRunDescription() throws Exception { - testJAXB(RunDescription.class); - } - - @Test - public void testJAXBForRunList() throws Exception { - testJAXB(RunList.class); - } - - @Test - public void testJAXBForPolicyDescription() throws Exception { - testJAXB(PolicyDescription.class); - } - - @Test - public void testJAXBForSecurityCredential() throws Exception { - testJAXB(CredentialHolder.class); - } - - @Test - public void testJAXBForSecurityCredentialList() throws Exception { - testJAXB(TavernaServerSecurityREST.CredentialList.class); - } - - @Test - public void testJAXBForSecurityTrust() throws Exception { - testJAXB(Trust.class); - } - - @Test - public void testJAXBForSecurityTrustList() throws Exception { - testJAXB(TavernaServerSecurityREST.TrustList.class); - } - - @Test - public void testJAXBForPermission() throws Exception { - testJAXB(Permission.class); - } - - @Test - public void testJAXBForSecurityPermissionDescription() throws Exception { - testJAXB(TavernaServerSecurityREST.PermissionDescription.class); - } - - @Test - public void testJAXBForSecurityPermissionsDescription() throws Exception { - testJAXB(TavernaServerSecurityREST.PermissionsDescription.class); - } - - @Test - public void testJAXBForSecurityDescriptor() throws Exception { - testJAXB(TavernaServerSecurityREST.Descriptor.class); - } - - @Test - public void testJAXBForProfileList() throws Exception { - testJAXB(ProfileList.class); - } - - @Test - public void testJAXBForDirEntry() throws Exception { - testJAXB(DirEntry.class); - } - - @Test - public void testJAXBForCapability() throws Exception { - testJAXB(Capability.class); - } - - @Test - public void testJAXBForCapabilityList() throws Exception { - testJAXB(CapabilityList.class); - } - - @Test - public void testJAXBForEverythingREST() throws Exception { - testJAXB(DirEntryReference.class, InputDescription.class, - RunReference.class, Workflow.class, Status.class, - DirectoryContents.class, InDesc.class, - ListenerDefinition.class, MakeOrUpdateDirEntry.class, - InputsDescriptor.class, ListenerDescription.class, - Listeners.class, Properties.class, PropertyDescription.class, - PermittedListeners.class, PermittedWorkflows.class, - EnabledNotificationFabrics.class, ServerDescription.class, - RunDescription.class, Uri.class, RunList.class, - PolicyDescription.class, CredentialHolder.class, Trust.class, - TavernaServerSecurityREST.CredentialList.class, - TavernaServerSecurityREST.TrustList.class, Permission.class, - TavernaServerSecurityREST.Descriptor.class, - TavernaServerSecurityREST.PermissionDescription.class, - TavernaServerSecurityREST.PermissionsDescription.class, - ProfileList.class, Capability.class, CapabilityList.class); - } - - @Test - public void testJAXBForEverythingSOAP() throws Exception { - testJAXB(DirEntry.class, FileContents.class, InputDescription.class, - Permission.class, PermissionList.class, - PermissionList.SinglePermissionMapping.class, - RunReference.class, Status.class, Trust.class, Uri.class, - ProfileList.class, Workflow.class, Capability.class); - } - - @Test - public void testUserPassSerializeDeserialize() throws Exception { - JAXBContext c = JAXBContext.newInstance(CredentialHolder.class); - - Password password = new Password(); - password.username = "foo"; - password.password = "bar"; - - // Serialize - StringWriter sw = new StringWriter(); - CredentialHolder credIn = new CredentialHolder(password); - c.createMarshaller().marshal(credIn, sw); - - // Deserialize - StringReader sr = new StringReader(sw.toString()); - Object credOutObj = c.createUnmarshaller().unmarshal(sr); - - // Test value-equivalence - assertEquals(credIn.getClass(), credOutObj.getClass()); - CredentialHolder credOut = (CredentialHolder) credOutObj; - assertEquals(credIn.credential.getClass(), - credOut.credential.getClass()); - assertEquals(credIn.getUserpass().username, - credOut.getUserpass().username); - assertEquals(credIn.getUserpass().password, - credOut.getUserpass().password); - } - - @Test - public void testKeypairSerializeDeserialize() throws Exception { - JAXBContext c = JAXBContext.newInstance(CredentialHolder.class); - - KeyPair keypair = new KeyPair(); - keypair.credentialName = "foo"; - keypair.credentialBytes = new byte[] { 1, 2, 3 }; - - // Serialize - StringWriter sw = new StringWriter(); - CredentialHolder credIn = new CredentialHolder(keypair); - c.createMarshaller().marshal(credIn, sw); - - // Deserialize - StringReader sr = new StringReader(sw.toString()); - Object credOutObj = c.createUnmarshaller().unmarshal(sr); - - // Test value-equivalence - assertEquals(credIn.getClass(), credOutObj.getClass()); - CredentialHolder credOut = (CredentialHolder) credOutObj; - assertEquals(credIn.credential.getClass(), - credOut.credential.getClass()); - assertEquals(credIn.getKeypair().credentialName, - credOut.getKeypair().credentialName); - assertTrue(Arrays.equals(credIn.getKeypair().credentialBytes, - credOut.getKeypair().credentialBytes)); - } - - @Test - public void testJAXBforAdmininstration() throws Exception { - testJAXB(Admin.AdminDescription.class); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/TavernaServerImplTest.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/TavernaServerImplTest.java b/server-webapp/src/test/java/org/taverna/server/master/TavernaServerImplTest.java deleted file mode 100644 index 9665cf0..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/TavernaServerImplTest.java +++ /dev/null @@ -1,246 +0,0 @@ -package org.taverna.server.master; - -import static java.util.Arrays.asList; -import static java.util.Collections.singletonMap; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import org.junit.Before; -import org.junit.Test; -import org.taverna.server.master.api.ManagementModel; -import org.taverna.server.master.common.RunReference; -import org.taverna.server.master.exceptions.BadPropertyValueException; -import org.taverna.server.master.exceptions.NoListenerException; -import org.taverna.server.master.exceptions.NoUpdateException; -import org.taverna.server.master.exceptions.UnknownRunException; -import org.taverna.server.master.interfaces.Listener; -import org.taverna.server.master.interfaces.TavernaRun; -import org.taverna.server.master.mocks.ExampleRun; -import org.taverna.server.master.mocks.MockPolicy; -import org.taverna.server.master.mocks.SimpleListenerFactory; -import org.taverna.server.master.mocks.SimpleNonpersistentRunStore; - -public class TavernaServerImplTest { - private TavernaServer server; - private MockPolicy policy; - private SimpleNonpersistentRunStore store; - @java.lang.SuppressWarnings("unused") - private ExampleRun.Builder runFactory; - private SimpleListenerFactory lFactory; - private TavernaServerSupport support; - - private String lrunname; - private String lrunconf; - - Listener makeListener(TavernaRun run, final String config) { - lrunname = run.toString(); - lrunconf = config; - return new Listener() { - @Override - public String getConfiguration() { - return config; - } - - @Override - public String getName() { - return "bar"; - } - - @Override - public String getProperty(String propName) - throws NoListenerException { - throw new NoListenerException(); - } - - @Override - public String getType() { - return "foo"; - } - - @Override - public String[] listProperties() { - return new String[0]; - } - - @Override - public void setProperty(String propName, String value) - throws NoListenerException, BadPropertyValueException { - throw new NoListenerException(); - } - }; - } - - @Before - public void wireup() throws Exception { - // Wire everything up; ought to be done with Spring, but this works... - server = new TavernaServer() { - @Override - protected RunREST makeRunInterface() { - return new RunREST() { - @Override - protected ListenersREST makeListenersInterface() { - return new ListenersREST() { - @Override - protected SingleListenerREST makeListenerInterface() { - return new SingleListenerREST() { - @Override - protected ListenerPropertyREST makePropertyInterface() { - return new ListenerPropertyREST() { - }; - } - }; - } - }; - } - - @Override - protected RunSecurityREST makeSecurityInterface() { - return new RunSecurityREST() { - }; - } - - @Override - protected DirectoryREST makeDirectoryInterface() { - return new DirectoryREST() { - }; - } - - @Override - protected InputREST makeInputInterface() { - return new InputREST() { - }; - } - - @Override - protected InteractionFeed makeInteractionFeed() { - return null; // TODO... - } - }; - } - - @Override - public PolicyView getPolicyDescription() { - return new PolicyREST(); - } - }; - support = new TavernaServerSupport(); - server.setSupport(support); - support.setWebapp(server); - support.setLogGetPrincipalFailures(false); - support.setStateModel(new ManagementModel() { - @Override - public boolean getAllowNewWorkflowRuns() { - return true; - } - - @Override - public boolean getLogIncomingWorkflows() { - return false; - } - - @Override - public boolean getLogOutgoingExceptions() { - return false; - } - - @Override - public void setAllowNewWorkflowRuns(boolean allowNewWorkflowRuns) { - } - - @Override - public void setLogIncomingWorkflows(boolean logIncomingWorkflows) { - } - - @Override - public void setLogOutgoingExceptions(boolean logOutgoingExceptions) { - } - - @Override - public String getUsageRecordLogFile() { - return null; - } - - @Override - public void setUsageRecordLogFile(String usageRecordLogFile) { - } - }); - server.setPolicy(policy = new MockPolicy()); - support.setPolicy(policy); - server.setRunStore(store = new SimpleNonpersistentRunStore()); - support.setRunStore(store); - store.setPolicy(policy); - support.setRunFactory(runFactory = new ExampleRun.Builder(1)); - support.setListenerFactory(lFactory = new SimpleListenerFactory()); - lFactory.setBuilders(singletonMap( - "foo", - (SimpleListenerFactory.Builder) new SimpleListenerFactory.Builder() { - @Override - public Listener build(TavernaRun run, String configuration) - throws NoListenerException { - return makeListener(run, configuration); - } - })); - } - - @Test - public void defaults1() { - assertNotNull(server); - } - - @Test - public void defaults2() { - assertEquals(10, server.getServerMaxRuns()); - } - - @Test - public void defaults3() { - assertEquals(1, server.getServerListeners().length); - } - - @Test - public void defaults4() { - assertNotNull(support.getPrincipal()); - } - - @Test - public void serverAsksPolicyForMaxRuns() { - int oldmax = policy.maxruns; - try { - policy.maxruns = 1; - assertEquals(1, server.getServerMaxRuns()); - } finally { - policy.maxruns = oldmax; - } - } - - @Test - public void makeAndKillARun() throws NoUpdateException, UnknownRunException { - RunReference rr = server.submitWorkflow(null); - assertNotNull(rr); - assertNotNull(rr.name); - server.destroyRun(rr.name); - } - - @Test - public void makeListenKillRun() throws Exception { - RunReference run = server.submitWorkflow(null); - try { - lrunname = lrunconf = null; - assertEquals(asList("foo"), asList(server.getServerListeners())); - String l = server.addRunListener(run.name, "foo", "foobar"); - assertEquals("bar", l); - assertEquals("foobar", lrunconf); - assertEquals(lrunname, support.getRun(run.name).toString()); - assertEquals(asList("default", "bar"), - asList(server.getRunListeners(run.name))); - assertEquals(0, - server.getRunListenerProperties(run.name, "bar").length); - } finally { - try { - server.destroyRun(run.name); - } catch (Exception e) { - // Ignore - } - } - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/WorkflowSerializationTest.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/WorkflowSerializationTest.java b/server-webapp/src/test/java/org/taverna/server/master/WorkflowSerializationTest.java deleted file mode 100644 index 0450317..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/WorkflowSerializationTest.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.taverna.server.master; - -import static org.taverna.server.master.rest.handler.T2FlowDocumentHandler.T2FLOW_NS; -import static org.taverna.server.master.rest.handler.T2FlowDocumentHandler.T2FLOW_ROOTNAME; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.junit.Assert; -import org.junit.Test; -import org.taverna.server.master.common.Workflow; -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -public class WorkflowSerializationTest { - @Test - public void testWorkflowSerialization() - throws ParserConfigurationException, IOException, - ClassNotFoundException { - DocumentBuilder db = DocumentBuilderFactory.newInstance() - .newDocumentBuilder(); - Document doc = db.getDOMImplementation().createDocument(null, null, - null); - Element workflow = doc.createElementNS(T2FLOW_NS, T2FLOW_ROOTNAME); - Element foo = doc.createElementNS("urn:foo:bar", "pqr:foo"); - foo.setTextContent("bar"); - foo.setAttribute("xyz", "abc"); - workflow.appendChild(foo); - Workflow w = new Workflow(workflow); - - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { - oos.writeObject(w); - } - - Object o; - try (ObjectInputStream ois = new ObjectInputStream( - new ByteArrayInputStream(baos.toByteArray()))) { - o = ois.readObject(); - } - - Assert.assertNotNull(o); - Assert.assertEquals(w.getClass(), o.getClass()); - Workflow w2 = (Workflow) o; - Assert.assertNotNull(w2.getT2flowWorkflow()); - Element e = w2.getT2flowWorkflow(); - Assert.assertEquals(T2FLOW_ROOTNAME, e.getLocalName()); - Assert.assertEquals(T2FLOW_NS, e.getNamespaceURI()); - e = (Element) e.getFirstChild(); - Assert.assertEquals("foo", e.getLocalName()); - Assert.assertEquals("pqr", e.getPrefix()); - Assert.assertEquals("urn:foo:bar", e.getNamespaceURI()); - Assert.assertEquals("bar", e.getTextContent()); - Assert.assertEquals(1, e.getChildNodes().getLength()); - // WARNING: These are dependent on how namespaces are encoded! - Assert.assertEquals(2, e.getAttributes().getLength()); - Assert.assertEquals("xyz", ((Attr) e.getAttributes().item(1)).getLocalName()); - Assert.assertEquals("abc", e.getAttribute("xyz")); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/mocks/ExampleRun.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/mocks/ExampleRun.java b/server-webapp/src/test/java/org/taverna/server/master/mocks/ExampleRun.java deleted file mode 100644 index a2a0791..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/mocks/ExampleRun.java +++ /dev/null @@ -1,452 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.master.mocks; - -import static java.util.Calendar.MINUTE; -import static java.util.Collections.unmodifiableList; -import static java.util.UUID.randomUUID; -import static org.taverna.server.master.common.Status.Initialized; - -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Calendar; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - -import javax.ws.rs.core.HttpHeaders; -import javax.xml.ws.handler.MessageContext; - -import org.springframework.security.core.context.SecurityContext; -import org.taverna.server.master.common.Credential; -import org.taverna.server.master.common.Status; -import org.taverna.server.master.common.Trust; -import org.taverna.server.master.common.Workflow; -import org.taverna.server.master.exceptions.BadStateChangeException; -import org.taverna.server.master.exceptions.FilesystemAccessException; -import org.taverna.server.master.exceptions.InvalidCredentialException; -import org.taverna.server.master.exceptions.NoListenerException; -import org.taverna.server.master.exceptions.UnknownRunException; -import org.taverna.server.master.factories.RunFactory; -import org.taverna.server.master.interfaces.Directory; -import org.taverna.server.master.interfaces.Input; -import org.taverna.server.master.interfaces.Listener; -import org.taverna.server.master.interfaces.SecurityContextFactory; -import org.taverna.server.master.interfaces.TavernaRun; -import org.taverna.server.master.interfaces.TavernaSecurityContext; -import org.taverna.server.master.utils.UsernamePrincipal; - -@SuppressWarnings("serial") -public class ExampleRun implements TavernaRun, TavernaSecurityContext { - String id; - List<Listener> listeners; - Workflow workflow; - Status status; - Date expiry; - UsernamePrincipal owner; - String inputBaclava; - String outputBaclava; - java.io.File realRoot; - List<Input> inputs; - String name; - - public ExampleRun(UsernamePrincipal creator, Workflow workflow, Date expiry) { - this.id = randomUUID().toString(); - this.listeners = new ArrayList<>(); - this.status = Initialized; - this.owner = creator; - this.workflow = workflow; - this.expiry = expiry; - this.inputs = new ArrayList<>(); - listeners.add(new DefaultListener()); - } - - @Override - public void addListener(Listener l) { - listeners.add(l); - } - - @Override - public void destroy() { - // This does nothing... - } - - @Override - public Date getExpiry() { - return expiry; - } - - @Override - public List<Listener> getListeners() { - return listeners; - } - - @Override - public TavernaSecurityContext getSecurityContext() { - return this; - } - - @Override - public Status getStatus() { - return status; - } - - @Override - public Workflow getWorkflow() { - return workflow; - } - - @Override - public Directory getWorkingDirectory() { - // LATER: Implement this! - throw new UnsupportedOperationException("not yet implemented"); - } - - @Override - public void setExpiry(Date d) { - if (d.after(new Date())) - this.expiry = d; - } - - @Override - public String setStatus(Status s) { - this.status = s; - return null; - } - - @Override - public UsernamePrincipal getOwner() { - return owner; - } - - public static class Builder implements RunFactory { - private int lifetime; - - public Builder(int initialLifetimeMinutes) { - this.lifetime = initialLifetimeMinutes; - } - - @Override - public TavernaRun create(UsernamePrincipal creator, Workflow workflow) { - Calendar c = GregorianCalendar.getInstance(); - c.add(MINUTE, lifetime); - return new ExampleRun(creator, workflow, c.getTime()); - } - - @Override - public boolean isAllowingRunsToStart() { - return true; - } - } - - static final String[] emptyArray = new String[0]; - - class DefaultListener implements Listener { - @Override - public String getConfiguration() { - return ""; - } - - @Override - public String getName() { - return "default"; - } - - @Override - public String getType() { - return "default"; - } - - @Override - public String[] listProperties() { - return emptyArray; - } - - @Override - public String getProperty(String propName) throws NoListenerException { - throw new NoListenerException("no such property"); - } - - @Override - public void setProperty(String propName, String value) - throws NoListenerException { - throw new NoListenerException("no such property"); - } - } - - @Override - public String getInputBaclavaFile() { - return inputBaclava; - } - - @Override - public List<Input> getInputs() { - return unmodifiableList(inputs); - } - - @Override - public String getOutputBaclavaFile() { - return outputBaclava; - } - - class ExampleInput implements Input { - public String name; - public String file; - public String value; - public String delim; - - public ExampleInput(String name) { - this.name = name; - } - - @Override - public String getFile() { - return file; - } - - @Override - public String getName() { - return name; - } - - @Override - public String getValue() { - return value; - } - - @Override - public void setFile(String file) throws FilesystemAccessException, - BadStateChangeException { - if (status != Status.Initialized) - throw new BadStateChangeException(); - checkBadFilename(file); - this.file = file; - this.value = null; - inputBaclava = null; - } - - @Override - public void setValue(String value) throws BadStateChangeException { - if (status != Status.Initialized) - throw new BadStateChangeException(); - this.value = value; - this.file = null; - inputBaclava = null; - } - - void reset() { - this.file = null; - this.value = null; - } - - @Override - public String getDelimiter() { - return delim; - } - - @Override - public void setDelimiter(String delimiter) - throws BadStateChangeException { - if (status != Status.Initialized) - throw new BadStateChangeException(); - if (delimiter == null) - delim = null; - else - delim = delimiter.substring(0, 1); - } - } - - @Override - public Input makeInput(String name) throws BadStateChangeException { - if (status != Status.Initialized) - throw new BadStateChangeException(); - Input i = new ExampleInput(name); - inputs.add(i); - return i; - } - - static void checkBadFilename(String filename) - throws FilesystemAccessException { - if (filename.startsWith("/")) - throw new FilesystemAccessException("filename may not be absolute"); - if (Arrays.asList(filename.split("/")).contains("..")) - throw new FilesystemAccessException( - "filename may not refer to parent"); - } - - @Override - public void setInputBaclavaFile(String filename) - throws FilesystemAccessException, BadStateChangeException { - if (status != Status.Initialized) - throw new BadStateChangeException(); - checkBadFilename(filename); - inputBaclava = filename; - for (Input i : inputs) - ((ExampleInput) i).reset(); - } - - @Override - public void setOutputBaclavaFile(String filename) - throws FilesystemAccessException, BadStateChangeException { - if (status != Status.Initialized) - throw new BadStateChangeException(); - if (filename != null) - checkBadFilename(filename); - outputBaclava = filename; - } - - private Date created = new Date(); - @Override - public Date getCreationTimestamp() { - return created; - } - - @Override - public Date getFinishTimestamp() { - return null; - } - - @Override - public Date getStartTimestamp() { - return null; - } - - @Override - public Credential[] getCredentials() { - return new Credential[0]; - } - - @Override - public void addCredential(Credential toAdd) { - } - - @Override - public void deleteCredential(Credential toDelete) { - } - - @Override - public Trust[] getTrusted() { - return new Trust[0]; - } - - @Override - public void addTrusted(Trust toAdd) { - } - - @Override - public void deleteTrusted(Trust toDelete) { - } - - @Override - public void validateCredential(Credential c) - throws InvalidCredentialException { - } - - @Override - public void validateTrusted(Trust t) throws InvalidCredentialException { - } - - @Override - public void initializeSecurityFromSOAPContext(MessageContext context) { - // Do nothing - } - - @Override - public void initializeSecurityFromRESTContext(HttpHeaders headers) { - // Do nothing - } - - @Override - public void conveySecurity() throws GeneralSecurityException, IOException { - // Do nothing - } - - @Override - public SecurityContextFactory getFactory() { - return null; - } - - private Set<String> destroyers = new HashSet<String>(); - private Set<String> updaters = new HashSet<String>(); - private Set<String> readers = new HashSet<String>(); - @Override - public Set<String> getPermittedDestroyers() { - return destroyers; - } - - @Override - public void setPermittedDestroyers(Set<String> destroyers) { - this.destroyers = destroyers; - updaters.addAll(destroyers); - readers.addAll(destroyers); - } - - @Override - public Set<String> getPermittedUpdaters() { - return updaters; - } - - @Override - public void setPermittedUpdaters(Set<String> updaters) { - this.updaters = updaters; - this.updaters.addAll(destroyers); - readers.addAll(updaters); - } - - @Override - public Set<String> getPermittedReaders() { - return readers; - } - - @Override - public void setPermittedReaders(Set<String> readers) { - this.readers = readers; - this.readers.addAll(destroyers); - this.readers.addAll(updaters); - } - - @Override - public String getId() { - return id; - } - - @Override - public void initializeSecurityFromContext(SecurityContext securityContext) - throws Exception { - // Do nothing - } - - @Override - public String getName() { - return name; - } - - @Override - public void setName(String name) { - this.name = (name.length() > 5 ? name.substring(0, 5) : name); - } - - @Override - public void ping() throws UnknownRunException { - // Do nothing - } - - @Override - public boolean getGenerateProvenance() { - // TODO Auto-generated method stub - return false; - } - - @Override - public void setGenerateProvenance(boolean generateProvenance) { - // TODO Auto-generated method stub - - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/mocks/MockPolicy.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/mocks/MockPolicy.java b/server-webapp/src/test/java/org/taverna/server/master/mocks/MockPolicy.java deleted file mode 100644 index 81dd08c..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/mocks/MockPolicy.java +++ /dev/null @@ -1,59 +0,0 @@ -package org.taverna.server.master.mocks; - -import java.util.HashSet; -import java.util.Set; - -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.TavernaRun; -import org.taverna.server.master.utils.UsernamePrincipal; - -public class MockPolicy extends SimpleServerPolicy { - public MockPolicy() { - super(); - super.setCleanerInterval(30); - } - - public int maxruns = 10; - Integer usermaxruns; - Set<TavernaRun> denyaccess = new HashSet<>(); - boolean exnOnUpdate, exnOnCreate, exnOnDelete; - - @Override - public int getMaxRuns() { - return maxruns; - } - - @Override - public Integer getMaxRuns(UsernamePrincipal user) { - return usermaxruns; - } - - @Override - public boolean permitAccess(UsernamePrincipal user, TavernaRun run) { - return !denyaccess.contains(run); - } - - @Override - public void permitCreate(UsernamePrincipal user, Workflow workflow) - throws NoCreateException { - if (this.exnOnCreate) - throw new NoCreateException(); - } - - @Override - public void permitDestroy(UsernamePrincipal user, TavernaRun run) - throws NoDestroyException { - if (this.exnOnDelete) - throw new NoDestroyException(); - } - - @Override - public void permitUpdate(UsernamePrincipal user, TavernaRun run) - throws NoUpdateException { - if (this.exnOnUpdate) - throw new NoUpdateException(); - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleListenerFactory.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleListenerFactory.java b/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleListenerFactory.java deleted file mode 100644 index d864214..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleListenerFactory.java +++ /dev/null @@ -1,64 +0,0 @@ -package org.taverna.server.master.mocks; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import org.taverna.server.master.exceptions.NoListenerException; -import org.taverna.server.master.factories.ListenerFactory; -import org.taverna.server.master.interfaces.Listener; -import org.taverna.server.master.interfaces.TavernaRun; - -/** - * A factory for event listener. The factory is configured using Spring. - * - * @author Donal Fellows - */ -public class SimpleListenerFactory implements ListenerFactory { - private Map<String, Builder> builders = new HashMap<>(); - - public void setBuilders(Map<String, Builder> builders) { - this.builders = builders; - } - - @Override - public List<String> getSupportedListenerTypes() { - return new ArrayList<>(builders.keySet()); - } - - @Override - public Listener makeListener(TavernaRun run, String listenerType, - String configuration) throws NoListenerException { - Builder b = builders.get(listenerType); - if (b == null) - throw new NoListenerException("no such listener type"); - Listener l = b.build(run, configuration); - run.addListener(l); - return l; - } - - /** - * How to actually construct a listener. - * - * @author Donal Fellows - */ - public interface Builder { - /** - * Make an event listener attached to a run. - * - * @param run - * The run to attach to. - * @param configuration - * A user-specified configuration document. The constructed - * listener <i>should</i> process this configuration document - * and be able to return it to the user when requested. - * @return The listener object. - * @throws NoListenerException - * If the listener construction failed or the - * <b>configuration</b> document was bad in some way. - */ - public Listener build(TavernaRun run, String configuration) - throws NoListenerException; - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleNonpersistentRunStore.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleNonpersistentRunStore.java b/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleNonpersistentRunStore.java deleted file mode 100644 index a3751e4..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleNonpersistentRunStore.java +++ /dev/null @@ -1,151 +0,0 @@ -package org.taverna.server.master.mocks; - -import java.lang.ref.WeakReference; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; - -import org.taverna.server.master.exceptions.NoDestroyException; -import org.taverna.server.master.exceptions.UnknownRunException; -import org.taverna.server.master.interfaces.Policy; -import org.taverna.server.master.interfaces.RunStore; -import org.taverna.server.master.interfaces.TavernaRun; -import org.taverna.server.master.utils.UsernamePrincipal; - -/** - * Example of a store for Taverna Workflow Runs. - * - * @author Donal Fellows - */ -public class SimpleNonpersistentRunStore implements RunStore { - private Map<String, TavernaRun> store = new HashMap<>(); - private Object lock = new Object(); - - Timer timer; - private CleanerTask cleaner; - - /** - * The connection to the main policy store. Suitable for wiring up with - * Spring. - * - * @param p - * The policy to connect to. - */ - public void setPolicy(SimpleServerPolicy p) { - p.store = this; - cleanerIntervalUpdated(p.getCleanerInterval()); - } - - public SimpleNonpersistentRunStore() { - timer = new Timer("SimpleNonpersistentRunStore.CleanerTimer", true); - cleanerIntervalUpdated(300); - } - - @Override - protected void finalize() { - timer.cancel(); - } - - /** - * Remove and destroy all runs that are expired at the moment that this - * method starts. - */ - void clean() { - Date now = new Date(); - synchronized (lock) { - // Use an iterator so we have access to its remove() method... - Iterator<TavernaRun> i = store.values().iterator(); - while (i.hasNext()) { - TavernaRun w = i.next(); - if (w.getExpiry().before(now)) { - i.remove(); - try { - w.destroy(); - } catch (NoDestroyException e) { - } - } - } - } - } - - /** - * Reconfigure the cleaner task's call interval. This is called internally - * and from the Policy when the interval is set there. - * - * @param intervalInSeconds - * How long between runs of the cleaner task, in seconds. - */ - void cleanerIntervalUpdated(int intervalInSeconds) { - if (cleaner != null) - cleaner.cancel(); - cleaner = new CleanerTask(this, intervalInSeconds); - } - - @Override - public TavernaRun getRun(UsernamePrincipal user, Policy p, String uuid) - throws UnknownRunException { - synchronized (lock) { - TavernaRun w = store.get(uuid); - if (w == null || !p.permitAccess(user, w)) - throw new UnknownRunException(); - return w; - } - } - - @Override - public TavernaRun getRun(String uuid) throws UnknownRunException { - synchronized (lock) { - TavernaRun w = store.get(uuid); - if (w == null) - throw new UnknownRunException(); - return w; - } - } - - @Override - public Map<String, TavernaRun> listRuns(UsernamePrincipal user, Policy p) { - Map<String, TavernaRun> filtered = new HashMap<>(); - synchronized (lock) { - for (Map.Entry<String, TavernaRun> entry : store.entrySet()) - if (p.permitAccess(user, entry.getValue())) - filtered.put(entry.getKey(), entry.getValue()); - } - return filtered; - } - - @Override - public String registerRun(TavernaRun run) { - synchronized (lock) { - store.put(run.getId(), run); - return run.getId(); - } - } - - @Override - public void unregisterRun(String uuid) { - synchronized (lock) { - store.remove(uuid); - } - } -} - -class CleanerTask extends TimerTask { - WeakReference<SimpleNonpersistentRunStore> store; - - CleanerTask(SimpleNonpersistentRunStore store, int interval) { - this.store = new WeakReference<>(store); - int tms = interval * 1000; - store.timer.scheduleAtFixedRate(this, tms, tms); - } - - @Override - public void run() { - SimpleNonpersistentRunStore s = store.get(); - if (s != null) { - s.clean(); - } - } -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleServerPolicy.java ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleServerPolicy.java b/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleServerPolicy.java deleted file mode 100644 index 1a68d2c..0000000 --- a/server-webapp/src/test/java/org/taverna/server/master/mocks/SimpleServerPolicy.java +++ /dev/null @@ -1,110 +0,0 @@ -package org.taverna.server.master.mocks; - -import java.net.URI; -import java.util.List; - -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.utils.UsernamePrincipal; - -/** - * A very simple (and unsafe) security model. The number of runs is configurable - * through Spring (or 10 if unconfigured) with no per-user limits supported, all - * workflows are permitted, and all identified users may create a workflow run. - * Any user may read off information about any run, but only its owner may - * modify or destroy it. - * <p> - * Note that this is a <i>Policy Enforcement Point</i> for access control to - * individual workflows. - * - * @author Donal Fellows - */ -public class SimpleServerPolicy implements Policy { - private int maxRuns = 10; - private int cleanerInterval; - SimpleNonpersistentRunStore store; - - public void setMaxRuns(int maxRuns) { - this.maxRuns = maxRuns; - } - - @Override - public int getMaxRuns() { - return maxRuns; - } - - @Override - public Integer getMaxRuns(UsernamePrincipal p) { - return null; // No per-user limits - } - - public int getCleanerInterval() { - return cleanerInterval; - } - - /** - * Sets how often the store of workflow runs will try to clean out expired - * runs. - * - * @param intervalInSeconds - */ - public void setCleanerInterval(int intervalInSeconds) { - cleanerInterval = intervalInSeconds; - if (store != null) - store.cleanerIntervalUpdated(intervalInSeconds); - } - - @Override - public boolean permitAccess(UsernamePrincipal p, TavernaRun run) { - // No secrets here! - return true; - } - - @Override - public void permitCreate(UsernamePrincipal p, Workflow workflow) - throws NoCreateException { - // Only identified users may create - if (p == null) - throw new NoCreateException(); - // Global run count limit enforcement - if (store.listRuns(p, this).size() >= maxRuns) - throw new NoCreateException(); - // Per-user run count enforcement would come here - } - - @Override - public void permitDestroy(UsernamePrincipal p, TavernaRun run) - throws NoDestroyException { - // Only the creator may destroy - if (p == null || !p.equals(run.getSecurityContext().getOwner())) - throw new NoDestroyException(); - } - - @Override - public void permitUpdate(UsernamePrincipal p, TavernaRun run) - throws NoUpdateException { - // Only the creator may change - if (p == null || !p.equals(run.getSecurityContext().getOwner())) - throw new NoUpdateException(); - } - - @Override - public int getOperatingLimit() { - return 1; - } - - @Override - public List<URI> listPermittedWorkflowURIs(UsernamePrincipal user) { - return null; - } - - @Override - public void setPermittedWorkflowURIs(UsernamePrincipal user, - List<URI> permitted) { - // Ignore - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/resources/example.xml ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/resources/example.xml b/server-webapp/src/test/resources/example.xml deleted file mode 100644 index 14cc242..0000000 --- a/server-webapp/src/test/resources/example.xml +++ /dev/null @@ -1,55 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<beans xmlns="http://www.springframework.org/schema/beans" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd"> - - <bean id="policy" class="org.taverna.server.master.mocks.SimpleServerPolicy" - lazy-init="false" scope="singleton"> - <property name="maxRuns" value="1"> - <description> - Limit on total number of simultaneous runs. - </description> - </property> - <property name="cleanerInterval" value="300"> - <description> - Time between trying to delete expired runs, in seconds. - </description> - </property> - </bean> - - <bean id="runFactory" class="org.taverna.server.master.mocks.ExampleRun$Builder"> - <constructor-arg type="int" value="10" /> <!-- "initialLifetimeMinutes" --> - </bean> - - <bean id="runCatalog" scope="singleton" - class="org.taverna.server.master.mocks.SimpleNonpersistentRunStore"> - <property name="policy" ref="policy" /> - </bean> - - <bean id="listenerFactory" class="org.taverna.server.master.mocks.SimpleListenerFactory"> - <property name="builders"> - <description> - This map describes how to build each type of supported - event listener that is not installed by default. Any site policy for - a listeners should be installed using its properties, as shown. The - "key" is the type, the "class" is the builder for actual instances - (which must be an instance of - org.taverna.server.master.factories.SimpleListenerFactory.Builder) - and any policies and installation-specific configurations are - characterised by properties such as "sitePolicy" below. - </description> - <map> - <!-- <entry key="exampleListener">--> - <!-- - <bean - class="org.taverna.server.master.example.ExampleListener$Builder"> - --> - <!-- <property name="sitePolicy">--> - <!-- <value>Just an example!</value>--> - <!-- </property>--> - <!-- </bean>--> - <!-- </entry>--> - </map> - </property> - </bean> -</beans> http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-webapp/src/test/resources/log4j.properties ---------------------------------------------------------------------- diff --git a/server-webapp/src/test/resources/log4j.properties b/server-webapp/src/test/resources/log4j.properties deleted file mode 100644 index 6707f55..0000000 --- a/server-webapp/src/test/resources/log4j.properties +++ /dev/null @@ -1,4 +0,0 @@ -log4j.rootLogger=info, R -log4j.appender.R=org.apache.log4j.ConsoleAppender -log4j.appender.R.layout=org.apache.log4j.PatternLayout -log4j.appender.R.layout.ConversionPattern=%d{yyyyMMdd'T'HHmmss.SSS} %-5p %c{1} %C{1} - %m%n \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/pom.xml ---------------------------------------------------------------------- diff --git a/server-worker/pom.xml b/server-worker/pom.xml deleted file mode 100644 index 8006c6d..0000000 --- a/server-worker/pom.xml +++ /dev/null @@ -1,125 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<!-- -Licensed to the Apache Software Foundation (ASF) under one or more -contributor license agreements. See the NOTICE file distributed with -this work for additional information regarding copyright ownership. -The ASF licenses this file to You under the Apache License, Version 2.0 -(the "License"); you may not use this file except in compliance with -the License. You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. ---> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.taverna.server</groupId> - <artifactId>taverna-server</artifactId> - <version>3.1.0-incubating-SNAPSHOT</version> - </parent> - <artifactId>taverna-server-worker</artifactId> - <name>Apache Taverna Server Workflow Executor/File System Access Process Implementation</name> - <description>This is the implementation of the factory process that is started up by the web application to manage executing Taverna Workflow executeworkflow.sh calls. Also provides per-user access to filestore.</description> - - <properties> - <workerMainClass>org.taverna.server.localworker.impl.TavernaRunManager</workerMainClass> - </properties> - - <dependencies> - <dependency> - <groupId>${project.parent.groupId}</groupId> - <artifactId>taverna-server-runinterface</artifactId> - <version>${project.parent.version}</version> - </dependency> - <dependency> - <groupId>commons-collections</groupId> - <artifactId>commons-collections</artifactId> - </dependency> - <dependency> - <groupId>${project.parent.groupId}</groupId> - <artifactId>taverna-server-usagerecord</artifactId> - <version>${project.parent.version}</version> - </dependency> - <dependency> - <groupId>commons-io</groupId> - <artifactId>commons-io</artifactId> - </dependency> - <dependency> - <groupId>org.apache.taverna.language</groupId> - <artifactId>taverna-scufl2-api</artifactId> - <version>${taverna.language.version}</version> - </dependency> - <dependency> - <groupId>org.apache.taverna.language</groupId> - <artifactId>taverna-scufl2-t2flow</artifactId> - <version>${taverna.language.version}</version> - <scope>runtime</scope> - </dependency> - <dependency> - <groupId>org.apache.taverna.language</groupId> - <artifactId>taverna-scufl2-wfbundle</artifactId> - <version>${taverna.language.version}</version> - <scope>runtime</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <artifactId>maven-assembly-plugin</artifactId> - <configuration> - <descriptorRefs> - <descriptorRef>jar-with-dependencies</descriptorRef> - </descriptorRefs> - <archive> - <manifest> - <mainClass>${workerMainClass}</mainClass> - </manifest> - </archive> - </configuration> - <executions> - <execution> - <id>make-assembly</id> - <phase>package</phase> - <goals> - <goal>single</goal> - </goals> - </execution> - </executions> - </plugin> - </plugins> - <pluginManagement> - <plugins> - <plugin> - <groupId>org.eclipse.m2e</groupId> - <artifactId>lifecycle-mapping</artifactId> - <version>1.0.0</version> - <configuration> - <lifecycleMappingMetadata> - <pluginExecutions> - <pluginExecution> - <pluginExecutionFilter> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-assembly-plugin</artifactId> - <versionRange>[2.0,)</versionRange> - <goals> - <goal>single</goal> - </goals> - </pluginExecutionFilter> - <action> - <execute /> - </action> - </pluginExecution> - </pluginExecutions> - </lifecycleMappingMetadata> - </configuration> - </plugin> - </plugins> - </pluginManagement> - </build> -</project> http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/META-INF/MANIFEST.MF ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/META-INF/MANIFEST.MF b/server-worker/src/main/java/META-INF/MANIFEST.MF deleted file mode 100644 index 5e94951..0000000 --- a/server-worker/src/main/java/META-INF/MANIFEST.MF +++ /dev/null @@ -1,3 +0,0 @@ -Manifest-Version: 1.0 -Class-Path: - http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/org/taverna/server/localworker/api/Constants.java ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/org/taverna/server/localworker/api/Constants.java b/server-worker/src/main/java/org/taverna/server/localworker/api/Constants.java deleted file mode 100644 index 600913a..0000000 --- a/server-worker/src/main/java/org/taverna/server/localworker/api/Constants.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2013 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.localworker.api; - -import static java.nio.charset.Charset.defaultCharset; - -import java.net.InetAddress; -import java.net.UnknownHostException; - -/** - * The defaults associated with this worker, together with various other - * constants. - * - * @author Donal Fellows - */ -public abstract class Constants { - /** - * Subdirectories of the working directory to create by default. - */ - public static final String[] SUBDIR_LIST = { "conf", "externaltool", "feed", - "interactions", "lib", "logs", "plugins", "repository", "var" }; - - /** The name of the default encoding for characters on this machine. */ - public static final String SYSTEM_ENCODING = defaultCharset().name(); - - /** - * Password to use to encrypt security information. This default is <7 chars - * to work even without Unlimited Strength JCE. - */ - public static final char[] KEYSTORE_PASSWORD = { 'c', 'h', 'a', 'n', 'g', 'e' }; - - /** - * The name of the directory (in the home directory) where security settings - * will be written. - */ - public static final String SECURITY_DIR_NAME = ".taverna-server-security"; - - /** The name of the file that will be the created keystore. */ - public static final String KEYSTORE_FILE = "t2keystore.ubr"; - - /** The name of the file that will be the created truststore. */ - public static final String TRUSTSTORE_FILE = "t2truststore.ubr"; - - /** - * The name of the file that contains the password to unlock the keystore - * and truststore. - */ - public static final String PASSWORD_FILE = "password.txt"; - - // --------- UNUSED --------- - // /** - // * The name of the file that contains the mapping from URIs to keystore - // * aliases. - // */ - // public static final String URI_ALIAS_MAP = "urlmap.txt"; - - /** - * Used to instruct the Taverna credential manager to use a non-default - * location for user credentials. - */ - public static final String CREDENTIAL_MANAGER_DIRECTORY = "-cmdir"; - - /** - * Used to instruct the Taverna credential manager to take its master - * password from standard input. - */ - public static final String CREDENTIAL_MANAGER_PASSWORD = "-cmpassword"; - - /** - * Name of environment variable used to pass HELIO security tokens to - * workflows. - */ - // This technique is known to be insecure; bite me. - public static final String HELIO_TOKEN_NAME = "HELIO_CIS_TOKEN"; - - /** - * The name of the standard listener, which is installed by default. - */ - public static final String DEFAULT_LISTENER_NAME = "io"; - - /** - * Time to wait for the subprocess to wait, in milliseconds. - */ - public static final int START_WAIT_TIME = 1500; - - /** - * Time to wait for success or failure of a death-causing activity (i.e., - * sending a signal). - */ - public static final int DEATH_TIME = 333; - - /** - * The name of the file (in this code's resources) that provides the default - * security policy that we use. - */ - public static final String SECURITY_POLICY_FILE = "security.policy"; - - /** - * The Java property holding security policy info. - */ - public static final String SEC_POLICY_PROP = "java.security.policy"; - /** - * The Java property to set to make this code not try to enforce security - * policy. - */ - public static final String UNSECURE_PROP = "taverna.suppressrestrictions.rmi"; - /** - * The Java property that holds the name of the host name to enforce. - */ - public static final String RMI_HOST_PROP = "java.rmi.server.hostname"; - /** - * The default hostname to require in secure mode. This is the - * <i>resolved</i> version of "localhost". - */ - public static final String LOCALHOST; - static { - String h = "127.0.0.1"; // fallback - try { - h = InetAddress.getByName("localhost").getHostAddress(); - } catch (UnknownHostException e) { - e.printStackTrace(); - } finally { - LOCALHOST = h; - } - } - - /** - * Time to wait during closing down this process. In milliseconds. - */ - public static final int DEATH_DELAY = 500; - /** - * The name of the property describing where shared directories should be - * located. - */ - public static final String SHARED_DIR_PROP = "taverna.sharedDirectory"; - - public static final String TIME = "/usr/bin/time"; -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/org/taverna/server/localworker/api/RunAccounting.java ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/org/taverna/server/localworker/api/RunAccounting.java b/server-worker/src/main/java/org/taverna/server/localworker/api/RunAccounting.java deleted file mode 100644 index 3896c06..0000000 --- a/server-worker/src/main/java/org/taverna/server/localworker/api/RunAccounting.java +++ /dev/null @@ -1,22 +0,0 @@ -/* - * Copyright (C) 2013 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.localworker.api; - -/** - * - * @author Donal Fellows - */ -public interface RunAccounting { - /** - * Logs that a run has started executing. - */ - void runStarted(); - - /** - * Logs that a run has finished executing. - */ - void runCeased(); -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/org/taverna/server/localworker/api/Worker.java ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/org/taverna/server/localworker/api/Worker.java b/server-worker/src/main/java/org/taverna/server/localworker/api/Worker.java deleted file mode 100644 index c513ed8..0000000 --- a/server-worker/src/main/java/org/taverna/server/localworker/api/Worker.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (C) 2010-2012 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.localworker.api; - -import java.io.File; -import java.util.List; -import java.util.Map; - -import org.taverna.server.localworker.impl.LocalWorker; -import org.taverna.server.localworker.remote.ImplementationException; -import org.taverna.server.localworker.remote.RemoteListener; -import org.taverna.server.localworker.remote.RemoteStatus; -import org.taverna.server.localworker.server.UsageRecordReceiver; - -/** - * The interface between the connectivity layer and the thunk to the - * subprocesses. - * - * @author Donal Fellows - */ -public interface Worker { - /** - * Fire up the workflow. This causes a transition into the operating state. - * - * @param local - * The reference to the factory class for this worker. - * @param executeWorkflowCommand - * The command to run to execute the workflow. - * @param workflow - * The workflow document to execute. - * @param workingDir - * What directory to use as the working directory. - * @param inputBaclavaFile - * The baclava file to use for inputs, or <tt>null</tt> to use - * the other <b>input*</b> arguments' values. - * @param inputRealFiles - * A mapping of input names to files that supply them. Note that - * we assume that nothing mapped here will be mapped in - * <b>inputValues</b>. - * @param inputValues - * A mapping of input names to values to supply to them. Note - * that we assume that nothing mapped here will be mapped in - * <b>inputFiles</b>. - * @param inputDelimiters - * A mapping of input names to characters used to split them into - * lists. - * @param outputBaclavaFile - * What baclava file to write the output from the workflow into, - * or <tt>null</tt> to have it written into the <tt>out</tt> - * subdirectory. - * @param contextDirectory - * The directory containing the keystore and truststore. <i>Must - * not be <tt>null</tt>.</i> - * @param keystorePassword - * The password to the keystore and truststore. <i>Must not be - * <tt>null</tt>.</i> - * @param generateProvenance - * Whether to generate a run bundle containing provenance data. - * @param environment - * Any environment variables that need to be added to the - * invokation. - * @param masterToken - * The internal name of the workflow run. - * @param runtimeSettings - * List of configuration details for the forked runtime. - * @return Whether a successful start happened. - * @throws Exception - * If any of quite a large number of things goes wrong. - */ - boolean initWorker(LocalWorker local, String executeWorkflowCommand, - byte[] workflow, File workingDir, File inputBaclavaFile, - Map<String, File> inputRealFiles, Map<String, String> inputValues, - Map<String, String> inputDelimiters, File outputBaclavaFile, - File contextDirectory, char[] keystorePassword, - boolean generateProvenance, Map<String, String> environment, - String masterToken, List<String> runtimeSettings) throws Exception; - - /** - * Kills off the subprocess if it exists and is alive. - * - * @throws Exception - * if anything goes badly wrong when the worker is being killed - * off. - */ - void killWorker() throws Exception; - - /** - * Move the worker out of the stopped state and back to operating. - * - * @throws Exception - * if it fails (which it always does; operation currently - * unsupported). - */ - void startWorker() throws Exception; - - /** - * Move the worker into the stopped state from the operating state. - * - * @throws Exception - * if it fails (which it always does; operation currently - * unsupported). - */ - void stopWorker() throws Exception; - - /** - * @return The status of the workflow run. Note that this can be an - * expensive operation. - */ - RemoteStatus getWorkerStatus(); - - /** - * @return The listener that is registered by default, in addition to all - * those that are explicitly registered by the user. - */ - RemoteListener getDefaultListener(); - - /** - * @param receiver - * The destination where any final usage records are to be - * written in order to log them back to the server. - */ - void setURReceiver(UsageRecordReceiver receiver); - - /** - * Arrange for the deletion of any resources created during worker process - * construction. Guaranteed to be the last thing done before finalization. - * - * @throws ImplementationException - * If anything goes wrong. - */ - void deleteLocalResources() throws ImplementationException; -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/org/taverna/server/localworker/api/WorkerFactory.java ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/org/taverna/server/localworker/api/WorkerFactory.java b/server-worker/src/main/java/org/taverna/server/localworker/api/WorkerFactory.java deleted file mode 100644 index 4ce13a7..0000000 --- a/server-worker/src/main/java/org/taverna/server/localworker/api/WorkerFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.taverna.server.localworker.api; - - -/** - * Class that manufactures instances of {@link Worker}. - * - * @author Donal Fellows - */ -public interface WorkerFactory { - /** - * Create an instance of the low-level worker class. - * - * @return The worker object. - * @throws Exception - * If anything goes wrong. - */ - Worker makeInstance() throws Exception; -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/org/taverna/server/localworker/impl/DirectoryDelegate.java ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/org/taverna/server/localworker/impl/DirectoryDelegate.java b/server-worker/src/main/java/org/taverna/server/localworker/impl/DirectoryDelegate.java deleted file mode 100644 index 1692856..0000000 --- a/server-worker/src/main/java/org/taverna/server/localworker/impl/DirectoryDelegate.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.localworker.impl; - -import static org.apache.commons.io.FileUtils.forceDelete; -import static org.apache.commons.io.FileUtils.forceMkdir; -import static org.apache.commons.io.FileUtils.touch; -import static org.taverna.server.localworker.impl.utils.FilenameVerifier.getValidatedNewFile; - -import java.io.File; -import java.io.IOException; -import java.rmi.RemoteException; -import java.rmi.server.UnicastRemoteObject; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Date; -import java.util.List; - -import javax.annotation.Nonnull; - -import org.apache.commons.collections.MapIterator; -import org.apache.commons.collections.map.ReferenceMap; -import org.taverna.server.localworker.remote.RemoteDirectory; -import org.taverna.server.localworker.remote.RemoteDirectoryEntry; -import org.taverna.server.localworker.remote.RemoteFile; - -/** - * This class acts as a remote-aware delegate for the workflow run's working - * directory and its subdirectories. - * - * @author Donal Fellows - * @see FileDelegate - */ -@SuppressWarnings("serial") -public class DirectoryDelegate extends UnicastRemoteObject implements - RemoteDirectory { - private File dir; - private DirectoryDelegate parent; - private ReferenceMap localCache; - - /** - * @param dir - * @param parent - * @throws RemoteException - * If registration of the directory fails. - */ - public DirectoryDelegate(@Nonnull File dir, - @Nonnull DirectoryDelegate parent) throws RemoteException { - super(); - this.localCache = new ReferenceMap(); - this.dir = dir; - this.parent = parent; - } - - @Override - public Collection<RemoteDirectoryEntry> getContents() - throws RemoteException { - List<RemoteDirectoryEntry> result = new ArrayList<>(); - for (String s : dir.list()) { - if (s.equals(".") || s.equals("..")) - continue; - File f = new File(dir, s); - RemoteDirectoryEntry entry; - synchronized (localCache) { - entry = (RemoteDirectoryEntry) localCache.get(s); - if (f.isDirectory()) { - if (entry == null || !(entry instanceof DirectoryDelegate)) { - entry = new DirectoryDelegate(f, this); - localCache.put(s, entry); - } - } else if (f.isFile()) { - if (entry == null || !(entry instanceof FileDelegate)) { - entry = new FileDelegate(f, this); - localCache.put(s, entry); - } - } else { - // not file or dir; skip... - continue; - } - } - result.add(entry); - } - return result; - } - - @Override - public RemoteFile makeEmptyFile(String name) throws IOException { - File f = getValidatedNewFile(dir, name); - touch(f); - FileDelegate delegate = new FileDelegate(f, this); - synchronized (localCache) { - localCache.put(name, delegate); - } - return delegate; - } - - @Override - public RemoteDirectory makeSubdirectory(String name) throws IOException { - File f = getValidatedNewFile(dir, name); - forceMkdir(f); - DirectoryDelegate delegate = new DirectoryDelegate(f, this); - synchronized (localCache) { - localCache.put(name, delegate); - } - return delegate; - } - - @SuppressWarnings("unchecked") - @Override - public void destroy() throws IOException { - if (parent == null) - throw new IOException("tried to destroy main job working directory"); - Collection<RemoteDirectoryEntry> values; - synchronized (localCache) { - values = new ArrayList<>(localCache.values()); - } - for (RemoteDirectoryEntry obj : values) { - if (obj == null) - continue; - try { - obj.destroy(); - } catch (IOException e) { - } - } - forceDelete(dir); - parent.forgetEntry(this); - } - - @Override - public RemoteDirectory getContainingDirectory() { - return parent; - } - - void forgetEntry(@Nonnull RemoteDirectoryEntry entry) { - synchronized (localCache) { - MapIterator i = localCache.mapIterator(); - while (i.hasNext()) { - Object key = i.next(); - if (entry == i.getValue()) { - localCache.remove(key); - break; - } - } - } - } - - @Override - public String getName() { - if (parent == null) - return ""; - return dir.getName(); - } - - @Override - public Date getModificationDate() throws RemoteException { - return new Date(dir.lastModified()); - } -} http://git-wip-us.apache.org/repos/asf/incubator-taverna-server/blob/2c71f9a9/server-worker/src/main/java/org/taverna/server/localworker/impl/FileDelegate.java ---------------------------------------------------------------------- diff --git a/server-worker/src/main/java/org/taverna/server/localworker/impl/FileDelegate.java b/server-worker/src/main/java/org/taverna/server/localworker/impl/FileDelegate.java deleted file mode 100644 index 7e47af9..0000000 --- a/server-worker/src/main/java/org/taverna/server/localworker/impl/FileDelegate.java +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2010-2011 The University of Manchester - * - * See the file "LICENSE" for license terms. - */ -package org.taverna.server.localworker.impl; - -import static java.lang.System.arraycopy; -import static java.net.InetAddress.getLocalHost; -import static org.apache.commons.io.FileUtils.copyFile; -import static org.apache.commons.io.FileUtils.forceDelete; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.UnknownHostException; -import java.rmi.RemoteException; -import java.rmi.server.UnicastRemoteObject; -import java.util.Date; - -import javax.annotation.Nonnull; - -import org.taverna.server.localworker.remote.RemoteDirectory; -import org.taverna.server.localworker.remote.RemoteFile; - -/** - * This class acts as a remote-aware delegate for the files in a workflow run's - * working directory and its subdirectories. - * - * @author Donal Fellows - * @see DirectoryDelegate - */ [email protected]("serial") -public class FileDelegate extends UnicastRemoteObject implements RemoteFile { - private File file; - private DirectoryDelegate parent; - - /** - * @param file - * @param parent - * @throws RemoteException - * If registration of the file fails. - */ - public FileDelegate(@Nonnull File file, @Nonnull DirectoryDelegate parent) - throws RemoteException { - super(); - this.file = file; - this.parent = parent; - } - - @Override - public byte[] getContents(int offset, int length) throws IOException { - if (length == -1) - length = (int) (file.length() - offset); - if (length < 0 || length > 1024 * 64) - length = 1024 * 64; - byte[] buffer = new byte[length]; - int read; - try (FileInputStream fis = new FileInputStream(file)) { - if (offset > 0 && fis.skip(offset) != offset) - throw new IOException("did not move to correct offset in file"); - read = fis.read(buffer); - } - if (read <= 0) - return new byte[0]; - if (read < buffer.length) { - byte[] shortened = new byte[read]; - arraycopy(buffer, 0, shortened, 0, read); - return shortened; - } - return buffer; - } - - @Override - public long getSize() { - return file.length(); - } - - @Override - public void setContents(byte[] data) throws IOException { - try (FileOutputStream fos = new FileOutputStream(file)) { - fos.write(data); - } - } - - @Override - public void appendContents(byte[] data) throws IOException { - try (FileOutputStream fos = new FileOutputStream(file, true)) { - fos.write(data); - } - } - - @Override - public void destroy() throws IOException { - forceDelete(file); - parent.forgetEntry(this); - parent = null; - } - - @Override - public RemoteDirectory getContainingDirectory() { - return parent; - } - - @Override - public String getName() { - return file.getName(); - } - - @Override - public void copy(RemoteFile sourceFile) throws RemoteException, IOException { - String sourceHost = sourceFile.getNativeHost(); - if (!getNativeHost().equals(sourceHost)) { - throw new IOException( - "cross-system copy not implemented; cannot copy from " - + sourceHost + " to " + getNativeHost()); - } - // Must copy; cannot count on other file to stay unmodified - copyFile(new File(sourceFile.getNativeName()), file); - } - - @Override - public String getNativeName() { - return file.getAbsolutePath(); - } - - @Override - public String getNativeHost() { - try { - return getLocalHost().getHostAddress(); - } catch (UnknownHostException e) { - throw new RuntimeException( - "unexpected failure to resolve local host address", e); - } - } - - @Override - public Date getModificationDate() throws RemoteException { - return new Date(file.lastModified()); - } -}
