1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/*******************************************************************************
* 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 com.mycorp.examples.timeservice.internal.provider.rest.consumer;
import java.io.NotSerializableException;
import java.util.Arrays;
import java.util.Map;
import java.util.UUID;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.ContainerCreateException;
import org.eclipse.ecf.core.ContainerTypeDescription;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.identity.ID;
import org.eclipse.ecf.core.identity.Namespace;
import org.eclipse.ecf.core.security.IConnectContext;
import org.eclipse.ecf.remoteservice.IRemoteCall;
import org.eclipse.ecf.remoteservice.IRemoteServiceRegistration;
import org.eclipse.ecf.remoteservice.client.IRemoteCallable;
import org.eclipse.ecf.remoteservice.client.IRemoteResponseDeserializer;
import org.eclipse.ecf.remoteservice.provider.RemoteServiceContainerInstantiator;
import org.eclipse.ecf.remoteservice.rest.RestCallableFactory;
import org.eclipse.ecf.remoteservice.rest.client.HttpGetRequestType;
import org.eclipse.ecf.remoteservice.rest.client.RestClientContainer;
import org.eclipse.ecf.remoteservice.rest.identity.RestID;
import org.eclipse.ecf.remoteservice.rest.identity.RestNamespace;
import org.json.JSONException;
import org.json.JSONObject;
import com.mycorp.examples.timeservice.ITimeService;
public class TimeServiceRestClientContainer extends RestClientContainer {
public static final String TIMESERVICE_CONSUMER_CONFIG_NAME = "com.mycorp.examples.timeservice.rest.consumer";
private IRemoteServiceRegistration reg;
TimeServiceRestClientContainer(RestID id) {
super(id);
// This sets up the JSON deserialization of the server's response.
// See below for implementation of TimeServiceRestResponseDeserializer
setResponseDeserializer(new TimeServiceRestResponseDeserializer());
}
@Override
public void connect(ID targetID, IConnectContext connectContext1) throws ContainerConnectException {
super.connect(targetID, connectContext1);
// Create the IRemoteCallable to represent
// access to the ITimeService method.
IRemoteCallable callable = RestCallableFactory.createCallable("getCurrentTime", ITimeService.class.getName(),
null, new HttpGetRequestType(), 30000);
// Register the callable and associate it with the ITimeService class
// name
reg = registerCallables(new String[] { ITimeService.class.getName() }, new IRemoteCallable[][] { { callable } },
null);
}
@Override
public void disconnect() {
super.disconnect();
if (reg != null) {
reg.unregister();
reg = null;
}
}
class TimeServiceRestResponseDeserializer implements IRemoteResponseDeserializer {
public Object deserializeResponse(String endpoint, IRemoteCall call, IRemoteCallable callable,
@SuppressWarnings("rawtypes") Map responseHeaders, byte[] responseBody)
throws NotSerializableException {
// We simply need to read the response body (json String),
// And return the value of the "time" field
try {
return new JSONObject(new String(responseBody)).get("time");
} catch (JSONException e1) {
throw new NotSerializableException(TimeServiceRestResponseDeserializer.class.getName());
}
}
}
@Override
public Namespace getConnectNamespace() {
return RestNamespace.INSTANCE;
}
public static class Instantiator extends RemoteServiceContainerInstantiator {
private static final String TIMESERVICE_HOST_CONFIG_NAME = "com.mycorp.examples.timeservice.rest.host";
@Override
public IContainer createInstance(ContainerTypeDescription description, Map<String, ?> parameters)
throws ContainerCreateException {
// Create new container instance
return new TimeServiceRestClientContainer((RestID) RestNamespace.INSTANCE
.createInstance(new Object[] { "uuid:" + UUID.randomUUID().toString() }));
}
public String[] getImportedConfigs(ContainerTypeDescription description, String[] exporterSupportedConfigs) {
if (Arrays.asList(exporterSupportedConfigs).contains(TIMESERVICE_HOST_CONFIG_NAME))
return new String[] { TimeServiceRestClientContainer.TIMESERVICE_CONSUMER_CONFIG_NAME };
else
return null;
}
}
}
|