blob: ffe43df3ea5b736a4f91150748b71dc7881114c1 [file] [log] [blame]
/*******************************************************************************
* 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;
import java.io.IOException;
import java.net.*;
import java.util.*;
import org.eclipse.ecf.core.*;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.sharedobject.ISharedObjectContainer;
import org.eclipse.ecf.internal.server.generic.Activator;
import org.eclipse.ecf.provider.generic.*;
/**
* @since 4.0
*/
public class GenericServerContainerGroup implements IGenericServerContainerGroup {
private GenericServerSOContainerGroup serverGroup;
private Map defaultContainerProperties;
class GenericServerSOContainerGroup extends TCPServerSOContainerGroup {
public GenericServerSOContainerGroup(String name, int port, InetAddress bindAddress) {
super(name, null, port, bindAddress);
}
public Map getMap() {
return map;
}
}
public GenericServerContainerGroup(String hostname, int port, Map defaultContainerProperties) {
this(hostname, port, null, defaultContainerProperties);
}
/**
* @since 7.0
*/
public GenericServerContainerGroup(String hostname, int port, InetAddress bindAddress, Map defaultContainerProperties) {
this.serverGroup = new GenericServerSOContainerGroup(hostname, port, bindAddress);
this.defaultContainerProperties = defaultContainerProperties;
}
private String getHost() {
return serverGroup.getName();
}
private int getPort() {
return serverGroup.getPort();
}
public Map getContainers() {
Map result = new HashMap();
Map lock = serverGroup.getMap();
synchronized (lock) {
for (Iterator i = lock.keySet().iterator(); i.hasNext();) {
String key = (String) i.next();
result.put(key, lock.get(key));
}
}
return result;
}
public ISharedObjectContainer createContainer(String path, int keepAlive, Map properties) throws ContainerCreateException {
if (path == null)
throw new ContainerCreateException("Path for new container cannot be null"); //$NON-NLS-1$
Map lock = serverGroup.getMap();
ISharedObjectContainer newContainer = null;
synchronized (lock) {
TCPServerSOContainer existing = (TCPServerSOContainer) lock.get(path);
if (existing != null)
throw new ContainerCreateException("Container with path=" + path + " already exists"); //$NON-NLS-1$ //$NON-NLS-2$
// create container
newContainer = createGenericServerContainer(path, keepAlive, properties);
// add To container manager
addNewContainerToContainerManager(newContainer);
}
return newContainer;
}
public ISharedObjectContainer createContainer(String path, int keepAlive) throws ContainerCreateException {
return createContainer(path, keepAlive, null);
}
private void addNewContainerToContainerManager(ISharedObjectContainer container) {
IContainerManager containerManager = Activator.getDefault().getContainerManager();
if (containerManager != null) {
ContainerTypeDescription ctd = containerManager.getContainerFactory().getDescriptionByName("ecf.generic.server"); //$NON-NLS-1$
containerManager.addContainer(container, ctd);
}
}
private void removeContainerFromContainerManager(ISharedObjectContainer container) {
IContainerManager containerManager = Activator.getDefault().getContainerManager();
if (containerManager != null) {
containerManager.removeContainer(container);
}
}
public ISharedObjectContainer createContainer(String path) throws ContainerCreateException {
return createContainer(path, IGenericServerContainerGroup.DEFAULT_KEEPALIVE);
}
/**
* @since 6.0
*/
protected TCPServerSOContainerGroup getServerGroup() {
return serverGroup;
}
protected TCPServerSOContainer createGenericServerContainer(String path, int keepAlive, Map properties) throws ContainerCreateException {
try {
return new TCPServerSOContainer(new SOContainerConfig(createGenericServerID(path, properties), createGenericServerProperties(path, properties)), getServerGroup(), path, keepAlive);
} catch (Exception e) {
throw new ContainerCreateException("Unexpected exception creating generic server container path=" + path, e); //$NON-NLS-1$
}
}
protected Map createGenericServerProperties(String path, Map properties) {
return (properties == null) ? defaultContainerProperties : properties;
}
protected ID createGenericServerID(String path, Map properties) throws ContainerCreateException {
if (!path.startsWith("/")) //$NON-NLS-1$
throw new ContainerCreateException("Path must start with '/'"); //$NON-NLS-1$
String serverIDPrefix = createGenericServerIDPrefix();
return IDFactory.getDefault().createStringID(serverIDPrefix + path);
}
private String createGenericServerIDPrefix() {
return TCPServerSOContainer.DEFAULT_PROTOCOL + "://" + getHost() + ":" + getPort(); //$NON-NLS-1$ //$NON-NLS-2$
}
public ISharedObjectContainer getContainer(String path) {
return serverGroup.get(path);
}
public ISharedObjectContainer removeContainer(String path) {
return serverGroup.remove(path);
}
public void startListening() throws IOException {
Map lock = serverGroup.getMap();
synchronized (lock) {
serverGroup.putOnTheAir();
}
}
public boolean isListening() {
return serverGroup.isOnTheAir();
}
public void stopListening() {
Map lock = serverGroup.getMap();
synchronized (lock) {
serverGroup.takeOffTheAir();
}
}
public void close() {
Map lock = serverGroup.getMap();
synchronized (lock) {
for (Iterator i = lock.keySet().iterator(); i.hasNext();) {
TCPServerSOContainer container = (TCPServerSOContainer) removeContainer((String) i.next());
removeContainerFromContainerManager(container);
if (container != null) {
container.dispose();
}
}
serverGroup.takeOffTheAir();
}
}
public URI getGroupEndpoint() {
try {
return new URI(createGenericServerIDPrefix());
} catch (URISyntaxException e) {
// should not happen
return null;
}
}
/**
* @since 6.0
*/
public boolean isSSLTransport() {
return false;
}
}