Hi Jon You could consider using generic for your comparator PublishedDateComparator Comparator<SyncFeed> so the compare method uses SyncFeed as parameters
BTW: This sort feature does it also apply for the camel-atom component? If so is the wiki updated? /Claus Ibsen Apache Camel Committer Blog: http://davsclaus.blogspot.com/ On Fri, Dec 5, 2008 at 9:10 PM, <[EMAIL PROTECTED]> wrote: > Author: janstey > Date: Fri Dec 5 12:10:50 2008 > New Revision: 723844 > > URL: http://svn.apache.org/viewvc?rev=723844&view=rev > Log: > CAMEL-1101 - Add option to sort entries by published date. > > Added: > > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/PublishedDateComparator.java > (with props) > > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortDefaultsTest.java > (with props) > > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortTest.java > (with props) > Modified: > > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java > > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/AggregatorType.java > > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregationCollection.java > > activemq/camel/trunk/components/camel-atom/src/main/java/org/apache/camel/component/feed/FeedEndpoint.java > > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEndpoint.java > > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEntryPollingConsumer.java > > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/UpdatedDateFilter.java > > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntryPollingConsumerTest.java > > Modified: > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java > (original) > +++ > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/component/mock/MockEndpoint.java > Fri Dec 5 12:10:50 2008 > @@ -270,6 +270,21 @@ > } > > /** > + * Validates that the assertions fail on this endpoint > + > + * @param timeoutForEmptyEndpoints the timeout in milliseconds that we > + * should wait for the test to be true > + */ > + public void assertIsNotSatisfied(long timeoutForEmptyEndpoints) throws > InterruptedException { > + try { > + assertIsSatisfied(timeoutForEmptyEndpoints); > + fail("Expected assertion failure!"); > + } catch (AssertionError e) { > + LOG.info("Caught expected failure: " + e); > + } > + } > + > + /** > * Specifies the expected number of message exchanges that should be > * received by this endpoint > * > > Modified: > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/AggregatorType.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/AggregatorType.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/AggregatorType.java > (original) > +++ > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/model/AggregatorType.java > Fri Dec 5 12:10:50 2008 > @@ -289,7 +289,7 @@ > > //------------------------------------------------------------------------- > > /** > - * Sets the in batch size for number of exchanges recieved > + * Sets the in batch size for number of exchanges received > * > * @param batchSize the batch size > * @return builder > > Modified: > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregationCollection.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregationCollection.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregationCollection.java > (original) > +++ > activemq/camel/trunk/camel-core/src/main/java/org/apache/camel/processor/aggregate/AggregationCollection.java > Fri Dec 5 12:10:50 2008 > @@ -69,7 +69,7 @@ > int size(); > > /** > - * Clears this colleciton > + * Clears this collection > */ > void clear(); > > > Modified: > activemq/camel/trunk/components/camel-atom/src/main/java/org/apache/camel/component/feed/FeedEndpoint.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-atom/src/main/java/org/apache/camel/component/feed/FeedEndpoint.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/components/camel-atom/src/main/java/org/apache/camel/component/feed/FeedEndpoint.java > (original) > +++ > activemq/camel/trunk/components/camel-atom/src/main/java/org/apache/camel/component/feed/FeedEndpoint.java > Fri Dec 5 12:10:50 2008 > @@ -35,6 +35,7 @@ > protected Date lastUpdate; > protected boolean filter = true; > private boolean feedHeader = true; > + private boolean sortEntries = false; > > public FeedEndpoint(String endpointUri, FeedComponent component, String > feedUri) { > super(endpointUri, component); > @@ -163,6 +164,17 @@ > return feedHeader; > } > > + /** > + * Sets whether to sort entries by published date. Only works when > splitEntries = true. > + */ > + public void setSortEntries(boolean sortEntries) { > + this.sortEntries = sortEntries; > + } > + > + public boolean isSortEntries() { > + return sortEntries ; > + } > + > // Implementation methods > > //------------------------------------------------------------------------- > > > Added: > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/PublishedDateComparator.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/PublishedDateComparator.java?rev=723844&view=auto > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/PublishedDateComparator.java > (added) > +++ > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/PublishedDateComparator.java > Fri Dec 5 12:10:50 2008 > @@ -0,0 +1,32 @@ > +/** > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You 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 org.apache.camel.component.rss; > + > +import com.sun.syndication.feed.synd.SyndEntry; > + > +import java.util.Comparator; > + > +public class PublishedDateComparator implements Comparator { > + > + public int compare(Object o1, Object o2) { > + SyndEntry s1 = (SyndEntry) o1; > + SyndEntry s2 = (SyndEntry) o2; > + return s2.getPublishedDate().compareTo(s1.getPublishedDate()); > + } > + > +} > \ No newline at end of file > > Propchange: > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/PublishedDateComparator.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Modified: > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEndpoint.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEndpoint.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEndpoint.java > (original) > +++ > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEndpoint.java > Fri Dec 5 12:10:50 2008 > @@ -44,7 +44,7 @@ > */ > public static final String HEADER_RSS_FEED = > "org.apache.camel.component.rss.feed"; > protected static final transient Log LOG = > LogFactory.getLog(RssEndpoint.class); > - > + > public RssEndpoint(String endpointUri, FeedComponent component, String > feedUri) { > super(endpointUri, component, feedUri); > } > > Modified: > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEntryPollingConsumer.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEntryPollingConsumer.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEntryPollingConsumer.java > (original) > +++ > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/RssEntryPollingConsumer.java > Fri Dec 5 12:10:50 2008 > @@ -16,12 +16,15 @@ > */ > package org.apache.camel.component.rss; > > +import java.util.ArrayList; > +import java.util.Collections; > import java.util.Date; > > import com.sun.syndication.feed.synd.SyndFeed; > > import org.apache.camel.Processor; > import org.apache.camel.component.feed.EntryFilter; > +import org.apache.camel.component.feed.FeedEndpoint; > import org.apache.camel.component.feed.FeedEntryPollingConsumer; > > > @@ -39,10 +42,17 @@ > protected void populateList(Object feed) throws Exception { > if (list == null) { > list = ((SyndFeed)feed).getEntries(); > + if (endpoint.isSortEntries()) { > + sortEntries(); > + } > entryIndex = list.size() - 1; > } > } > > + protected void sortEntries() { > + Collections.sort(list, new PublishedDateComparator()); > + } > + > @Override > protected Object createFeed() throws Exception { > return RssUtils.createFeed(endpoint.getFeedUri()); > @@ -55,5 +65,5 @@ > > protected EntryFilter createEntryFilter(Date lastUpdate) { > return new UpdatedDateFilter(lastUpdate); > - } > + } > } > > Modified: > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/UpdatedDateFilter.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/UpdatedDateFilter.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/UpdatedDateFilter.java > (original) > +++ > activemq/camel/trunk/components/camel-rss/src/main/java/org/apache/camel/component/rss/UpdatedDateFilter.java > Fri Dec 5 12:10:50 2008 > @@ -42,6 +42,9 @@ > > public boolean isValidEntry(FeedEndpoint endpoint, Object feed, Object > entry) { > Date updated = ((SyndEntry)entry).getUpdatedDate(); > + if (updated == null) { // never been updated so get published date > + updated = ((SyndEntry)entry).getPublishedDate(); > + } > if (updated == null) { > if (LOG.isDebugEnabled()) { > LOG.debug("No updated time for entry so assuming its valid: > entry=[" + entry + "]"); > @@ -49,7 +52,7 @@ > return true; > } > if (lastUpdate != null) { > - if (lastUpdate.after(updated)) { > + if (lastUpdate.after(updated) || lastUpdate.equals(updated)) { > if (LOG.isDebugEnabled()) { > LOG.debug("Entry is older than lastupdate=[" + lastUpdate > + "], no valid entry=[" + entry + "]"); > @@ -57,7 +60,7 @@ > return false; > } > } > - lastUpdate = updated; > + lastUpdate = updated; > return true; > } > > > Modified: > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntryPollingConsumerTest.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntryPollingConsumerTest.java?rev=723844&r1=723843&r2=723844&view=diff > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntryPollingConsumerTest.java > (original) > +++ > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntryPollingConsumerTest.java > Fri Dec 5 12:10:50 2008 > @@ -31,7 +31,7 @@ > protected RouteBuilder createRouteBuilder() throws Exception { > return new RouteBuilder() { > public void configure() throws Exception { > - > from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=100").to("mock:result"); > + > from("rss:file:src/test/data/rss20.xml?splitEntries=true&sortEntries=true&consumer.delay=100").to("mock:result"); > } > }; > } > > Added: > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortDefaultsTest.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortDefaultsTest.java?rev=723844&view=auto > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortDefaultsTest.java > (added) > +++ > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortDefaultsTest.java > Fri Dec 5 12:10:50 2008 > @@ -0,0 +1,44 @@ > +/** > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You 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 org.apache.camel.component.rss; > + > +import com.sun.syndication.feed.synd.SyndEntry; > +import com.sun.syndication.feed.synd.SyndFeed; > + > +import java.util.Date; > + > +import javax.naming.Context; > + > +import org.apache.camel.Body; > +import org.apache.camel.ContextTestSupport; > +import org.apache.camel.builder.ExpressionBuilder; > +import org.apache.camel.builder.RouteBuilder; > +import org.apache.camel.component.mock.MockEndpoint; > +import org.apache.camel.util.jndi.JndiContext; > + > +public class RssEntrySortDefaultsTest extends RssEntrySortTest { > + protected RouteBuilder createRouteBuilder() throws Exception { > + return new RouteBuilder() { > + public void configure() throws Exception { > + > from("rss:file:src/test/data/rss20.xml?splitEntries=true&sortEntries=true&consumer.delay=50").to("mock:sorted"); > + > + // should NOT sort by default > + > from("rss:file:src/test/data/rss20.xml?splitEntries=true&consumer.delay=50").to("mock:unsorted"); > + } > + }; > + } > +} > > Propchange: > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortDefaultsTest.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > Added: > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortTest.java > URL: > http://svn.apache.org/viewvc/activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortTest.java?rev=723844&view=auto > ============================================================================== > --- > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortTest.java > (added) > +++ > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortTest.java > Fri Dec 5 12:10:50 2008 > @@ -0,0 +1,73 @@ > +/** > + * Licensed to the Apache Software Foundation (ASF) under one or more > + * contributor license agreements. See the NOTICE file distributed with > + * this work for additional information regarding copyright ownership. > + * The ASF licenses this file to You 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 org.apache.camel.component.rss; > + > +import com.sun.syndication.feed.synd.SyndEntry; > +import com.sun.syndication.feed.synd.SyndFeed; > + > +import java.util.Date; > + > +import javax.naming.Context; > + > +import org.apache.camel.Body; > +import org.apache.camel.ContextTestSupport; > +import org.apache.camel.builder.ExpressionBuilder; > +import org.apache.camel.builder.RouteBuilder; > +import org.apache.camel.component.mock.MockEndpoint; > +import org.apache.camel.util.jndi.JndiContext; > + > +public class RssEntrySortTest extends ContextTestSupport { > + > + public void testSortedEntries() throws Exception { > + MockEndpoint mock = getMockEndpoint("mock:sorted"); > + mock.expectsAscending(ExpressionBuilder.beanExpression("myBean", > "getPubDate")); > + mock.expectedMessageCount(10); > + mock.assertIsSatisfied(); > + } > + > + public void testUnSortedEntries() throws Exception { > + MockEndpoint mock = getMockEndpoint("mock:unsorted"); > + mock.expectsAscending(ExpressionBuilder.beanExpression("myBean", > "getPubDate")); > + mock.expectedMessageCount(10); > + mock.setResultWaitTime(2000L); > + mock.assertIsNotSatisfied(2000L); > + } > + > + @Override > + protected Context createJndiContext() throws Exception { > + JndiContext jndi = new JndiContext(); > + jndi.bind("myBean", new MyBean()); > + return jndi; > + } > + > + protected RouteBuilder createRouteBuilder() throws Exception { > + return new RouteBuilder() { > + public void configure() throws Exception { > + > from("rss:file:src/test/data/rss20.xml?splitEntries=true&sortEntries=true&consumer.delay=50").to("mock:sorted"); > + > from("rss:file:src/test/data/rss20.xml?splitEntries=true&sortEntries=false&consumer.delay=50").to("mock:unsorted"); > + } > + }; > + } > + > + public static class MyBean { > + public Date getPubDate(@Body Object body) { > + SyndFeed feed = (SyndFeed) body; > + SyndEntry syndEntry = (SyndEntry) feed.getEntries().get(0); > + return syndEntry.getPublishedDate(); > + } > + } > +} > > Propchange: > activemq/camel/trunk/components/camel-rss/src/test/java/org/apache/camel/component/rss/RssEntrySortTest.java > ------------------------------------------------------------------------------ > svn:eol-style = native > > >
