blob: 786d76866b02c5b20aeb50397b3210a413c6d862 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 EclipseSource 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:
* EclipseSource - initial API and implementation
*******************************************************************************/
package org.eclipse.ecf.remoteservice.client;
import java.util.Dictionary;
import java.util.Enumeration;
import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.remoteservice.*;
/**
* Registrations for {@link AbstractClientContainer}.
*
* @since 4.0
*/
public class RemoteServiceClientRegistration implements IRemoteServiceRegistration {
protected static final String CLASS_METHOD_SEPARATOR = "."; //$NON-NLS-1$
protected String[] clazzes;
protected IRemoteCallable[][] callables;
protected IRemoteServiceReference reference;
protected Dictionary properties;
protected ID containerId;
protected RemoteServiceClientRegistry registry;
protected IRemoteServiceID serviceID;
public RemoteServiceClientRegistration(Namespace namespace, String[] classNames, IRemoteCallable[][] restCalls, Dictionary properties, RemoteServiceClientRegistry registry) {
Assert.isNotNull(classNames);
this.clazzes = classNames;
Assert.isNotNull(restCalls);
this.callables = restCalls;
this.properties = properties;
containerId = registry.getContainerId();
reference = new RemoteServiceClientReference(this);
this.registry = registry;
this.serviceID = new RemoteServiceID(namespace, containerId, registry.getNextServiceId());
}
public RemoteServiceClientRegistration(Namespace namespace, IRemoteCallable[] restCalls, Dictionary properties, RemoteServiceClientRegistry registry) {
Assert.isNotNull(restCalls);
this.clazzes = new String[restCalls.length];
for (int i = 0; i < restCalls.length; i++) {
this.clazzes[i] = restCalls[i].getMethod();
}
this.callables = new IRemoteCallable[][] {restCalls};
this.properties = properties;
containerId = registry.getContainerId();
reference = new RemoteServiceClientReference(this);
this.registry = registry;
this.serviceID = new RemoteServiceID(namespace, containerId, registry.getNextServiceId());
}
public String[] getClazzes() {
return clazzes;
}
public ID getContainerID() {
return containerId;
}
public IRemoteServiceID getID() {
return serviceID;
}
public Object getProperty(String key) {
if (properties == null)
return null;
return properties.get(key);
}
public String[] getPropertyKeys() {
if (properties == null)
return new String[] {};
int length = properties.size();
Enumeration keys = properties.keys();
String[] result = new String[length];
int i = 0;
while (keys.hasMoreElements()) {
Object element = keys.nextElement();
if (element instanceof String) {
result[i] = (String) element;
i++;
}
}
return result;
}
public IRemoteServiceReference getReference() {
return reference;
}
public void setProperties(Dictionary properties) {
this.properties = properties;
}
public void unregister() {
registry.unregisterRegistration(this);
}
protected IRemoteCallable findDefaultRemoteCallable(String methodToFind) {
for (int i = 0; i < callables.length; i++) {
String className = clazzes[i];
IRemoteCallable[] subArray = callables[i];
for (int j = 0; j < subArray.length; j++) {
IRemoteCallable def = subArray[j];
String defMethod = def.getMethod();
if (defMethod != null && defMethod.equals(methodToFind))
return def;
String fqDefMethod = getFQMethod(className, defMethod);
if (fqDefMethod.equals(methodToFind))
return def;
}
}
return null;
}
public static String getFQMethod(String className, String defMethod) {
return className + CLASS_METHOD_SEPARATOR + defMethod;
}
protected IRemoteCallable findRemoteCallable(IRemoteCall remoteCall) {
String callMethod = remoteCall.getMethod();
if (callMethod == null)
return null;
IRemoteCallable defaultRestCall = null;
for (int i = 0; i < clazzes.length; i++) {
if (clazzes[i].equals(callMethod)) {
// The method name given is the fully qualified name
defaultRestCall = callables[i][0];
}
}
return (defaultRestCall != null) ? defaultRestCall : findDefaultRemoteCallable(callMethod);
}
public IRemoteCallable lookupCallable(IRemoteCall remoteCall) {
if (remoteCall == null)
return null;
return findRemoteCallable(remoteCall);
}
}