diff options
Diffstat (limited to 'sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java')
9 files changed, 1357 insertions, 0 deletions
diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/AssemblyFactoryTestCase.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/AssemblyFactoryTestCase.java new file mode 100644 index 0000000000..767b152624 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/AssemblyFactoryTestCase.java @@ -0,0 +1,214 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.assembly; + +import javax.xml.namespace.QName; + +import junit.framework.TestCase; + + +/** + * Test building of assembly model instances using the assembly factory. + * + * @version $Rev$ $Date$ + */ +public class AssemblyFactoryTestCase extends TestCase { + + AssemblyFactory factory; + + @Override + public void setUp() throws Exception { + factory = new DefaultAssemblyFactory(); + } + + @Override + public void tearDown() throws Exception { + factory = null; + } + + public void testCreateComponent() { + createComponent("AccountServiceComponent1"); + } + + public void testCreateComponentType() { + createComponentType(); + } + + public void testCreateComposite() { + createComposite(); + } + + public void testCreateConstrainingType() { + createConstrainingType(); + } + + /** + * Create a composite + */ + Composite createComposite() { + Composite c = factory.createComposite(); + + Component c1 = createComponent("AccountServiceComponent1"); + c.getComponents().add(c1); + Component c2 = createComponent("AccountServiceComponent2"); + c.getComponents().add(c2); + + Wire w = factory.createWire(); + w.setSource(c1.getReferences().get(0)); + w.setTarget(c2.getServices().get(0)); + c.getWires().add(w); + + CompositeService cs = factory.createCompositeService(); + cs.setName("AccountService"); + cs.setPromotedService(c1.getServices().get(0)); + cs.setInterfaceContract(new TestInterfaceContract(factory)); + c.getServices().add(cs); + cs.getBindings().add(new TestBinding(factory)); + + CompositeReference cr = factory.createCompositeReference(); + cr.setName("StockQuoteService"); + cr.getPromotedReferences().add(c2.getReferences().get(1)); + cr.setInterfaceContract(new TestInterfaceContract(factory)); + c.getReferences().add(cr); + cr.getBindings().add(new TestBinding(factory)); + + return c; + } + + /** + * Create a new component + */ + Component createComponent(String name) { + Component c = factory.createComponent(); + c.setName(name); + + ConstrainingType constraint = createConstrainingType(); + c.setConstrainingType(constraint); + + Implementation i = new TestImplementation(factory); + c.setImplementation(i); + + ComponentProperty p = factory.createComponentProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + p.setProperty(i.getProperties().get(0)); + c.getProperties().add(p); + + ComponentReference ref1 = factory.createComponentReference(); + ref1.setName("accountDataService"); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + ref1.setInterfaceContract(new TestInterfaceContract(factory)); + ref1.setReference(i.getReferences().get(0)); + c.getReferences().add(ref1); + ref1.getBindings().add(new TestBinding(factory)); + + ComponentReference ref2 = factory.createComponentReference(); + ref2.setName("stockQuoteService"); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + ref2.setReference(i.getReferences().get(1)); + c.getReferences().add(ref2); + ref2.getBindings().add(new TestBinding(factory)); + + ComponentService s = factory.createComponentService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + s.setService(i.getServices().get(0)); + c.getServices().add(s); + s.getBindings().add(new TestBinding(factory)); + + return c; + } + + /** + * Create a new component type + * + * @return + */ + ComponentType createComponentType() { + ComponentType ctype = factory.createComponentType(); + + Property p = factory.createProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + ctype.getProperties().add(p); + + Reference ref1 = factory.createReference(); + ref1.setName("accountDataService"); + ref1.setInterfaceContract(new TestInterfaceContract(factory)); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref1); + ref1.getBindings().add(new TestBinding(factory)); + + Reference ref2 = factory.createReference(); + ref2.setName("stockQuoteService"); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref2); + ref2.getBindings().add(new TestBinding(factory)); + + Service s = factory.createService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + ctype.getServices().add(s); + s.getBindings().add(new TestBinding(factory)); + + return ctype; + } + + /** + * Create a new constraining type + * + * @return + */ + ConstrainingType createConstrainingType() { + ConstrainingType ctype = factory.createConstrainingType(); + + AbstractProperty p = factory.createAbstractProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + ctype.getProperties().add(p); + + AbstractReference ref1 = factory.createAbstractReference(); + ref1.setName("accountDataService"); + ref1.setInterfaceContract(new TestInterfaceContract(factory)); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref1); + + AbstractReference ref2 = factory.createAbstractReference(); + ref2.setName("stockQuoteService"); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref2); + + AbstractService s = factory.createAbstractService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + ctype.getServices().add(s); + + return ctype; + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestBinding.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestBinding.java new file mode 100644 index 0000000000..40d5f4e63f --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestBinding.java @@ -0,0 +1,55 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.assembly; + + +/** + * A test interface model. + * + * @version $Rev$ $Date$ + */ +public class TestBinding implements Binding { + public TestBinding(AssemblyFactory factory) { + } + + public String getName() { + return null; + } + + public String getURI() { + return "http://test"; + } + + public void setName(String name) { + } + + public void setURI(String uri) { + } + + public void setUnresolved(boolean unresolved) { + } + + public boolean isUnresolved() { + return false; + } + + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestImplementation.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestImplementation.java new file mode 100644 index 0000000000..19702954c9 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestImplementation.java @@ -0,0 +1,61 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.assembly; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.impl.ImplementationImpl; + +/** + * A test component implementation model. + * + * @version $Rev$ $Date$ + */ +public class TestImplementation extends ImplementationImpl implements Implementation { + public TestImplementation(AssemblyFactory factory) { + + Property p = factory.createProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + getProperties().add(p); + + Reference ref1 = factory.createReference(); + ref1.setName("accountDataService"); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + getReferences().add(ref1); + ref1.getBindings().add(new TestBinding(factory)); + + Reference ref2 = factory.createReference(); + ref2.setName("stockQuoteService"); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + getReferences().add(ref2); + ref2.getBindings().add(new TestBinding(factory)); + + Service s = factory.createService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + getServices().add(s); + s.getBindings().add(new TestBinding(factory)); + + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestInterface.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestInterface.java new file mode 100644 index 0000000000..dbe0cb8225 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestInterface.java @@ -0,0 +1,42 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.assembly; + +import org.apache.tuscany.sca.interfacedef.Interface; +import org.apache.tuscany.sca.interfacedef.Operation; +import org.apache.tuscany.sca.interfacedef.impl.InterfaceImpl; + +/** + * A test interface model. + * + * @version $Rev$ $Date$ + */ +public class TestInterface extends InterfaceImpl implements Interface { + + public TestInterface(AssemblyFactory factory) { + + setRemotable(true); + + Operation operation = new TestOperation(); + operation.setName("test"); + getOperations().add(operation); + + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestInterfaceContract.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestInterfaceContract.java new file mode 100644 index 0000000000..ee6b95edc9 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestInterfaceContract.java @@ -0,0 +1,41 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.assembly; + +import org.apache.tuscany.sca.interfacedef.InterfaceContract; +import org.apache.tuscany.sca.interfacedef.impl.InterfaceContractImpl; + +/** + * A test interface contract model. + * + * @version $Rev$ $Date$ + */ +public class TestInterfaceContract extends InterfaceContractImpl implements InterfaceContract { + + public TestInterfaceContract(AssemblyFactory factory) { + + TestInterface testInterface = new TestInterface(factory); + setInterface(testInterface); + + TestInterface testCallbackInterface = new TestInterface(factory); + setCallbackInterface(testCallbackInterface); + + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestOperation.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestOperation.java new file mode 100644 index 0000000000..d94a7e93a3 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/TestOperation.java @@ -0,0 +1,30 @@ +/* + * 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. + */ +package org.apache.tuscany.sca.assembly; + +import org.apache.tuscany.sca.interfacedef.impl.OperationImpl; + +/** + * A test operation model. + * + * @version $Rev$ $Date$ + */ +public class TestOperation extends OperationImpl { + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/CalculateBindingURITestCase.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/CalculateBindingURITestCase.java new file mode 100644 index 0000000000..f06b8e95ea --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/CalculateBindingURITestCase.java @@ -0,0 +1,557 @@ +/* + * 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. + */ + +package org.apache.tuscany.sca.assembly.builder.impl; + +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +import javax.xml.namespace.QName; + +import junit.framework.Assert; +import junit.framework.TestCase; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Binding; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeReference; +import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory; +import org.apache.tuscany.sca.assembly.SCABinding; +import org.apache.tuscany.sca.assembly.SCABindingFactory; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.assembly.builder.CompositeBuilderMonitor; +import org.apache.tuscany.sca.assembly.builder.Problem; +import org.apache.tuscany.sca.assembly.builder.Problem.Severity; + +public class CalculateBindingURITestCase extends TestCase { + private final static Logger logger = Logger.getLogger(CalculateBindingURITestCase.class.getName()); + private AssemblyFactory assemblyFactory; + private SCABindingFactory scaBindingFactory = null; + private CompositeBuilderMonitor monitor = null; + private CompositeConfigurationBuilderImpl configurationBuilder = null; + private List<Binding> defaultBindings = new ArrayList<Binding>(); + + @Override + protected void setUp() throws Exception { + assemblyFactory = new DefaultAssemblyFactory(); + scaBindingFactory = new TestBindingFactory(); + monitor = new CompositeBuilderMonitor() { + public void problem(Problem problem) { + if (problem.getSeverity() == Severity.INFO) { + logger.info(problem.toString()); + } else if (problem.getSeverity() == Severity.WARNING) { + logger.warning(problem.toString()); + } else if (problem.getSeverity() == Severity.ERROR) { + if (problem.getCause() != null) { + logger.log(Level.SEVERE, problem.toString(), problem.getCause()); + } else { + logger.severe(problem.toString()); + } + } + } + }; + configurationBuilder = new CompositeConfigurationBuilderImpl(assemblyFactory, scaBindingFactory, null, null, monitor); + Binding defaultBinding = new TestBindingImpl(); + defaultBinding.setURI("http://myhost:8080/root"); + defaultBindings.add(defaultBinding); + } + + @Override + protected void tearDown() throws Exception { + assemblyFactory = null; + } + + /** + * Test that URI are generated in accordance with the assembly spec section 1.7.2.1 as + * follows. For the 3 parts that make up the URI; + * + * BaseURI / Component URI / Service Binding URI + * + * Test the following combinations for: + * + * NB. The short hand here, e.g. <service name="s1"> <binding.sca> <service name="s2"> means + * two services appear where the first has the sca binding specified. + * + * component service bindings + * + * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca> + * --> http://myhost:8080/root/c1 + * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca> <service name="s2"> + * --> http://myhost:8080/root/c1/s1 + * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca name="n"> <service name="s2"> + * --> http://myhost:8080/root/c1/n + * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca uri="b"> <service name="s2"> + * --> http://myhost:8080/root/c1/b + * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca uri="http://myhost:8080/b"> <service name="s2"> + * --> http://myhost:8080/b + * http://myhost:8080/root / <component name="c1"> / <service name="s1"> <binding.sca uri="../../b"> <service name="s2"> + * --> http://myhost:8080/b + * + * top level composite service bindings + * + * http://myhost:8080/root / null / <service name="s1"> <binding.sca> <service name="s2"> + * --> http://myhost:8080/root + * http://myhost:8080/root / null / <service name="s1"> <binding.sca> <service name="s2"> + * --> http://myhost:8080/root/s1 + * http://myhost:8080/root / null / <service name="s1"> <binding.sca name="n"> <service name="s2"> + * --> http://myhost:8080/root/n + * http://myhost:8080/root / null / <service name="s1"> <binding.sca uri="b"> <service name="s2"> + * --> http://myhost:8080/root/b + * http://myhost:8080/root / null / <service name="s1"> <binding.sca uri="http://myhost:8080/b"> <service name="s2"> + * --> http://myhost:8080/b + * + * nested composite service bindings + * + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca> + * --> http://myhost:8080/root/c1/c2 + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca> <service name="s2"> + * --> http://myhost:8080/root/c1/c2/s1 + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca name="n"> <service name="s2"> + * --> http://myhost:8080/root/c1/c2/n + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca uri="b"> <service name="s2"> + * --> http://myhost:8080/root/c1/c2/b + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca uri="http://myhost:8080/b"> <service name="s2"> + * --> http://myhost:8080/b + * + * binding name duplication errors + * + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca> <binding.xyz> + * --> Error + * http://myhost:8080/root / <component name="c1"> implemented by composite with <component name="c2"> / <service name="s1"> <binding.sca name="b1"> <binding.xyz name="b1"> + * --> Error + */ + + private Composite createComponentServiceBinding() { + Composite composite1 = assemblyFactory.createComposite(); + composite1.setName(new QName("http://foo", "C1")); + + Component c1 = assemblyFactory.createComponent(); + c1.setName("c1"); + composite1.getComponents().add(c1); + + ComponentService s1 = assemblyFactory.createComponentService(); + c1.getServices().add(s1); + s1.setName("s1"); + + ComponentService s2 = assemblyFactory.createComponentService(); + c1.getServices().add(s2); + s2.setName("s2"); + + Binding b1 = new TestBindingImpl(); + s1.getBindings().add(b1); + + Binding b2 = new TestBindingImpl(); + s2.getBindings().add(b2); + + return composite1; + } + + private Composite createTopLevelCompositeServiceBinding(){ + Composite composite1 = assemblyFactory.createComposite(); + composite1.setName(new QName("http://foo", "C1")); + + CompositeService s1 = assemblyFactory.createCompositeService(); + s1.setName("s1"); + composite1.getServices().add(s1); + + Binding b1 = new TestBindingImpl(); + s1.getBindings().add(b1); + + CompositeService s2 = assemblyFactory.createCompositeService(); + s2.setName("s2"); + composite1.getServices().add(s2); + + Binding b2 = new TestBindingImpl(); + s2.getBindings().add(b2); + + return composite1; + } + + private Composite createNestCompositeServiceBinding(){ + Composite composite1 = assemblyFactory.createComposite(); + composite1.setName(new QName("http://foo", "C1")); + + Component c1 = assemblyFactory.createComponent(); + c1.setName("c1"); + composite1.getComponents().add(c1); + + Composite composite2 = assemblyFactory.createComposite(); + c1.setImplementation(composite2); + composite2.setName(new QName("http://foo", "C2")); + + Component c2 = assemblyFactory.createComponent(); + composite2.getComponents().add(c2); + c2.setName("c2"); + + ComponentService s1 = assemblyFactory.createComponentService(); + c2.getServices().add(s1); + s1.setName("s1"); + + ComponentService s2 = assemblyFactory.createComponentService(); + c2.getServices().add(s2); + s2.setName("s2"); + + Binding b1 = new TestBindingImpl(); + s1.getBindings().add(b1); + + Binding b2 = new TestBindingImpl(); + s2.getBindings().add(b2); + + return composite1; + } + + // component service binding tests + + public void testComponentServiceSingleService() { + Composite composite = createComponentServiceBinding(); + composite.getComponents().get(0).getServices().remove(1); + Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testComponentServiceBindingDefault() { + Composite composite = createComponentServiceBinding(); + Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/s1", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testComponentServiceBindingName() { + Composite composite = createComponentServiceBinding(); + Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/n", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testComponentServiceBindingURIRelative() { + Composite composite = createComponentServiceBinding(); + Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testComponentServiceBindingURIAbsolute() { + Composite composite = createComponentServiceBinding(); + Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("http://myhost:8080/b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testComponentServiceBindingURIRelative2() { + Composite composite = createComponentServiceBinding(); + Binding b = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("../../b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + // top level composite service binding tests + + public void testCompositeServiceSingleService() { + Composite composite = createTopLevelCompositeServiceBinding(); + composite.getServices().remove(1); + Binding b = composite.getServices().get(0).getBindings().get(0); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testCompositeServiceBindingDefault() { + Composite composite = createTopLevelCompositeServiceBinding(); + Binding b = composite.getServices().get(0).getBindings().get(0); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/s1", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testCompositeServiceBindingName() { + Composite composite = createTopLevelCompositeServiceBinding(); + Binding b = composite.getServices().get(0).getBindings().get(0); + b.setName("n"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/n", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testCompositeServiceBindingURIRelative() { + Composite composite = createTopLevelCompositeServiceBinding(); + Binding b = composite.getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testCompositeServiceBindingURIAbsolute() { + Composite composite = createTopLevelCompositeServiceBinding(); + Binding b = composite.getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("http://myhost:8080/b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + // nested composite service binding tests + + public void testNestedCompositeServiceSingleService() { + Composite composite = createNestCompositeServiceBinding(); + ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().remove(1); + Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/c2", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testNestedCompositeServiceBindingDefault() { + Composite composite = createNestCompositeServiceBinding(); + Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/c2/s1", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testNestedCompositeServiceBindingName() { + Composite composite = createNestCompositeServiceBinding(); + Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/c2/n", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testNestedCompositeServiceBindingURIRelative() { + Composite composite = createNestCompositeServiceBinding(); + Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/root/c1/c2/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + public void testNestedCompositeServiceBindingURIAbsolute() { + Composite composite = createNestCompositeServiceBinding(); + Binding b = ((Composite)composite.getComponents().get(0).getImplementation()).getComponents().get(0).getServices().get(0).getBindings().get(0); + b.setName("n"); + b.setURI("http://myhost:8080/b"); + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + + assertEquals("http://myhost:8080/b", b.getURI()); + } catch(Exception ex){ + System.out.println(ex.toString()); + fail(); + } + } + + // component service binding name error tests + + //FIXME Need to find a better way to test these error cases as + // the composite builder now (intentionally) logs warnings instead of + // throwing exceptions + public void FIXMEtestComponentServiceBindingNameError1() { + Composite composite = createComponentServiceBinding(); + Binding b1 = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + Binding b2 = new TestBindingImpl(); + composite.getComponents().get(0).getServices().get(0).getBindings().add(b2); + + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + fail(); + } catch(Exception ex){ + //System.out.println(ex.toString()); + } + } + + //FIXME Need to find a better way to test these error cases as + // the composite builder now (intentionally) logs warnings instead of + // throwing exceptions + public void FIXMEtestComponentServiceBindingNameError2() { + Composite composite = createComponentServiceBinding(); + Binding b1 = composite.getComponents().get(0).getServices().get(0).getBindings().get(0); + Binding b2 = new TestBindingImpl(); + composite.getComponents().get(0).getServices().get(0).getBindings().add(b2); + + b1.setName("b"); + b2.setName("b"); + + + try { + configurationBuilder.configureBindingURIs(composite, null, defaultBindings); + fail(); + } catch(Exception ex){ + System.out.println(ex.toString()); + } + } + + + public class TestBindingFactory implements SCABindingFactory { + public SCABinding createSCABinding() { + return new TestBindingImpl(); + } + } + + public class TestBindingImpl implements SCABinding { + private String name; + private String uri; + private boolean unresolved; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getURI() { + return uri; + } + + public void setURI(String uri) { + this.uri = uri; + } + + public void setUnresolved(boolean unresolved) { + this.unresolved = unresolved; + } + + public boolean isUnresolved() { + return false; + } + + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderTestCase.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderTestCase.java new file mode 100644 index 0000000000..854d15f546 --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/CompositeBuilderTestCase.java @@ -0,0 +1,128 @@ +/* + * 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. + */ + +package org.apache.tuscany.sca.assembly.builder.impl; + +import javax.xml.namespace.QName; + +import junit.framework.TestCase; + +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeReference; +import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory; + +public class CompositeBuilderTestCase extends TestCase { + + private AssemblyFactory assemblyFactory; + + @Override + protected void setUp() throws Exception { + assemblyFactory = new DefaultAssemblyFactory(); + } + + @Override + protected void tearDown() throws Exception { + assemblyFactory = null; + } + + public void testFuseIncludes() { + Composite c1 = assemblyFactory.createComposite(); + c1.setName(new QName("http://foo", "C1")); + Component a = assemblyFactory.createComponent(); + a.setName("a"); + c1.getComponents().add(a); + CompositeService s = assemblyFactory.createCompositeService(); + s.setName("s"); + c1.getServices().add(s); + CompositeReference r = assemblyFactory.createCompositeReference(); + r.setName("r"); + c1.getReferences().add(r); + + Composite c2 = assemblyFactory.createComposite(); + c2.setName(new QName("http://foo", "C2")); + c1.getIncludes().add(c2); + Component b = assemblyFactory.createComponent(); + b.setName("b"); + c2.getComponents().add(b); + + Composite c = assemblyFactory.createComposite(); + c.setName(new QName("http://foo", "C")); + c.getIncludes().add(c1); + + new CompositeIncludeBuilderImpl(null).fuseIncludes(c); + + assertTrue(c.getComponents().get(0).getName().equals("a")); + assertTrue(c.getComponents().get(1).getName().equals("b")); + assertTrue(c.getServices().get(0).getName().equals("s")); + assertTrue(c.getReferences().get(0).getName().equals("r")); + } + + public void testExpandComposites() { + Composite c1 = assemblyFactory.createComposite(); + c1.setName(new QName("http://foo", "C1")); + Component a = assemblyFactory.createComponent(); + a.setName("a"); + c1.getComponents().add(a); + CompositeService s = assemblyFactory.createCompositeService(); + s.setName("s"); + c1.getServices().add(s); + CompositeReference r = assemblyFactory.createCompositeReference(); + r.setName("r"); + c1.getReferences().add(r); + + Composite c2 = assemblyFactory.createComposite(); + c2.setName(new QName("http://foo", "C2")); + Component b = assemblyFactory.createComponent(); + b.setName("b"); + c2.getComponents().add(b); + + Composite c = assemblyFactory.createComposite(); + c.setName(new QName("http://foo", "C")); + Component x = assemblyFactory.createComponent(); + x.setName("x"); + x.setImplementation(c1); + c.getComponents().add(x); + Component y = assemblyFactory.createComponent(); + y.setName("y"); + y.setImplementation(c2); + c.getComponents().add(y); + Component z = assemblyFactory.createComponent(); + z.setName("z"); + z.setImplementation(c1); + c.getComponents().add(z); + + new CompositeCloneBuilderImpl(null).expandCompositeImplementations(c); + + assertTrue(c.getComponents().get(0).getImplementation() != c1); + assertTrue(c.getComponents().get(1).getImplementation() != c2); + assertTrue(c.getComponents().get(2).getImplementation() != c1); + + Composite i = (Composite)c.getComponents().get(0).getImplementation(); + assertTrue(i.getComponents().get(0) != a); + assertTrue(i.getComponents().get(0).getName().equals("a")); + assertTrue(i.getServices().get(0).getName().equals("s")); + assertTrue(i.getServices().get(0) != s); + assertTrue(i.getReferences().get(0).getName().equals("r")); + assertTrue(i.getReferences().get(0) != r); + } + +} diff --git a/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/PrintUtilTestCase.java b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/PrintUtilTestCase.java new file mode 100644 index 0000000000..c8694966fe --- /dev/null +++ b/sca-java-1.x/branches/sca-java-1.2/modules/assembly/src/test/java/org/apache/tuscany/sca/assembly/builder/impl/PrintUtilTestCase.java @@ -0,0 +1,229 @@ +/* + * 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. + */ + +package org.apache.tuscany.sca.assembly.builder.impl; + +import java.io.PrintWriter; +import java.io.StringWriter; + +import javax.xml.namespace.QName; + +import org.apache.tuscany.sca.assembly.AbstractProperty; +import org.apache.tuscany.sca.assembly.AbstractReference; +import org.apache.tuscany.sca.assembly.AbstractService; +import org.apache.tuscany.sca.assembly.AssemblyFactory; +import org.apache.tuscany.sca.assembly.Component; +import org.apache.tuscany.sca.assembly.ComponentProperty; +import org.apache.tuscany.sca.assembly.ComponentReference; +import org.apache.tuscany.sca.assembly.ComponentService; +import org.apache.tuscany.sca.assembly.ComponentType; +import org.apache.tuscany.sca.assembly.Composite; +import org.apache.tuscany.sca.assembly.CompositeReference; +import org.apache.tuscany.sca.assembly.CompositeService; +import org.apache.tuscany.sca.assembly.ConstrainingType; +import org.apache.tuscany.sca.assembly.DefaultAssemblyFactory; +import org.apache.tuscany.sca.assembly.Implementation; +import org.apache.tuscany.sca.assembly.Multiplicity; +import org.apache.tuscany.sca.assembly.Property; +import org.apache.tuscany.sca.assembly.Reference; +import org.apache.tuscany.sca.assembly.Service; +import org.apache.tuscany.sca.assembly.TestBinding; +import org.apache.tuscany.sca.assembly.TestImplementation; +import org.apache.tuscany.sca.assembly.TestInterfaceContract; +import org.apache.tuscany.sca.assembly.Wire; +import org.junit.Test; + +/** + * @version $Rev$ $Date$ + */ +public class PrintUtilTestCase { + + private AssemblyFactory factory = new DefaultAssemblyFactory(); + + /** + * Create a composite + */ + Composite createComposite() { + Composite c = factory.createComposite(); + + Component c1 = createComponent("AccountServiceComponent1"); + c.getComponents().add(c1); + Component c2 = createComponent("AccountServiceComponent2"); + c.getComponents().add(c2); + + Wire w = factory.createWire(); + w.setSource(c1.getReferences().get(0)); + w.setTarget(c2.getServices().get(0)); + c.getWires().add(w); + + CompositeService cs = factory.createCompositeService(); + cs.setName("AccountService"); + cs.setPromotedService(c1.getServices().get(0)); + cs.setInterfaceContract(new TestInterfaceContract(factory)); + c.getServices().add(cs); + cs.getBindings().add(new TestBinding(factory)); + + CompositeReference cr = factory.createCompositeReference(); + cr.setName("StockQuoteService"); + cr.getPromotedReferences().add(c2.getReferences().get(1)); + cr.setInterfaceContract(new TestInterfaceContract(factory)); + c.getReferences().add(cr); + cr.getBindings().add(new TestBinding(factory)); + + return c; + } + + /** + * Create a new component + */ + Component createComponent(String name) { + Component c = factory.createComponent(); + c.setName(name); + + ConstrainingType constraint = createConstrainingType(); + c.setConstrainingType(constraint); + + Implementation i = new TestImplementation(factory); + c.setImplementation(i); + + ComponentProperty p = factory.createComponentProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + p.setProperty(i.getProperties().get(0)); + c.getProperties().add(p); + + ComponentReference ref1 = factory.createComponentReference(); + ref1.setName("accountDataService"); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + ref1.setInterfaceContract(new TestInterfaceContract(factory)); + ref1.setReference(i.getReferences().get(0)); + c.getReferences().add(ref1); + ref1.getBindings().add(new TestBinding(factory)); + + ComponentReference ref2 = factory.createComponentReference(); + ref2.setName("stockQuoteService"); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + ref2.setReference(i.getReferences().get(1)); + c.getReferences().add(ref2); + ref2.getBindings().add(new TestBinding(factory)); + + ComponentService s = factory.createComponentService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + s.setService(i.getServices().get(0)); + c.getServices().add(s); + s.getBindings().add(new TestBinding(factory)); + + return c; + } + + /** + * Create a new component type + * + * @return + */ + ComponentType createComponentType() { + ComponentType ctype = factory.createComponentType(); + + Property p = factory.createProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + ctype.getProperties().add(p); + + Reference ref1 = factory.createReference(); + ref1.setName("accountDataService"); + ref1.setInterfaceContract(new TestInterfaceContract(factory)); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref1); + ref1.getBindings().add(new TestBinding(factory)); + + Reference ref2 = factory.createReference(); + ref2.setName("stockQuoteService"); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref2); + ref2.getBindings().add(new TestBinding(factory)); + + Service s = factory.createService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + ctype.getServices().add(s); + s.getBindings().add(new TestBinding(factory)); + + return ctype; + } + + /** + * Create a new constraining type + * + * @return + */ + ConstrainingType createConstrainingType() { + ConstrainingType ctype = factory.createConstrainingType(); + + AbstractProperty p = factory.createAbstractProperty(); + p.setName("currency"); + p.setValue("USD"); + p.setMustSupply(true); + p.setXSDType(new QName("", "")); + ctype.getProperties().add(p); + + AbstractReference ref1 = factory.createAbstractReference(); + ref1.setName("accountDataService"); + ref1.setInterfaceContract(new TestInterfaceContract(factory)); + ref1.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref1); + + AbstractReference ref2 = factory.createAbstractReference(); + ref2.setName("stockQuoteService"); + ref2.setInterfaceContract(new TestInterfaceContract(factory)); + ref2.setMultiplicity(Multiplicity.ONE_ONE); + ctype.getReferences().add(ref2); + + AbstractService s = factory.createAbstractService(); + s.setName("AccountService"); + s.setInterfaceContract(new TestInterfaceContract(factory)); + ctype.getServices().add(s); + + return ctype; + } + + @Test + public void testPrint1() { + Composite composite = createComposite(); + StringWriter sw = new StringWriter(); + PrintUtil p = new PrintUtil(new PrintWriter(sw), true); + p.print(composite); + // System.out.println(sw.toString()); + } + + @Test + public void testPrint2() { + Composite composite = createComposite(); + StringWriter sw = new StringWriter(); + PrintUtil p = new PrintUtil(new PrintWriter(sw), false); + p.print(composite); + // System.out.println(sw.toString()); + } +} |