/*******************************************************************************
* Copyright (c) 2010 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;
import java.net.InetAddress;
import java.util.*;
import org.eclipse.core.runtime.Assert;
/**
* @since 6.0
*/
public class GenericServerContainerGroupFactory implements IGenericServerContainerGroupFactory {
protected class SCGData {
private String hostname;
private int port;
private InetAddress bindAddress;
/**
* @since 7.0
*/
public SCGData(String hostname, int port, InetAddress bindAddress) {
Assert.isNotNull(hostname);
Assert.isTrue(port > 0);
this.hostname = hostname;
this.port = port;
this.bindAddress = bindAddress;
}
public String getHostname() {
return hostname;
}
public int getPort() {
return port;
}
public boolean equals(Object other) {
if (!(other instanceof SCGData))
return false;
SCGData o = (SCGData) other;
if (this.hostname.equals(o.hostname) && this.port == o.port)
return true;
return false;
}
public int hashCode() {
return this.hostname.hashCode() ^ this.port;
}
/**
* @since 7.0
*/
public InetAddress getBindAddress() {
return bindAddress;
}
}
private Hashtable serverContainerGroups = new Hashtable();
/**
* @since 7.0
*/
public IGenericServerContainerGroup createContainerGroup(String hostname, int port, InetAddress bindAddress, Map defaultContainerProperties) throws GenericServerContainerGroupCreateException {
synchronized (serverContainerGroups) {
SCGData scgdata = new SCGData(hostname, port, bindAddress);
if (serverContainerGroups.contains(scgdata))
throw new GenericServerContainerGroupCreateException("Cannot container group hostname=" + hostname + " port=" + port + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
IGenericServerContainerGroup scg = createGenericServerContainerGroup(scgdata, defaultContainerProperties);
serverContainerGroups.put(scgdata, scg);
return scg;
}
}
public IGenericServerContainerGroup createContainerGroup(String hostname, int port, Map defaultContainerProperties) throws GenericServerContainerGroupCreateException {
return createContainerGroup(hostname, port, null, defaultContainerProperties);
}
protected boolean isSSLTransportSpecified(Map defaultContainerProperties) {
boolean sslTransport = false;
if (defaultContainerProperties != null) {
Object sslTransportPropValue = defaultContainerProperties.get(IGenericServerContainerGroupFactory.SSLTRANSPORT_CONTAINER_PROP);
if (sslTransportPropValue instanceof Boolean)
sslTransport = ((Boolean) sslTransportPropValue).booleanValue();
else if (sslTransportPropValue instanceof String)
sslTransport = Boolean.valueOf((String) sslTransportPropValue).booleanValue();
}
return sslTransport;
}
/**
* @throws GenericServerContainerGroupCreateException
*/
protected IGenericServerContainerGroup createGenericServerContainerGroup(SCGData scgdata, Map defaultContainerProperties) throws GenericServerContainerGroupCreateException {
if (isSSLTransportSpecified(defaultContainerProperties))
return new SSLGenericServerContainerGroup(scgdata.getHostname(), scgdata.getPort(), scgdata.getBindAddress(), defaultContainerProperties);
return new GenericServerContainerGroup(scgdata.getHostname(), scgdata.getPort(), scgdata.getBindAddress(), defaultContainerProperties);
}
public IGenericServerContainerGroup createContainerGroup(String hostname, int port) throws GenericServerContainerGroupCreateException {
return createContainerGroup(hostname, port, null);
}
public IGenericServerContainerGroup createContainerGroup(String hostname) throws GenericServerContainerGroupCreateException {
return createContainerGroup(hostname, DEFAULT_PORT);
}
public void close() {
synchronized (serverContainerGroups) {
for (Iterator i = serverContainerGroups.keySet().iterator(); i.hasNext();) {
SCGData scgdata = (SCGData) i.next();
IGenericServerContainerGroup scg = (IGenericServerContainerGroup) serverContainerGroups.get(scgdata);
// call close
scg.close();
}
}
serverContainerGroups.clear();
}
public IGenericServerContainerGroup getContainerGroup(String hostname, int port) {
if (hostname == null)
return null;
SCGData scgdata = new SCGData(hostname, port, null);
synchronized (serverContainerGroups) {
return (IGenericServerContainerGroup) serverContainerGroups.get(scgdata);
}
}
public IGenericServerContainerGroup[] getContainerGroups() {
List results = new ArrayList();
synchronized (serverContainerGroups) {
for (Iterator i = serverContainerGroups.keySet().iterator(); i.hasNext();) {
SCGData scgdata = (SCGData) i.next();
IGenericServerContainerGroup gscg = (IGenericServerContainerGroup) serverContainerGroups.get(scgdata);
if (gscg != null)
results.add(gscg);
}
}
return (IGenericServerContainerGroup[]) results.toArray(new IGenericServerContainerGroup[] {});
}
public IGenericServerContainerGroup removeContainerGroup(String hostname, int port) {
if (hostname == null)
return null;
SCGData scgdata = new SCGData(hostname, port, null);
synchronized (serverContainerGroups) {
return (IGenericServerContainerGroup) serverContainerGroups.remove(scgdata);
}
}
}