Package juzu.impl.plugin.controller.descriptor

Source Code of juzu.impl.plugin.controller.descriptor.ControllersDescriptor

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

Related Classes of juzu.impl.plugin.controller.descriptor.ControllersDescriptor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.