/*******************************************************************************
* Copyright (c) 2004 Composent, Inc. and others. 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: Composent, Inc. - initial API and implementation
******************************************************************************/
package org.eclipse.ecf.server.generic.app;
import java.io.FileInputStream;
import java.security.PermissionCollection;
import java.util.*;
import org.eclipse.ecf.core.IContainerListener;
import org.eclipse.ecf.core.events.*;
import org.eclipse.ecf.core.identity.*;
import org.eclipse.ecf.core.security.IConnectHandlerPolicy;
import org.eclipse.ecf.core.sharedobject.*;
import org.eclipse.ecf.core.sharedobject.security.ISharedObjectPolicy;
import org.eclipse.ecf.provider.generic.*;
/**
* An ECF server container implementation that runs as an application.
* <p>
* Usage: java org.eclipse.ecf.provider.app.ServerApplication [-c
* <configfile> | <serverid>]
* <p>
* If -p <configfile> is used, the server configuration is loaded and used
* to setup servers. If <serverid> is omitted or "-" is specified,
* ecftcp://localhost:3282/server" is used. The <serverid> must correspond
* to URI syntax as defined by <a href="http://www.ietf.org/rfc/rfc2396.txt"><i>RFC 2396:
* Uniform Resource Identifiers (URI): Generic Syntax</i></a>, amended by <a
* href="http://www.ietf.org/rfc/rfc2732.txt"><i>RFC 2732: Format for
* Literal IPv6 Addresses in URLs</i></a>
*
*/
public class ServerApplication {
public static final int DEFAULT_KEEPALIVE = TCPServerSOContainer.DEFAULT_KEEPALIVE;
static TCPServerSOContainerGroup serverGroups[] = null;
static List servers = new ArrayList();
static class JoinListener implements IConnectHandlerPolicy {
public PermissionCollection checkConnect(Object addr, ID fromID, ID targetID, String targetGroup, Object joinData) throws Exception {
System.out.println("JOIN Addr=" + addr + ";From=" + fromID + ";Target Group=" + targetGroup + ";Data=" + joinData); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
return null;
}
public void refresh() {
System.out.println("connectHandlerPolicy.refresh()"); //$NON-NLS-1$
}
}
static class SharedObjectAddListener implements ISharedObjectPolicy {
public PermissionCollection checkAddSharedObject(ID fromID, ID toID, ID localID, ReplicaSharedObjectDescription newObject) throws SecurityException {
System.out.println("CHECKADDSHAREDOBJECT From=" + fromID + ";To=" + toID + ";SharedObject=" + newObject); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return null;
}
public void refresh() {
System.out.println("connectHandlerPolicy.refresh()"); //$NON-NLS-1$
}
}
static class ContainerListener implements IContainerListener {
public void handleEvent(IContainerEvent event) {
if (event instanceof IContainerDisconnectedEvent) {
System.out.println("Container disconnected id=" + ((IContainerDisconnectedEvent) event).getTargetID()); //$NON-NLS-1$
} else if (event instanceof IContainerEjectedEvent) {
System.out.println("Container ejected id=" + ((IContainerEjectedEvent) event).getTargetID()); //$NON-NLS-1$
}
}
}
public static void main(String args[]) throws Exception {
// Get server identity
String serverName = null;
List connectors = null;
if (args.length > 0) {
if (args[0].equals("-c")) { //$NON-NLS-1$
ServerConfigParser parser = new ServerConfigParser();
connectors = parser.load(new FileInputStream(args[1]));
} else if (!args[0].equals("-")) //$NON-NLS-1$
serverName = args[0];
}
if (connectors != null) {
serverGroups = new TCPServerSOContainerGroup[connectors.size()];
int j = 0;
for (Iterator i = connectors.iterator(); i.hasNext();) {
Connector connect = (Connector) i.next();
serverGroups[j] = createServerGroup(connect.getHostname(), connect.getPort());
List groups = connect.getGroups();
for (Iterator g = groups.iterator(); g.hasNext();) {
NamedGroup group = (NamedGroup) g.next();
TCPServerSOContainer cont = createServerContainer(group.getIDForGroup(), serverGroups[j], group.getName(), connect.getTimeout());
// Setup join policy
((ISharedObjectContainerGroupManager) cont).setConnectPolicy(new JoinListener());
cont.addListener(new ContainerListener());
servers.add(cont);
}
System.out.println("Putting server " + connect.getHostname() + " on the air"); //$NON-NLS-1$ //$NON-NLS-2$
serverGroups[j].putOnTheAir();
j++;
System.out.println("<ctrl>-c to stop server"); //$NON-NLS-1$
}
} else {
if (serverName == null) {
serverName = TCPServerSOContainer.getDefaultServerURL();
}
java.net.URI anURL = new java.net.URI(serverName);
int port = anURL.getPort();
if (port == -1) {
port = TCPServerSOContainer.DEFAULT_PORT;
}
String name = anURL.getPath();
if (name == null) {
name = TCPServerSOContainer.DEFAULT_NAME;
}
serverGroups = new TCPServerSOContainerGroup[1];
// Setup server group
serverGroups[0] = new TCPServerSOContainerGroup(anURL.getPort());
// Create identity for server
ID id = IDFactory.getDefault().createStringID(serverName);
// Create server config object with identity and default timeout
SOContainerConfig config = new SOContainerConfig(id);
// Make server instance
System.out.print("Creating ECF server container..."); //$NON-NLS-1$
TCPServerSOContainer server = new TCPServerSOContainer(config, serverGroups[0], name, TCPServerSOContainer.DEFAULT_KEEPALIVE);
// Setup join policy
((ISharedObjectContainerGroupManager) server).setConnectPolicy(new JoinListener());
// Setup add shared object policy
ISharedObjectManager manager = server.getSharedObjectManager();
manager.setRemoteAddPolicy(new SharedObjectAddListener());
serverGroups[0].putOnTheAir();
servers.add(server);
System.out.println("success!"); //$NON-NLS-1$
System.out.println("Waiting for JOIN requests at '" + id.getName() + "'..."); //$NON-NLS-1$ //$NON-NLS-2$
System.out.println("<ctrl>-c to stop server"); //$NON-NLS-1$
}
}
protected static TCPServerSOContainerGroup createServerGroup(String name, int port) {
System.out.println("Creating server group named " + name + " to listen on port " + port); //$NON-NLS-1$ //$NON-NLS-2$
TCPServerSOContainerGroup group = new TCPServerSOContainerGroup(name, port);
return group;
}
protected static TCPServerSOContainer createServerContainer(String id, TCPServerSOContainerGroup group, String path, int keepAlive) throws IDCreateException {
System.out.println(" Creating container with id=" + id + ", group=" + path + " keepAlive=" + keepAlive); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
ID newServerID = IDFactory.getDefault().createStringID(id);
SOContainerConfig config = new SOContainerConfig(newServerID);
return new TCPServerSOContainer(config, group, path, keepAlive);
}
}