Package com.quickwebframework.framework.impl

Source Code of com.quickwebframework.framework.impl.ServletFilterContext

package com.quickwebframework.framework.impl;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
import org.osgi.framework.ServiceEvent;
import org.osgi.framework.ServiceRegistration;

import com.quickwebframework.bridge.ServletFilterBridge;
import com.quickwebframework.core.Activator;
import com.quickwebframework.framework.FrameworkContext;
import com.quickwebframework.framework.WebContext;
import com.quickwebframework.stereotype.FilterSetting;

public class ServletFilterContext extends FrameworkContext {
  private static Log log = LogFactory.getLog(ServletFilterContext.class);
  private static ServletFilterContext instance;

  public static ServletFilterContext getInstance() {
    if (instance == null)
      instance = new ServletFilterContext();
    return instance;
  }

  // QuickwebFramework的过滤器配置状态
  // ===== 常量开始
  public static final String QUICKWEBFRAMEWORK_STATE_FILTERCONFIG = "com.quickwebframework.state.FILTERCONFIG";
  // ===== 常量结束

  // ===== 过滤器变量部分开始
  // 从上层传递下来的过滤器配置
  private static FilterConfig filterConfig;
  private static List<Filter> filterList;
  private static Map<Bundle, List<Filter>> bundleFilterListMap;
  // 过滤器桥接对象
  private ServiceRegistration<?> servletFilterBridgeServiceRegistration;

  /**
   * 得到过滤器配置
   *
   * @return
   */
  public static FilterConfig getFilterConfig() {
    return filterConfig;
  }

  public ServletFilterContext() {
    filterList = new ArrayList<Filter>();
    bundleFilterListMap = new HashMap<Bundle, List<Filter>>();

  }

  /**
   * 设置过滤器配置
   *
   * @param filterConfig
   */
  public static void setFilterConfig(FilterConfig filterConfig) {
    ServletFilterContext.filterConfig = filterConfig;
    if (filterConfig == null)
      return;
    for (Filter filter : filterList) {
      try {
        filter.init(filterConfig);
      } catch (ServletException e) {
        throw new RuntimeException(e);
      }
    }
  }

  /**
   * 得到所有过滤器
   *
   * @return
   */
  public static Filter[] getFilters() {
    return filterList.toArray(new Filter[0]);
  }

  // ===== 过滤器变量部分结束

  @Override
  protected BundleContext getBundleContext() {
    return Activator.getContext();
  }

  @Override
  protected void init(int arg) {
    BundleContext bundleContext = Activator.getContext();

    // 启动时,从ServletContext中读取相关运行时状态
    Object filterConfigObject = WebContext.getServletContext()
        .getAttribute(QUICKWEBFRAMEWORK_STATE_FILTERCONFIG);
    if (filterConfigObject != null)
      setFilterConfig((FilterConfig) filterConfigObject);

    // 注册过滤器桥接对象
    servletFilterBridgeServiceRegistration = bundleContext.registerService(
        ServletFilterBridge.class.getName(), new ServletFilterBridge(),
        null);
  }

  @Override
  protected void destory(int arg) {
    servletFilterBridgeServiceRegistration.unregister();
    // 停止时,保存相关运行时状态到ServletContext中。
    WebContext.getServletContext().setAttribute(
        QUICKWEBFRAMEWORK_STATE_FILTERCONFIG, getFilterConfig());
  }

  @Override
  protected void bundleChanged(BundleEvent event) {
    Bundle bundle = event.getBundle();
    int bundleEventType = event.getType();

    BundleContext bundleContext = Activator.getContext();
    if (bundleContext == null)
      return;
    Bundle coreBundle = bundleContext.getBundle();
    if (bundleEventType == BundleEvent.STOPPING) {
      // 移除插件的过滤器
      if (bundle.equals(coreBundle)) {
        ServletFilterContext.unregisterAllFilter();
      } else {
        ServletFilterContext.unregisterBundleAllFilter(bundle);
      }
    }
  }

  @Override
  protected void serviceChanged(ServiceEvent event) {

  }

