/*******************************************************************************
* Copyright (c) 2013 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.*;
import java.net.*;
import java.security.PermissionCollection;
import java.util.Iterator;
import java.util.List;
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.ISharedObjectContainerGroupManager;
import org.eclipse.ecf.provider.generic.*;
/**
* @since 6.0
*/
public abstract class SSLAbstractGenericServerApplication {
protected SSLServerSOContainerGroup[] serverGroups;
protected String configURL;
protected String serverName;
static class SysOutConnectHandlerPolicy implements IConnectHandlerPolicy {
public PermissionCollection checkConnect(Object addr, ID fromID, ID targetID, String targetGroup, Object joinData) throws Exception {
System.out.println("Client Connect Addr=" + addr + ";ID=" + fromID + ";Group=" + targetGroup); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
return null;
}
public void refresh() {
// do nothing
}
}
static class ContainerListener implements IContainerListener {
public void handleEvent(IContainerEvent event) {
if (event instanceof IContainerDisconnectedEvent) {
System.out.println("Client id=" + ((IContainerDisconnectedEvent) event).getTargetID() + " disconnected."); //$NON-NLS-1$ //$NON-NLS-2$
} else if (event instanceof IContainerEjectedEvent) {
System.out.println("Client id=" + ((IContainerEjectedEvent) event).getTargetID() + " ejected."); //$NON-NLS-1$ //$NON-NLS-2$
}
}
}
protected void processArguments(String[] args) {
configURL = null;
serverName = SSLServerSOContainer.getDefaultServerURL();
for (int i = 0; i < args.length; i++) {
if (args[i].equals("-configURL")) { //$NON-NLS-1$
configURL = args[i + 1];
i++;
} else if (args[i].equals("-serverName")) { //$NON-NLS-1$
serverName = args[i + 1];
i++;
}
}
}
protected void initialize() throws Exception {
List connectors = null;
if (configURL != null) {
InputStream ins = null;
try {
try {
ins = new URL(configURL).openStream();
} catch (MalformedURLException e) {
// If it's not an URL, just try to load via file
ins = new FileInputStream(configURL);
}
// read connectors from input stream via ServerConfigParser
connectors = new ServerConfigParser().load(ins);
} finally {
if (ins != null)
ins.close();
}
initializeFromConnectors(connectors);
} else
initializeSingleServer();
}
protected void initializeSingleServer() throws IOException, URISyntaxException {
java.net.URI anURL = new java.net.URI(serverName);
int port = anURL.getPort();
if (port == -1)
port = SSLServerSOContainer.DEFAULT_PORT;
String name = anURL.getPath();
if (name == null)
name = SSLServerSOContainer.DEFAULT_NAME;
serverGroups = new SSLServerSOContainerGroup[1];
// Setup server group
serverGroups[0] = new SSLServerSOContainerGroup(anURL.getPort());
SSLServerSOContainer server = createServerContainer(serverName, serverGroups[0], name, TCPServerSOContainer.DEFAULT_KEEPALIVE);
setupServerContainer(server);
// Then put the new server on the air
serverGroups[0].putOnTheAir();
}
protected void initializeFromConnectors(List connectors) throws IOException {
if (connectors == null)
return;
serverGroups = new SSLServerSOContainerGroup[connectors.size()];
int j = 0;
for (Iterator i = connectors.iterator(); i.hasNext();) {
Connector connector = (Connector) i.next();
serverGroups[j] = new SSLServerSOContainerGroup(connector.getHostname(), connector.getPort());
List groups = connector.getGroups();
for (Iterator g = groups.iterator(); g.hasNext();) {
NamedGroup group = (NamedGroup) g.next();
SSLServerSOContainer container = createServerContainer(group.getIDForGroup(), serverGroups[j], group.getName(), connector.getTimeout());
setupServerContainer(container);
}
serverGroups[j].putOnTheAir();
j++;
}
}
protected SSLServerSOContainer createServerContainer(String id, SSLServerSOContainerGroup group, String path, int keepAlive) throws IDCreateException {
return new SSLServerSOContainer(new SOContainerConfig(IDFactory.getDefault().createStringID(id)), group, path, keepAlive);
}
protected void setupServerContainer(SSLServerSOContainer container) {
// Setup connect policy
((ISharedObjectContainerGroupManager) container).setConnectPolicy(new SysOutConnectHandlerPolicy());
// Setup container listener
container.addListener(new ContainerListener());
}
protected void shutdown() {
if (serverGroups != null) {
for (int i = 0; i < serverGroups.length; i++) {
serverGroups[i].takeOffTheAir();
final Iterator iter = serverGroups[i].elements();
for (; iter.hasNext();) {
((SSLServerSOContainer) iter.next()).dispose();
}
}
serverGroups = null;
}
}
}