Version 1.7.4
[gae.git] / java / src / main / com / google / appengine / api / labs / servers / ServersServiceImpl.java
blob93049b1347a91a37757ff45628432747efec3139
1 package com.google.appengine.api.labs.servers;
3 import com.google.appengine.api.labs.servers.ServersServicePb.GetDefaultVersionRequest;
4 import com.google.appengine.api.labs.servers.ServersServicePb.GetDefaultVersionResponse;
5 import com.google.appengine.api.labs.servers.ServersServicePb.GetHostnameRequest;
6 import com.google.appengine.api.labs.servers.ServersServicePb.GetHostnameResponse;
7 import com.google.appengine.api.labs.servers.ServersServicePb.GetNumInstancesRequest;
8 import com.google.appengine.api.labs.servers.ServersServicePb.GetNumInstancesResponse;
9 import com.google.appengine.api.labs.servers.ServersServicePb.GetServersRequest;
10 import com.google.appengine.api.labs.servers.ServersServicePb.GetServersResponse;
11 import com.google.appengine.api.labs.servers.ServersServicePb.GetVersionsRequest;
12 import com.google.appengine.api.labs.servers.ServersServicePb.GetVersionsResponse;
13 import com.google.appengine.api.labs.servers.ServersServicePb.ServersServiceError.ErrorCode;
14 import com.google.appengine.api.labs.servers.ServersServicePb.SetNumInstancesRequest;
15 import com.google.appengine.api.labs.servers.ServersServicePb.StartServerRequest;
16 import com.google.appengine.api.labs.servers.ServersServicePb.StartServerResponse;
17 import com.google.appengine.api.labs.servers.ServersServicePb.StopServerRequest;
18 import com.google.appengine.api.labs.servers.ServersServicePb.StopServerResponse;
19 import com.google.apphosting.api.ApiProxy;
20 import com.google.apphosting.api.ApiProxy.Environment;
21 import com.google.common.base.Pair;
22 import com.google.common.base.Splitter;
23 import com.google.common.collect.Sets;
24 import com.google.protobuf.InvalidProtocolBufferException;
25 import com.google.protobuf.Message;
27 import java.util.List;
28 import java.util.Map;
29 import java.util.Set;
31 class ServersServiceImpl implements ServersService {
32 protected static final String PACKAGE = "servers";
34 /**
35 * Environment attribute key where the instance id is stored.
37 * @see ServersService#getCurrentInstanceId()
39 private static final String INSTANCE_ID_ENV_ATTRIBUTE = "com.google.appengine.instance.id";
41 private Pair<String, String> getCurrentServerAndVersion() {
42 Environment env = ApiProxy.getCurrentEnvironment();
43 String majorVersion = Splitter.on('.').split(env.getVersionId()).iterator().next();
44 if (majorVersion.contains(":")) {
45 List<String> result = Splitter.on(':').splitToList(majorVersion);
46 return Pair.of(result.get(0), result.get(1));
47 } else {
48 return Pair.of("default", majorVersion);
52 @Override
53 public String getCurrentServer() {
54 return getCurrentServerAndVersion().first;
57 @Override
58 public String getCurrentVersion() {
59 return getCurrentServerAndVersion().second;
62 private static Map<String, Object> getThreadLocalAttributes() {
63 return ApiProxy.getCurrentEnvironment().getAttributes();
66 @Override
67 public String getCurrentInstanceId() {
68 Map<String, Object> env = getThreadLocalAttributes();
69 if (!env.containsKey(INSTANCE_ID_ENV_ATTRIBUTE)) {
70 throw new ServersException("No valid instance id for this instance.");
72 String instanceId = (String) getThreadLocalAttributes().get(INSTANCE_ID_ENV_ATTRIBUTE);
73 if (instanceId == null) {
74 throw new ServersException("No valid instance id for this instance.");
76 return instanceId;
79 private static void makeSyncCall(String method, Message.Builder request, Message.Builder response)
80 throws ServersException {
81 byte[] responseBytes;
82 try {
83 responseBytes = ApiProxy.makeSyncCall(PACKAGE, method, request.build().toByteArray());
84 response.mergeFrom(responseBytes);
85 } catch (ApiProxy.ApplicationException e) {
86 switch(ErrorCode.valueOf(e.getApplicationError())) {
87 case INVALID_SERVER:
88 throw new InvalidServerException("Given server is not known.");
89 case INVALID_VERSION:
90 throw new InvalidVersionException("Given server version is not known.");
91 case INVALID_INSTANCES:
92 throw new InvalidInstanceException("Given instances value is invalid.");
93 case UNEXPECTED_STATE:
94 if (method.equals("StartServer")) {
95 throw new ServerAlreadyStartedException("Given server version is already started.");
96 } else if (method.equals("StopServer")) {
97 throw new ServerAlreadyStoppedException("Given server version is already stopped.");
99 default:
100 throw new ServersException("Unknown error occurred.");
102 } catch (InvalidProtocolBufferException e) {
103 throw new RuntimeException("Internal logic error: Response PB could not be parsed.", e);
107 @Override
108 public Set<String> getServers() {
109 GetServersResponse.Builder response = GetServersResponse.newBuilder();
110 makeSyncCall("GetServers", GetServersRequest.newBuilder(), response);
111 return Sets.newHashSet(response.getServerList());
114 @Override
115 public Set<String> getVersions(String server) {
116 GetVersionsRequest.Builder request = GetVersionsRequest.newBuilder();
117 request.setServer(server);
118 GetVersionsResponse.Builder response = GetVersionsResponse.newBuilder();
119 makeSyncCall("GetVersions", request, response);
120 return Sets.newHashSet(response.getVersionList());
123 @Override
124 public String getDefaultVersion(String server) {
125 GetDefaultVersionRequest.Builder request = GetDefaultVersionRequest.newBuilder();
126 request.setServer(server);
127 GetDefaultVersionResponse.Builder response = GetDefaultVersionResponse.newBuilder();
128 makeSyncCall("GetDefaultVersion", request, response);
129 return response.getVersion();
132 @Override
133 public long getNumInstances(String server, String version) {
134 GetNumInstancesRequest.Builder request = GetNumInstancesRequest.newBuilder();
135 request.setServer(server);
136 request.setVersion(version);
137 GetNumInstancesResponse.Builder response = GetNumInstancesResponse.newBuilder();
138 makeSyncCall("GetNumInstances", request, response);
139 return response.getInstances();
142 @Override
143 public void setNumInstances(String server, String version, long instances) {
144 SetNumInstancesRequest.Builder request = SetNumInstancesRequest.newBuilder();
145 request.setServer(server);
146 request.setVersion(version);
147 request.setInstances(instances);
148 makeSyncCall("SetNumInstances", request, SetNumInstancesRequest.newBuilder());
151 @Override
152 public void startServer(String server, String version) {
153 StartServerRequest.Builder request = StartServerRequest.newBuilder();
154 request.setServer(server);
155 request.setVersion(version);
156 makeSyncCall("StartServer", request, StartServerResponse.newBuilder());
159 @Override
160 public void stopServer(String server, String version) {
161 StopServerRequest.Builder request = StopServerRequest.newBuilder();
162 request.setServer(server);
163 request.setVersion(version);
164 makeSyncCall("StopServer", request, StopServerResponse.newBuilder());
167 private String getHostname(GetHostnameRequest.Builder request) {
168 GetHostnameResponse.Builder response = GetHostnameResponse.newBuilder();
169 makeSyncCall("GetHostname", request, response);
170 return response.getHostname();
173 @Override
174 public String getServerHostname(String server, String version) {
175 GetHostnameRequest.Builder request = GetHostnameRequest.newBuilder();
176 request.setServer(server);
177 request.setVersion(version);
178 return getHostname(request);
181 @Override
182 public String getServerHostname(String server, String version, int instance) {
183 GetHostnameRequest.Builder request = GetHostnameRequest.newBuilder();
184 request.setServer(server);
185 request.setVersion(version);
186 request.setInstance(Integer.toString(instance));
187 return getHostname(request);
190 ServersServiceImpl() { }