⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 accesspluginmanager.java

📁 java开源的企业总线.xmlBlaster
💻 JAVA
字号:
/*------------------------------------------------------------------------------Name:      AccessPluginManager.javaProject:   xmlBlaster.orgCopyright: xmlBlaster.org, see xmlBlaster-LICENSE fileComment:   Code for a plugin manager for persistenceAuthor:    goetzger@gmx.net------------------------------------------------------------------------------*/package org.xmlBlaster.engine.mime;import java.util.logging.Logger;import java.util.logging.Level;import org.xmlBlaster.util.plugin.PluginManagerBase;import org.xmlBlaster.util.plugin.PluginInfo;import org.xmlBlaster.util.plugin.I_Plugin;import org.xmlBlaster.util.XmlBlasterException;import org.xmlBlaster.engine.ServerScope;import org.xmlBlaster.engine.runlevel.I_RunlevelListener;import org.xmlBlaster.engine.runlevel.RunlevelManager;import org.xmlBlaster.util.def.Constants;import org.xmlBlaster.util.def.ErrorCode;import java.util.Map;import java.util.HashMap;import java.util.Collections;import java.util.Iterator;/** * Loads subscribe()/get() filter plugin depending on message MIME type.  * Please register your plugins in xmlBlaster.properties, for example: * <pre> * MimeAccessPlugin[MyFilter][1.0]=com.mycompany.MyFilter * </pre> */public class AccessPluginManager extends PluginManagerBase implements I_RunlevelListener {   private final String ME;   public static final String pluginPropertyName = "MimeAccessPlugin";   private final ServerScope glob;   private static Logger log = Logger.getLogger(AccessPluginManager.class.getName());      private boolean firstLogging = true;   public AccessPluginManager(ServerScope glob)   {      super(glob);      this.glob = glob;      this.ME = "AccessPluginManager" + this.glob.getLogPrefixDashed();      glob.getRunlevelManager().addRunlevelListener(this);   }   /**    * Return a specific MIME based message filter plugin.     * <p/>    * It is returned from cache if loaded already.    * <p/>    * @param String The type of the requested plugin.    * @param String The version of the requested plugin.    * @return The AccessFilter for this type and version or null if none is specified    */   public I_AccessFilter getPlugin(String type, String version) throws XmlBlasterException {      return (I_AccessFilter)getPluginObject(type, version);   }   /**    * Called by PluginManagerBase.instantiatePluginSecondPhase()    */   public void postInstantiate(I_Plugin plugin, PluginInfo pluginInfo) {      ((I_AccessFilter)plugin).initialize(glob);   }   /**   * @return The name of the property in xmlBlaster.property "MimeAccessPlugin"   * for "MimeAccessPlugin[demo][1.0]"   */   protected String getPluginPropertyName() {      return pluginPropertyName;   }   /**    * @return please return your default plugin classname or null if not specified    */   public String getDefaultPluginName(String type, String version) {      if (type != null) {         if (type.equals("GnuRegexFilter"))            return "org.xmlBlaster.engine.mime.regex.GnuRegexFilter";      }      return null;   }// here are extensions for MIME based plugin selection:   private final Map accessFilterMap = Collections.synchronizedMap(new HashMap());   /**    * Get access filter object from cache, based on MIME type.     * @return null if not applicable    */   public final I_AccessFilter getAccessFilter(String type, String version, String mime, String mimeExtended)   {      if (mimeExtended == null || mimeExtended.length() < 1) {         mimeExtended = Constants.DEFAULT_CONTENT_MIME_EXTENDED;         if (log.isLoggable(Level.FINE)) log.fine("Needed to set empty mimeExtended to default=" + mimeExtended);      }      if (log.isLoggable(Level.FINER)) log.finer("Trying to find plugin for type=" + type + " version=" + version + " mime=" + mime + " mimeExtended=" + mimeExtended);      try {         // Try to find it in the cache...         StringBuffer key = new StringBuffer(80);         key.append(type).append(version).append(mime).append(mimeExtended);         Object obj = accessFilterMap.get(key.toString());         if (obj != null) {            if (log.isLoggable(Level.FINE)) log.fine("Found filter for key=" + key.toString());            return (I_AccessFilter)obj;         }         if (log.isLoggable(Level.FINE)) log.fine("No filter for key=" + key.toString());         // Check if the plugin is for all mime types         key.setLength(0);         key.append(type).append(version).append("*");         obj = accessFilterMap.get(key.toString());         if (obj != null) {            if (log.isLoggable(Level.FINE)) log.fine("Found filter for key=" + key.toString());            return (I_AccessFilter)obj;         }         if (log.isLoggable(Level.FINE)) log.fine("No filter for key=" + key.toString());         // Check if the plugin is loaded already         key.setLength(0);         key.append(type).append(version);         obj = accessFilterMap.get(key.toString());         if (obj != null) {            if (firstLogging) {               log.warning("Filter plugin type=" + type + " version=" + version + " is loaded but does not support mime=" + mime + " mimeExtended=" + mimeExtended);               firstLogging = false;            }            else {               if (log.isLoggable(Level.FINE)) log.fine("Filter plugin type=" + type + " version=" + version + " is loaded but does not support mime=" + mime + " mimeExtended=" + mimeExtended);            }            return null; // Plugin is loaded but does not support the mime types         }         log.info("Going to load filter plugin for type=" + type + " version=" + version + " mime=" + mime + " mimeExtended=" + mimeExtended);         if (addAccessFilterPlugin(type, version)) { // try to load it            // try again if our mime type matches:            key.setLength(0);            key.append(type).append(version).append(mime).append(mimeExtended);            obj = accessFilterMap.get(key.toString());            if (obj != null) {               if (log.isLoggable(Level.FINE)) log.fine("Found filter for key=" + key.toString());               return (I_AccessFilter)obj;            }            // Check if the plugin is for all mime types            key.setLength(0);            key.append(type).append(version).append("*");            obj = accessFilterMap.get(key.toString());            if (obj != null) {               if (log.isLoggable(Level.FINE)) log.fine("Found filter for key=" + key.toString());               return (I_AccessFilter)obj;            }         }         if (log.isLoggable(Level.FINE)) log.fine("There is no plugin for type=" + type + " version=" + version + " mime=" + mime + " mimeExtended=" + mimeExtended + " available");         return null;      } catch (Exception e) {         log.severe("Problems accessing subscribe filter [" + type + "][" + version +"] mime=" + mime + " mimeExtended=" + mimeExtended + ": " + e.toString());         e.printStackTrace();         return null;      }   }   /**    * Invoked on new subscription or get() invocation, loads plugin.     * You have to check yourself if it is loaded already    * @return true if initially loaded, and false if was loaded already    * @exception on error    */   public final boolean addAccessFilterPlugin(String type, String version) throws XmlBlasterException   {      StringBuffer key = new StringBuffer(80);      key.append(type).append(version);      Object obj = accessFilterMap.get(key.toString());      if (obj != null) {         if (log.isLoggable(Level.FINE)) log.fine("Access filter '" + key.toString() + "' is loaded already");         return false;      }      try {         I_AccessFilter filterPlugin = getPlugin(type, version);         if (filterPlugin == null) {            log.warning("Problems accessing plugin " + AccessPluginManager.pluginPropertyName + "[" + type + "][" + version +"] please check your configuration");            throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_PLUGINFAILED, ME, "Problems accessing subscribe plugin manager, can't instantiate " + AccessPluginManager.pluginPropertyName + "[" + type + "][" + version +"]");         }         // filterPlugin.initialize(glob); is done via PluginManagerBase -> postInstantiate()         accessFilterMap.put(key.toString(), filterPlugin); // Add a dummy instance without mime, so we can check above if loaded already         key.setLength(0);         String[] mime = filterPlugin.getMimeTypes();         String[] mimeExtended = filterPlugin.getMimeExtended();         // check plugin code:         if (mimeExtended == null || mimeExtended.length != mime.length) {            if (mimeExtended.length != mime.length)               log.severe("Access plugin manager [" + type + "][" + version +"]: Number of mimeExtended does not match mime, ignoring mimeExtended.");            mimeExtended = new String[mime.length];            for (int ii=0; ii < mime.length; ii++)               mimeExtended[ii] = Constants.DEFAULT_CONTENT_MIME_EXTENDED;         }         for (int ii = 0; ii < mime.length; ii++) {            if (mime[ii] == null || mime[ii].length() < 1 || mime[ii].equals("*"))               key.append(type).append(version).append("*");            else               key.append(type).append(version).append(mime[ii]).append(mimeExtended[ii]);            accessFilterMap.put(key.toString(), filterPlugin);            log.info("Loaded access filter for mime types '" + key.toString() + "' to cache");            key.setLength(0);         }         return true;      } catch (XmlBlasterException e) {         log.warning("Problems accessing subscribe plugin manager, can't instantiate " + AccessPluginManager.pluginPropertyName + "[" + type + "][" + version +"]: " + e.toString());         throw e;      } catch (Throwable e) {         log.severe("Problems accessing subscribe plugin manager, can't instantiate " + AccessPluginManager.pluginPropertyName + "[" + type + "][" + version +"]: " + e.toString());         e.printStackTrace();         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION_PLUGINFAILED, ME, "Problems accessing subscribe plugin manager, can't instantiate " + AccessPluginManager.pluginPropertyName + "[" + type + "][" + version +"]", e);      }   }   public void shutdown() {      Iterator iterator = accessFilterMap.values().iterator();      while (iterator.hasNext()) {         I_AccessFilter plugin = (I_AccessFilter)iterator.next();         plugin.shutdown();      }      accessFilterMap.clear();   }   /**    * A human readable name of the listener for logging.     * <p />    * Enforced by I_RunlevelListener    */   public String getName() {      return ME;   }   /**    * Invoked on run level change, see RunlevelManager.RUNLEVEL_HALTED and RunlevelManager.RUNLEVEL_RUNNING    * <p />    * Enforced by I_RunlevelListener    */   public void runlevelChange(int from, int to, boolean force) throws org.xmlBlaster.util.XmlBlasterException {      //if (log.isLoggable(Level.FINER)) log.call(ME, "Changing from run level=" + from + " to level=" + to + " with force=" + force);      if (to == from)         return;      if (to > from) { // startup         if (to == RunlevelManager.RUNLEVEL_STANDBY) {            //initializePlugins();         }      }      if (to < from) { // shutdown         if (to == RunlevelManager.RUNLEVEL_HALTED) {            shutdown();         }      }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -