diff options
Diffstat (limited to 'branches/sca-java-2.0-M2/modules/node-launcher-equinox')
22 files changed, 0 insertions, 3676 deletions
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/LICENSE b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/LICENSE deleted file mode 100644 index 6e529a25c4..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/LICENSE +++ /dev/null @@ -1,205 +0,0 @@ -
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed 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.
-
-
-
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/META-INF/MANIFEST.MF b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/META-INF/MANIFEST.MF deleted file mode 100644 index 18e619c559..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/META-INF/MANIFEST.MF +++ /dev/null @@ -1,20 +0,0 @@ -Manifest-Version: 1.0
-Export-Package: org.apache.tuscany.sca.node.equinox.launcher;uses:="or
- g.osgi.framework,org.eclipse.core.runtime.adaptor";version="2.0.0"
-Eclipse-AutoStart: true
-Tool: Bnd-0.0.255
-Bundle-Name: Apache Tuscany SCA Node Equinox OSGi Launcher
-Created-By: 1.6.0_07 (Sun Microsystems Inc.)
-Bundle-Vendor: The Apache Software Foundation
-Bundle-Version: 2.0.0
-Bnd-LastModified: 1225397473703
-Bundle-ManifestVersion: 2
-Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
-Bundle-Description: Apache Tuscany SCA Node Equinox OSGi Launcher
-Import-Package: org.apache.commons.cli;resolution:=optional,
- org.apache.tuscany.sca.node.equinox.launcher;version="2.0.0",
- org.eclipse.core.runtime.adaptor,
- org.osgi.framework;version="1.4"
-Bundle-SymbolicName: org.apache.tuscany.sca.node.launcher.equinox
-Bundle-DocURL: http://www.apache.org/
-
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/NOTICE b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/NOTICE deleted file mode 100644 index 51042eab05..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/NOTICE +++ /dev/null @@ -1,6 +0,0 @@ -${pom.name}
-Copyright (c) 2005 - 2009 The Apache Software Foundation
-
-This product includes software developed by
-The Apache Software Foundation (http://www.apache.org/).
-
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/pom.xml b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/pom.xml deleted file mode 100644 index 7e343ac850..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/pom.xml +++ /dev/null @@ -1,119 +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> - - <modelVersion>4.0.0</modelVersion> - <parent> - <groupId>org.apache.tuscany.sca</groupId> - <artifactId>tuscany-modules</artifactId> - <version>2.0-M2-SNAPSHOT</version> - <relativePath>../pom.xml</relativePath> - </parent> - - <artifactId>tuscany-node-launcher-equinox</artifactId> - <name>Apache Tuscany SCA Node Equinox OSGi Launcher</name> - - <dependencies> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>servlet-api</artifactId> - <version>2.5</version> - </dependency> - - <dependency> - <groupId>org.eclipse</groupId> - <artifactId>osgi</artifactId> - <version>3.3.0-v20070530</version> - <scope>compile</scope> - </dependency> - - <dependency> - <groupId>org.eclipse.core</groupId> - <artifactId>runtime</artifactId> - <version>3.3.100-v20070530</version> - <scope>runtime</scope> - <exclusions> - <exclusion> - <groupId>org.eclipse.equinox</groupId> - <artifactId>app</artifactId> - </exclusion> - </exclusions> - </dependency> - - <dependency> - <groupId>org.eclipse.equinox</groupId> - <artifactId>app</artifactId> - <version>1.0.0-v20070606</version> - <scope>runtime</scope> - </dependency> - - <dependency> - <groupId>commons-cli</groupId> - <artifactId>commons-cli</artifactId> - <version>1.1</version> - </dependency> - - <dependency> - <groupId>org.apache.tuscany.sca</groupId> - <artifactId>tuscany-implementation-node-runtime</artifactId> - <version>2.0-M2-SNAPSHOT</version> - <scope>test</scope> - </dependency> - - <dependency> - <groupId>org.apache.tuscany.sca</groupId> - <artifactId>tuscany-extensibility-equinox</artifactId> - <version>2.0-M2-SNAPSHOT</version> - <scope>test</scope> - </dependency> - - <!-- dependency> - <groupId>org.apache.tuscany.sca</groupId> - <artifactId>tuscany-binding-http-runtime</artifactId> - <version>2.0-M2-SNAPSHOT</version> - <scope>test</scope> - </dependency--> - - <dependency> - <groupId>org.apache.tuscany.sca</groupId> - <artifactId>tuscany-implementation-java-runtime</artifactId> - <version>2.0-M2-SNAPSHOT</version> - <scope>test</scope> - </dependency> - </dependencies> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <configuration> - <archive> - <manifest> - <mainClass>org.apache.tuscany.sca.node.equinox.launcher.NodeMain</mainClass> - <addClasspath>true</addClasspath> - </manifest> - </archive> - </configuration> - </plugin> - </plugins> - </build> - -</project> diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/Contribution.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/Contribution.java deleted file mode 100644 index 892412b395..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/Contribution.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.node.equinox.launcher; - -/** - * Represents an SCA contribution uri + location. - * - * @version $Rev$ $Date$ - */ -public final class Contribution { - private String uri; - private String location; - - /** - * Constructs a new SCA contribution. - * - * @param uri - * @param location - */ - public Contribution(String uri, String location) { - this.uri = uri; - this.location = location; - } - - public String getURI() { - return uri; - } - - public String getLocation() { - return location; - } -}
\ No newline at end of file diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/ContributionLocationHelper.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/ContributionLocationHelper.java deleted file mode 100644 index fd7aaed4c8..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/ContributionLocationHelper.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import java.io.File; -import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; - -import org.osgi.framework.Bundle; - -/** - * ContributionLocationHelper - * - * @version $Rev: $ $Date: $ - */ -public class ContributionLocationHelper { - - /** - * Returns the location of the SCA contribution containing the given class. - * - * @param anchorClass - * @return - */ - public static String getContributionLocation(final Class<?> anchorClass) { - URL url = AccessController.doPrivileged(new PrivilegedAction<URL>() { - public URL run() { - return anchorClass.getProtectionDomain().getCodeSource().getLocation(); - } - }); - String uri = url.toString(); - return uri; - } - - /** - * Returns the location of the SCA contribution represented by the given bundle. - * - * @param anchorClass - * @return - */ - public static String getContributionLocation(final Bundle bundle) { - String uri = bundle.getLocation(); - uri = uri.substring(uri.indexOf("file:") + 5); - File file = new File(uri); - uri = file.toURI().toString(); - return uri; - } - -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/DomainManagerLauncher.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/DomainManagerLauncher.java deleted file mode 100644 index e6f59e1b07..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/DomainManagerLauncher.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.domainManager; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * Simple launcher for the SCA domain manager. - * - * @version $Rev$ $Date$ - */ -public class DomainManagerLauncher { - - static final Logger logger = Logger.getLogger(DomainManagerLauncher.class.getName()); - - /** - * Constructs a new DomainManagerLauncher. - */ - private DomainManagerLauncher() { - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static DomainManagerLauncher newInstance() { - return new DomainManagerLauncher(); - } - - /** - * Creates a new DomainManager. - * - * @return a new DomainManager - * @throws LauncherException - */ - public <T> T createDomainManager() throws LauncherException { - return (T)domainManager("."); - } - - /** - * Creates a new DomainManager. - * - * @param rootDirectory the domain's root configuration directory - * - * @return a new DomainManager - * @throws LauncherException - */ - public <T> T createDomainManager(String rootDirectory) throws LauncherException { - return (T)domainManager(rootDirectory); - } - - public static void main(String[] args) throws Exception { - logger.info("Apache Tuscany SCA Domain Manager is starting..."); - - // Create a launcher - DomainManagerLauncher launcher = newInstance(); - - EquinoxHost equinox = null; - Object domainManager = null; - ShutdownThread shutdown = null; - try { - - // Start the OSGi host - equinox = new EquinoxHost(); - equinox.start(); - - // Start the domain manager - domainManager = launcher.createDomainManager(); - try { - domainManager.getClass().getMethod("start").invoke(domainManager); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Domain Manager could not be started", e); - throw e; - } - logger.info("SCA Domain Manager is now started."); - - // Install a shutdown hook - ShutdownThread hook = new ShutdownThread(domainManager, equinox); - Runtime.getRuntime().addShutdownHook(hook); - - logger.info("Press enter to shutdown."); - try { - System.in.read(); - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized(lock) { - lock.wait(); - } - } - - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the domain manager and OSGi host - if (domainManager != null) { - stopDomainManager(domainManager); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - - /** - * Stop the given domain manager. - * - * @param domainManager - * @throws Exception - */ - private static void stopDomainManager(Object domainManager) throws Exception { - try { - domainManager.getClass().getMethod("stop").invoke(domainManager); - logger.info("SCA Domain Manager is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Domain Manager could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object domainManager; - private EquinoxHost equinox; - - public ShutdownThread(Object domainManager, EquinoxHost equinox) { - super(); - this.domainManager = domainManager; - this.equinox = equinox; - } - - @Override - public void run() { - try { - stopDomainManager(domainManager); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java deleted file mode 100644 index 4918f165bc..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxHost.java +++ /dev/null @@ -1,459 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import static java.lang.System.currentTimeMillis; -import static java.lang.System.setProperty; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.LAUNCHER_EQUINOX_LIBRARIES; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.artifactId; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.bundleName; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.file; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.fixupBundle; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.jarVersion; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.runtimeClasspathEntries; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.string; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.thirdPartyLibraryBundle; -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.thisBundleLocation; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URISyntaxException; -import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.UUID; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.eclipse.core.runtime.adaptor.EclipseStarter; -import org.eclipse.core.runtime.adaptor.LocationManager; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; - -/** - * Wraps the Equinox runtime. - */ -public class EquinoxHost { - private static Logger logger = Logger.getLogger(EquinoxHost.class.getName()); - - static { - if (getSystemProperty("osgi.debug") != null) { - logger.setLevel(Level.FINE); - } - } - - private BundleContext bundleContext; - private Bundle launcherBundle; - private boolean startedEclipse; - private List<URL> bundleFiles = new ArrayList<URL>(); - private List<String> bundleNames = new ArrayList<String>(); - private Collection<URL> jarFiles = new HashSet<URL>(); - private Map<String, Bundle> allBundles = new HashMap<String, Bundle>(); - private List<Bundle> installedBundles = new ArrayList<Bundle>(); - - private Set<URL> bundleLocations; - private boolean aggregateThirdPartyJars = false; - - public EquinoxHost() { - super(); - } - - public EquinoxHost(Set<URL> urls) { - super(); - this.bundleLocations = urls; - } - - private static String getSystemProperty(final String name) { - return AccessController.doPrivileged(new PrivilegedAction<String>() { - public String run() { - return System.getProperty(name); - } - }); - } - - private static Properties getSystemProperties() { - return AccessController.doPrivileged(new PrivilegedAction<Properties>() { - public Properties run() { - Properties props = new Properties(); - for (Map.Entry<Object, Object> e : System.getProperties().entrySet()) { - if (e.getKey() instanceof String) { - String prop = (String)e.getKey(); - if (prop.startsWith("osgi.") || prop.startsWith("eclipse.")) { - props.put(prop, e.getValue()); - } - } - } - return props; - } - }); - } - - private static void put(Properties props, String key, String value) { - if (!props.contains(key)) { - props.put(key, value); - } - } - - /** - * Start the Equinox host. - * - * @return - */ - public BundleContext start() { - try { - if (!EclipseStarter.isRunning()) { - - String version = getSystemProperty("java.specification.version"); - String profile = "J2SE-1.5.profile"; - if (version.startsWith("1.6")) { - profile = "JavaSE-1.6.profile"; - } - Properties props = new Properties(); - InputStream is = getClass().getResourceAsStream(profile); - if (is != null) { - props.load(is); - is.close(); - } - - props.putAll(getSystemProperties()); - - // Configure Eclipse properties - - // Use the boot classloader as the parent classloader - put(props, "osgi.contextClassLoaderParent", "app"); - - // Set startup properties - put(props, EclipseStarter.PROP_CLEAN, "true"); - - // Set location properties - // FIXME Use proper locations - String tmpDir = getSystemProperty("java.io.tmpdir"); - File root = new File(tmpDir); - // Add user name as the prefix. For multiple users on the same Lunix, - // there will be permission issue if one user creates the .tuscany folder - // first under /tmp with no write permission for others. - String userName = getSystemProperty("user.name"); - if (userName != null) { - root = new File(root, userName); - } - root = new File(root, ".tuscany/equinox/" + UUID.randomUUID().toString()); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Equinox location: " + root); - } - - put(props, LocationManager.PROP_INSTANCE_AREA_DEFAULT, new File(root, "workspace").toURI().toString()); - put(props, LocationManager.PROP_INSTALL_AREA, new File(root, "install").toURI().toString()); - put(props, LocationManager.PROP_CONFIG_AREA_DEFAULT, new File(root, "config").toURI().toString()); - put(props, LocationManager.PROP_USER_AREA_DEFAULT, new File(root, "user").toURI().toString()); - - EclipseStarter.setInitialProperties(props); - - // Test if the configuration/config.ini or osgi.bundles has been set - // If yes, try to avoid discovery of bundles - if (bundleLocations == null) { - if (props.getProperty("osgi.bundles") != null) { - bundleLocations = Collections.emptySet(); - } else { - String config = props.getProperty(LocationManager.PROP_CONFIG_AREA); - File ini = new File(config, "config.ini"); - if (ini.isFile()) { - Properties iniProps = new Properties(); - iniProps.load(new FileInputStream(ini)); - if (iniProps.getProperty("osgi.bundles") != null) { - bundleLocations = Collections.emptySet(); - } - } - } - } - - // Start Eclipse - bundleContext = EclipseStarter.startup(new String[] {}, null); - startedEclipse = true; - - } else { - - // Get bundle context from the running Eclipse instance - bundleContext = EclipseStarter.getSystemBundleContext(); - } - - // Determine the runtime classpath entries - Set<URL> urls; - urls = findBundleLocations(); - - // Sort out which are bundles (and not already installed) and which are just - // regular JARs - for (URL url : urls) { - File file = file(url); - String bundleName = bundleName(file); - if (bundleName != null) { - bundleFiles.add(url); - bundleNames.add(bundleName); - } else { - if (file.isFile()) { - jarFiles.add(url); - } - } - } - - // Get the already installed bundles - for (Bundle bundle : bundleContext.getBundles()) { - allBundles.put(bundle.getSymbolicName(), bundle); - } - - // Install the launcher bundle if necessary - String launcherBundleName = "org.apache.tuscany.sca.node.launcher.equinox"; - String launcherBundleLocation; - launcherBundle = allBundles.get(launcherBundleName); - if (launcherBundle == null) { - launcherBundleLocation = thisBundleLocation(); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Installing launcher bundle: " + launcherBundleLocation); - } - fixupBundle(launcherBundleLocation); - launcherBundle = bundleContext.installBundle(launcherBundleLocation); - allBundles.put(launcherBundleName, launcherBundle); - installedBundles.add(launcherBundle); - } else { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Launcher bundle is already installed: " + string(launcherBundle, false)); - } - // launcherBundleLocation = thisBundleLocation(launcherBundle); - } - - // FIXME: SDO bundles dont have the correct dependencies - setProperty("commonj.sdo.impl.HelperProvider", "org.apache.tuscany.sdo.helper.HelperProviderImpl"); - - // Install the Tuscany bundles - long start = currentTimeMillis(); - - if (logger.isLoggable(Level.FINE)) { - logger.fine("Generating third-party library bundle."); - } - long libraryStart = currentTimeMillis(); - if (!aggregateThirdPartyJars) { - for (URL jarFile : jarFiles) { - installAsBundle(jarFile, null); - } - } else { - installAsBundle(jarFiles, LAUNCHER_EQUINOX_LIBRARIES); - } - if (logger.isLoggable(Level.FINE)) { - logger - .fine("Third-party library bundle installed in " + (currentTimeMillis() - libraryStart) + " ms: "); - } - - // Install all the other bundles that are not already installed - for (URL bundleFile: bundleFiles) { - fixupBundle(bundleFile.toString()); - } - for (int i = 0, n = bundleFiles.size(); i < n; i++) { - URL bundleFile = bundleFiles.get(i); - String bundleName = bundleNames.get(i); - if (bundleName.contains("org.eclipse.jdt.junit")) { - continue; - } - installBundle(bundleFile, bundleName); - } - - long end = currentTimeMillis(); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Tuscany bundles are installed in " + (end - start) + " ms."); - } - - // Start the extensiblity and launcher bundles - String extensibilityBundleName = "org.apache.tuscany.sca.extensibility.equinox"; - Bundle extensibilityBundle = allBundles.get(extensibilityBundleName); - if (extensibilityBundle != null) { - if ((extensibilityBundle.getState() & Bundle.ACTIVE) == 0) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Starting bundle: " + string(extensibilityBundle, false)); - } - extensibilityBundle.start(); - } else if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle is already started: " + string(extensibilityBundle, false)); - } - } - if ((launcherBundle.getState() & Bundle.ACTIVE) == 0) { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Starting bundle: " + string(launcherBundle, false)); - } - launcherBundle.start(); - } else if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle is already started: " + string(launcherBundle, false)); - } - - // Start all our bundles for now to help diagnose any class loading issues - // for (Bundle bundle: bundleContext.getBundles()) { - // if (bundle.getSymbolicName().startsWith("org.apache.tuscany.sca")) { - // if ((bundle.getState() & Bundle.ACTIVE) == 0) { - // if (logger.isLoggable(Level.FINE)) { - // logger.fine("Starting bundle: " + string(bundle, false)); - // } - // try { - // //bundle.start(); - // } catch (Exception e) { - // logger.log(Level.SEVERE, e.getMessage(), e); - // // throw e; - // } - // if (logger.isLoggable(Level.FINE)) { - // logger.fine("Bundle: " + string(bundle, false)); - // } - // } - // } - // } - // logger.fine("Tuscany bundles are started in " + (System.currentTimeMillis() - activateStart) + " ms."); - return bundleContext; - - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public Bundle installAsBundle(Collection<URL> jarFiles, String libraryBundleName) throws IOException, - BundleException { - // Install a single 'library' bundle for the third-party JAR files - Bundle libraryBundle = allBundles.get(libraryBundleName); - if (libraryBundle == null) { - InputStream library = thirdPartyLibraryBundle(jarFiles, libraryBundleName, null); - libraryBundle = bundleContext.installBundle(libraryBundleName, library); - allBundles.put(libraryBundleName, libraryBundle); - installedBundles.add(libraryBundle); - } else { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Third-party library bundle is already installed: " + string(libraryBundle, false)); - } - } - return libraryBundle; - } - - public void installBundle(URL bundleFile, String bundleName) throws MalformedURLException, BundleException { - if (bundleName == null) { - try { - bundleName = bundleName(file(bundleFile)); - } catch (IOException e) { - bundleName = null; - } - } - Bundle bundle = allBundles.get(bundleName); - if (bundle == null) { - long installStart = currentTimeMillis(); - String location = bundleFile.toString(); - if ("file".equals(bundleFile.getProtocol())) { - File target = file(bundleFile); - // Use a special "reference" scheme to install the bundle as a reference - // instead of copying the bundle - location = "reference:file:/" + target.getPath(); - } - bundle = bundleContext.installBundle(location); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Bundle installed in " + (currentTimeMillis() - installStart) - + " ms: " - + string(bundle, false)); - } - allBundles.put(bundleName, bundle); - installedBundles.add(bundle); - } - } - - public Bundle installAsBundle(URL jarFile, String symbolicName) throws IOException, BundleException { - if (symbolicName == null) { - symbolicName = LAUNCHER_EQUINOX_LIBRARIES + "." + artifactId(jarFile); - } - Bundle bundle = allBundles.get(symbolicName); - if (bundle == null) { - String version = jarVersion(jarFile); - if (logger.isLoggable(Level.FINE)) { - logger.fine("Installing third-party jar as bundle: " + jarFile); - } - InputStream is = thirdPartyLibraryBundle(Collections.singleton(jarFile), symbolicName, version); - bundle = bundleContext.installBundle(symbolicName, is); - allBundles.put(symbolicName, bundle); - installedBundles.add(bundle); - } - return bundle; - } - - private Set<URL> findBundleLocations() throws FileNotFoundException, URISyntaxException, MalformedURLException { - if (bundleLocations == null) { - if (!startedEclipse) { - - // Use classpath entries from a distribution if there is one and the modules - // directories available in a dev environment for example - bundleLocations = runtimeClasspathEntries(true, false, true); - } else { - - // Use classpath entries from a distribution if there is one and the classpath - // entries on the current application's classloader - bundleLocations = runtimeClasspathEntries(true, true, false); - } - } - return bundleLocations; - } - - /** - * Stop the Equinox host. - */ - public void stop() { - try { - - // Uninstall all the bundles we've installed - for (int i = installedBundles.size() - 1; i >= 0; i--) { - Bundle bundle = installedBundles.get(i); - try { - if (logger.isLoggable(Level.FINE)) { - logger.fine("Uninstalling bundle: " + string(bundle, false)); - } - bundle.uninstall(); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - } - } - installedBundles.clear(); - - // Shutdown Eclipse if we started it ourselves - if (startedEclipse) { - startedEclipse = false; - EclipseStarter.shutdown(); - } - - } catch (Exception e) { - throw new IllegalStateException(e); - } - } - - public void setBundleLocations(Set<URL> bundleLocations) { - this.bundleLocations = bundleLocations; - } - -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherException.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherException.java deleted file mode 100644 index b9bb70b5d7..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/LauncherException.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.node.equinox.launcher; - - -/** - * Denotes an error launching an SCA domain manager or node. - * - * @version $Rev$ $Date$ - */ -public class LauncherException extends Exception { - private static final long serialVersionUID = 4581189418849190567L; - - public LauncherException() { - super(); - } - - /** - * @param message - * @param cause - */ - public LauncherException(String message, Throwable cause) { - super(message, cause); - } - - /** - * @param message - */ - public LauncherException(String message) { - super(message); - } - - /** - * @param cause - */ - public LauncherException(Throwable cause) { - super(cause); - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeDaemonLauncher.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeDaemonLauncher.java deleted file mode 100644 index aeb29c0789..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeDaemonLauncher.java +++ /dev/null @@ -1,160 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.nodeDaemon; - -import java.io.IOException; -import java.util.logging.Level; -import java.util.logging.Logger; - -/** - * A launcher for the SCA Node daemon. - * - * @version $Rev$ $Date$ - */ -public class NodeDaemonLauncher { - - static final Logger logger = Logger.getLogger(NodeDaemonLauncher.class.getName()); - - /** - * Constructs a new node daemon launcher. - */ - private NodeDaemonLauncher() { - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static NodeDaemonLauncher newInstance() { - return new NodeDaemonLauncher(); - } - - /** - * Creates a new node daemon. - * - * @param - * @return a new node daemon - * @throws LauncherException - */ - public <T> T createNodeDaemon() throws LauncherException { - return (T)nodeDaemon(); - } - - public static void main(String[] args) throws Exception { - logger.info("Apache Tuscany SCA Node Daemon is starting..."); - - // Create a node launcher - NodeDaemonLauncher launcher = newInstance(); - - EquinoxHost equinox = null; - Object node = null; - ShutdownThread shutdown = null; - try { - - // Start the OSGi host - equinox = new EquinoxHost(); - equinox.start(); - - // Start the node - node = launcher.createNodeDaemon(); - try { - node.getClass().getMethod("start").invoke(node); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node Daemon could not be started", e); - throw e; - } - logger.info("SCA Node Daemon is now started."); - - // Install a shutdown hook - shutdown = new ShutdownThread(node, equinox); - Runtime.getRuntime().addShutdownHook(shutdown); - - logger.info("Press enter to shutdown."); - try { - System.in.read(); - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized(lock) { - lock.wait(); - } - } - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the node - if (node != null) { - stopNode(node); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void stopNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - logger.info("SCA Node Daemon is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node Daemon could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object node; - private EquinoxHost equinox; - - public ShutdownThread(Object node, EquinoxHost equinox) { - super(); - this.node = node; - this.equinox = equinox; - } - - @Override - public void run() { - try { - stopNode(node); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java deleted file mode 100644 index 04d77bcdd5..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher.java +++ /dev/null @@ -1,327 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.node; - -import java.io.File; -import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.List; -import java.util.logging.Level; -import java.util.logging.Logger; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.HelpFormatter; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.PosixParser; -import org.osgi.framework.BundleContext; - -/** - * A launcher for SCA nodes. - * - * Agruments: - * [-config <equinoxConfiguration>]: The configuration folder for Equinox - * [-c <compositeURI>]: The composite URI - * [-t <ttl>]: Time to live in milliseconds before the node is started - * contribution1 ... contributionN: A list of contribution files or URLs - * - * @version $Rev$ $Date$ - */ -public class NodeLauncher { - - static final Logger logger = Logger.getLogger(NodeLauncher.class.getName()); - private EquinoxHost equinoxHost; - private BundleContext bundleContext; - - /** - * Constructs a new node launcher. - */ - private NodeLauncher() { - equinoxHost = new EquinoxHost(); - bundleContext = equinoxHost.start(); - } - - /** - * Returns a new launcher instance. - * - * @return a new launcher instance - */ - public static NodeLauncher newInstance() { - return new NodeLauncher(); - } - - /** - * Creates a new SCA node from the configuration URL - * - * @param configurationURL the URL of the node configuration which is the ATOM feed - * that contains the URI of the composite and a collection of URLs for the contributions - * - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String configurationURL) throws LauncherException { - return (T)node(configurationURL, null, null, null, bundleContext); - } - - /** - * Creates a new SCA OSGi Node. - * - * @param compositeURI the URI of the composite to use - * @param contributions the URI of the contributions that provides the composites and related - * artifacts. If the list is empty, then we will use the thread context classloader to discover - * the contribution on the classpath - * - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String compositeURI, Contribution... contributions) throws LauncherException { - return (T)node(null, compositeURI, null, contributions, bundleContext); - } - - /** - * Creates a new SCA OSGi Node. - * - * @param compositeURI the URI of the composite to use - * @param compositeContent the XML content of the composite to use - * @param contributions the URI of the contributions that provides the composites and related artifacts - * @return a new SCA node. - * @throws LauncherException - */ - public <T> T createNode(String compositeURI, String compositeContent, Contribution... contributions) - throws LauncherException { - return (T)node(null, compositeURI, compositeContent, contributions, bundleContext); - } - - public static void main(String[] args) throws Exception { - CommandLineParser parser = new PosixParser(); - Options options = getCommandLineOptions(); - CommandLine cli = parser.parse(options, args); - - Object node = null; - ShutdownThread shutdown = null; - EquinoxHost equinox = null; - try { - - if (cli.hasOption("config")) { - System.setProperty("osgi.configuration.area", cli.getOptionValue("config")); - } - while (true) { - if (cli.hasOption("node")) { - // Create a node from a configuration URI - String configurationURI = cli.getOptionValue("node"); - logger.info("SCA Node configuration: " + configurationURI); - - // Create a node launcher - NodeLauncher launcher = newInstance(); - equinox = launcher.equinoxHost; - - node = launcher.createNode(configurationURI); - } else { - // Create a node from a composite URI and a contribution location - String compositeURI = cli.getOptionValue("composite"); - List<String> contribs = cli.getArgList(); - Contribution[] contributions = null; - if (!contribs.isEmpty()) { - contributions = new Contribution[contribs.size()]; - int index = 0; - for (String contrib : contribs) { - logger.info("SCA contribution: " + contrib); - URL url = null; - try { - url = new URL(contrib); - } catch (MalformedURLException e) { - url = new File(contrib).toURI().toURL(); - } - contributions[index] = new Contribution("contribution-" + index, url.toString()); - index++; - } - } else { - HelpFormatter formatter = new HelpFormatter(); - formatter.setSyntaxPrefix("Usage: "); - formatter.printHelp("java " + NodeLauncher.class.getName() - + " [-config <equinoxConfiguration>]" - + " [-c <compositeURI>]" - + " [-t <ttl>]" - + " contribution1 ... contributionN", options); - return; - } - // Create a node launcher - logger.info("SCA composite: " + compositeURI); - NodeLauncher launcher = newInstance(); - equinox = launcher.equinoxHost; - node = launcher.createNode(compositeURI, contributions); - } - - logger.info("Apache Tuscany SCA Node is starting..."); - - // Start the node - try { - node.getClass().getMethod("start").invoke(node); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be started", e); - throw e; - } - logger.info("SCA Node is now started."); - - // Install a shutdown hook - shutdown = new ShutdownThread(node, equinox); - Runtime.getRuntime().addShutdownHook(shutdown); - - long ttl = Long.parseLong(cli.getOptionValue("ttl", "-1")); - if (ttl >= 0) { - logger.info("Waiting for " + ttl + " milliseconds ..."); - Thread.sleep(ttl); - break; // Exit - } - - // Wait until the "Enter" is pressed - logger.info("Press 'q' to quit, 'r' to restart."); - int k = 0; - try { - while ((k != 'q') && (k != 'r')) { - k = System.in.read(); - } - } catch (IOException e) { - - // Wait forever - Object lock = new Object(); - synchronized (lock) { - lock.wait(); - } - } - - // Stop the node - if (node != null) { - Object n = node; - node = null; - stopNode(n); - } - - // Quit - if (k == 'q') { - break; - } - - } - } finally { - - // Remove the shutdown hook - if (shutdown != null) { - Runtime.getRuntime().removeShutdownHook(shutdown); - } - - // Stop the node - if (node != null) { - destroyNode(node); - } - if (equinox != null) { - equinox.stop(); - } - } - } - - static Options getCommandLineOptions() { - Options options = new Options(); - Option opt1 = new Option("c", "composite", true, "URI for the composite"); - opt1.setArgName("compositeURI"); - options.addOption(opt1); - Option opt2 = new Option("n", "node", true, "URI for the node configuration"); - opt2.setArgName("nodeConfigurationURI"); - options.addOption(opt2); - Option opt3 = new Option("config", "configuration", true, "Configuration"); - opt3.setArgName("equinoxConfiguration"); - options.addOption(opt3); - Option opt4 = new Option("t", "ttl", true, "Time to live"); - opt4.setArgName("timeToLiveInMilliseconds"); - // opt4.setType(long.class); - options.addOption(opt4); - - return options; - } - - public void destroy() { - if (equinoxHost != null) { - equinoxHost.stop(); - bundleContext = null; - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void destroyNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - node.getClass().getMethod("destroy").invoke(node); - logger.info("SCA Node is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be stopped", e); - throw e; - } - } - - private static class ShutdownThread extends Thread { - private Object node; - private EquinoxHost equinox; - - public ShutdownThread(Object node, EquinoxHost equinox) { - super(); - this.node = node; - this.equinox = equinox; - } - - @Override - public void run() { - try { - destroyNode(node); - } catch (Exception e) { - // Ignore - } - try { - equinox.stop(); - } catch (Exception e) { - // Ignore - } - } - } - - /** - * Stop the given node. - * - * @param node - * @throws Exception - */ - private static void stopNode(Object node) throws Exception { - try { - node.getClass().getMethod("stop").invoke(node); - logger.info("SCA Node is now stopped."); - } catch (Exception e) { - logger.log(Level.SEVERE, "SCA Node could not be stopped", e); - throw e; - } - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher2.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher2.java deleted file mode 100644 index fc299b3d53..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncher2.java +++ /dev/null @@ -1,217 +0,0 @@ -/*
- * 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.node.equinox.launcher;
-
-import static org.apache.tuscany.sca.node.equinox.launcher.NodeLauncherUtil.node;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import org.osgi.framework.BundleContext;
-
-/**
- * A launcher for SCA nodes.
- *
- * @version $Rev: 720905 $ $Date: 2008-11-26 15:47:28 +0000 (Wed, 26 Nov 2008) $
- */
-public class NodeLauncher2 {
-
- static final Logger logger = Logger.getLogger(NodeLauncher2.class.getName());
- private EquinoxHost equinoxHost;
- private BundleContext bundleContext;
-
- /**
- * Constructs a new node launcher.
- */
- private NodeLauncher2() {
- equinoxHost = new EquinoxHost();
- bundleContext = equinoxHost.start();
- }
-
- /**
- * Returns a new launcher instance.
- *
- * @return a new launcher instance
- */
- public static NodeLauncher2 newInstance() {
- return new NodeLauncher2();
- }
-
- /**
- * Creates a new SCA node from the configuration URL
- *
- * @param configurationURL the URL of the node configuration which is the ATOM feed
- * that contains the URI of the composite and a collection of URLs for the contributions
- *
- * @return a new SCA node.
- * @throws LauncherException
- */
- public <T> T createNode(String configurationURL) throws LauncherException {
- return (T)node(configurationURL, null, null, null, bundleContext);
- }
-
- /**
- * Creates a new SCA OSGi Node.
- *
- * @param compositeURI the URI of the composite to use
- * @param contributions the URI of the contributions that provides the composites and related
- * artifacts. If the list is empty, then we will use the thread context classloader to discover
- * the contribution on the classpath
- *
- * @return a new SCA node.
- * @throws LauncherException
- */
- public <T> T createNode(String compositeURI, Contribution... contributions) throws LauncherException {
- return (T)node(null, compositeURI, null, contributions, bundleContext);
- }
-
- /**
- * Creates a new SCA OSGi Node.
- *
- * @param compositeURI the URI of the composite to use
- * @param compositeContent the XML content of the composite to use
- * @param contributions the URI of the contributions that provides the composites and related artifacts
- * @return a new SCA node.
- * @throws LauncherException
- */
- public <T> T createNode(String compositeURI, String compositeContent, Contribution... contributions)
- throws LauncherException {
- return (T)node(null, compositeURI, compositeContent, contributions, bundleContext);
- }
-
- public static void main(String[] args) throws Exception {
- logger.info("Apache Tuscany SCA Node is starting...");
-
- // Create a node launcher
- NodeLauncher2 launcher = newInstance();
-
- EquinoxHost equinox = launcher.equinoxHost;
- Object node = null;
- ShutdownThread shutdown = null;
- try {
-
- Contribution[] contributions = new Contribution[args.length];
- for (int i=0; i<args.length; i++) {
- File f = new File(args[i]);
- if (!f.exists()) {
- System.err.println("contribution not found: " + f);
- System.exit(1);
- }
- contributions[i] = new Contribution(f.toURI().toString(), f.toURI().toString());
- }
-
- // Create a node from a composite URI and a contribution location
-// String contributionLocation = args[1];
-// logger.info("SCA composite: " + null);
-// logger.info("SCA contribution: " + contributionLocation);
- node = launcher.createNode(null, contributions);
-
- // Start the node
- try {
- node.getClass().getMethod("start").invoke(node);
- } catch (Exception e) {
- logger.log(Level.SEVERE, "SCA Node could not be started", e);
- throw e;
- }
- logger.info("SCA Node is now started.");
-
- // Install a shutdown hook
- shutdown = new ShutdownThread(node, equinox);
- Runtime.getRuntime().addShutdownHook(shutdown);
-
- logger.info("Press enter to shutdown.");
- try {
- System.in.read();
- } catch (IOException e) {
-
- // Wait forever
- Object lock = new Object();
- synchronized(lock) {
- lock.wait();
- }
- }
- } finally {
-
- // Remove the shutdown hook
- if (shutdown != null) {
- Runtime.getRuntime().removeShutdownHook(shutdown);
- }
-
- // Stop the node
- if (node != null) {
- destroyNode(node);
- }
- if (equinox != null) {
- equinox.stop();
- }
- }
- }
-
- public void destroy() {
- if (equinoxHost != null) {
- equinoxHost.stop();
- bundleContext = null;
- }
- }
-
- /**
- * Stop the given node.
- *
- * @param node
- * @throws Exception
- */
- private static void destroyNode(Object node) throws Exception {
- try {
- node.getClass().getMethod("stop").invoke(node);
- node.getClass().getMethod("destroy").invoke(node);
- logger.info("SCA Node is now stopped.");
- } catch (Exception e) {
- logger.log(Level.SEVERE, "SCA Node could not be stopped", e);
- throw e;
- }
- }
-
- private static class ShutdownThread extends Thread {
- private Object node;
- private EquinoxHost equinox;
-
- public ShutdownThread(Object node, EquinoxHost equinox) {
- super();
- this.node = node;
- this.equinox = equinox;
- }
-
- @Override
- public void run() {
- try {
- destroyNode(node);
- } catch (Exception e) {
- // Ignore
- }
- try {
- equinox.stop();
- } catch (Exception e) {
- // Ignore
- }
- }
- }
-}
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java deleted file mode 100644 index 2a14657d21..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherUtil.java +++ /dev/null @@ -1,1113 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import static org.osgi.framework.Constants.BUNDLE_CLASSPATH; -import static org.osgi.framework.Constants.BUNDLE_MANIFESTVERSION; -import static org.osgi.framework.Constants.BUNDLE_SYMBOLICNAME; -import static org.osgi.framework.Constants.DYNAMICIMPORT_PACKAGE; -import static org.osgi.framework.Constants.EXPORT_PACKAGE; -import static org.osgi.framework.Constants.IMPORT_PACKAGE; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FilenameFilter; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.lang.reflect.Constructor; -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.net.URLClassLoader; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.StringTokenizer; -import java.util.jar.Attributes; -import java.util.jar.JarFile; -import java.util.jar.JarInputStream; -import java.util.jar.JarOutputStream; -import java.util.jar.Manifest; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; -import java.util.zip.ZipInputStream; - -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; -import org.osgi.framework.BundleException; -import org.osgi.framework.Constants; - -/** - * Common functions and constants used by the admin components. - * - * @version $Rev$ $Date$ - */ -final class NodeLauncherUtil { - private static final Logger logger = Logger.getLogger(NodeLauncherUtil.class.getName()); - - static final String LAUNCHER_EQUINOX_LIBRARIES = "org.apache.tuscany.sca.node.launcher.equinox.libraries"; - - private static final String NODE_FACTORY = "org.apache.tuscany.sca.node.NodeFactory"; - - private static final String DOMAIN_MANAGER_LAUNCHER_BOOTSTRAP = - "org.apache.tuscany.sca.domain.manager.launcher.DomainManagerLauncherBootstrap"; - - private static final String NODE_IMPLEMENTATION_DAEMON_BOOTSTRAP = - "org.apache.tuscany.sca.implementation.node.launcher.NodeImplementationDaemonBootstrap"; - - private static final String NODE_IMPLEMENTATION_LAUNCHER_BOOTSTRAP = - "org.apache.tuscany.sca.implementation.node.launcher.NodeImplementationLauncherBootstrap"; - - private static final String TUSCANY_HOME = "TUSCANY_HOME"; - private static final String TUSCANY_PATH = "TUSCANY_PATH"; - - /** - * Creates a new node. - * - * @param configurationURI - * @param compositeURI - * @param compositeContent - * @param contributions - * @param contributionClassLoader - * @param bundleContext - * @throws LauncherException - */ - static Object node(String configurationURI, - String compositeURI, - String compositeContent, - Contribution[] contributions, - BundleContext bundleContext) throws LauncherException { - try { - - // Get the node runtime bundle. - Bundle bundle = null; - for (Bundle b : bundleContext.getBundles()) { - if ("org.apache.tuscany.sca.implementation.node.runtime".equals(b.getSymbolicName())) { - bundle = b; - break; - } - } - if (bundle == null) { - throw new IllegalStateException( - "Bundle org.apache.tuscany.sca.implementation.node.runtime is not installed"); - } - - // Use Java reflection to create the node as only the runtime class - // loader knows the runtime classes required by the node - Class<?> bootstrapClass = bundle.loadClass(NODE_IMPLEMENTATION_LAUNCHER_BOOTSTRAP); - - Object bootstrap; - if (configurationURI != null) { - - // Construct the node with a configuration URI - bootstrap = bootstrapClass.getConstructor(String.class).newInstance(configurationURI); - - } else if (compositeContent != null) { - - // Construct the node with a composite URI, the composite content and - // the URIs and locations of a list of contributions - Constructor<?> constructor = - bootstrapClass.getConstructor(String.class, String.class, String[].class, String[].class); - String[] uris = new String[contributions.length]; - String[] locations = new String[contributions.length]; - for (int i = 0; i < contributions.length; i++) { - uris[i] = contributions[i].getURI(); - locations[i] = contributions[i].getLocation(); - } - bootstrap = constructor.newInstance(compositeURI, compositeContent, uris, locations); - - } else { - - // Construct the node with a composite URI and the URIs and - // locations of a list of contributions - Constructor<?> constructor = - bootstrapClass.getConstructor(String.class, String[].class, String[].class); - String[] uris = new String[contributions.length]; - String[] locations = new String[contributions.length]; - for (int i = 0; i < contributions.length; i++) { - uris[i] = contributions[i].getURI(); - locations[i] = contributions[i].getLocation(); - } - bootstrap = constructor.newInstance(compositeURI, uris, locations); - } - - // Get the node instance - Object node = bootstrapClass.getMethod("getNode").invoke(bootstrap); - - // If the SCANodeFactory interface is available in the current classloader, create - // an SCANode proxy around the node we've just create - try { - Class<?> type = Class.forName(NODE_FACTORY); - type = type.getDeclaredClasses()[0]; - return type.getMethod("createProxy", Class.class, Object.class).invoke(null, type, node); - } catch (ClassNotFoundException e) { - // Ignore - } - return node; - - } catch (Exception e) { - NodeLauncher.logger.log(Level.SEVERE, "SCA Node could not be created", e); - throw new LauncherException(e); - } - } - - /** - * Creates a new node daemon. - * - * @throws LauncherException - */ - static Object nodeDaemon() throws LauncherException { - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); - try { - - // Use Java reflection to create the node daemon as only the runtime class - // loader knows the runtime classes required by the node - String className = NODE_IMPLEMENTATION_DAEMON_BOOTSTRAP; - Class<?> bootstrapClass; - bootstrapClass = Class.forName(className, false, tccl); - Object bootstrap = bootstrapClass.getConstructor().newInstance(); - - Object nodeDaemon = bootstrapClass.getMethod("getNode").invoke(bootstrap); - return nodeDaemon; - - } catch (Exception e) { - NodeDaemonLauncher.logger.log(Level.SEVERE, "SCA Node Daemon could not be created", e); - throw new LauncherException(e); - } finally { - Thread.currentThread().setContextClassLoader(tccl); - } - } - - /** - * Creates a new domain manager. - * - * @throws LauncherException - */ - static Object domainManager(String rootDirectory) throws LauncherException { - ClassLoader tccl = Thread.currentThread().getContextClassLoader(); - try { - - // Use Java reflection to create the node daemon as only the runtime class - // loader knows the runtime classes required by the node - String className = DOMAIN_MANAGER_LAUNCHER_BOOTSTRAP; - Class<?> bootstrapClass; - bootstrapClass = Class.forName(className, false, tccl); - Constructor<?> constructor = bootstrapClass.getConstructor(String.class); - Object bootstrap = constructor.newInstance(rootDirectory); - - Object domainManager = bootstrapClass.getMethod("getNode").invoke(bootstrap); - return domainManager; - - } catch (Exception e) { - DomainManagerLauncher.logger.log(Level.SEVERE, "SCA Domain Manager could not be created", e); - throw new LauncherException(e); - } finally { - Thread.currentThread().setContextClassLoader(tccl); - } - } - - /** - * starting with -, then some digits, then . or - or _, then some digits again - * - */ - private static Pattern pattern = Pattern.compile("-(\\d)+((\\.|-|_)(\\d)+)*"); - - /** - * Returns the version number to use for the given JAR file. - * - * @param jarFile - * @return - */ - static String jarVersion(URL jarFile) { - String name = jarFile.getFile(); - int index = name.lastIndexOf('/'); - if (index != -1) { - // Find the last segment - name = name.substring(index + 1); - } - index = name.lastIndexOf('.'); - if (index != -1) { - // Trim the extension - name = name.substring(0, index); - } - - Matcher matcher = pattern.matcher(name); - String version = "0.0.0"; - if (matcher.find()) { - version = matcher.group(); - version = version.substring(1); - } - return version; - } - - static String artifactId(URL jarFile) { - String name = jarFile.getFile(); - int index = name.lastIndexOf('/'); - if (index != -1) { - // Find the last segment - name = name.substring(index + 1); - } - index = name.lastIndexOf('.'); - if (index != -1) { - // Trim the extension - name = name.substring(0, index); - } - - Matcher matcher = pattern.matcher(name); - if (matcher.find()) { - return name.substring(0, matcher.start()); - } else { - return name; - } - } - - /** - * Add the packages found in the given JAR to a set. - * - * @param jarFile - * @param packages - * @throws IOException - */ - private static void addPackages(URL jarFile, Set<String> packages, String version) throws IOException { - if (version == null) { - version = ";version=" + jarVersion(jarFile); - } else { - version = ";version=" + version; - } - File file = file(jarFile); - if (file.isDirectory()) { - List<String> classFiles = listClassFiles(file); - for (String cls : classFiles) { - int index = cls.lastIndexOf('/'); - if (index == -1) { - // Default package cannot be exported - continue; - } - String pkg = cls.substring(0, index); - pkg = pkg.replace('/', '.') + version; - packages.add(pkg); - } - } else if (file.isFile()) { - ZipInputStream is = new ZipInputStream(new FileInputStream(file)); - ZipEntry entry; - while ((entry = is.getNextEntry()) != null) { - String entryName = entry.getName(); - if (!entry.isDirectory() && entryName != null - && entryName.length() > 0 - && !entryName.startsWith(".") - && entryName.endsWith(".class") // Exclude resources from Export-Package - && entryName.lastIndexOf("/") > 0) { - String pkg = entryName.substring(0, entryName.lastIndexOf("/")).replace('/', '.') + version; - packages.add(pkg); - } - } - is.close(); - } - } - - private static List<String> listClassFiles(File directory) { - List<String> artifacts = new ArrayList<String>(); - traverse(artifacts, directory, directory); - return artifacts; - } - - /** - * Recursively traverse a root directory - * - * @param fileList - * @param file - * @param root - * @throws IOException - */ - private static void traverse(List<String> fileList, File file, File root) { - if (file.isFile() && file.getName().endsWith(".class")) { - fileList.add(root.toURI().relativize(file.toURI()).toString()); - } else if (file.isDirectory()) { - String uri = root.toURI().relativize(file.toURI()).toString(); - if (uri.endsWith("/")) { - uri = uri.substring(0, uri.length() - 1); - } - fileList.add(uri); - - File[] files = file.listFiles(); - for (File f : files) { - if (!f.getName().startsWith(".")) { - traverse(fileList, f, root); - } - } - } - } - - /** - * Generate a manifest from a list of third-party JAR files. - * - * @param jarFiles - * @param bundleSymbolicName The Bundle-SymbolicName - * @param bundleVersion The Bundle-Version - * @return - * @throws IllegalStateException - */ - static private Manifest thirdPartyLibraryBundleManifest(Collection<URL> jarFiles, - String bundleSymbolicName, - String bundleVersion) throws IllegalStateException { - try { - - // List exported packages and bundle classpath entries - StringBuffer classpath = new StringBuffer(); - StringBuffer exports = new StringBuffer(); - StringBuffer imports = new StringBuffer(); - Set<String> packages = new HashSet<String>(); - - for (URL jarFile : jarFiles) { - addPackages(jarFile, packages, bundleVersion); - classpath.append("\"external:"); - classpath.append(file(jarFile).getPath().replace(File.separatorChar, '/')); - classpath.append("\","); - } - - Set<String> importPackages = new HashSet<String>(); - for (String pkg : packages) { - - String importPackage = pkg; - int index = pkg.indexOf(';'); - if (index != -1) { - importPackage = pkg.substring(0, index); - } - if (!importPackages.contains(importPackage)) { - imports.append(importPackage); - imports.append(','); - importPackages.add(importPackage); - exports.append(pkg); - exports.append(','); - } else { - logger.warning("Duplicate package skipped: " + pkg); - } - } - - // Create a manifest - Manifest manifest = new Manifest(); - Attributes attributes = manifest.getMainAttributes(); - attributes.putValue("Manifest-Version", "1.0"); - attributes.putValue(BUNDLE_MANIFESTVERSION, "2"); - - if (bundleVersion == null) { - bundleVersion = "0.0.0"; - } - attributes.putValue(Constants.BUNDLE_VERSION, bundleVersion); - if (bundleSymbolicName == null) { - bundleSymbolicName = LAUNCHER_EQUINOX_LIBRARIES; - } - attributes.putValue(BUNDLE_SYMBOLICNAME, bundleSymbolicName); - if (exports.length() > 0) { - attributes.putValue(EXPORT_PACKAGE, exports.substring(0, exports.length() - 1)); - } - if (imports.length() > 0) { - attributes.putValue(IMPORT_PACKAGE, imports.substring(0, imports.length() - 1)); - } - if (classpath.length() > 0) { - attributes.putValue(BUNDLE_CLASSPATH, classpath.substring(0, classpath.length() - 1)); - } - attributes.putValue(DYNAMICIMPORT_PACKAGE, "*"); - - return manifest; - } catch (IOException e) { - throw new IllegalStateException(e); - } - } - - /** - * Generates a library bundle from a list of third-party JARs. - * - * @param jarFiles - * @param bundleSymbolicName The Bundle-SymbolicName - * @param bundleVersion The Bundle-Version - * @return - * @throws IOException - */ - static InputStream thirdPartyLibraryBundle(Collection<URL> jarFiles, - String bundleSymbolicName, - String bundleVersion) throws IOException { - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - Manifest mf = thirdPartyLibraryBundleManifest(jarFiles, bundleSymbolicName, bundleVersion); - JarOutputStream jos = new JarOutputStream(bos, mf); - jos.close(); - return new ByteArrayInputStream(bos.toByteArray()); - } - - /** - * Returns the location of this bundle. - * - * @return - * @throws IOException - */ - static String thisBundleLocation() throws IOException, URISyntaxException { - String resource = NodeLauncherUtil.class.getName().replace('.', '/') + ".class"; - URL url = NodeLauncherUtil.class.getClassLoader().getResource(resource); - if (url == null) { - throw new FileNotFoundException(resource); - } - URI uri = toURI(url); - - String scheme = uri.getScheme(); - if (scheme.equals("jar")) { - String path = uri.toString().substring(4); - int i = path.indexOf("!/"); - path = path.substring(0, i); - return path; - } else { - String path = uri.toString(); - path = path.substring(0, path.length() - resource.length()); - return path; - } - } - - static URI toURI(URL url) { - File file = file(url); - if (file != null) { - return file.toURI(); - } else { - try { - return url.toURI(); - } catch (URISyntaxException e) { - throw new IllegalArgumentException(e); - } - } - } - - /** - * Returns the location of this bundle. - * - * @param bundle - * @return - * @throws IOException - */ - static String thisBundleLocation(Bundle bundle) throws IOException, URISyntaxException, ClassNotFoundException { - String resource = NodeLauncherUtil.class.getName(); - Class<?> clazz = bundle.loadClass(NodeLauncherUtil.class.getName()); - URL url = clazz.getProtectionDomain().getCodeSource().getLocation(); - if (url == null) { - throw new FileNotFoundException(resource); - } - URI uri = toURI(url); - - String scheme = uri.getScheme(); - if (scheme.equals("jar")) { - String path = uri.toString().substring(4); - int i = path.indexOf("!/"); - path = path.substring(0, i); - return path; - } else { - String path = uri.toString(); - //path = path.substring(0, path.length() - resource.length()); - return path; - } - } - - /** - * Install the given bundle. - * - * @param bundleContext - * @param location - * @throws BundleException - * @throws IOException - */ - static void fixupBundle(String location) throws BundleException, IOException { - File target = file(new URL(location)); - location = target.toURI().toString(); - - // For development mode, copy the MANIFEST.MF file to the bundle location as it's - // initially outside of target/classes, at the root of the project. - if (location.endsWith("/target/classes/")) { - File targetManifest = new File(target, "META-INF/MANIFEST.MF"); - File sourceManifest = new File(target.getParentFile().getParentFile(), "META-INF/MANIFEST.MF"); - targetManifest.getParentFile().mkdirs(); - OutputStream os = new FileOutputStream(targetManifest); - InputStream is = new FileInputStream(sourceManifest); - byte[] buf = new byte[2048]; - for (;;) { - int l = is.read(buf); - if (l == -1) { - break; - } - os.write(buf, 0, l); - } - is.close(); - os.close(); - } - } - - /** - * Returns a string representation of the given bundle. - * - * @param b - * @param verbose - * @return - */ - static String string(Bundle bundle, boolean verbose) { - StringBuffer sb = new StringBuffer(); - sb.append(bundle.getBundleId()).append(" ").append(bundle.getSymbolicName()); - int s = bundle.getState(); - if ((s & Bundle.UNINSTALLED) != 0) { - sb.append(" UNINSTALLED"); - } - if ((s & Bundle.INSTALLED) != 0) { - sb.append(" INSTALLED"); - } - if ((s & Bundle.RESOLVED) != 0) { - sb.append(" RESOLVED"); - } - if ((s & Bundle.STARTING) != 0) { - sb.append(" STARTING"); - } - if ((s & Bundle.STOPPING) != 0) { - sb.append(" STOPPING"); - } - if ((s & Bundle.ACTIVE) != 0) { - sb.append(" ACTIVE"); - } - - if (verbose) { - sb.append(" ").append(bundle.getLocation()); - sb.append(" ").append(bundle.getHeaders()); - } - return sb.toString(); - } - - /** - * Returns the name of a bundle, or null if the given file is not a bundle. - * - * @param file - * @return - * @throws IOException - */ - static String bundleName(File file) throws IOException { - if (!file.exists()) { - return null; - } - String bundleName = null; - if (file.isDirectory()) { - File mf = new File(file, "META-INF/MANIFEST.MF"); - if (mf.isFile()) { - Manifest manifest = new Manifest(new FileInputStream(mf)); - bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - } else { - if (file.toURI().getPath().endsWith("/target/classes/")) { - // Development mode, MANIFEST.MF is outside the bundle location - mf = new File(file.getParentFile().getParentFile(), "META-INF/MANIFEST.MF"); - if (mf.isFile()) { - Manifest manifest = new Manifest(new FileInputStream(mf)); - bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - } - } - } - } else { - JarFile jar = new JarFile(file, false); - Manifest manifest = jar.getManifest(); - if (manifest != null) { - bundleName = manifest.getMainAttributes().getValue(BUNDLE_SYMBOLICNAME); - } - jar.close(); - } - if (bundleName == null) { - return bundleName; - } - int sc = bundleName.indexOf(';'); - if (sc != -1) { - bundleName = bundleName.substring(0, sc); - } - return bundleName; - } - - /** - * Collect JAR files in the given directory. - * - * @param directory - * @param urls - * @param filter - * @throws MalformedURLException - */ - private static void collectClasspathEntries(File directory, Set<URL> urls, FilenameFilter filter, boolean recursive) - throws MalformedURLException { - File[] files = directory.listFiles(filter); - if (files != null) { - int count = 0; - for (File file : files) { - if (recursive && file.isDirectory()) { - collectClasspathEntries(file, urls, filter, recursive); - } else { - urls.add(file.toURI().toURL()); - count++; - } - } - if (count != 0) { - logger.info("Runtime classpath: " + count - + " JAR" - + (count > 1 ? "s" : "") - + " from " - + directory.toString()); - } - } - } - - /** - * Collect development .../ target/classes directories in the given directory. - * - * @param directory - * @param urls - * @param filter - * @throws MalformedURLException - */ - private static void collectTargetClassesClasspathEntries(File directory, Set<URL> urls, FilenameFilter filter) - throws MalformedURLException { - File[] files = directory.listFiles(); - if (files != null) { - int count = 0; - for (File file : files) { - if (!file.isDirectory()) { - continue; - } - File target = new File(file, "target"); - if (!target.isDirectory()) { - continue; - } - File classes = new File(target, "classes"); - if (classes.isDirectory() && filter.accept(target, "classes")) { - urls.add(classes.toURI().toURL()); - count++; - } - } - if (count != 0) { - logger.info("Runtime classpath: " + count - + " classes folder" - + (count > 1 ? "s" : "") - + " from " - + directory.toString()); - } - } - } - - /** - * Collect JAR files under the given distribution directory. - * - * @param directory - * @param jarDirectoryURLs - * @param jarURLs - * @param filter - * @throws MalformedURLException - */ - private static void collectDistributionClasspathEntries(String directory, - Set<URL> jarDirectoryURLs, - Set<URL> jarURLs, - FilenameFilter filter) throws MalformedURLException { - File directoryFile = new File(directory); - URL directoryURL = directoryFile.toURI().toURL(); - if (!jarDirectoryURLs.contains(directoryURL) && directoryFile.exists()) { - - // Collect files under the given directory - jarDirectoryURLs.add(directoryURL); - collectClasspathEntries(directoryFile, jarURLs, filter, false); - - // Collect files under <directory>/modules - File modulesDirectory = new File(directoryFile, "modules"); - URL modulesDirectoryURL = modulesDirectory.toURI().toURL(); - if (!jarDirectoryURLs.contains(modulesDirectoryURL) && modulesDirectory.exists()) { - jarDirectoryURLs.add(modulesDirectoryURL); - collectClasspathEntries(modulesDirectory, jarURLs, filter, true); - } - - // Collect files under <directory>/lib - File libDirectory = new File(directoryFile, "lib"); - URL libDirectoryURL = libDirectory.toURI().toURL(); - if (!jarDirectoryURLs.contains(libDirectoryURL) && libDirectory.exists()) { - jarDirectoryURLs.add(libDirectoryURL); - collectClasspathEntries(libDirectory, jarURLs, filter, true); - } - } - } - - /** - * Determine the Tuscany runtime classpath entries. - * - * @param useDistribution - * @param useAppClasspath - * @param useModulesDirectory - * @return - */ - static Set<URL> runtimeClasspathEntries(boolean useDistribution, - boolean useAppClasspath, - boolean useModulesDirectory) throws FileNotFoundException, - URISyntaxException, MalformedURLException { - - // Build list of runtime JARs - Set<URL> jarDirectoryURLs = new HashSet<URL>(); - Set<URL> jarURLs = new HashSet<URL>(); - - // Determine the path to the launcher class - URI uri; - try { - uri = codeLocation(NodeLauncherUtil.class); - } catch (Exception e) { - uri = URI.create(""); - } - - // If the launcher class is in a JAR, add all runtime JARs from directory containing - // that JAR (e.g. the Tuscany modules directory) as well as the ../modules and - // ../lib directories - if (uri.getPath().endsWith(".jar")) { - if (useDistribution) { - - File file = new File(uri); - if (file.exists()) { - File jarDirectory = file.getParentFile(); - if (jarDirectory != null && jarDirectory.exists()) { - - // Collect JAR files from the directory containing the input JAR - // (e.g. the Tuscany modules directory) - URL jarDirectoryURL = jarDirectory.toURI().toURL(); - jarDirectoryURLs.add(jarDirectoryURL); - collectClasspathEntries(jarDirectory, jarURLs, new StandAloneJARFileNameFilter(), true); - - File homeDirectory = jarDirectory.getParentFile(); - if (homeDirectory != null && homeDirectory.exists()) { - collectDistributionClasspathEntries(homeDirectory.getAbsolutePath(), - jarDirectoryURLs, - jarURLs, - new StandAloneJARFileNameFilter()); - } - } - } - } - } else if (uri.getPath().endsWith("/target/classes/")) { - - // Development mode, we're running off classes in a workspace - // and not from Maven surefire, collect all bundles in the workspace - if (useModulesDirectory) { - ClassLoader cl = NodeLauncherUtil.class.getClassLoader(); - if (!cl.getClass().getName().startsWith("org.apache.maven.surefire")) { - File file = new File(uri); - if (file.exists()) { - File moduleDirectory = file.getParentFile().getParentFile(); - if (moduleDirectory != null) { - File modulesDirectory = moduleDirectory.getParentFile(); - if (modulesDirectory != null && modulesDirectory.exists() - && modulesDirectory.getName().equals("modules")) { - collectDevelopmentClasspathEntries(modulesDirectory.getAbsolutePath(), - jarDirectoryURLs, - jarURLs, - new StandAloneDevelopmentClassesFileNameFilter()); - } - } - } - } - } - } - - // Look for a TUSCANY_HOME system property or environment variable - // Add all the JARs found under $TUSCANY_HOME, $TUSCANY_HOME/modules - // and $TUSCANY_HOME/lib - if (useDistribution) { - String home = getProperty(TUSCANY_HOME); - if (home != null && home.length() != 0) { - logger.info(TUSCANY_HOME + ": " + home); - collectDistributionClasspathEntries(home, jarDirectoryURLs, jarURLs, new StandAloneJARFileNameFilter()); - } - - // Look for a TUSCANY_PATH system property or environment variable - // Add all the JARs found under $TUSCANY_PATH, $TUSCANY_PATH/modules - // and $TUSCANY_PATH/lib - String ext = getProperty(TUSCANY_PATH); - if (ext != null && ext.length() != 0) { - logger.info(TUSCANY_PATH + ": " + ext); - String separator = getProperty("path.separator"); - for (StringTokenizer tokens = new StringTokenizer(ext, separator); tokens.hasMoreTokens();) { - collectDistributionClasspathEntries(tokens.nextToken(), - jarDirectoryURLs, - jarURLs, - new StandAloneJARFileNameFilter()); - } - } - } - - // Add the classpath entries from the current classloader - if (useAppClasspath) { - collectClassLoaderClasspathEntries(jarURLs, NodeLauncherUtil.class.getClassLoader()); - } - - return jarURLs; - - } - - /** - * Returns the JAR files on the classpath used by the given classloader. - * - * @param classLoader - * @return - */ - static List<URL> jarFilesOnClasspath(ClassLoader classLoader) { - Set<URL> entries = new HashSet<URL>(); - collectClassLoaderClasspathEntries(entries, classLoader); - return new ArrayList<URL>(entries); - } - - private static String getProperty(final String prop) { - return AccessController.doPrivileged(new PrivilegedAction<String>() { - public String run() { - String value = System.getProperty(prop); - if (value == null || value.length() == 0) { - return System.getenv(prop); - } else { - return value; - } - } - }); - } - - /** - * Collect JARs on the classpath of a URLClassLoader. - * - * @param urls - * @param cl - */ - private static void collectClassLoaderClasspathEntries(Set<URL> urls, ClassLoader cl) { - if (cl == null) { - return; - } - - int count = urls.size(); - // Collect JARs from the URLClassLoader's classpath - if (cl instanceof URLClassLoader) { - URL[] jarURLs = ((URLClassLoader)cl).getURLs(); - if (jarURLs != null) { - for (URL jarURL : jarURLs) { - urls.add(jarURL); - try { - urls.addAll(manifestClassPath(jarURL)); - } catch (Exception e) { - logger.log(Level.SEVERE, e.getMessage(), e); - } - } - count = urls.size() - count; - - if (count != 0) { - logger.info("Runtime classpath: " + count - + " JAR" - + (count > 1 ? "s" : "") - + " from application classpath."); - } - } - } - } - - static Set<URL> manifestClassPath(URL jarFile) throws Exception { - Set<URL> urls = new HashSet<URL>(); - if (jarFile != null) { - Manifest mf = null; - if ("file".equals(jarFile.getProtocol())) { - File f = file(jarFile); - if (f.isDirectory()) { - File mfFile = new File(f, "META-INF/MANIFEST.MF"); - if (mfFile.isFile()) { - FileInputStream is = new FileInputStream(mfFile); - mf = new Manifest(is); - is.close(); - } - } else if (f.isFile()) { - JarInputStream jar = new JarInputStream(jarFile.openStream()); - mf = jar.getManifest(); - jar.close(); - } - } - if (mf != null) { - String cp = mf.getMainAttributes().getValue("Class-Path"); - if (cp != null) { - StringTokenizer st = new StringTokenizer(cp); - while (st.hasMoreTokens()) { - URL entry = new URL(jarFile.toURI().toURL(), st.nextToken()).toURI().toURL(); - urls.add(entry); - } - } - } - } - return urls; - } - - /** - * A file name filter used to filter JAR files. - */ - private static class StandAloneJARFileNameFilter implements FilenameFilter { - - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - - if (new File(dir, name).isDirectory()) { - return true; - } - - // Filter out the Tomcat and Webapp hosts - if (name.startsWith("tuscany-host-tomcat") || name.startsWith("tuscany-host-webapp")) { - //FIXME This is temporary - return false; - } - - // Include JAR and MAR files - if (name.endsWith(".jar")) { - return true; - } - if (name.endsWith(".mar")) { - return true; - } - return false; - } - } - - /** - * A file name filter used to filter target/classes directories. - */ - private static class StandAloneDevelopmentClassesFileNameFilter implements FilenameFilter { - - public boolean accept(File dir, String name) { - name = name.toLowerCase(); - if (dir.getName().equals("target") && name.equals("classes")) { - - // Filter out the Tomcat and Webapp hosts - String dirPath = dir.getAbsolutePath(); - if (dirPath.endsWith("host-tomcat/target") || dirPath.endsWith("host-webapp/target")) { - //FIXME This is temporary - return false; - } - return true; - } - - // Filter out the Tomcat and Webapp hosts - if (name.startsWith("tuscany-host-tomcat") || name.startsWith("tuscany-host-webapp")) { - //FIXME This is temporary - return false; - } - - // Include JAR and MAR files - if (name.endsWith(".jar")) { - return true; - } - if (name.endsWith(".mar")) { - return true; - } - return false; - } - } - - /** - * A file name filter used to filter JAR files. - */ - private static class WebAppJARFileNameFilter extends StandAloneJARFileNameFilter { - - @Override - public boolean accept(File dir, String name) { - if (!super.accept(dir, name)) { - return false; - } - name = name.toLowerCase(); - - // Exclude servlet-api JARs - if (name.startsWith("servlet-api")) { - return false; - } - - // Exclude the Tomcat and Jetty hosts - if (name.startsWith("tuscany-host-tomcat") || name.startsWith("tuscany-host-jetty")) { - //FIXME This is temporary - return false; - } - - return true; - } - } - - /** - * Returns the File object representing the given URL. - * - * @param url - * @return - */ - static File file(URL url) { - if (url == null || !url.getProtocol().equals("file")) { - return null; - } else { - String filename = url.getFile().replace('/', File.separatorChar); - int pos = 0; - while ((pos = filename.indexOf('%', pos)) >= 0) { - if (pos + 2 < filename.length()) { - String hexStr = filename.substring(pos + 1, pos + 3); - char ch = (char)Integer.parseInt(hexStr, 16); - filename = filename.substring(0, pos) + ch + filename.substring(pos + 3); - } - } - return new File(filename); - } - } - - /** - * Returns the location of the classpath entry, JAR, WAR etc. containing the given class. - * - * @param clazz - * @return - */ - static private URI codeLocation(Class<?> clazz) { - URL url = clazz.getProtectionDomain().getCodeSource().getLocation(); - return toURI(url); - } - - /** - * Collect JAR files under the given distribution directory. - * - * @param directory - * @param jarDirectoryURLs - * @param jarURLs - * @param filter - * @throws MalformedURLException - */ - private static void collectDevelopmentClasspathEntries(String directory, - Set<URL> jarDirectoryURLs, - Set<URL> jarURLs, - FilenameFilter filter) throws MalformedURLException { - File directoryFile = new File(directory); - URL directoryURL = directoryFile.toURI().toURL(); - if (!jarDirectoryURLs.contains(directoryURL) && directoryFile.exists()) { - - // Collect files under the given directory - jarDirectoryURLs.add(directoryURL); - collectTargetClassesClasspathEntries(directoryFile, jarURLs, filter); - - } - } - -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeMain.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeMain.java deleted file mode 100644 index 4b4c4a8978..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/java/org/apache/tuscany/sca/node/equinox/launcher/NodeMain.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import org.apache.commons.cli.CommandLine; -import org.apache.commons.cli.CommandLineParser; -import org.apache.commons.cli.Option; -import org.apache.commons.cli.OptionGroup; -import org.apache.commons.cli.Options; -import org.apache.commons.cli.PosixParser; - - -/** - * Main class for this JAR. - * With a "-nodeDaemon or -nd" this class launches the SCA Node Daemon. - * With a "-domainManager or -dm" argument it launches the SCA domain admin node. - * With any other argument it launches an SCA Node. - * - * @version $Rev$ $Date$ - */ -public class NodeMain { - - public static void main(String[] args) throws Exception { - CommandLineParser parser = new PosixParser(); - Options options = new Options(); - OptionGroup group = new OptionGroup(); - group.addOption(new Option("dm", "domainManager", false, "Domain Manager")); - group.addOption(new Option("nd", "nodeDaemon", false, "Node Domain")); - options.addOptionGroup(group); - - // Add options from NodeLauncher to avoid UnrecognizedOptionException - for (Object o : NodeLauncher.getCommandLineOptions().getOptions()) { - options.addOption((Option)o); - } - - CommandLine cli = parser.parse(options, args); - if (cli.hasOption("nd")) { - NodeDaemonLauncher.main(args); - } else if (cli.hasOption("dm")) { - DomainManagerLauncher.main(args); - } else { - NodeLauncher.main(args); - } - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/resources/org/apache/tuscany/sca/node/equinox/launcher/J2SE-1.5.profile b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/resources/org/apache/tuscany/sca/node/equinox/launcher/J2SE-1.5.profile deleted file mode 100644 index 3814b42d00..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/resources/org/apache/tuscany/sca/node/equinox/launcher/J2SE-1.5.profile +++ /dev/null @@ -1,150 +0,0 @@ -# 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.
-org.osgi.framework.system.packages = \
- javax.accessibility,\
- javax.activity,\
- javax.crypto,\
- javax.crypto.interfaces,\
- javax.crypto.spec,\
- javax.imageio,\
- javax.imageio.event,\
- javax.imageio.metadata,\
- javax.imageio.plugins.bmp,\
- javax.imageio.plugins.jpeg,\
- javax.imageio.spi,\
- javax.imageio.stream,\
- javax.management,\
- javax.management.loading,\
- javax.management.modelmbean,\
- javax.management.monitor,\
- javax.management.openmbean,\
- javax.management.relation,\
- javax.management.remote,\
- javax.management.remote.rmi,\
- javax.management.timer,\
- javax.naming,\
- javax.naming.directory,\
- javax.naming.event,\
- javax.naming.ldap,\
- javax.naming.spi,\
- javax.net,\
- javax.net.ssl,\
- javax.print,\
- javax.print.attribute,\
- javax.print.attribute.standard,\
- javax.print.event,\
- javax.rmi,\
- javax.rmi.CORBA,\
- javax.rmi.ssl,\
- javax.security.auth,\
- javax.security.auth.callback,\
- javax.security.auth.kerberos,\
- javax.security.auth.login,\
- javax.security.auth.spi,\
- javax.security.auth.x500,\
- javax.security.cert,\
- javax.security.sasl,\
- javax.sound.midi,\
- javax.sound.midi.spi,\
- javax.sound.sampled,\
- javax.sound.sampled.spi,\
- javax.sql,\
- javax.sql.rowset,\
- javax.sql.rowset.serial,\
- javax.sql.rowset.spi,\
- javax.swing,\
- javax.swing.border,\
- javax.swing.colorchooser,\
- javax.swing.event,\
- javax.swing.filechooser,\
- javax.swing.plaf,\
- javax.swing.plaf.basic,\
- javax.swing.plaf.metal,\
- javax.swing.plaf.multi,\
- javax.swing.plaf.synth,\
- javax.swing.table,\
- javax.swing.text,\
- javax.swing.text.html,\
- javax.swing.text.html.parser,\
- javax.swing.text.rtf,\
- javax.swing.tree,\
- javax.swing.undo,\
- javax.transaction,\
- javax.transaction.xa,\
- javax.xml,\
- javax.xml.datatype,\
- javax.xml.namespace,\
- javax.xml.parsers,\
- javax.xml.transform,\
- javax.xml.transform.dom,\
- javax.xml.transform.sax,\
- javax.xml.transform.stream,\
- javax.xml.validation,\
- javax.xml.xpath,\
- org.ietf.jgss,\
- org.omg.CORBA,\
- org.omg.CORBA_2_3,\
- org.omg.CORBA_2_3.portable,\
- org.omg.CORBA.DynAnyPackage,\
- org.omg.CORBA.ORBPackage,\
- org.omg.CORBA.portable,\
- org.omg.CORBA.TypeCodePackage,\
- org.omg.CosNaming,\
- org.omg.CosNaming.NamingContextExtPackage,\
- org.omg.CosNaming.NamingContextPackage,\
- org.omg.Dynamic,\
- org.omg.DynamicAny,\
- org.omg.DynamicAny.DynAnyFactoryPackage,\
- org.omg.DynamicAny.DynAnyPackage,\
- org.omg.IOP,\
- org.omg.IOP.CodecFactoryPackage,\
- org.omg.IOP.CodecPackage,\
- org.omg.Messaging,\
- org.omg.PortableInterceptor,\
- org.omg.PortableInterceptor.ORBInitInfoPackage,\
- org.omg.PortableServer,\
- org.omg.PortableServer.CurrentPackage,\
- org.omg.PortableServer.POAManagerPackage,\
- org.omg.PortableServer.POAPackage,\
- org.omg.PortableServer.portable,\
- org.omg.PortableServer.ServantLocatorPackage,\
- org.omg.SendingContext,\
- org.omg.stub.java.rmi,\
- org.w3c.dom,\
- org.w3c.dom.bootstrap,\
- org.w3c.dom.events,\
- org.w3c.dom.ls,\
- org.xml.sax,\
- org.xml.sax.ext,\
- org.xml.sax.helpers
-org.osgi.framework.bootdelegation = \
- javax.*,\
- org.ietf.jgss,\
- org.omg.*,\
- org.w3c.*,\
- org.xml.*,\
- sun.*,\
- com.sun.*
-org.osgi.framework.executionenvironment = \
- OSGi/Minimum-1.0,\
- OSGi/Minimum-1.1,\
- JRE-1.1,\
- J2SE-1.2,\
- J2SE-1.3,\
- J2SE-1.4,\
- J2SE-1.5
-osgi.java.profile.name = J2SE-1.5
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/resources/org/apache/tuscany/sca/node/equinox/launcher/JavaSE-1.6.profile b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/resources/org/apache/tuscany/sca/node/equinox/launcher/JavaSE-1.6.profile deleted file mode 100644 index 816e7c44f4..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/main/resources/org/apache/tuscany/sca/node/equinox/launcher/JavaSE-1.6.profile +++ /dev/null @@ -1,185 +0,0 @@ -# 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.
-org.osgi.framework.system.packages = \
- javax.accessibility,\
- javax.activation,\
- javax.activity,\
- javax.annotation,\
- javax.annotation.processing,\
- javax.crypto,\
- javax.crypto.interfaces,\
- javax.crypto.spec,\
- javax.imageio,\
- javax.imageio.event,\
- javax.imageio.metadata,\
- javax.imageio.plugins.bmp,\
- javax.imageio.plugins.jpeg,\
- javax.imageio.spi,\
- javax.imageio.stream,\
- javax.jws,\
- javax.jws.soap,\
- javax.lang.model,\
- javax.lang.model.element,\
- javax.lang.model.type,\
- javax.lang.model.util,\
- javax.management,\
- javax.management.loading,\
- javax.management.modelmbean,\
- javax.management.monitor,\
- javax.management.openmbean,\
- javax.management.relation,\
- javax.management.remote,\
- javax.management.remote.rmi,\
- javax.management.timer,\
- javax.naming,\
- javax.naming.directory,\
- javax.naming.event,\
- javax.naming.ldap,\
- javax.naming.spi,\
- javax.net,\
- javax.net.ssl,\
- javax.print,\
- javax.print.attribute,\
- javax.print.attribute.standard,\
- javax.print.event,\
- javax.rmi,\
- javax.rmi.CORBA,\
- javax.rmi.ssl,\
- javax.script,\
- javax.security.auth,\
- javax.security.auth.callback,\
- javax.security.auth.kerberos,\
- javax.security.auth.login,\
- javax.security.auth.spi,\
- javax.security.auth.x500,\
- javax.security.cert,\
- javax.security.sasl,\
- javax.sound.midi,\
- javax.sound.midi.spi,\
- javax.sound.sampled,\
- javax.sound.sampled.spi,\
- javax.sql,\
- javax.sql.rowset,\
- javax.sql.rowset.serial,\
- javax.sql.rowset.spi,\
- javax.swing,\
- javax.swing.border,\
- javax.swing.colorchooser,\
- javax.swing.event,\
- javax.swing.filechooser,\
- javax.swing.plaf,\
- javax.swing.plaf.basic,\
- javax.swing.plaf.metal,\
- javax.swing.plaf.multi,\
- javax.swing.plaf.synth,\
- javax.swing.table,\
- javax.swing.text,\
- javax.swing.text.html,\
- javax.swing.text.html.parser,\
- javax.swing.text.rtf,\
- javax.swing.tree,\
- javax.swing.undo,\
- javax.tools,\
- javax.transaction,\
- javax.transaction.xa,\
- javax.xml,\
- javax.xml.bind,\
- javax.xml.bind.annotation,\
- javax.xml.bind.annotation.adapters,\
- javax.xml.bind.attachment,\
- javax.xml.bind.helpers,\
- javax.xml.bind.util,\
- javax.xml.crypto,\
- javax.xml.crypto.dom,\
- javax.xml.crypto.dsig,\
- javax.xml.crypto.dsig.dom,\
- javax.xml.crypto.dsig.keyinfo,\
- javax.xml.crypto.dsig.spec,\
- javax.xml.datatype,\
- javax.xml.namespace,\
- javax.xml.parsers,\
- javax.xml.soap,\
- javax.xml.stream,\
- javax.xml.stream.events,\
- javax.xml.stream.util,\
- javax.xml.transform,\
- javax.xml.transform.dom,\
- javax.xml.transform.sax,\
- javax.xml.transform.stax,\
- javax.xml.transform.stream,\
- javax.xml.validation,\
- javax.xml.ws,\
- javax.xml.ws.handler,\
- javax.xml.ws.handler.soap,\
- javax.xml.ws.http,\
- javax.xml.ws.soap,\
- javax.xml.ws.spi,\
- javax.xml.xpath,\
- org.ietf.jgss,\
- org.omg.CORBA,\
- org.omg.CORBA_2_3,\
- org.omg.CORBA_2_3.portable,\
- org.omg.CORBA.DynAnyPackage,\
- org.omg.CORBA.ORBPackage,\
- org.omg.CORBA.portable,\
- org.omg.CORBA.TypeCodePackage,\
- org.omg.CosNaming,\
- org.omg.CosNaming.NamingContextExtPackage,\
- org.omg.CosNaming.NamingContextPackage,\
- org.omg.Dynamic,\
- org.omg.DynamicAny,\
- org.omg.DynamicAny.DynAnyFactoryPackage,\
- org.omg.DynamicAny.DynAnyPackage,\
- org.omg.IOP,\
- org.omg.IOP.CodecFactoryPackage,\
- org.omg.IOP.CodecPackage,\
- org.omg.Messaging,\
- org.omg.PortableInterceptor,\
- org.omg.PortableInterceptor.ORBInitInfoPackage,\
- org.omg.PortableServer,\
- org.omg.PortableServer.CurrentPackage,\
- org.omg.PortableServer.POAManagerPackage,\
- org.omg.PortableServer.POAPackage,\
- org.omg.PortableServer.portable,\
- org.omg.PortableServer.ServantLocatorPackage,\
- org.omg.SendingContext,\
- org.omg.stub.java.rmi,\
- org.w3c.dom,\
- org.w3c.dom.bootstrap,\
- org.w3c.dom.events,\
- org.w3c.dom.ls,\
- org.xml.sax,\
- org.xml.sax.ext,\
- org.xml.sax.helpers
-org.osgi.framework.bootdelegation = \
- javax.*,\
- org.ietf.jgss,\
- org.omg.*,\
- org.w3c.*,\
- org.xml.*,\
- sun.*,\
- com.sun.*
-org.osgi.framework.executionenvironment = \
- OSGi/Minimum-1.0,\
- OSGi/Minimum-1.1,\
- JRE-1.1,\
- J2SE-1.2,\
- J2SE-1.3,\
- J2SE-1.4,\
- J2SE-1.5,\
- JavaSE-1.6
-osgi.java.profile.name = JavaSE-1.6
diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorld.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorld.java deleted file mode 100644 index e3fcdfd25f..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorld.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 hello; - -import org.oasisopen.sca.annotation.Remotable; - -/** - * HelloWorld interface - */ -@Remotable -public interface HelloWorld { - String hello(String name); -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java deleted file mode 100644 index 8232acb658..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorldClient.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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 hello; - -import org.oasisopen.sca.annotation.EagerInit; -import org.oasisopen.sca.annotation.Init; -import org.oasisopen.sca.annotation.Reference; -import org.oasisopen.sca.annotation.Scope; - -/** - * This client program shows how to create an SCA runtime, start it, - * and locate and invoke a SCA component - */ -@Scope("COMPOSITE") -@EagerInit -public class HelloWorldClient { - - private HelloWorld hw; - - @Reference - public void setHelloWorld(HelloWorld hw) { - this.hw = hw; - } - - @Init - public void hello() { - // Say hello - System.out.println("Contribution ClassLoader: " + getClass().getClassLoader()); - System.out.println("SCA API ClassLoader: " + Reference.class.getClassLoader()); - System.out.println(hw.hello("Equinox")); - } - -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java deleted file mode 100644 index e51d3c79d9..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/hello/HelloWorldImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * 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 hello; - -/** - * HelloWorldImpl - */ -public class HelloWorldImpl implements HelloWorld { - public String hello(String name) { - System.out.println("Name: " + name); - return "Hello, " + name; - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHostTestCase.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHostTestCase.java deleted file mode 100644 index 8988a91b34..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/EquinoxOSGiHostTestCase.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import java.util.Dictionary; -import java.util.Enumeration; - -import org.junit.Assert; -import org.junit.Test; -import org.osgi.framework.Bundle; -import org.osgi.framework.BundleContext; - - -/** - * - */ -public class EquinoxOSGiHostTestCase { - - @Test - public void testStartThenStop() { - EquinoxHost host = new EquinoxHost(); - BundleContext context = host.start(); - Assert.assertNotNull(context); - for (Bundle b : context.getBundles()) { - System.out.println(toString(b, false)); - } - host.stop(); - } - - @Test - public void testStartThenStopTwice() { - EquinoxHost host = new EquinoxHost(); - BundleContext context = host.start(); - Assert.assertNotNull(context); - for (Bundle b : context.getBundles()) { - System.out.println(toString(b, false)); - } - host.stop(); - - host = new EquinoxHost(); - context = host.start(); - Assert.assertNotNull(context); - for (Bundle b : context.getBundles()) { - System.out.println(toString(b, false)); - } - host.stop(); - } - - public static String toString(Bundle b, boolean verbose) { - StringBuffer sb = new StringBuffer(); - sb.append(b.getBundleId()).append(" ").append(b.getSymbolicName()); - int s = b.getState(); - if ((s & Bundle.UNINSTALLED) != 0) { - sb.append(" UNINSTALLED"); - } - if ((s & Bundle.INSTALLED) != 0) { - sb.append(" INSTALLED"); - } - if ((s & Bundle.RESOLVED) != 0) { - sb.append(" RESOLVED"); - } - if ((s & Bundle.STARTING) != 0) { - sb.append(" STARTING"); - } - if ((s & Bundle.STOPPING) != 0) { - sb.append(" STOPPING"); - } - if ((s & Bundle.ACTIVE) != 0) { - sb.append(" ACTIVE"); - } - - sb.append(" ").append(b.getLocation()); - if (verbose) { - Dictionary<Object, Object> dict = b.getHeaders(); - Enumeration<Object> keys = dict.keys(); - while (keys.hasMoreElements()) { - Object key = keys.nextElement(); - sb.append(" ").append(key).append("=").append(dict.get(key)); - } - } - return sb.toString(); - } -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java deleted file mode 100644 index 5cc40ca77f..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/java/org/apache/tuscany/sca/node/equinox/launcher/NodeLauncherTestCase.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.node.equinox.launcher; - -import org.apache.tuscany.sca.node.Node; -import org.junit.AfterClass; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; - -/** - * - */ -public class NodeLauncherTestCase { - private static NodeLauncher launcher; - - @BeforeClass - public static void setUp() { - System.setProperty("osgi.configuration.area", "target/equinox/configuration"); - try { - launcher = NodeLauncher.newInstance(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - @AfterClass - public static void tearDown() { - System.clearProperty("osgi.configuration.area"); - if (launcher != null) { - launcher.destroy(); - } - - } - - @Test - public void testLaunch() throws Exception { - String location = ContributionLocationHelper.getContributionLocation(getClass()); - Node node = launcher.createNode("HelloWorld.composite", new Contribution("test", location)); - node.start(); - node.stop(); - } - - @Test - @Ignore("contribution-osgi issue") - public void testLaunchDomain() throws Exception { - DomainManagerLauncher.main(new String[] {}); - } - -} diff --git a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite b/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite deleted file mode 100644 index e232226fd3..0000000000 --- a/branches/sca-java-2.0-M2/modules/node-launcher-equinox/src/test/resources/HelloWorld.composite +++ /dev/null @@ -1,34 +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.
--->
-<composite xmlns="http://docs.oasis-open.org/ns/opencsa/sca/200903"
- xmlns:tuscany="http://tuscany.apache.org/xmlns/sca/1.1"
- targetNamespace="http://sample/composite"
- xmlns:sc="http://sample/composite"
- name="HelloWorld">
-
- <component name="HelloWorld">
- <implementation.java class="hello.HelloWorldImpl" />
- </component>
- <component name="HelloWorldClient">
- <implementation.java class="hello.HelloWorldClient" />
- <reference name="helloWorld" target="HelloWorld"></reference>
- </component>
-
-</composite>
|