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

📄 filedriver.java

📁 java开源的企业总线.xmlBlaster
💻 JAVA
字号:
/*------------------------------------------------------------------------------Name:      FileDriver.javaProject:   xmlBlaster.orgCopyright: xmlBlaster.org, see xmlBlaster-LICENSE fileComment:   Code for a very simple, file based, persistence managerAuthor:    xmlBlaster@marcelruff.info------------------------------------------------------------------------------*/package org.xmlBlaster.engine.persistence.filestore;import java.util.logging.Logger;import java.util.logging.Level;import org.xmlBlaster.util.FileLocator;import org.xmlBlaster.util.Global;import org.xmlBlaster.util.XmlBlasterException;import org.xmlBlaster.engine.xml2java.XmlKey;import org.xmlBlaster.util.def.ErrorCode;import org.xmlBlaster.util.key.MsgKeyData;import org.xmlBlaster.util.qos.MsgQosData;import org.xmlBlaster.util.MsgUnit;import org.xmlBlaster.engine.MsgUnitWrapper;import org.xmlBlaster.engine.persistence.I_PersistenceDriver;import java.io.File;import java.io.FilenameFilter;import java.util.Enumeration;import java.util.Vector;/** * A very simple, file based, persistence manager. * <br /> * This driver stores messages on the hard disk, one message to one file (plus a key and a qos file). * <br /> * All methods are marked final, in hope to have some performance gain (could be changed to allow a customized driver) * <br /> * CAUTION: This driver is not suitable for production purposes. * If you want to use this driver for more than some hundred different messages * we recommend to use it with the ReiserFS.<br /> * Reiserfs is a file system using a plug-in based object oriented variant on classical balanced tree algorithms.<br /> * See ftp://ftp.suse.com:/pub/suse/i386/update/6.3/reiserfs/<br /> * and http://devlinux.com/projects/reiserfs/content_table.html * for further informations. * <br /> * TODO: Extend interface to support caching!<br /> * TODO: Is the File stuff thread save or do we need to add some synchronize? * <br /> * Invoke (for testing only):<br /> * <code> *    jaco org.xmlBlaster.engine.persistence.FileDriver * </code> */public class FileDriver implements I_PersistenceDriver{   private static final String ME = "FileDriver";   private Global glob = null;   private static Logger log = Logger.getLogger(FileDriver.class.getName());   private String path = null;   private final String XMLKEY_TOKEN = "-XmlKey.xml";   private final String XMLQOS_TOKEN = "-XmlQos.xml";   /**    * Constructs the FileDriver object (reflection constructor).    */   public FileDriver() throws XmlBlasterException   {   }     /**    * initialises an instance of the filedriver plugin    * <p />    * @param Global Global object holding logging and property informations    * @param param  aditional parameter for the filedriver plugin    */   /**    * This method is called by the PluginManager (enforced by I_Plugin).     * @see org.xmlBlaster.util.plugin.I_Plugin#init(org.xmlBlaster.util.Global,org.xmlBlaster.util.plugin.PluginInfo)    */   public final void init(org.xmlBlaster.util.Global glob, org.xmlBlaster.util.plugin.PluginInfo pluginInfo) throws XmlBlasterException {      this.glob = glob;      if (log.isLoggable(Level.FINER)) log.finer("Entering init()");            String defaultPath = System.getProperty("user.home") + System.getProperty("file.separator") + "tmp";      path = glob.getProperty().get("Persistence.Path", defaultPath);      if (path == null) {         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION, ME, "xmlBlaster will run memory based only, no persistence path is avalailable, please specify 'Persistence.Path' in xmlBlaster.properties");      }      File pp = new File(path);      if (!pp.exists()) {         log.info("Creating new directory " + path + " for persitence of messages");         pp.mkdirs();      }      if (!pp.isDirectory()) {         log.severe(path + " is no directory, please specify another 'Persistence.Path' in xmlBlaster.properties");         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION, ME, path + " is no directory, please specify another 'Persistence.Path' in xmlBlaster.properties");      }      if (!pp.canWrite()) {         log.severe("Sorry, no access permissions to " + path + ", please specify another 'Persistence.Path' in xmlBlaster.properties");         throw new XmlBlasterException(glob, ErrorCode.RESOURCE_CONFIGURATION, ME, "Sorry, no access permissions to " + path + ", please specify another 'Persistence.Path' in xmlBlaster.properties");      }   }     /**    * Closes the instance of the filedriver plugin    * <p />    */   public final void shutdown() throws XmlBlasterException {      if (log.isLoggable(Level.FINE)) log.fine("Not neccessary!");   }   /**    * Allows a message to be stored.    * <p />    * It only stores the xmlKey, content and qos.    * The other store() method is called for following messages, to store only message-content.    * @param messageWrapper The container with all necessary message info.    */   public final void store(MsgUnitWrapper messageWrapper) throws XmlBlasterException   {      MsgKeyData xmlKey = messageWrapper.getMsgKeyData();      MsgQosData qos = messageWrapper.getMsgQosData();      //String mime = messageWrapper.getContentMime();      byte[] content = messageWrapper.getMsgUnit().getContent();      String oid = xmlKey.getOid(); // The file name      FileLocator.writeFile(path, oid + XMLKEY_TOKEN, xmlKey.toXml().getBytes());      FileLocator.writeFile(path, oid, content);      FileLocator.writeFile(path, oid + XMLQOS_TOKEN, qos.toXml().getBytes());      if (log.isLoggable(Level.FINE)) log.fine("Successfully stored " + oid);   }   /**    * Allows a stored message content to be updated.    * <p />    * It only stores the content, so the other store() method needs to be called first if this message is new.    * @param xmlKey  To identify the message    * @param content The data to store    * @param qos The quality of service, may contain another publisher name    */   public final void update(MsgUnitWrapper messageWrapper)throws XmlBlasterException   {      String oid = messageWrapper.getKeyOid();      FileLocator.writeFile(path, oid, messageWrapper.getMsgUnit().getContent());      // Store the sender as well:      FileLocator.writeFile(path, oid + XMLQOS_TOKEN, messageWrapper.getMsgQosData().toXml().getBytes());      if (log.isLoggable(Level.FINE)) log.fine("Successfully updated store " + messageWrapper.getKeyOid());   }   /**    * Allows to fetch one message by oid from the persistence.    * <p />    * @param   oid   The message oid (key oid="...")    * @return the MsgUnit, which is persistent.    */   public MsgUnit fetch(String oid) throws XmlBlasterException   {      MsgUnit msgUnit = null;      String xmlKey_literal = FileLocator.readAsciiFile(path, oid + XMLKEY_TOKEN);      byte[] content = FileLocator.readFile(path, oid);      String xmlQos_literal = FileLocator.readAsciiFile(path, oid + XMLQOS_TOKEN);      msgUnit = new MsgUnit(glob, xmlKey_literal, content, xmlQos_literal);      if (log.isLoggable(Level.FINE)) log.fine("Successfully fetched message " + oid);      if (log.isLoggable(Level.FINEST)) log.finest("Successfully fetched message\n" + msgUnit.toXml());      return msgUnit;   }   /**    * Fetches all oid's of the messages from the persistence.    * <p />    * It is a helper method to invoke 'fetch(String oid)'.    * @return a Enumeration of oids of all persistent MsgUnits. The oid is a String-Type.    */    public Enumeration fetchAllOids() throws XmlBlasterException    {       Vector oidContainer = new Vector();       File pp = new File(path);       String[] fileArr = pp.list(new XmlKeyFilter());       for (int ii=0; ii<fileArr.length; ii++) {          // Strip the XMLKEY_TOKEN ...          String oid = fileArr[ii].substring(0, fileArr[ii].length() - XMLKEY_TOKEN.length());          // and load the messages in a vector ...          oidContainer.addElement(oid);       }       log.info("Successfully got " + oidContainer.size() + " stored message-oids from " + path);       return oidContainer.elements();    }   /**    * Allows a stored message to be deleted.    * <p />    * @param xmlKey  To identify the message    */   public void erase(XmlKey xmlKey) throws XmlBlasterException   {      String oid = xmlKey.getOid(); // The file name      FileLocator.deleteFile(path, oid + XMLKEY_TOKEN);      FileLocator.deleteFile(path, oid);      FileLocator.deleteFile(path, oid + XMLQOS_TOKEN);   }     /**    * gives the type of the driver    * <p />    * @return the type of the driver    */   public String getType() {      return null; // TODO !!!   }     /**    * gives the version of the driver    * <p />    * @return the version of the driver    */   public String getVersion() {      return null; // TODO !!!   }     /**    * gives the name of the driver    * <p />    * @return the name of the driver    */   public String getName() {      return ME;   }   /**    * Filter only the xy-XmlKey.xml files.    */   private class XmlKeyFilter implements FilenameFilter   {      public boolean accept(File dir, String name)      {         if (name.endsWith(XMLKEY_TOKEN))            return true;         return false;      }   }   /** Invoke:  jaco org.xmlBlaster.engine.persistence.FileDriver */   public static void main(String args[])   {      try {         /*FileDriver driver = */new FileDriver();      } catch (Exception e) {         System.out.println(e.toString());         e.printStackTrace();      }   }}

⌨️ 快捷键说明

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