diff options
Diffstat (limited to 'sandbox/old/contrib/discovery/jxta')
10 files changed, 1127 insertions, 0 deletions
diff --git a/sandbox/old/contrib/discovery/jxta/LICENSE.txt b/sandbox/old/contrib/discovery/jxta/LICENSE.txt new file mode 100644 index 0000000000..0084319535 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/LICENSE.txt @@ -0,0 +1,202 @@ + + 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, serviceDefinition 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/sandbox/old/contrib/discovery/jxta/NOTICE.txt b/sandbox/old/contrib/discovery/jxta/NOTICE.txt new file mode 100644 index 0000000000..d83ebbe236 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/NOTICE.txt @@ -0,0 +1,14 @@ +${pom.name} +Copyright (c) 2005 - 2006 The Apache Software Foundation + +Apache Tuscany is an effort undergoing incubation at The Apache Software +Foundation (ASF), sponsored by the Apache Web Services PMC. Incubation is +required of all newly accepted projects until a further review indicates that +the infrastructure, communications, and decision making process have stabilized +in a manner consistent with other successful ASF projects. While incubation +status is not necessarily a reflection of the completeness or stability of the +code, it does indicate that the project has yet to be fully endorsed by the ASF. + +This product includes software developed by +The Apache Software Foundation (http://www.apache.org/). + diff --git a/sandbox/old/contrib/discovery/jxta/pom.xml.off b/sandbox/old/contrib/discovery/jxta/pom.xml.off new file mode 100644 index 0000000000..cef8c30cb6 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/pom.xml.off @@ -0,0 +1,74 @@ +<?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> + + <parent> + <groupId>org.apache.tuscany.sca.runtime.services</groupId> + <artifactId>discovery</artifactId> + <version>2.0-alpha2-incubating-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + <groupId>org.apache.tuscany.sca.runtime.services.discovery</groupId> + <artifactId>discovery-jxta</artifactId> + <packaging>jar</packaging> + <name>Apache Tuscany JXTA Discovery</name> + <description>Apache Tuscany JXTA Discovery</description> + + <dependencies> + + <dependency> + <groupId>org.apache.tuscany.sca.kernel</groupId> + <artifactId>tuscany-spi</artifactId> + </dependency> + + <dependency> + <groupId>bouncycastle</groupId> + <artifactId>bcprov-jdk14</artifactId> + <version>124</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.jxta.platform</groupId> + <artifactId>jxta</artifactId> + <version>2.4.1</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <version>1.2.13</version> + <scope>compile</scope> + </dependency> + + <dependency> + <groupId>org.codehaus.woodstox</groupId> + <artifactId>wstx-asl</artifactId> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + </dependency> + + </dependencies> + +</project> diff --git a/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/JxtaDiscoveryService.java b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/JxtaDiscoveryService.java new file mode 100644 index 0000000000..ed3cf60fee --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/JxtaDiscoveryService.java @@ -0,0 +1,320 @@ +/* + * 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.service.discovery.jxta; + +import java.io.File; +import java.io.IOException; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; + +import javax.security.cert.CertificateException; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import net.jxta.credential.AuthenticationCredential; +import net.jxta.discovery.DiscoveryService; +import net.jxta.exception.PeerGroupException; +import net.jxta.impl.id.UUID.UUID; +import net.jxta.impl.protocol.ResolverQuery; +import net.jxta.membership.Authenticator; +import net.jxta.membership.MembershipService; +import net.jxta.peer.PeerID; +import net.jxta.peergroup.NetPeerGroupFactory; +import net.jxta.peergroup.PeerGroup; +import net.jxta.platform.NetworkConfigurator; +import net.jxta.protocol.ModuleImplAdvertisement; +import net.jxta.resolver.QueryHandler; +import net.jxta.resolver.ResolverService; + +import org.apache.tuscany.service.discovery.jxta.pdp.PeerListener; +import org.apache.tuscany.service.discovery.jxta.prp.TuscanyQueryHandler; +import org.apache.tuscany.spi.services.discovery.AbstractDiscoveryService; +import org.apache.tuscany.spi.services.discovery.DiscoveryException; +import org.apache.tuscany.spi.services.work.NotificationListener; +import org.apache.tuscany.spi.services.work.NotificationListenerAdaptor; +import org.apache.tuscany.spi.services.work.WorkScheduler; +import org.apache.tuscany.spi.util.stax.StaxUtil; +import org.omg.CORBA.Any; +import org.osoa.sca.annotations.Property; +import org.osoa.sca.annotations.Reference; + +/** + * Discovery service implemented using Apple bonjour. + * + * @version $Revision$ $Date$ + * + */ +public class JxtaDiscoveryService extends AbstractDiscoveryService { + + /** Well known peer group id. */ + private static final TuscanyPeerGroupID PEER_GROUP_ID = + new TuscanyPeerGroupID(new UUID("aea468a4-6450-47dc-a288-a7f1bbcc5927")); + + /** Default discovery interval. */ + private static long DEFAULT_INTERVAL = 10000L; + + /** Peer listener. */ + private PeerListener peerListener; + + /** Resolver service. */ + private ResolverService resolverService; + + /** Domain group. */ + private PeerGroup domainGroup; + + /** Network platform configurator. */ + private NetworkConfigurator configurator; + + /** Work scheduler. */ + private WorkScheduler workScheduler; + + /** Interval for sending discivery messages .*/ + private long interval = DEFAULT_INTERVAL; + + /** Started flag. */ + private final AtomicBoolean started = new AtomicBoolean(); + + /** Message id generator. */ + private final AtomicInteger messageIdGenerator = new AtomicInteger(); + + /** + * Adds a network configurator for this service. + * @param configurator Network configurator. + */ + @Reference + public void setConfigurator(NetworkConfigurator configurator) { + this.configurator = configurator; + } + + /** + * Adds a work scheduler for runningbackground discovery operations. + * @param workScheduler Work scheduler. + */ + @Reference + public void setWorkScheduler(WorkScheduler workScheduler) { + this.workScheduler = workScheduler; + } + + /** + * Sets the interval at which discovery messages are sent. + * @param interval Interval at which discovery messages are sent. + */ + @Property + public void setInterval(long interval) { + this.interval = interval; + } + + /** + * Starts the discovery service. + * @throws Any unexpected JXTA exception to bubble up the call stack. + */ + @Override + public void onStart() throws DiscoveryException { + + Runnable runnable = new Runnable() { + public void run() { + try { + startService(); + } catch(DiscoveryException ex) { + throw new JxtaException(ex); + } + } + }; + + NotificationListener<Runnable> listener = new NotificationListenerAdaptor<Runnable>(); + workScheduler.scheduleWork(runnable, listener); + + } + + /** + * Rusn the discovery service in a different thread. + */ + private void startService() throws DiscoveryException { + + try { + + configure(); + createAndJoinDomainGroup(); + + setupDiscovery(); + setupResolver(); + + started.set(true); + peerListener.start(); + + } catch (PeerGroupException ex) { + throw new DiscoveryException(ex); + } catch (IOException ex) { + throw new DiscoveryException(ex); + } catch (Exception ex) { + throw new DiscoveryException(ex); + } + + } + + /** + * Sends a message to the specified runtime. + * + * @param runtimeId Runtime id of recipient. If null, the message is + * broadcasted to all runtimes in the domain. + * @param content Message content. + * @return The message id. + * @throws DiscoveryException In case of discovery errors. + */ + public int sendMessage(final String runtimeId, final XMLStreamReader content) throws DiscoveryException { + + if(content == null) { + throw new IllegalArgumentException("Content id is null"); + } + + PeerID peerID = null; + if(runtimeId != null) { + peerID = peerListener.getPeerId(runtimeId); + if(peerID == null) { + throw new DiscoveryException("Unrecognized runtime " + runtimeId); + } + } + + String message = null; + try { + StaxUtil.serialize(content); + } catch(XMLStreamException ex) { + throw new DiscoveryException(ex); + } + + int messageId = messageIdGenerator.incrementAndGet(); + + ResolverQuery query = new ResolverQuery(); + query.setHandlerName(TuscanyQueryHandler.class.getSimpleName()); + query.setQuery(message); + query.setSrc(domainGroup.getPeerID().toString()); + + if(peerID == null) { + resolverService.sendQuery(null, query); + } else { + resolverService.sendQuery(peerID.toString(), query); + } + + return messageId; + + } + + /** + * Checks whether the service is started. + * @return True if the service is started. + */ + public boolean isStarted() { + return started.get(); + } + + /** + * Stops the discovery service. + */ + @Override + protected void onStop() { + peerListener.stop(); + started.set(false); + } + + /** + * Configures the platform. + * + */ + private void configure() throws DiscoveryException { + + try { + + String runtimeId = getRuntimeInfo().getRuntimeId(); + + configurator.setName(runtimeId); + configurator.setHome(new File(runtimeId)); + + if (configurator.exists()) { + File pc = new File(configurator.getHome(), "PlatformConfig"); + configurator.load(pc.toURI()); + configurator.save(); + } else { + configurator.save(); + } + + } catch (IOException ex) { + throw new DiscoveryException(ex); + } catch (CertificateException ex) { + throw new DiscoveryException(ex); + } + + } + + /** + * Creates and joins the domain peer group. + * @throws Exception In case of unexpected JXTA exceptions. + */ + private void createAndJoinDomainGroup() throws Exception { + + String domain = getRuntimeInfo().getDomain().toString(); + + PeerGroup netGroup = new NetPeerGroupFactory().getInterface(); + ModuleImplAdvertisement implAdv = netGroup.getAllPurposePeerGroupImplAdvertisement(); + domainGroup = netGroup.newGroup(PEER_GROUP_ID, implAdv, domain, "Tuscany domain group"); + + AuthenticationCredential authCred = new AuthenticationCredential(domainGroup, null, null); + MembershipService membership = domainGroup.getMembershipService(); + Authenticator auth = membership.apply(authCred); + + if (auth.isReadyForJoin()){ + membership.join(auth); + } else { + throw new DiscoveryException("Unable to join domain group"); + } + + } + + /** + * Sets up the resolver service. + */ + private void setupResolver() { + + resolverService = domainGroup.getResolverService(); + QueryHandler queryHandler = new TuscanyQueryHandler(resolverService, this); + resolverService.registerHandler(TuscanyQueryHandler.class.getSimpleName(), queryHandler); + + } + + /** + * Sets up peer discovery service. + */ + private void setupDiscovery() { + + final DiscoveryService discoveryService = domainGroup.getDiscoveryService(); + discoveryService.remotePublish(domainGroup.getPeerAdvertisement()); + peerListener = new PeerListener(discoveryService, interval, getRuntimeInfo().getRuntimeId()); + + } + + /* + * Well known peer grroup. + */ + @SuppressWarnings("serial") + private static class TuscanyPeerGroupID extends net.jxta.impl.id.CBID.PeerGroupID { + public TuscanyPeerGroupID(UUID uuid) { + super(uuid); + } + } + +} diff --git a/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/JxtaException.java b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/JxtaException.java new file mode 100644 index 0000000000..06d542c705 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/JxtaException.java @@ -0,0 +1,48 @@ +/* + * 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.service.discovery.jxta; + +import org.apache.tuscany.api.TuscanyRuntimeException; + +/** + * Exception that translates unexpected JXTA exceptions to tuscany runtime exceptions. + * + * @version $Revision$ $Date$ + * + */ +@SuppressWarnings("serial") +public class JxtaException extends TuscanyRuntimeException { + + /** + * Initializes the error message. * + * @param message Initializes the error message. + */ + public JxtaException(String message) { + super(message); + } + + /** + * Initializes the root cause. + * @param cause Initializes the root cause. + */ + public JxtaException(Throwable cause) { + super(cause); + } + +} diff --git a/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/pdp/PeerListener.java b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/pdp/PeerListener.java new file mode 100644 index 0000000000..adc67ce263 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/pdp/PeerListener.java @@ -0,0 +1,125 @@ +/* + * 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.service.discovery.jxta.pdp; + +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicBoolean; + +import org.apache.tuscany.service.discovery.jxta.JxtaException; + +import net.jxta.discovery.DiscoveryEvent; +import net.jxta.discovery.DiscoveryListener; +import net.jxta.discovery.DiscoveryService; +import net.jxta.peer.PeerID; +import net.jxta.protocol.DiscoveryResponseMsg; +import net.jxta.protocol.PeerAdvertisement; + +/** + * Listener that keeps track of peers in the same peer group. + * + * @version $Revision$ $Date$ + * + */ +public class PeerListener implements DiscoveryListener { + + /** Discovery service to use. */ + private DiscoveryService discoveryService; + + /** Interval for sending discivery messages. */ + private long interval; + + /** Liveness indicator. */ + private AtomicBoolean live = new AtomicBoolean(); + + /** Owning runtime. */ + private String runtimeId; + + /** Available peers. */ + private Map<String, PeerID> availablePeers = new HashMap<String, PeerID>(); + + /** + * Initializes the JXTA discovery service. + * @param discoveryService JXTA discovery service. + * @param interval Interval between sending discovery messages. + * @param runtimeId Runtime that owns this peer. + */ + public PeerListener(DiscoveryService discoveryService, long interval, String runtimeId) { + this.discoveryService = discoveryService; + this.interval = interval; + this.runtimeId = runtimeId; + } + + /** + * Sends discovery messages for peer advertisements. + */ + public void start() { + + live.set(true); + discoveryService.addDiscoveryListener(this); + while(live.get()) { + discoveryService.getRemoteAdvertisements(null, DiscoveryService.PEER, null, null, 5); + try { + Thread.sleep(interval); + } catch(InterruptedException ex) { + throw new JxtaException(ex); + } + + } + + } + + /** + * returns the peer id for the runtime id. + * @param runtimeId Runtime id for which peer id is requested. + * @return Peer id. + */ + public synchronized PeerID getPeerId(String runtimeId) { + return availablePeers.get(runtimeId); + } + + /** + * Listens for discovery event. + */ + public synchronized void discoveryEvent(DiscoveryEvent event) { + + DiscoveryResponseMsg res = event.getResponse(); + Enumeration en = res.getAdvertisements(); + if (en != null ) { + while (en.hasMoreElements()) { + PeerAdvertisement adv = (PeerAdvertisement) en.nextElement(); + String peerName = adv.getName(); + if(!runtimeId.equals(peerName)) { + availablePeers.put(adv.getName(), adv.getPeerID()); + } + } + } + System.err.println("Peer view for " + runtimeId + ": " + availablePeers.keySet()); + + } + + /** + * Stops the pipe listener. + */ + public void stop() { + live.set(false); + } + +} diff --git a/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/prp/TuscanyQueryHandler.java b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/prp/TuscanyQueryHandler.java new file mode 100644 index 0000000000..f1d4a2ae2f --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/main/java/org/apache/tuscany/service/discovery/jxta/prp/TuscanyQueryHandler.java @@ -0,0 +1,122 @@ +/* + * 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.service.discovery.jxta.prp; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import net.jxta.impl.protocol.ResolverResponse; +import net.jxta.protocol.ResolverQueryMsg; +import net.jxta.protocol.ResolverResponseMsg; +import net.jxta.resolver.QueryHandler; +import net.jxta.resolver.ResolverService; + +import org.apache.tuscany.service.discovery.jxta.JxtaDiscoveryService; +import org.apache.tuscany.service.discovery.jxta.JxtaException; +import org.apache.tuscany.spi.services.discovery.RequestListener; +import org.apache.tuscany.spi.services.discovery.ResponseListener; +import org.apache.tuscany.spi.util.stax.StaxUtil; + +/** + * Generic quety handler for tuscany PRP (Peer Resolver Protocol) messages. The + * <code>processQuery</code> method is invoked on the receiver and the <code> + * processResponse</code> is invoked on the sender when the receiver responds. + * @version $Revision$ $Date$ + * + */ +public class TuscanyQueryHandler implements QueryHandler { + + /** Resolver service for sending responses. */ + private final ResolverService resolverService; + + /** Discovery service. */ + private final JxtaDiscoveryService discoveryService; + + /** + * Initializes the JXTA resolver service and tuscany discovery service. + * + * @param resolverService Resolver service. + * @param discoveryService Tuscany discovery service. + */ + public TuscanyQueryHandler(final ResolverService resolverService, final JxtaDiscoveryService discoveryService) { + this.resolverService = resolverService; + this.discoveryService = discoveryService; + } + + /** + * Processes a query message. + */ + public int processQuery(ResolverQueryMsg queryMessage) { + + try { + + final String message = queryMessage.getQuery(); + final int queryId = queryMessage.getQueryId(); + final String source = queryMessage.getSrc(); + final String handler = queryMessage.getHandlerName(); + + final QName messageType = StaxUtil.getDocumentElementQName(message); + RequestListener messageListener = discoveryService.getRequestListener(messageType); + if(messageListener != null) { + + XMLStreamReader requestReader = StaxUtil.createReader(message); + XMLStreamReader responseReader = messageListener.onRequest(requestReader); + String response = StaxUtil.serialize(responseReader); + + ResolverResponse responseMessage = new ResolverResponse(); + responseMessage.setResponse(response); + responseMessage.setHandlerName(handler); + responseMessage.setQueryId(queryId); + + resolverService.sendResponse(source, responseMessage); + + } + return ResolverService.OK; + + } catch(XMLStreamException ex) { + throw new JxtaException(ex); + } + + } + + /** + * Processes a response message. + */ + public void processResponse(ResolverResponseMsg responseMessage) { + + try { + + final String message = responseMessage.getResponse(); + final int queryId = responseMessage.getQueryId(); + + final QName messageType = StaxUtil.getDocumentElementQName(message); + ResponseListener messageListener = discoveryService.getResponseListener(messageType); + if(messageListener != null) { + XMLStreamReader responseReader = StaxUtil.createReader(message); + messageListener.onResponse(responseReader, queryId); + } + + } catch(XMLStreamException ex) { + throw new JxtaException(ex); + } + + } + +} diff --git a/sandbox/old/contrib/discovery/jxta/src/main/resources/org/apache/tuscany/service/discovery/discovery.jxta.scdl b/sandbox/old/contrib/discovery/jxta/src/main/resources/org/apache/tuscany/service/discovery/discovery.jxta.scdl new file mode 100644 index 0000000000..5d0c62c516 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/main/resources/org/apache/tuscany/service/discovery/discovery.jxta.scdl @@ -0,0 +1,42 @@ +<?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. +--> +<!-- + JXTA discovery components. + + $Rev$ $Date$ +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:system="http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT" + name="discovery.jxta.scdl"> + + <!-- JXTA discovery service. --> + <component name="discovery.jxta"> + <system:implementation.system class="org.apache.tuscany.service.discovery.jxta.JxtaDiscoveryService"/> + <property name="interval">10000</property> + </component> + + <!-- JXTA platform configurator --> + <component name="jxta.network.configurator"> + <system:implementation.system class="net.jxta.platform.NetworkConfigurator"/> + <property name="principal">user</property> + <property name="password">password</property> + </component> + +</composite> diff --git a/sandbox/old/contrib/discovery/jxta/src/test/java/org/apache/tuscany/service/discovery/jxta/JxtaDiscoveryServiceTestCase.java b/sandbox/old/contrib/discovery/jxta/src/test/java/org/apache/tuscany/service/discovery/jxta/JxtaDiscoveryServiceTestCase.java new file mode 100644 index 0000000000..54ca496ba5 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/test/java/org/apache/tuscany/service/discovery/jxta/JxtaDiscoveryServiceTestCase.java @@ -0,0 +1,146 @@ +/* + * 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.service.discovery.jxta; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +import javax.xml.namespace.QName; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.XMLStreamReader; + +import net.jxta.platform.NetworkConfigurator; + +import org.apache.tuscany.host.RuntimeInfo; +import org.apache.tuscany.spi.services.discovery.RequestListener; +import org.apache.tuscany.spi.services.discovery.ResponseListener; +import org.apache.tuscany.spi.services.work.NotificationListener; +import org.apache.tuscany.spi.services.work.WorkScheduler; +import org.apache.tuscany.spi.util.stax.StaxUtil; + +import junit.framework.TestCase; + +/** + * @version $Revision$ $Date$ + * + */ +public class JxtaDiscoveryServiceTestCase extends TestCase { + + public JxtaDiscoveryServiceTestCase(String name) { + super(name); + } + + protected void setUp() throws Exception { + } + + protected void tearDown() throws Exception { + } + + public void testStartAndStop() throws Exception { + + JxtaDiscoveryService discoveryService = getDiscoveryService("runtime-1", "domain"); + + discoveryService.start(); + while(!discoveryService.isStarted()) { + } + + RequestListener requestListener = new RequestListener() { + public XMLStreamReader onRequest(XMLStreamReader content) { + try { + return StaxUtil.createReader("<response/>"); + } catch(XMLStreamException ex) { + throw new JxtaException(ex); + } + } + }; + + ResponseListener responseListener = new ResponseListener() { + public void onResponse(XMLStreamReader content, int messageId) { + } + + }; + + discoveryService.registerRequestListener(new QName("request"), requestListener); + discoveryService.registerResponseListener(new QName("response"), responseListener); + + XMLStreamReader reader = StaxUtil.createReader("<request/>"); + discoveryService.sendMessage(null, reader); + reader.close(); + + } + + private JxtaDiscoveryService getDiscoveryService(final String runtimeId, final String domain) { + + JxtaDiscoveryService discoveryService = new JxtaDiscoveryService(); + RuntimeInfo runtimeInfo = new RuntimeInfo() { + public File getApplicationRootDirectory() { + return null; + } + public URL getBaseURL() { + return null; + } + public URI getDomain() { + try { + return new URI(domain); + } catch (URISyntaxException ex) { + throw new RuntimeException(ex); + } + } + public String getRuntimeId() { + return runtimeId; + } + public boolean isOnline() { + return false; + } + + }; + discoveryService.setRuntimeInfo(runtimeInfo); + + NetworkConfigurator configurator = new NetworkConfigurator(); + configurator.setPrincipal("test-user"); + configurator.setPassword("test-password"); + + discoveryService.setConfigurator(configurator); + discoveryService.setWorkScheduler(new WorkScheduler() { + public <T extends Runnable> void scheduleWork(final T work, final NotificationListener<T> listener) { + new Thread() { + public void run() { + try { + work.run(); + } catch(Exception ex) { + listener.workFailed(work, ex); + } + } + }.start(); + } + public <T extends Runnable> void scheduleWork(final T work) { + new Thread() { + public void run() { + work.run(); + } + }.start(); + } + }); + return discoveryService; + + } + +} diff --git a/sandbox/old/contrib/discovery/jxta/src/test/resources/test.scdl b/sandbox/old/contrib/discovery/jxta/src/test/resources/test.scdl new file mode 100644 index 0000000000..a9ee04b7b0 --- /dev/null +++ b/sandbox/old/contrib/discovery/jxta/src/test/resources/test.scdl @@ -0,0 +1,34 @@ +<?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. +--> +<!-- + Test for stax. + + $Rev$ $Date$ +--> +<composite xmlns="http://www.osoa.org/xmlns/sca/1.0" + xmlns:system="http://tuscany.apache.org/xmlns/system/1.0-SNAPSHOT" + name="test.scdl"> + + <component name="test.component"> + <system:implementation.system class="test.class"/> + <property name="testProperty">123</property> + </component> + +</composite> |