  /**
   * 注册过滤器
   *
   * @param bundle
   * @param filter
   */
  public static void registerFilter(Bundle bundle, Filter filter) {
    if (filterConfig != null) {
      try {
        filter.init(filterConfig);
      } catch (ServletException e) {
        throw new RuntimeException(e);
      }
    }
    String filterClassName = filter.getClass().getName();
    // 是否存在同类名实例
    boolean hasSameClassNameObject = false;
    for (Filter preFilter : filterList) {
      if (preFilter.getClass().getName().equals(filterClassName)) {
        hasSameClassNameObject = true;
        break;
      }
    }
    // 如果存在同类名实例,则抛出异常
    if (hasSameClassNameObject) {

      StringBuilder sb = new StringBuilder();
      sb.append(String.format(
          "警告:将Bundle[%s]的过滤器[类名:%s]加入到FilterContext中时,发现存在多个同类名实例!",
          bundle.getSymbolicName(), filterClassName));
      sb.append("\n--同类名实例列表如下:");
      synchronized (bundleFilterListMap) {
        for (Bundle tmpBundle : bundleFilterListMap.keySet()) {
          List<Filter> tmpBundleFilterList = bundleFilterListMap
              .get(tmpBundle);
          for (Filter tmpFilter : tmpBundleFilterList) {
            if (tmpFilter.getClass().getName()
                .equals(filterClassName)) {
              sb.append(String.format(
                  "\n  --Bundle[%s],过滤器[%s ,类名:%s]",
                  tmpBundle.getSymbolicName(),
                  tmpFilter.toString(), filterClassName));
            }
          }
        }
      }
      String errorMessage = sb.toString();
      log.warn(errorMessage);
    }

    // 加入到Bundle对应的过滤器列表中
    List<Filter> bundleFilterList = null;
    if (bundleFilterListMap.containsKey(bundle)) {
      bundleFilterList = bundleFilterListMap.get(bundle);
    } else {
      bundleFilterList = new ArrayList<Filter>();
      bundleFilterListMap.put(bundle, bundleFilterList);
    }
    bundleFilterList.add(filter);

    // 加入到全部过滤器列表中
    filterList.add(filter);

    // 过滤器的类
    Class<?> filterClass = filter.getClass();
    // 过滤器的FilterSetting实例
    FilterSetting filterSetting = filterClass
        .getAnnotation(FilterSetting.class);
    // 如果此过滤器的类上有FilterSetting注解,则全部过滤器根据FilterSetting注解的index的值进行排序
    if (filterSetting != null) {
      // 有属性的过滤器列表
      List<Filter> hasSettingFilterList = new ArrayList<Filter>();
      // 没有属性的过滤器列表
      List<Filter> noSettingFilterList = new ArrayList<Filter>();
      // 设置与过滤器的Map
      Map<FilterSetting, Filter> settingFilterMap = new HashMap<FilterSetting, Filter>();

      // 分离
      for (Filter tmpFilter : filterList) {
        Class<?> tmpFilterClass = tmpFilter.getClass();
        FilterSetting tmpFilterSetting = tmpFilterClass
            .getAnnotation(FilterSetting.class);
        // 如果没有设置
        if (tmpFilterSetting == null) {
          noSettingFilterList.add(tmpFilter);
        }// 否则有设置
        else {
          hasSettingFilterList.add(tmpFilter);
          settingFilterMap.put(tmpFilterSetting, tmpFilter);
        }
      }
      // 根据index排序
      FilterSetting[] filterSettings = settingFilterMap.keySet().toArray(
          new FilterSetting[0]);
      for (int j = 0; j < filterSettings.length; j++) {
        for (int i = 0; i < filterSettings.length; i++) {
          if (i == 0)
            continue;
          // 如果前面的index大于后面的index,则交换
          if (filterSettings[i - 1].index() > filterSettings[i]
              .index()) {
            FilterSetting tmpExchangeObject = filterSettings[i - 1];
            filterSettings[i - 1] = filterSettings[i];
            filterSettings[i] = tmpExchangeObject;
          }
        }
      }

      // 得到新的列表
      List<Filter> newFilterList = new ArrayList<Filter>();
      for (int i = 0; i < filterSettings.length; i++) {
        newFilterList.add(settingFilterMap.get(filterSettings[i]));
      }
      newFilterList.addAll(noSettingFilterList);
      filterList = newFilterList;
    }

    log.debug(String.format("已添加插件[%s]的过滤器[%s]!", bundle.getSymbolicName(),
        filter));
  }

  /**
   * 取消注册所有的过滤器
   */
  public static void unregisterAllFilter() {
    for (Bundle bundle : bundleFilterListMap.keySet()
        .toArray(new Bundle[0])) {
      unregisterBundleAllFilter(bundle);
    }
  }

  /**
   * 取消注册某Bundle所有的过滤器
   *
   * @param bundle
   */
  public static void unregisterBundleAllFilter(Bundle bundle) {
    if (!bundleFilterListMap.containsKey(bundle))
      return;
    Filter[] bundleFilterArray = bundleFilterListMap.get(bundle).toArray(
        new Filter[0]);

    for (Filter filter : bundleFilterArray) {
      unregisterFilter(bundle, filter);
    }
    bundleFilterListMap.remove(bundle);
  }

  /**
   * 取消注册过滤器
   *
   * @param bundle
   * @param filter
   */
  public static void unregisterFilter(Bundle bundle, Filter filter) {

    // 从Bundle对应的过滤器列表中移除
    if (!bundleFilterListMap.containsKey(bundle))
      return;
    List<Filter> bundleFilterList = bundleFilterListMap.get(bundle);
    bundleFilterList.remove(filter);

    // 从所有的过滤器列表中移除
    filterList.remove(filter);
    // 销毁过滤器
    filter.destroy();
    log.debug(String.format("已成功移除插件[%s]的过滤器[%s]!",
        bundle.getSymbolicName(), filter));
  }
}
TOP

Related Classes of com.quickwebframework.framework.impl.ServletFilterContext

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.