Package hermes.impl

Source Code of hermes.impl.FileRepository

/*
* Copyright 2003,2004 Colin Crist
*
* 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 hermes.impl;

import hermes.Hermes;
import hermes.HermesException;
import hermes.HermesRepository;
import hermes.MessageFactory;
import hermes.providers.file.FileQueue;
import hermes.providers.file.FileQueueBrowser;
import hermes.store.MessageStoreListener;
import hermes.xml.Entry;
import hermes.xml.MessageSet;
import hermes.xml.XMLMessage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.QueueBrowser;

import org.apache.log4j.Logger;

/**
* Stores messages on the filesystem
*
* @author colincrist@hermesjms.com
* @version $Id: FileRepository.java,v 1.4 2005/06/28 15:36:15 colincrist Exp $
*/

public class FileRepository implements HermesRepository {
  private static final Logger log = Logger.getLogger(FileRepository.class);
  private static final String SEPARATOR = System.getProperty("file.separator");
  private String fileName;
  private MessageSet xmlMessages;
  private DefaultXMLHelper xmlSupport = new DefaultXMLHelper();

  public FileRepository(File file) throws IOException {
    this.fileName = file.getAbsolutePath();

  }

  public String getToolTipText() {
    return fileName;
  }

  private void read() throws Exception {
    File file = new File(fileName);
    if (!file.exists()) {
      file.createNewFile();
    } else {
      try {
        xmlMessages = xmlSupport.readContent(new FileInputStream(file));
      } catch (Exception ex) {
        log.error(ex.getMessage(), ex);
      }
    }

    if (xmlMessages == null) {
      xmlMessages = new MessageSet();
    }

  }

  private void save() throws Exception {
    if (xmlMessages != null) {
      File file = new File(fileName);
      xmlSupport.saveContent(xmlMessages, new FileOutputStream(file));
    }
  }

  public String getId() {
    File file = new File(fileName);

    return file.getName();
  }

  /*
   * (non-Javadoc)
   *
   * @see hermes.HermesRepository#getMessages(java.lang.String)
   */
  public Collection getMessages(Hermes hermes) throws JMSException {
    if (hermes == null) {
      throw new HermesException("No Hermes available");
    }

    try {
      if (xmlMessages == null) {
        read();
      }

      return xmlSupport.fromMessageSet(hermes, xmlMessages);
    } catch (Exception e) {
      log.error(e.getMessage(), e);
      throw new HermesException(e);
    }

  }

  /*
   * (non-Javadoc)
   *
   * @see hermes.HermesRepository#addMessages(java.lang.String,
   * java.util.Collection)
   */
  public void addMessages(Hermes hermes, Collection messages) throws JMSException {
    if (hermes == null) {
      throw new HermesException("No Hermes available");
    }

    try {
      if (xmlMessages == null) {
        read();
      }

      MessageSet newMessages = xmlSupport.toMessageSet(messages);

      xmlMessages.getEntry().addAll(newMessages.getEntry());

      save();
    } catch (JMSException e) {
      throw e; // Ugh.
    } catch (Exception e) {
      throw new HermesException(e);
    }
  }

  /*
   * (non-Javadoc)
   *
   * @see hermes.HermesRepository#addMessage(hermes.Hermes, javax.jms.Message)
   */
  public void addMessage(Hermes hermes, Message message) throws JMSException {
    List tmp = new ArrayList();
    tmp.add(message);

    addMessages(hermes, tmp);
  }

  /*
   * (non-Javadoc)
   *
   * @see hermes.HermesRepository#delete()
   */
  public void delete() {
    File file = new File(fileName);
    if (file != null) {
      file.delete();
    }

    xmlMessages = null;
  }

  /*
   * (non-Javadoc)
   *
   * @see hermes.HermesRepository#size()
   */
  public int size() {
    if (xmlMessages == null) {
      return 0;
    } else {
      return xmlMessages.getEntry().size();
    }

  }

  /**
   * This supports the minimum interface of a MessageStore so it can be
   * browsed in the same way.
   *
   */
  public void addMessageListener(MessageStoreListener listener) {
  }

