blob: b1f0378e92e869dbc9b05139513eaf5ad56ee242 [file] [log] [blame]
/*
* Copyright 2009 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.dev.shell.remoteui;
import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request;
import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response;
import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest;
import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Request.DevModeRequest.RequestType;
import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse;
import com.google.gwt.dev.shell.remoteui.RemoteMessageProto.Message.Response.DevModeResponse.CapabilityExchange;
/**
* A request processor that handles DevModeService requests. There should only
* be one instance of this class for a given {@link RemoteUI} instance.
*
* TODO: We currently reference protobuf classes directly. We're going to be
* re-basing the protobuf API, and we don't want to expose these rebased classes
* directly to users of this API. We need to provide a level of indirection
* between protobuf messages.
*/
public class DevModeServiceRequestProcessor implements RequestProcessor {
private final RemoteUI remoteUI;
/**
* Create a new instance for the given remoteUI.
*/
public DevModeServiceRequestProcessor(RemoteUI remoteUI) {
this.remoteUI = remoteUI;
}
public Response execute(Request request) throws Exception {
if (request.getServiceType() != Request.ServiceType.DEV_MODE) {
throw new IllegalArgumentException(
"Unknown Service Type: This request processor cannot handle requests of type "
+ request.getServiceType().name());
}
RequestType requestType = request.getDevModeRequest().getRequestType();
if (requestType != null) {
switch (requestType) {
case CAPABILITY_EXCHANGE:
return processCapabilityExchange();
case RESTART_WEB_SERVER:
return processRestartServer();
default: {
break;
}
}
}
throw new IllegalArgumentException(
"Unknown DevModeService Request: The DevModeService cannot handle requests of type "
+ requestType == null ? "(unknown)" : requestType.name());
}
private Response processCapabilityExchange() {
CapabilityExchange.Builder capabilityExchangeBuilder = CapabilityExchange.newBuilder();
CapabilityExchange.Capability.Builder c1Builder = CapabilityExchange.Capability.newBuilder();
c1Builder.setCapability(DevModeRequest.RequestType.CAPABILITY_EXCHANGE);
capabilityExchangeBuilder.addCapabilities(c1Builder);
CapabilityExchange.Capability.Builder c2Builder = CapabilityExchange.Capability.newBuilder();
c2Builder.setCapability(DevModeRequest.RequestType.RESTART_WEB_SERVER);
capabilityExchangeBuilder.addCapabilities(c2Builder);
DevModeResponse.Builder devModeResponseBuilder = DevModeResponse.newBuilder();
devModeResponseBuilder.setResponseType(DevModeResponse.ResponseType.CAPABILITY_EXCHANGE);
devModeResponseBuilder.setCapabilityExchange(capabilityExchangeBuilder);
Response.Builder responseBuilder = Response.newBuilder();
responseBuilder.setDevModeResponse(devModeResponseBuilder);
return responseBuilder.build();
}
private Response processRestartServer() {
if (!remoteUI.restartWebServer()) {
throw new IllegalStateException(
"Unable to restart the web server. It is still in the process of starting up. Wait a few seconds and try again.");
}
DevModeResponse.Builder devModeResponseBuilder = DevModeResponse.newBuilder();
devModeResponseBuilder.setResponseType(DevModeResponse.ResponseType.RESTART_WEB_SERVER);
Response.Builder responseBuilder = Response.newBuilder();
responseBuilder.setDevModeResponse(devModeResponseBuilder);
return responseBuilder.build();
}
}