[Lutinweb-commits] r73 - in trunk/lutinrss/src: main/java/org/codelutin/rss test/java/org/codelutin/rss
Author: tchemit Date: 2008-05-30 14:05:16 +0000 (Fri, 30 May 2008) New Revision: 73 Modified: trunk/lutinrss/src/main/java/org/codelutin/rss/RSSGeneratorHelper.java trunk/lutinrss/src/test/java/org/codelutin/rss/RSSGeneratorHelperTest.java Log: tests sur la creation des items Modified: trunk/lutinrss/src/main/java/org/codelutin/rss/RSSGeneratorHelper.java =================================================================== --- trunk/lutinrss/src/main/java/org/codelutin/rss/RSSGeneratorHelper.java 2008-05-30 09:51:30 UTC (rev 72) +++ trunk/lutinrss/src/main/java/org/codelutin/rss/RSSGeneratorHelper.java 2008-05-30 14:05:16 UTC (rev 73) @@ -40,7 +40,7 @@ /** to use log facility, just put in your code: log.info(\"...\"); */ static final Log log = LogFactory.getLog(RSSGeneratorHelper.class); /** date formater use to save date in feed and entries */ - static final DateFormat DATE_PARSER = new SimpleDateFormat("dd/MM/yyyy"); + static final DateFormat DATE_PARSER = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss"); /** shared jvm instance */ protected static RSSGeneratorHelper instance; /** dictonnary of field <-> property for feed */ @@ -77,16 +77,20 @@ /** * * @param url location where to create the file + * @param type fromat of feed to create * @param values properties of the feed + * @throws ParseException if pb while parsing date + * @throws IOException if io pb + * @throws FeedException if pb while creating feed */ public void createFeedFile(URL url, FeedType type, Map<Field, Object> values) throws IOException, FeedException, ParseException { - if (url==null) { + if (url == null) { throw new NullPointerException("can not create a feed with null url"); } - if (type==null) { + if (type == null) { throw new NullPointerException("can not create a feed with null feedtype"); } - if (values==null || values.isEmpty()) { + if (values == null || values.isEmpty()) { //TODO Should check mandatory values (title, link,...) throw new NullPointerException("can not create a feed with null nor empty values dictonnary"); } @@ -109,9 +113,8 @@ RSSIOUtil.saveFeed(f, feed); } finally { - releaseLock(f,lock); + releaseLock(f, lock); } - } /** @@ -120,12 +123,15 @@ * @param url location of feed to used * @param nbEntries number of maximum entries to be written in feed file * @param values dictionnary of properties to write + * @throws FeedException if feed pb + * @throws IOException if io pb + * @throws ParseException if dateparser pb */ - public void addItemToFeedFile(URL url, int nbEntries, Map<Field, Object> values) throws FileNotFoundException, IOException, IllegalArgumentException, FeedException, ParseException { - if (url==null) { + public void addItemToFeedFile(URL url, int nbEntries, Map<Field, Object> values) throws IOException, FeedException, ParseException { + if (url == null) { throw new NullPointerException("can not add a feed's entry with null url"); } - if (values==null || values.isEmpty()) { + if (values == null || values.isEmpty()) { //TODO Should check mandatory values (title, link,...) throw new NullPointerException("can not add a feed's entry with null nor empty values dictonnary"); } @@ -138,25 +144,21 @@ // block until can acquire lock FileLock lock = acquireLock(f); - // temporary file where to write feed - - File tmpFile = null; - try { - + // get feed and add the new item SyndFeed feed = addItemToFeed(url, nbEntries, values); // save feed into a tmp file + File tmpFile = new File(f.getAbsolutePath() + "-tmp_" + System.nanoTime()); - tmpFile = new File(f.getParentFile(), "tmp_" + f.getName() + "_" + System.nanoTime() + ".xml"); - RSSIOUtil.saveFeed(tmpFile, feed); - + + //TODO use a read file lock, to prevent read pb while renaming ? + // move tmpFile to real file tmpFile.renameTo(f); - } finally { - releaseLock(f,lock); + releaseLock(f, lock); } } @@ -173,10 +175,10 @@ continue; } Object value = entry.getValue(); - Object realValue = null; + Object realValue; switch (field) { case TIME: - realValue = DATE_PARSER.parse((String)value); + realValue = DATE_PARSER.parse((String) value); break; default: realValue = value; @@ -201,16 +203,17 @@ continue; } Object value = entry.getValue(); - Object realValue = null; + Object realValue; switch (field) { case TIME: realValue = DATE_PARSER.parse((String) value); break; case DESCRIPTION: + //TODO Deal with xml content ? SyndContent description = new SyndContentImpl(); description.setType("text/plain"); - description.setValue(String.valueOf(value)); - realValue = description; + feedEntry.setDescription(description); + realValue = String.valueOf(value); break; default: realValue = value; @@ -221,18 +224,23 @@ return feedEntry; } + @SuppressWarnings({"unchecked"}) protected SyndFeed addItemToFeed(URL url, int nbEntries, Map<Field, Object> values) throws IOException, IllegalArgumentException, FeedException, ParseException { SyndFeed feed = RSSIOUtil.readFeed(url); - List entries = feed.getEntries(); - // always sort by publication date - java.util.Collections.sort(entries, new FeedEntryComparator()); - // keep only nbEntries -1 entries - while (entries.size() > nbEntries - 1) { - entries.remove(0); + List<SyndEntry> entries = feed.getEntries(); + if (!entries.isEmpty()) { + // always sort by publication date + java.util.Collections.sort(entries, new FeedEntryComparator()); + // keep only nbEntries -1 entries + while (entries.size() > nbEntries - 1) { + entries.remove(0); + } } SyndEntry item = createFeedItem(values); entries.add(item); - + if (log.isDebugEnabled()) { + log.debug("new item " + item); + } return feed; } @@ -245,35 +253,35 @@ */ protected File getFile(URL url) throws IllegalStateException { try { - File f = new File(url.toURI()); - - return f; + return new File(url.toURI()); } catch (URISyntaxException e) { throw new IllegalStateException("could not obtain file from url " + url, e); } } - protected FileLock acquireLock(File f) throws IOException, FileNotFoundException { - File lockFile = new File(f.getParentFile(), f.getName() + ".lock"); - + protected FileLock acquireLock(File f) throws IOException { + File lockFile = getWriteFileLock(f); + /*if (!lockFile.exists()) lockFile.createNewFile(); */ // open file for writing only FileChannel channel = new RandomAccessFile(lockFile, "rw").getChannel(); // block until can acquire lock - FileLock lock = channel.lock(); - // temporary file where to write feed - return lock; + return channel.lock(); } - protected void releaseLock(File f,FileLock lock) throws IOException { + protected File getWriteFileLock(File f) { + return new File(f.getParentFile(), f.getName() + ".wlock"); + } + + protected void releaseLock(File f, FileLock lock) throws IOException { // release lock lock.release(); // close channel lock.channel().close(); // delete file lock - File lockFile = new File(f.getParentFile(), f.getName() + ".lock"); + File lockFile = getWriteFileLock(f); lockFile.delete(); } Modified: trunk/lutinrss/src/test/java/org/codelutin/rss/RSSGeneratorHelperTest.java =================================================================== --- trunk/lutinrss/src/test/java/org/codelutin/rss/RSSGeneratorHelperTest.java 2008-05-30 09:51:30 UTC (rev 72) +++ trunk/lutinrss/src/test/java/org/codelutin/rss/RSSGeneratorHelperTest.java 2008-05-30 14:05:16 UTC (rev 73) @@ -2,11 +2,14 @@ * To change this template, choose Tools | Templates * and open the template in the editor. */ - package org.codelutin.rss; +import com.sun.syndication.feed.synd.SyndEntry; import com.sun.syndication.feed.synd.SyndFeed; import java.io.File; +import java.net.MalformedURLException; +import java.text.ParseException; +import java.util.List; import java.util.Map; import junit.framework.TestCase; @@ -16,56 +19,172 @@ */ public class RSSGeneratorHelperTest extends TestCase { - RSSGeneratorHelper helper; + RSSGeneratorHelper helper; + static File f; - - @Override - protected void setUp() throws Exception { - super.setUp(); - helper = RSSGeneratorHelper.getInstance(); - } + public void testCreateFeed() throws Exception { - @Override - protected void tearDown() throws Exception { - super.tearDown(); - } - - public void testCreateFeed() throws Exception { - File f = getFeedFile(); - - try{ - Map<Field, Object> values = new java.util.HashMap<Field,Object>(); - values.put(Field.NAME, "feedName : "+f.getName()); - values.put(Field.DESCRIPTION, "feedDescription : "+f.getName()); - values.put(Field.LINK, f.toURI().toURL()); - values.put(Field.TIME,RSSGeneratorHelper.DATE_PARSER.format(new java.util.Date())); - + Map<Field, Object> values = new java.util.HashMap<Field, Object>(); + values.put(Field.NAME, "feedName : " + f.getName()); + values.put(Field.DESCRIPTION, "feedDescription : " + f.getName()); + values.put(Field.LINK, f.toURI().toURL() + ""); + values.put(Field.TIME, RSSGeneratorHelper.DATE_PARSER.format(new java.util.Date())); + assertFalse(f.exists()); - RSSGeneratorHelper.log.info("feedFile : "+f); - helper.createFeedFile(f.toURI().toURL(), FeedType.RSS_1_0, values); - // lock is delete - assertFalse(new File(f.getAbsolutePath()+".lock").exists()); + RSSGeneratorHelper.log.info("feedFile : " + f); + helper.createFeedFile(f.toURI().toURL(), RSSConfig.DEFAULT_GENERATOR_FORMAT, values); + // no lock + assertFalse(new File(f.getAbsolutePath() + ".lock").exists()); // file exist assertTrue(f.exists()); - //TODO test feed + SyndFeed feed = RSSIOUtil.readFeed(f.toURI().toURL()); - RSSGeneratorHelper.log.info(feed); + + if (RSSGeneratorHelper.log.isDebugEnabled()) { + RSSGeneratorHelper.log.debug(feed); + } + + assertEquals(feed.getFeedType(), RSSConfig.DEFAULT_GENERATOR_FORMAT.getType()); + assertEquals(feed.getLink(), values.get(Field.LINK)); assertEquals(feed.getTitle(), values.get(Field.NAME)); assertEquals(feed.getDescription(), values.get(Field.DESCRIPTION)); - assertEquals(feed.getPublishedDate(), RSSGeneratorHelper.DATE_PARSER.parse((String)values.get(Field.TIME))); + assertEquals(feed.getPublishedDate(), RSSGeneratorHelper.DATE_PARSER.parse((String) values.get(Field.TIME))); + + } + + public void testCreateFeedAlreadyExisting() throws Exception { + + Map<Field, Object> values = new java.util.HashMap<Field, Object>(); + values.put(Field.NAME, "feedName : " + f.getName()); + values.put(Field.DESCRIPTION, "feedDescription : " + f.getName()); + values.put(Field.LINK, f.toURI().toURL() + ""); + values.put(Field.TIME, RSSGeneratorHelper.DATE_PARSER.format(new java.util.Date())); + + assertTrue(f.exists()); + + try { + helper.createFeedFile(f.toURI().toURL(), FeedType.RSS_1_0, values); + // file already exist, can not reach this code + fail(); + } catch (IllegalStateException e) { + assertTrue(true); + } + // no write lock + assertFalse(helper.getWriteFileLock(f).exists()); + + } + + public void testAddFeedEntry() throws Exception { + assertTrue(f.exists()); + Map<Field, Object> values = createEntry(0); + + helper.addItemToFeedFile(f.toURI().toURL(), 2, values); + + SyndFeed feed = RSSIOUtil.readFeed(f.toURI().toURL()); + + List entries = feed.getEntries(); + assertEquals(1, entries.size()); + + if (RSSGeneratorHelper.log.isDebugEnabled()) { + RSSGeneratorHelper.log.debug(feed); + } + + SyndEntry entry = (SyndEntry) entries.get(0); + + assertEntry(entry, values); + } + + public void testAddFeedEntryToMax() throws Exception { + + assertTrue(f.exists()); + SyndFeed feed = RSSIOUtil.readFeed(f.toURI().toURL()); + + List entries = feed.getEntries(); + assertEquals(1, entries.size()); + SyndEntry firsEntry = (SyndEntry) entries.get(0); + + Map<Field, Object> values; + + int nbMaxEntries = 10; + + for (int i = 1; i < nbMaxEntries; i++) { + values = createEntry(i); + helper.addItemToFeedFile(f.toURI().toURL(), nbMaxEntries, values); + feed = RSSIOUtil.readFeed(f.toURI().toURL()); + + entries = feed.getEntries(); + assertEquals(i + 1, entries.size()); + + SyndEntry entry = (SyndEntry) entries.get(i); + + assertEntry(entry, values); + } + + // feed file contains max items + + values = createEntry(nbMaxEntries); + + helper.addItemToFeedFile(f.toURI().toURL(), nbMaxEntries, values); + + feed = RSSIOUtil.readFeed(f.toURI().toURL()); + + entries = feed.getEntries(); + + assertEquals(nbMaxEntries, entries.size()); + + SyndEntry entry = (SyndEntry) entries.get(nbMaxEntries - 1); + + assertEntry(entry, values); + + // check orginal first entry is no more present + entry = (SyndEntry) entries.get(0); + assertFalse(firsEntry.getTitle().equals(entry.getTitle())); + } + + public void testCleanFile() throws Exception { + try { + assertNotNull(f); + assertTrue(f.exists()); + // lock is delete + assertFalse(helper.getWriteFileLock(f).exists()); } finally { - f.deleteOnExit(); + if (f != null) { + f.deleteOnExit(); + } } - } - - public void testAddFeed() throws Exception { - + + protected void assertEntry(SyndEntry entry, Map<Field, Object> values) throws ParseException { + assertEquals(entry.getLink(), values.get(Field.LINK)); + assertEquals(entry.getTitle(), values.get(Field.NAME)); + assertEquals(entry.getDescription().getValue(), values.get(Field.DESCRIPTION)); + assertEquals(entry.getPublishedDate(), RSSGeneratorHelper.DATE_PARSER.parse((String) values.get(Field.TIME))); } protected File getFeedFile() { - File feedFile = new File("/tmp/" + getClass().getSimpleName() + "-" + System.nanoTime() + ".xml"); - return feedFile; + return new File("/tmp/" + getClass().getSimpleName() + "-" + System.nanoTime() + ".xml"); } + protected Map<Field, Object> createEntry(int number) throws MalformedURLException { + Map<Field, Object> values = new java.util.HashMap<Field, Object>(); + values.put(Field.NAME, "entryName : " + f.getName() + "-" + number); + values.put(Field.DESCRIPTION, "entryDescription : " + f.getName() + "-" + number); + values.put(Field.LINK, f.toURI().toURL() + "/entry-" + number); + values.put(Field.TIME, RSSGeneratorHelper.DATE_PARSER.format(new java.util.Date())); + return values; + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + helper = RSSGeneratorHelper.getInstance(); + if (f == null) { + f = getFeedFile(); + } + } + + @Override + protected void tearDown() throws Exception { + super.tearDown(); + } }
participants (1)
-
tchemit@users.labs.libre-entreprise.org