/*
* Copyright 2010 Gal Dolber.
*
* 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.guit.server.command;
import com.google.inject.Inject;
import com.google.inject.Injector;
import com.guit.client.command.CommandRpc;
import com.guit.client.command.action.Action;
import com.guit.client.command.action.ActionHandler;
import com.guit.client.command.action.BatchResponse;
import com.guit.client.command.action.CommandException;
import com.guit.client.command.action.Handler;
import com.guit.client.command.action.Response;
import java.util.ArrayList;
/**
* Service implementation.
*/
public class CommandRpcImpl implements CommandRpc {
@Inject
Injector injector;
@SuppressWarnings({"unchecked", "rawtypes"})
@Override
public Response execute(Action<Response> action) throws CommandException {
CommandHook commandHook = injector.getInstance(CommandHook.class);
Class<? extends Action> actionClass = action.getClass();
if (!actionClass.isAnnotationPresent(ActionHandler.class)) {
throw new IllegalStateException("The action " + actionClass.getCanonicalName()
+ " don't have the RpcActionHandler annotation");
}
try {
String handlerClassName = actionClass.getAnnotation(ActionHandler.class).value();
Class<?> handlerClass = findClass(handlerClassName);
Handler<Action<Response>, Response> rpcHandler =
(Handler<Action<Response>, Response>) injector.getInstance(handlerClass);
Response response = rpcHandler.handle(action);
if (commandHook != null) {
commandHook.success(action, response);
}
return response;
} catch (CommandException e) {
if (commandHook != null) {
commandHook.exception(action, e);
}
throw e;
} catch (Exception e) {
if (commandHook != null) {
commandHook.unexpectedException(e);
}
throw new RuntimeException(e);
}
}
@Override
public BatchResponse executeBatch(ArrayList<Action<Response>> actions) {
BatchResponse batch = new BatchResponse();
for (Action<Response> action : actions) {
try {
batch.add(execute(action));
} catch (CommandException e) {
batch.add(e);
}
}
return batch;
}
private Class<?> findClass(String className) {
try {
return Class.forName(className);
} catch (ClassNotFoundException e) {
throw new IllegalStateException("Class not found. Found: " + className);
}
}
}