Package de.nava.informa.impl.hibernate

Source Code of de.nava.informa.impl.hibernate.TestInformaPersistence

//
// Informa -- RSS Library for Java
// Copyright (c) 2002, 2003 by Niko Schmuck
//
// Niko Schmuck
// http://sourceforge.net/projects/informa
// mailto:niko_schmuck@users.sourceforge.net
//
// This library is free software.
//
// You may redistribute it and/or modify it under the terms of the GNU
// Lesser General Public License as published by the Free Software Foundation.
//
// Version 2.1 of the license should be included with this distribution in
// the file LICENSE. If the license is not included with this distribution,
// you may find a copy at the FSF web site at 'www.gnu.org' or 'www.fsf.org',
// or you may write to the Free Software Foundation, 675 Mass Ave, Cambridge,
// MA 02139 USA.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied waranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//

// $Id: TestInformaPersistence.java,v 1.9 2006/01/03 00:30:39 niko_schmuck Exp $

package de.nava.informa.impl.hibernate;

import java.net.MalformedURLException;
import java.net.URL;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Hibernate;
import org.hibernate.HibernateException;
import org.hibernate.Session;

import de.nava.informa.core.ChannelBuilderException;
import de.nava.informa.core.ChannelIF;
import de.nava.informa.core.ChannelObserverIF;
import de.nava.informa.core.ItemIF;
import de.nava.informa.utils.ChannelRegistry;
import de.nava.informa.utils.InformaTestCase;

/**
* TestInformaPersistence
*
*/
public class TestInformaPersistence extends InformaTestCase
  implements ChannelObserverIF {

  SessionHandler handler;
  Connection conn;
  ChannelBuilder builder;
  ChannelRegistry channelRegistry;

  private static Log log = LogFactory.getLog(TestInformaPersistence.class);

  public TestInformaPersistence(String testname) {
    super("TestInformaPersistence", testname);
  }

  public void setUp() throws HibernateException, SQLException,
                                          ChannelBuilderException {
    handler = SessionHandler.getInstance();
    handler.getSession();
    builder = new ChannelBuilder(handler);
    builder.beginTransaction();
    channelRegistry = new ChannelRegistry(builder);
    builder.endTransaction();
  }

  public void tearDown() throws SQLException, ChannelBuilderException {
    if (conn != null)
      conn.close();
    if (builder != null)
      builder.close();
    handler = null;
  }

  // ==================================================================
 
  public void testChannelRegistry() {
    /* these tests now work correctly
          int chanA = createChanWithItems("Fee channel", 3);
          int chanB = createChanWithItems("Fie channel", 12);
          int chanC = createChanWithItems("Foe channel", 44);
          verifyChannel(chanA);
          verifyChannel(chanB);
          verifyChannel(chanC);
    */

    Thread t = new Thread() {
      public void run() {
        try {
          Thread.sleep(3000);
        } catch (InterruptedException e) {
          log.warn("Interrupted while running testcase: " + e);
        }
      }
    };
    // TODO: investigate more about multi-threaded JUnit tests (GroboUtils?)
    t.start();
    lookupAndCreateChannel("Joho",
                           "http://www.hyperorg.com/blogger/index.rdf");
    lookupAndCreateChannel("Bitwaste",
                           "http://www.bitwaste.com/wasted-bits/index.cgi/index.rss");
    lookupAndCreateChannel("AllConsuming",
                           "http://www.allconsuming.net/xml/recent_consumption.rss.xml");
  }

  // ==================================================================

  private Channel lookupAndCreateChannel(String label, String url) {
    log.info("Looking up channel: " + label);
    Channel achan = locateChannel(url);
    if (achan != null) {
      verifyChannel(label, achan.getId());
    } else {
      log.info(label + " not yet located.");
    }
    achan = getChannel(url, achan);
    verifyChannel(label + " that was created:", achan.getId());
    return achan;
  }

  private Channel getChannel(String string, Channel existing) {
    log.info("Getting channel: " + string);
    synchronized (builder) {
      Channel aChannel = null;
      try {
        builder.beginTransaction();
        if (existing == null) {
          aChannel =
            (Channel) channelRegistry.addChannel(new URL(string), 30, false);
        } else {
          aChannel = (Channel) channelRegistry.addChannel(existing, false, 30);
        }
        long chanid = aChannel.getId();
        log.info("Got channel: " + aChannel + "(id =" + chanid + ")");
        aChannel.addObserver(this);
        builder.endTransaction();
        channelRegistry.activateChannel(aChannel, 60);
      } catch (MalformedURLException e) {
        e.printStackTrace();
      } catch (ChannelBuilderException e1) {
        e1.printStackTrace();
      }
      return aChannel;
    }
  }

  private Channel locateChannel(String xmlURL) {
    synchronized (builder) {
      Channel aChannel = null;
      try {
        builder.beginTransaction();
        Session sess = builder.getSession();
        List channels =
          sess.createQuery("from Channel as chan where chan.locationString = :loc")
              .setParameter("loc", xmlURL, Hibernate.STRING).list();
        log.info("***locateChannel for " + xmlURL + " produced these: " + channels);
        if (channels.size() >= 1) { // for now just take the last one
          aChannel = (Channel) channels.get(channels.size() - 1);
        }
        builder.endTransaction();
      } catch (Exception e) {
        e.printStackTrace();
      }
      return aChannel;
    }
  }

  // TODO: split this out into InformaHibernateTestCase for better reuse

  private void verifyChannel(String label, long chan_id) {
    try {
      Session session = handler.getSession();
      log.info(label + chan_id);
      Channel aChan = (Channel) session.load(Channel.class, new Long(chan_id));
      assertEquals((long) chan_id, aChan.getId());
      assertNotNull(aChan.getTitle());
      logChannel(aChan);
      session.flush();
      session.close();
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  private void logChannel(Channel aChan) {
    String logthis = "Channel: " + aChan + ":";
    Iterator items = aChan.getItems().iterator();
    while (items.hasNext()) {
      Item item = (Item) items.next();
      logthis = logthis + ":" + item;
    }
    log.info(logthis);
  }

  // --------------------------------------------------------------------------
  // currently unused
  // --------------------------------------------------------------------------

  /*
  private int createChanWithItems(String chanName, int count) throws Exception {
    synchronized (builder) {
      int chan_id = -1;
      try {
        builder.beginTransaction();
        log.info("createChanWithItems starting...");
        Channel channel = (Channel) builder.createChannel(chanName);
        chan_id = channel.getIntId();
        channel.setDescription("Test Channel: " + chanName + " ID = " + chan_id);
        log.info("created " + chanName + " ID = " + chan_id);
        log.info("saved " + chanName);

        for (int i = 0; i < count; i++) {
          builder.createItem(channel, "Item " + i + " for " + chanName,
                                      "A wonderful description!",
                                      new URL("http://www.sf.net/"));
        }
        logChannel(channel);
        builder.endTransaction();
        log.info("transaction commited. CHAN ID = " + chan_id);
      } catch (ChannelBuilderException he) {
        he.printStackTrace();
        throw he;
      }
      return chan_id;
    }
  }
  */

  // ----------------------------------------------------------------------
  // Implementation of ChannelObserverIF
  // ----------------------------------------------------------------------

  public void itemAdded(ItemIF newItem) {
    log.info("Added item " + newItem);
  }

  public void channelRetrieved(ChannelIF channel) {
    log.info("Added channel " + channel);
  }

}
TOP

Related Classes of de.nava.informa.impl.hibernate.TestInformaPersistence

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.