/** * Copyright (c) 2006 Parity Communications, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Sergey Yakovlev - initial API and implementation */ package org.eclipse.ecf.internal.provider.rss.container; import java.io.IOException; import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; import java.security.PermissionCollection; import java.util.ArrayList; import java.util.List; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.identity.IDFactory; import org.eclipse.ecf.core.security.IConnectHandlerPolicy; import org.eclipse.ecf.core.sharedobject.ISharedObjectContainerConfig; import org.eclipse.ecf.core.sharedobject.ISharedObjectContainerGroupManager; import org.eclipse.ecf.core.sharedobject.ISharedObjectManager; import org.eclipse.ecf.core.sharedobject.ReplicaSharedObjectDescription; import org.eclipse.ecf.core.sharedobject.security.ISharedObjectPolicy; import org.eclipse.ecf.core.util.Trace; import org.eclipse.ecf.internal.provider.rss.RssDebugOptions; import org.eclipse.ecf.internal.provider.rss.RssPlugin; import org.eclipse.ecf.provider.generic.SOContainerConfig; import org.eclipse.ecf.provider.generic.ServerSOContainer; /** * The RssServerSOContainer implements the basic RSS server functionality. * */ public class RssServerSOContainer extends ServerSOContainer { public static final int DEFAULT_KEEPALIVE = 30000; public static final int DEFAULT_PORT = 80; // Keep alive value protected int keepAlive; protected RssServerSOContainerGroup group; private boolean isSingle = false; /** * The constructors * @param config * * @throws IOException * @throws URISyntaxException */ public RssServerSOContainer(ISharedObjectContainerConfig config) throws URISyntaxException, IOException { this(config, null, DEFAULT_KEEPALIVE); } public RssServerSOContainer(ISharedObjectContainerConfig config, int keepAlive) throws URISyntaxException, IOException { this(config, null, keepAlive); } public RssServerSOContainer(ISharedObjectContainerConfig config, RssServerSOContainerGroup group, int keepAlive) throws URISyntaxException, IOException { super(config); this.keepAlive = keepAlive; final URI actualURI = new URI(getID().getName()); final int urlPort = actualURI.getPort(); if (group == null) { isSingle = true; this.group = new RssServerSOContainerGroup(urlPort); this.group.putOnTheAir(); } else { this.group = group; } this.group.add(String.valueOf(urlPort), this); } protected void trace(String msg) { Trace.trace(RssPlugin.PLUGIN_ID, RssDebugOptions.DEBUG, msg); } protected void dumpStack(String msg, Throwable e) { Trace.catching(RssPlugin.PLUGIN_ID, RssDebugOptions.EXCEPTIONS_CATCHING, this.getClass(), "", e); } public void dispose() { URI aURI = null; try { aURI = new URI(getID().getName()); group.remove(String.valueOf(aURI.getPort())); } catch (final URISyntaxException e) { // Should never happen } if (isSingle) { group.takeOffTheAir(); } group = null; super.dispose(); } public static void main(String args[]) throws Exception { RssServerSOContainerGroup serverGroups[] = null; final List servers = new ArrayList(); int port = DEFAULT_PORT; if (args.length > 0) { if (args[0].equals("-p")) { port = Integer.parseInt(args[1]); } } // Get server identity final String serverName = "//" + InetAddress.getLocalHost().getHostName() + ":" + port; serverGroups = new RssServerSOContainerGroup[1]; // Setup server group serverGroups[0] = new RssServerSOContainerGroup(port); // Create identity for server final ID id = IDFactory.getDefault().createStringID(serverName); // Create server config object with identity and default timeout final SOContainerConfig config = new SOContainerConfig(id); // Make server instance System.out.println("Creating ECF server container..."); final RssServerSOContainer server = new RssServerSOContainer(config, serverGroups[0], DEFAULT_KEEPALIVE); // Setup join policy ((ISharedObjectContainerGroupManager) server).setConnectPolicy(new IConnectHandlerPolicy() { public PermissionCollection checkConnect(Object address, ID fromID, ID targetID, String targetGroup, Object connectData) throws Exception { System.out.println("JOIN Addr=" + address + ";From=" + fromID + ";Group=" + targetGroup + ";Data=" + connectData); return null; } public void refresh() { System.out.println("joinPolicy.refresh()"); } }); // Setup add shared object policy final ISharedObjectManager manager = server.getSharedObjectManager(); manager.setRemoteAddPolicy(new ISharedObjectPolicy() { public PermissionCollection checkAddSharedObject(ID fromID, ID toID, ID localID, ReplicaSharedObjectDescription newObjectDescription) throws SecurityException { System.out.println("ADDSHAREDOBJECT From=" + fromID + ";To=" + toID + ";SharedObjectDesc=" + newObjectDescription); return null; } public void refresh() { System.out.println("sharedObjectPolicy.refresh()"); } }); serverGroups[0].putOnTheAir(); servers.add(server); System.out.println("success!"); System.out.println("Waiting for JOIN requests at '" + id.getName() + "'..."); System.out.println("<Ctrl>+C to stop server"); } }