  public void checkpoint() throws JMSException {
    throw new HermesException("Not Implemented");
  }

  public void close() throws JMSException {
    throw new HermesException("Not Implemented");

  }

  public void delete(Destination d) throws JMSException {
    throw new HermesException("Not Implemented");

  }

  @Override
  public void delete(Set<String> messageIds) throws JMSException {
    try {
      if (xmlMessages == null) {
        read();
      }

      Set<XMLMessage> toRemove = new HashSet<XMLMessage>();

      for (Iterator<Entry> iter = xmlMessages.getEntry().iterator(); iter.hasNext();) {
        XMLMessage xmlMessage = null;
        Entry entry = iter.next();
        if (entry.getBytesMessage() != null) {
          xmlMessage = entry.getBytesMessage();
        } else if (entry.getTextMessage() != null) {
          xmlMessage = entry.getTextMessage();
        } else if (entry.getMapMessage() != null) {
          xmlMessage = entry.getMapMessage();
        } else if (entry.getObjectMessage() != null) {
          xmlMessage = entry.getObjectMessage();
        }

        if (xmlMessage != null) {
          if (messageIds.contains(xmlMessage.getJMSMessageID())) {
            iter.remove();
          }
        }
      }

      save();
    } catch (Exception ex) {
      log.error(ex);
      throw new JMSException(ex.getMessage());
    }

  }

  public int getDepth(Destination d) throws JMSException {
    return 0;
  }

  public Collection<Destination> getDestinations() throws JMSException {
    return Collections.EMPTY_LIST;
  }

  public String getTooltipText() {
    File file = new File(fileName);
    return file.getName();
  }

  public String getURL() {
    File file = new File(fileName);
    return file.getName();
  }

  public void removeMessageListener(MessageStoreListener listener) {
    // TODO Auto-generated method stub

  }

  public void rollback() throws JMSException {
    throw new HermesException("Not Implemented");
  }

  public void store(Message m) throws JMSException {
    throw new HermesException("Not Implemented");

  }

  public QueueBrowser visit() throws JMSException {
    throw new HermesException("Not Implemented");
  }

  public QueueBrowser visit(Destination d) throws JMSException {
    throw new HermesException("Not Implemented");
  }

  public QueueBrowser visit(MessageFactory factory, Destination d, HeaderPolicy headerPolicy) throws JMSException {
    File file = new File(fileName);
    return new FileQueueBrowser(factory, new FileQueue(file));
  }

  public QueueBrowser visit(MessageFactory factory, HeaderPolicy headerPolicy) throws JMSException {
    return visit(factory, null, headerPolicy);
  }

  @Override
  public void delete(Message m) throws JMSException {
    throw new HermesException("Not Implemented");
  }

  @Override
  public void update(Message message) throws Exception {
    if (xmlMessages == null) {
      read() ;
    }
   
    for (int i = 0 ; i < xmlMessages.getEntry().size() ; i++) {
      XMLMessage xmlMessage = null;
      Entry entry = xmlMessages.getEntry().get(i) ;
      if (entry.getBytesMessage() != null) {
        xmlMessage = entry.getBytesMessage();
      } else if (entry.getTextMessage() != null) {
        xmlMessage = entry.getTextMessage();
      } else if (entry.getMapMessage() != null) {
        xmlMessage = entry.getMapMessage();
      } else if (entry.getObjectMessage() != null) {
        xmlMessage = entry.getObjectMessage();
      }

      // ikky but whatever.
     
      if (xmlMessage != null) {
        if (message.getJMSMessageID().equals(xmlMessage.getJMSMessageID())) {
          xmlMessages.getEntry().remove(i) ;
          MessageSet messageSet = xmlSupport.toMessageSet(Arrays.asList(message)) ;
          xmlMessages.getEntry().add(i, messageSet.getEntry().get(0)) ;
        }
      }
    }

    save();
   
  }



}
TOP

Related Classes of hermes.impl.FileRepository

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.