/*
* Copyright 2013 eXo Platform SAS
*
* 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 juzu.impl.plugin.controller.descriptor;
import juzu.Response;
import juzu.impl.common.MethodHandle;
import juzu.impl.plugin.ServiceDescriptor;
import juzu.impl.inject.BeanDescriptor;
import juzu.impl.plugin.application.descriptor.ApplicationDescriptor;
import juzu.impl.plugin.controller.ControllerResolver;
import juzu.impl.common.JSON;
import juzu.impl.request.ControllerHandler;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/** @author <a href="mailto:julien.viet@exoplatform.com">Julien Viet</a> */
public class ControllersDescriptor extends ServiceDescriptor {
/** . */
private final Class<?> defaultController;
/** . */
private final Class<? extends juzu.Handler<Response.Error, Response>> errorController;
/** . */
private final List<ControllerDescriptor> controllers;
/** . */
private final ArrayList<ControllerHandler> handlers;
/** . */
private final ArrayList<juzu.impl.inject.BeanDescriptor> beans;
/** . */
private final Boolean escapeXML;
/** . */
private ControllerDescriptorResolver resolver;
/** . */
private final Map<MethodHandle, ControllerHandler> byHandle;
public ControllersDescriptor(ApplicationDescriptor desc) throws Exception {
this(desc.getApplicationLoader(), desc.getConfig().getJSON("controller"));
}
public ControllersDescriptor(ClassLoader loader, JSON config) throws Exception {
List<ControllerDescriptor> controllers = new ArrayList<ControllerDescriptor>();
ArrayList<ControllerHandler> handlers = new ArrayList<ControllerHandler>();
ArrayList<juzu.impl.inject.BeanDescriptor> beans = new ArrayList<juzu.impl.inject.BeanDescriptor>();
HashMap<MethodHandle, ControllerHandler> byHandle = new HashMap<MethodHandle, ControllerHandler>();
// Load controllers
for (String fqn : config.getList("controllers", String.class)) {
Class<?> clazz = loader.loadClass(fqn);
Field f = clazz.getField("DESCRIPTOR");
ControllerDescriptor bean = (ControllerDescriptor)f.get(null);
for (ControllerHandler handler : bean.getHandlers()) {
byHandle.put(handler.getHandle(), handler);
}
controllers.add(bean);
handlers.addAll(bean.getHandlers());
beans.add(BeanDescriptor.createFromBean(bean.getType(), null, null));
}
//
Boolean escapeXML = config.getBoolean("escapeXML");
//
Class<?> defaultController = null;
String defaultControllerName = config.getString("default");
if (defaultControllerName != null) {
defaultController = loader.loadClass(defaultControllerName);
}
//
Class<? extends juzu.Handler<Response.Error, Response>> errorController = null;
String errorControllerName = config.getString("error");
if (errorControllerName != null) {
errorController = (Class<? extends juzu.Handler<Response.Error,Response>>)loader.loadClass(errorControllerName);
beans.add(BeanDescriptor.createFromBean(errorController, null, Collections.<Annotation>emptyList()));
}
//
this.escapeXML = escapeXML;
this.defaultController = defaultController;
this.errorController = errorController;
this.controllers = controllers;
this.handlers = handlers;
this.beans = beans;
this.resolver = new ControllerDescriptorResolver(this);
this.byHandle = byHandle;
}
public Iterable<juzu.impl.inject.BeanDescriptor> getBeans() {
return beans;
}
public ControllerResolver<ControllerHandler> getResolver() {
return resolver;
}
public Class<?> getDefaultController() {
return defaultController;
}
public Class<? extends juzu.Handler<Response.Error, Response>> getErrorController() {
return errorController;
}
public Boolean getEscapeXML() {
return escapeXML;
}
public List<ControllerDescriptor> getControllers() {
return controllers;
}
public List<ControllerHandler> getHandlers() {
return handlers;
}
public ControllerHandler getHandler(Method method) {
for (ControllerHandler handler : handlers) {
Method m = handler.getMethod();
if (m.equals(method)) {
return handler;
}
}
return null;
}
public ControllerHandler getHandler(Class<?> type, String name, Class<?>... parameterTypes) {
for (ControllerHandler handler : handlers) {
Method m = handler.getMethod();
if (type.equals(handler.getType()) && m.getName().equals(name)) {
Class<?>[] a = m.getParameterTypes();
if (a.length == parameterTypes.length) {
for (int j = 0;j < parameterTypes.length;j++) {
if (!a[j].equals(parameterTypes[j])) {
continue;
}
}
return handler;
}
}
}
return null;
}
public ControllerHandler getMethodById(String methodId) {
for (int i = 0;i < handlers.size();i++) {
ControllerHandler cm = handlers.get(i);
if (cm.getId().equals(methodId)) {
return cm;
}
}
return null;
}
public ControllerHandler getMethodByHandle(MethodHandle handle) {
return byHandle.get(handle);
}
}