/* * 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(); } }