org.eclipse.ecr.runtime.api.ServiceHost.java Source code

Java tutorial

Introduction

Here is the source code for org.eclipse.ecr.runtime.api.ServiceHost.java

Source

/*
 * Copyright (c) 2006-2011 Nuxeo SA (http://nuxeo.com/) 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:
 *     Nuxeo - initial API and implementation
 *
 * $Id$
 */

package org.eclipse.ecr.runtime.api;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.Map;
import java.util.Properties;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.nuxeo.common.xmap.annotation.XNode;
import org.nuxeo.common.xmap.annotation.XNodeList;
import org.nuxeo.common.xmap.annotation.XNodeMap;
import org.nuxeo.common.xmap.annotation.XObject;

/**
 * @author <a href="mailto:bs@nuxeo.com">Bogdan Stefanescu</a>
 */
@XObject("server")
public class ServiceHost implements Serializable {

    private static final long serialVersionUID = 632838284857927463L;

    private static final Log log = LogFactory.getLog(ServiceHost.class);

    public static final ServiceHost LOCAL_SERVER = new ServiceHost(RuntimeServiceLocator.class);

    @XNode("@class")
    private Class<? extends ServiceLocator> serviceLocatorClass;

    @XNode("@host")
    private String host;

    @XNode("@port")
    private int port;

    private Properties properties;

    private transient ServiceGroup[] groups;

    private transient ServiceLocator serviceLocator;

    public ServiceHost() {
    }

    public ServiceHost(Class<? extends ServiceLocator> serverClass) {
        serviceLocatorClass = serverClass;
    }

    public ServiceHost(Class<? extends ServiceLocator> serverClass, String[] groups) {
        this(serverClass);
        setGroups(groups);
    }

    public String getServiceLocatorClass() {
        if (serviceLocatorClass == null) {
            log.warn("Shouldn't be asking a service host for a service locator... don't have one!");
            return null;
        }
        return serviceLocatorClass.getName();
    }

    protected ServiceLocator createServiceLocator() throws Exception {
        ServiceLocator serviceLocator = serviceLocatorClass.newInstance();
        serviceLocator.initialize(host, port, properties);
        return serviceLocator;
    }

    public String getHost() {
        return host;
    }

    public int getPort() {
        return port;
    }

    public void setAddress(String host, int port) {
        this.host = host;
        this.port = port;
    }

    @XNodeMap(value = "property", key = "@name", componentType = String.class, type = Properties.class, trim = true)
    public void setProperties(Properties properties) {
        this.properties = new Properties();
        // expand properties
        for (Map.Entry<Object, Object> entry : properties.entrySet()) {
            Object value = entry.getValue();
            if (value.getClass() == String.class) {
                this.properties.put(entry.getKey().toString(), Framework.expandVars(value.toString().trim()));
            } else {
                this.properties.put(entry.getKey(), value);
            }
        }
    }

    public Properties getProperties() {
        return properties;
    }

    public String getProperty(String key) {
        return properties.getProperty(key);
    }

    public String getProperty(String key, String defValue) {
        return properties.getProperty(key, defValue);
    }

    @XNodeList(value = "group", componentType = String.class, type = String[].class, trim = true)
    public void setGroups(String[] groups) {
        this.groups = new ServiceGroup[groups.length];

        ServiceManager mgr = ServiceManager.getInstance();
        for (int i = 0; i < groups.length; i++) {
            this.groups[i] = mgr.getOrCreateGroup(groups[i]);
            this.groups[i].setServer(this);
        }
    }

    public ServiceGroup[] getGroups() {
        if (groups == null) {
            groups = new ServiceGroup[] { ServiceManager.getInstance().getRootGroup() };
        }
        return groups;
    }

    public ServiceLocator getServiceLocator() throws Exception {
        if (serviceLocator == null) {
            serviceLocator = createServiceLocator();
        }
        return serviceLocator;
    }

    public void dispose() {
        if (groups != null) {
            // remove cached information from groups
            for (ServiceGroup group : groups) {
                group.setServer(null);
            }
        }
        if (serviceLocator != null) {
            serviceLocator.dispose();
            serviceLocator = null;
        }
        serviceLocatorClass = null;
        properties = null;
        groups = null;
    }

    public Object lookup(ServiceDescriptor sd) throws Exception {
        Object service = getServiceLocator().lookup(sd);
        if (service == null) {
            return null;
        }
        ServiceAdapter adapter = sd.getAdapter();
        if (adapter != null) {
            return adapter.adapt(sd, service);
        }
        return service;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof ServiceHost)) {
            return false;
        }
        ServiceHost server = (ServiceHost) obj;
        return server.serviceLocatorClass == serviceLocatorClass;
    }

    @Override
    public int hashCode() {
        return serviceLocatorClass != null ? serviceLocatorClass.hashCode() : 0;
    }

    private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
        in.defaultReadObject();
        int len = in.readInt();
        String[] ar = new String[len];
        for (int i = 0; i < len; i++) {
            ar[i] = (String) in.readObject();
        }
        setGroups(ar);
    }

    private void writeObject(ObjectOutputStream out) throws IOException {
        out.defaultWriteObject();
        if (groups != null) {
            out.writeInt(groups.length);
            for (ServiceGroup group : groups) {
                out.writeObject(group.getName());
            }
        } else {
            out.writeInt(0);
        }
    }

}