commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bur...@apache.org
Subject cvs commit: jakarta-commons-sandbox/feedparser/tests/filter nbsp-1.xml
Date Thu, 02 Sep 2004 00:36:25 GMT
burton      2004/09/01 17:36:25

  Modified:    feedparser build.xml
               feedparser/src/java/org/apache/commons/feedparser
                        FeedFilter.java
               feedparser/src/java/org/apache/commons/feedparser/locate
                        FeedLocator.java ProbeLocator.java
               feedparser/src/java/org/apache/commons/feedparser/test
                        TestFeedFilter.java TestProbeLocator.java
  Added:       feedparser/tests/filter nbsp-1.xml
  Log:
  Fix for NBSP as well as a whole range of entities
  
  Revision  Changes    Path
  1.6       +9 -4      jakarta-commons-sandbox/feedparser/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/feedparser/build.xml,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- build.xml	31 Aug 2004 23:56:13 -0000	1.5
  +++ build.xml	2 Sep 2004 00:36:25 -0000	1.6
  @@ -28,10 +28,6 @@
   
           </fileset>
   
  -        <fileset dir="/projects/ksa/lib">
  -             <include name="*.jar"/>
  -        </fileset>
  -
           <!--
           <fileset dir="c:/usr/local/ksa/lib">
   
  @@ -79,6 +75,15 @@
                fork="true"
                failonerror="true">
          </java>        
  +    </target>
  +	
  +	<target name="test-probing" description="Runs the testing class for aggresive probing"
  +	            depends="jakarta-feedparser.jar">
  +	       <java classpathref="project.classpath"
  +	             classname="org.apache.commons.feedparser.test.TestProbeLocator"
  +	             fork="true"
  +	             failonerror="true">
  +	       </java>        
       </target>
   
       <target name="clean">
  
  
  
  1.2       +56 -22    jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/FeedFilter.java
  
  Index: FeedFilter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/FeedFilter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FeedFilter.java	31 Aug 2004 21:02:40 -0000	1.1
  +++ FeedFilter.java	2 Sep 2004 00:36:25 -0000	1.2
  @@ -131,67 +131,101 @@
           //
           // Which is correct in Latin1
   
  -        LATIN1_ENTITIES.put( "AElig",     "198" );
  +        LATIN1_ENTITIES.put( "nbsp",      "160" );
  +        LATIN1_ENTITIES.put( "iexcl",     "161" );
  +        LATIN1_ENTITIES.put( "cent",      "162" );
  +        LATIN1_ENTITIES.put( "pound",     "163" );
  +        LATIN1_ENTITIES.put( "curren",    "164" );
  +        LATIN1_ENTITIES.put( "yen",       "165" );
  +        LATIN1_ENTITIES.put( "brvbar",    "166" );
  +        LATIN1_ENTITIES.put( "sect",      "167" );
  +        LATIN1_ENTITIES.put( "uml",       "168" );
  +        LATIN1_ENTITIES.put( "copy",      "169" );
  +        LATIN1_ENTITIES.put( "ordf",      "170" );
  +        LATIN1_ENTITIES.put( "laquo",     "171" );
  +        LATIN1_ENTITIES.put( "not",       "172" );
  +        LATIN1_ENTITIES.put( "shy",       "173" );
  +        LATIN1_ENTITIES.put( "reg",       "174" );
  +        LATIN1_ENTITIES.put( "macr",      "175" );
  +        LATIN1_ENTITIES.put( "deg",       "176" );
  +        LATIN1_ENTITIES.put( "plusmn",    "177" );
  +        LATIN1_ENTITIES.put( "sup2",      "178" );
  +        LATIN1_ENTITIES.put( "sup3",      "179" );
  +        LATIN1_ENTITIES.put( "acute",     "180" );
  +        LATIN1_ENTITIES.put( "micro",     "181" );
  +        LATIN1_ENTITIES.put( "para",      "182" );
  +        LATIN1_ENTITIES.put( "middot",    "183" );
  +        LATIN1_ENTITIES.put( "cedil",     "184" );
  +        LATIN1_ENTITIES.put( "sup1",      "185" );
  +        LATIN1_ENTITIES.put( "ordm",      "186" );
  +        LATIN1_ENTITIES.put( "raquo",     "187" );
  +        LATIN1_ENTITIES.put( "frac14",    "188" );
  +        LATIN1_ENTITIES.put( "frac12",    "189" );
  +        LATIN1_ENTITIES.put( "frac34",    "190" );
  +        LATIN1_ENTITIES.put( "iquest",    "191" );
  +        LATIN1_ENTITIES.put( "Agrave",    "192" );
           LATIN1_ENTITIES.put( "Aacute",    "193" );
           LATIN1_ENTITIES.put( "Acirc",     "194" );
  -        LATIN1_ENTITIES.put( "Agrave",    "192" );
  -        LATIN1_ENTITIES.put( "Aring",     "197" );
           LATIN1_ENTITIES.put( "Atilde",    "195" );
           LATIN1_ENTITIES.put( "Auml",      "196" );
  +        LATIN1_ENTITIES.put( "Aring",     "197" );
  +        LATIN1_ENTITIES.put( "AElig",     "198" );
           LATIN1_ENTITIES.put( "Ccedil",    "199" );
  -        LATIN1_ENTITIES.put( "ETH",       "208" );
  +        LATIN1_ENTITIES.put( "Egrave",    "200" );
           LATIN1_ENTITIES.put( "Eacute",    "201" );
           LATIN1_ENTITIES.put( "Ecirc",     "202" );
  -        LATIN1_ENTITIES.put( "Egrave",    "200" );
           LATIN1_ENTITIES.put( "Euml",      "203" );
  +        LATIN1_ENTITIES.put( "Igrave",    "204" );
           LATIN1_ENTITIES.put( "Iacute",    "205" );
           LATIN1_ENTITIES.put( "Icirc",     "206" );
  -        LATIN1_ENTITIES.put( "Igrave",    "204" );
           LATIN1_ENTITIES.put( "Iuml",      "207" );
  +        LATIN1_ENTITIES.put( "ETH",       "208" );
           LATIN1_ENTITIES.put( "Ntilde",    "209" );
  +        LATIN1_ENTITIES.put( "Ograve",    "210" );
           LATIN1_ENTITIES.put( "Oacute",    "211" );
           LATIN1_ENTITIES.put( "Ocirc",     "212" );
  -        LATIN1_ENTITIES.put( "Ograve",    "210" );
  -        LATIN1_ENTITIES.put( "Oslash",    "216" );
           LATIN1_ENTITIES.put( "Otilde",    "213" );
           LATIN1_ENTITIES.put( "Ouml",      "214" );
  -        LATIN1_ENTITIES.put( "THORN",     "222" );
  +        LATIN1_ENTITIES.put( "times",     "215" );
  +        LATIN1_ENTITIES.put( "Oslash",    "216" );
  +        LATIN1_ENTITIES.put( "Ugrave",    "217" );
           LATIN1_ENTITIES.put( "Uacute",    "218" );
           LATIN1_ENTITIES.put( "Ucirc",     "219" );
  -        LATIN1_ENTITIES.put( "Ugrave",    "217" );
           LATIN1_ENTITIES.put( "Uuml",      "220" );
           LATIN1_ENTITIES.put( "Yacute",    "221" );
  +        LATIN1_ENTITIES.put( "THORN",     "222" );
  +        LATIN1_ENTITIES.put( "szlig",     "223" );
  +        LATIN1_ENTITIES.put( "agrave",    "224" );
           LATIN1_ENTITIES.put( "aacute",    "225" );
           LATIN1_ENTITIES.put( "acirc",     "226" );
  -        LATIN1_ENTITIES.put( "aelig",     "230" );
  -        LATIN1_ENTITIES.put( "agrave",    "224" );
  -        LATIN1_ENTITIES.put( "aring",     "229" );
           LATIN1_ENTITIES.put( "atilde",    "227" );
           LATIN1_ENTITIES.put( "auml",      "228" );
  +        LATIN1_ENTITIES.put( "aring",     "229" );
  +        LATIN1_ENTITIES.put( "aelig",     "230" );
           LATIN1_ENTITIES.put( "ccedil",    "231" );
  +        LATIN1_ENTITIES.put( "egrave",    "232" );
           LATIN1_ENTITIES.put( "eacute",    "233" );
           LATIN1_ENTITIES.put( "ecirc",     "234" );
  -        LATIN1_ENTITIES.put( "egrave",    "232" );
  -        LATIN1_ENTITIES.put( "eth",       "240" );
           LATIN1_ENTITIES.put( "euml",      "235" );
  +        LATIN1_ENTITIES.put( "igrave",    "236" );
           LATIN1_ENTITIES.put( "iacute",    "237" );
           LATIN1_ENTITIES.put( "icirc",     "238" );
  -        LATIN1_ENTITIES.put( "igrave",    "236" );
           LATIN1_ENTITIES.put( "iuml",      "239" );
  +        LATIN1_ENTITIES.put( "eth",       "240" );
           LATIN1_ENTITIES.put( "ntilde",    "241" );
  +        LATIN1_ENTITIES.put( "ograve",    "242" );
           LATIN1_ENTITIES.put( "oacute",    "243" );
           LATIN1_ENTITIES.put( "ocirc",     "244" );
  -        LATIN1_ENTITIES.put( "ograve",    "242" );
  -        LATIN1_ENTITIES.put( "oslash",    "248" );
           LATIN1_ENTITIES.put( "otilde",    "245" );
           LATIN1_ENTITIES.put( "ouml",      "246" );
  -        LATIN1_ENTITIES.put( "szlig",     "223" );
  -        LATIN1_ENTITIES.put( "thorn",     "254" );
  +        LATIN1_ENTITIES.put( "divide",    "247" );
  +        LATIN1_ENTITIES.put( "oslash",    "248" );
  +        LATIN1_ENTITIES.put( "ugrave",    "249" );
           LATIN1_ENTITIES.put( "uacute",    "250" );
           LATIN1_ENTITIES.put( "ucirc",     "251" );
  -        LATIN1_ENTITIES.put( "ugrave",    "249" );
           LATIN1_ENTITIES.put( "uuml",      "252" );
           LATIN1_ENTITIES.put( "yacute",    "253" );
  +        LATIN1_ENTITIES.put( "thorn",     "254" );
           LATIN1_ENTITIES.put( "yuml",      "255" );
   
       }
  
  
  
  1.19      +14 -6     jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/locate/FeedLocator.java
  
  Index: FeedLocator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/locate/FeedLocator.java,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- FeedLocator.java	31 Aug 2004 23:56:14 -0000	1.18
  +++ FeedLocator.java	2 Sep 2004 00:36:25 -0000	1.19
  @@ -22,6 +22,8 @@
   
   import java.util.*;
   
  +import org.apache.log4j.Logger;
  +
   /**
    * Method to determine feed URLs from a given resource URI.  For example,
    * you would pass in the URI:
  @@ -41,6 +43,8 @@
    * @author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
    */
   public class FeedLocator {
  +
  +    private static Logger log = Logger.getLogger( FeedLocator.class );
       
       /**
        * Locate all feeds within the given resource.  The resource should be a link
  @@ -52,8 +56,7 @@
        * @author <a href="mailto:burton@peerfear.org">Kevin A. Burton</a>
        */
       public static final FeedList locate( String resource ) throws Exception {
  -
  -        //Use my network library when it's migrated into Apache.
  +        // \: Use my network library when it's migrated into Apache.
           
           //fetch content
           ResourceRequest request = ResourceRequestFactory.getResourceRequest( resource );
  @@ -72,18 +75,24 @@
        */
       public static final FeedList locate( String resource, String content ) throws Exception {
   
  +        log.info( "Locating " + resource + "..." );
  +        
           FeedList list = new FeedList();
  -
  +        
  +        log.info( "Using DiscoveryLocator..." );
           DiscoveryLocator.locate( resource, content, list );
   
  +        log.info( "Using LinkLocator..." );
           //this failed... try looking for links
           LinkLocator.locate( resource, content, list );
           
           //this failed... try probe location.  This is more reliable than
           //LinkLocation but requires a few more HTTP gets.
  -        if ( list.size() == 0 )
  +        if ( list.size() == 0 ) {
  +            log.info( "Using ProbeLocator..." );
               ProbeLocator.locate( resource, content, list );
  -        
  +        }
  +            
           return list;
           
       }
  @@ -104,7 +113,6 @@
           //String resource = "http://gonze.com/weblog/";
   
           //String resource = "http://codinginparadise.org/";
  -
   
           //        String resource = "http://bucsfishingreport.com/pMachine/weblog.php";
           
  
  
  
  1.10      +38 -9     jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/locate/ProbeLocator.java
  
  Index: ProbeLocator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/locate/ProbeLocator.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- ProbeLocator.java	31 Aug 2004 23:56:14 -0000	1.9
  +++ ProbeLocator.java	2 Sep 2004 00:36:25 -0000	1.10
  @@ -24,6 +24,8 @@
   import java.util.regex.*;
   import java.net.*;
   
  +import org.apache.log4j.Logger;
  +
   /**
    * Locator which uses Link probing.  It also attempts to determine the type of
    * blog service provider it is dealing with, such as BlogSpot, Blogsxom, etc.,
  @@ -38,6 +40,8 @@
    */
   public class ProbeLocator {
   
  +    private static Logger log = Logger.getLogger( ProbeLocator.class );
  +
       /** If true, then we aggresively probe a site if it doesn't have
        *  autodiscovery.  This includes trying to determine what the blog provider
        *  is, trying individual locations based on a blog provider, and probing
  @@ -84,8 +88,12 @@
            *  provide consistent autodiscovery.
            */
           FeedReference blosxomLocations[] =
  -            { new FeedReference("index.rss20", FeedReference.RSS_MEDIA_TYPE),
  -              new FeedReference("index.rss", FeedReference.RSS_MEDIA_TYPE) };
  +            // there is sometimes an index.rss20 file, but Blosxom has a bug where
  +            // it incorrectly responds to HTTP HEAD requests for that file,
  +            // saying that it exists when it doesn't.  Most sites don't seem
  +            // to have this file so we don't include it here. 
  +            // Brad Neuberg, bkn3@columbia.edu
  +            { new FeedReference("index.rss", FeedReference.RSS_MEDIA_TYPE) };
   
           // Diaryland doesn't offer feeds
           //FeedReference diaryLandLocations[] =       { "" };
  @@ -183,6 +191,7 @@
               if ( probeMapping.containsKey( blogService ) ) {
   
                   mapping = (FeedReference[])probeMapping.get( blogService );
  +                log.info( "mapping = " + mapping );
                   
                   // try out each mapping
                   for (int i = 0; i < mapping.length; i++) {
  @@ -190,9 +199,11 @@
                       
                       // we have to do special probing for Xanga
                       if ( blogService.equals( BlogService.XANGA ) ) {
  -                        pathToTest += getXangaUser(resource);;
  +                        pathToTest += getXangaUser(resource);
                       }
  -                    
  +
  +                    log.info( "pathToTest = " + pathToTest );
  +
                       if ( feedExists( pathToTest ) ) {
                           FeedReference feedReference = new FeedReference( pathToTest,
                                                                            mapping[i].type );
  @@ -235,8 +246,14 @@
                       }
                   }
               }
  +            
  +            log.info( "Using aggresive probing, found the following:" );
  +            log.info( "Blog service: " + blogService );
           }
   
  +        log.info( "List: " + list );
  +        log.info( "RSS feed: " + list.getAdRSSFeed() );
  +        log.info( "Atom feed: " + list.getAdAtomFeed() );
           return list;
   
       }
  @@ -268,7 +285,12 @@
        *  and gets the path necessary to build up a feed, such as 
        *  "http://www.codinginparadise.org/".  Basicly it appends a slash to the end if there
        *  is not one, and removes any file names that might be at the end, such as 
  -     *  "myweblog.php".
  +     *  "myweblog.php".  The one special exception is for some Blosxom blogs,
  +     *  which have things inside of a cgi-script and 'hang' their RSS files
  +     *  off of this cgi-bin.  For example, 
  +     *  http://www.bitbucketheaven.com/cgi-bin/blosxom.cgi has its RSS file
  +     *  at http://www.bitbucketheaven.com/cgi-bin/blosxom.cgi/index.rss, so
  +     *  we must return the blosxom.cgi at the end as well for this method.
        * 
        *  @throws MalformedURLException Thrown if the given resource's URL is incorrectly
        *  formatted.
  @@ -288,8 +310,10 @@
               resource = resource.substring(0, startStripAt);
           }
   
  -        Matcher fileMatcher = patternToStrip.matcher(resource);
  -        resource = fileMatcher.replaceAll("");
  +        if (!resource.endsWith("blosxom.cgi")) {
  +            Matcher fileMatcher = patternToStrip.matcher(resource);
  +            resource = fileMatcher.replaceAll("");
  +        }
       	
           if ( !resource.endsWith( "/" ) ) {
               resource = resource + "/";
  @@ -305,8 +329,13 @@
        *  @author Brad Neuberg, bkn3@columbia.edu
        */
       protected static boolean feedExists(String resource) throws Exception {
  +
  +        log.info( "Inside feedExists, resource = "+resource );
  +
           ResourceRequest request = ResourceRequestFactory.getResourceRequest( resource );
   
  +        log.info( "request = "+request );
  +
           request.setRequestMethod( "HEAD" );
           request.setFollowRedirects( false );
           
  @@ -314,7 +343,7 @@
           request.getContentLength();
           
           long response = request.getResponseCode();
  -        
  +        log.info( "response = " + response );
           return response == 200;
       }
       
  @@ -340,7 +369,7 @@
   
           while ( it.hasNext() ) {
   
  -            System.out.println( it.next() );
  +            log.info( it.next() );
               
           }
           
  
  
  
  1.2       +3 -1      jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/test/TestFeedFilter.java
  
  Index: TestFeedFilter.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/test/TestFeedFilter.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestFeedFilter.java	31 Aug 2004 23:57:31 -0000	1.1
  +++ TestFeedFilter.java	2 Sep 2004 00:36:25 -0000	1.2
  @@ -66,6 +66,8 @@
       
       public void test1() throws Exception {
   
  +        doTest( "file:tests/filter/nbsp-1.xml" );
  +
           doTest( "file:tests/filter/entity-atom-1.xml" );
   
           doTest( "file:tests/filter/prolog-atom-1.xml" );
  
  
  
  1.2       +166 -90   jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/test/TestProbeLocator.java
  
  Index: TestProbeLocator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/feedparser/src/java/org/apache/commons/feedparser/test/TestProbeLocator.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- TestProbeLocator.java	31 Aug 2004 23:57:31 -0000	1.1
  +++ TestProbeLocator.java	2 Sep 2004 00:36:25 -0000	1.2
  @@ -23,6 +23,7 @@
   
   import java.net.*;
   import java.io.*;
  +import org.peerfear.newsmonster.network.*;
   
   /**
    *
  @@ -241,14 +242,88 @@
       }
       
       public void testXanga() throws Exception {
  +
           FeedList list = null;
           String resource = null, content = null;
           BlogService blogService = null;
           FeedReference feeds[] = null;
           FeedReference rssFeed, atomFeed;
           
  +//         // This site should have an RSS feed
  +//         resource = "http://www.xanga.com/home.aspx?user=lithium98";
  +//         content = getContent(resource);
  +//         assertNotNull(content);
  +//         blogService = BlogServiceDiscovery.discover(resource, content);
  +//         assertEquals(blogService, BlogService.XANGA);
  +//         list = new FeedList();
  +//         ProbeLocator.locate(resource, content, list);
  +//         assertEquals(list.size(), 1);
  +//         feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  +//         assertEquals(feeds.length, 1);
  +//         assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
  +//         assertNull(feeds[0].title, null);
  +//         assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  +//         assertEquals(feeds[0].resource, "http://www.xanga.com/rss.aspx?user=lithium98");
  +//         /* test through the FeedLocator */
  +//         list = FeedLocator.locate(resource);
  +//         atomFeed = list.getAdAtomFeed();
  +//         rssFeed = list.getAdRSSFeed();
  +//         assertNull(atomFeed);
  +//         assertNotNull(rssFeed);
  +//         assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  +//         assertEquals(rssFeed.resource, "http://www.xanga.com/rss.aspx?user=lithium98");
  +        
  +//         //  This site should have an RSS feed
  +//         resource = "http://www.xanga.com/home.aspx?user=ChUnSA_86";
  +//         content = getContent(resource);
  +//         assertNotNull(content);
  +//         blogService = BlogServiceDiscovery.discover(resource, content);
  +//         assertEquals(blogService, BlogService.XANGA);
  +//         list = new FeedList();
  +//         ProbeLocator.locate(resource, content, list);
  +//         assertEquals(list.size(), 1);
  +//         feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  +//         assertEquals(feeds.length, 1);
  +//         assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
  +//         assertNull(feeds[0].title, null);
  +//         assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  +//         assertEquals(feeds[0].resource, "http://www.xanga.com/rss.aspx?user=ChUnSA_86");
  +//         /* test through the FeedLocator */
  +//         list = FeedLocator.locate(resource);
  +//         atomFeed = list.getAdAtomFeed();
  +//         rssFeed = list.getAdRSSFeed();
  +//         assertNull(atomFeed);
  +//         assertNotNull(rssFeed);
  +//         assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  +//         assertEquals(rssFeed.resource, "http://www.xanga.com/rss.aspx?user=ChUnSA_86");
  +        
  +//         //  This site should have an RSS feed
  +//         resource = "http://www.xanga.com/home.aspx?user=wdfphillz";
  +//         content = getContent(resource);
  +//         assertNotNull(content);
  +//         blogService = BlogServiceDiscovery.discover(resource, content);
  +//         assertEquals(blogService, BlogService.XANGA);
  +//         list = new FeedList();
  +//         ProbeLocator.locate(resource, content, list);
  +//         assertEquals(list.size(), 1);
  +//         feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  +//         assertEquals(feeds.length, 1);
  +//         assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
  +//         assertNull(feeds[0].title, null);
  +//         assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  +//         assertEquals(feeds[0].resource, "http://www.xanga.com/rss.aspx?user=wdfphillz");
  +//         /* test through the FeedLocator */
  +//         list = FeedLocator.locate(resource);
  +//         atomFeed = list.getAdAtomFeed();
  +//         rssFeed = list.getAdRSSFeed();
  +//         assertNull(atomFeed);
  +//         assertNotNull(rssFeed);
  +//         assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  +//         assertEquals(rssFeed.resource, "http://www.xanga.com/rss.aspx?user=wdfphillz");
  +        
           // This site should have an RSS feed
  -        resource = "http://www.xanga.com/home.aspx?user=lithium98";
  +
  +        resource = "http://xanga.com/home.aspx?user=joe";
           content = getContent(resource);
           assertNotNull(content);
           blogService = BlogServiceDiscovery.discover(resource, content);
  @@ -261,7 +336,7 @@
           assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
           assertNull(feeds[0].title, null);
           assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[0].resource, "http://www.xanga.com/rss.aspx?user=lithium98");
  +        assertEquals(feeds[0].resource, "http://xanga.com/rss.aspx?user=joe");
           /* test through the FeedLocator */
           list = FeedLocator.locate(resource);
           atomFeed = list.getAdAtomFeed();
  @@ -269,57 +344,64 @@
           assertNull(atomFeed);
           assertNotNull(rssFeed);
           assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(rssFeed.resource, "http://www.xanga.com/rss.aspx?user=lithium98");
  +        assertEquals(rssFeed.resource, "http://xanga.com/rss.aspx?user=joe");
  +    }
  +
  +    public FeedList test( String resource,
  +                          BlogService service,
  +                          int numFeeds ) throws Exception {
  +
  +        ResourceRequest request = ResourceRequestFactory.getResourceRequest( resource );
  +
  +        String content = request.getInputStreamAsString();
  +        resource = request.getResource();
  +
  +        System.out.println( "resource: " + resource );
           
  -        //  This site should have an RSS feed
  -        resource = "http://www.xanga.com/home.aspx?user=ChUnSA_86";
  -        content = getContent(resource);
           assertNotNull(content);
  -        blogService = BlogServiceDiscovery.discover(resource, content);
  -        assertEquals(blogService, BlogService.XANGA);
  -        list = new FeedList();
  +
  +        BlogService s = BlogServiceDiscovery.discover( resource, content );
  +
  +        assertEquals( s, service );
  +
  +        FeedList list = new FeedList();
           ProbeLocator.locate(resource, content, list);
  -        assertEquals(list.size(), 1);
  -        feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  -        assertEquals(feeds.length, 1);
  -        assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
  -        assertNull(feeds[0].title, null);
  -        assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[0].resource, "http://www.xanga.com/rss.aspx?user=ChUnSA_86");
  -        /* test through the FeedLocator */
  -        list = FeedLocator.locate(resource);
  -        atomFeed = list.getAdAtomFeed();
  -        rssFeed = list.getAdRSSFeed();
  -        assertNull(atomFeed);
  -        assertNotNull(rssFeed);
  -        assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(rssFeed.resource, "http://www.xanga.com/rss.aspx?user=ChUnSA_86");
  +
  +        assertEquals( list.size(), numFeeds );
  +
  +        System.out.println( "list: " + list );
  +        
  +        return list;
           
  -        //  This site should have an RSS feed
  -        resource = "http://www.xanga.com/home.aspx?user=wdfphillz";
  -        content = getContent(resource);
  -        assertNotNull(content);
  -        blogService = BlogServiceDiscovery.discover(resource, content);
  -        assertEquals(blogService, BlogService.XANGA);
  -        list = new FeedList();
  -        ProbeLocator.locate(resource, content, list);
  -        assertEquals(list.size(), 1);
  -        feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  -        assertEquals(feeds.length, 1);
  -        assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
  -        assertNull(feeds[0].title, null);
  -        assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[0].resource, "http://www.xanga.com/rss.aspx?user=wdfphillz");
  -        /* test through the FeedLocator */
  -        list = FeedLocator.locate(resource);
  -        atomFeed = list.getAdAtomFeed();
  -        rssFeed = list.getAdRSSFeed();
  -        assertNull(atomFeed);
  -        assertNotNull(rssFeed);
  -        assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(rssFeed.resource, "http://www.xanga.com/rss.aspx?user=wdfphillz");
       }
  -    
  +
  +    public static void main( String[] args ) throws Exception {
  +        
  +        TestProbeLocator test = new TestProbeLocator( null );
  +
  +        test.test( "http://xanga.com/home.aspx?user=joe",
  +                   BlogService.XANGA,
  +                   1 );
  +
  +        test.test( "http://www.xanga.com/home.aspx?user=joe",
  +                   BlogService.XANGA,
  +                   1 );
  +
  +        /*test.testBlogger();
  +        test.testLiveJournal();
  +        test.testDiaryLand();
  +        test.testMovableType();*/
  +        //test.testXanga();
  +        /*test.testWordPress();
  +        test.testAOLJournal();
  +        test.testTypePad();
  +        test.testGreyMatter();
  +        test.testPMachine();
  +        test.testBlosxom();
  +        test.testRadioUserland();
  +        test.testTextPattern();*/
  +    }
  +
       public void testWordPress() throws Exception {
           FeedList list = null;
           String resource = null, content = null;
  @@ -691,17 +773,13 @@
           assertEquals(blogService, BlogService.BLOSXOM);
           list = new FeedList();
           ProbeLocator.locate(resource, content, list);
  -        assertEquals(list.size(), 2);
  +        assertEquals(list.size(), 1);
           feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  -        assertEquals(feeds.length, 2);
  +        assertEquals(feeds.length, 1);
           assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
           assertNull(feeds[0].title, null);
           assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[0].resource, resource + "index.rss20");
  -        assertEquals(feeds[1].method, FeedReference.METHOD_PROBE_DISCOVERY);
  -        assertNull(feeds[1].title, null);
  -        assertEquals(feeds[1].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[1].resource, resource + "index.rss");
  +        assertEquals(feeds[0].resource, resource + "index.rss");
           /* test through the FeedLocator */
           list = FeedLocator.locate(resource);
           atomFeed = list.getAdAtomFeed();
  @@ -709,7 +787,7 @@
           assertNull(atomFeed);
           assertNotNull(rssFeed);
           assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(rssFeed.resource, resource + "index.rss20");
  +        assertEquals(rssFeed.resource, resource + "index.rss");
           
           // This site should have a single RSS feed
           resource = "http://www.foobargeek.com/";
  @@ -719,17 +797,13 @@
           assertEquals(blogService, BlogService.BLOSXOM);
           list = new FeedList();
           ProbeLocator.locate(resource, content, list);
  -        assertEquals(list.size(), 2);
  +        assertEquals(list.size(), 1);
           feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  -        assertEquals(feeds.length, 2);
  +        assertEquals(feeds.length, 1);
           assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
           assertNull(feeds[0].title, null);
           assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[0].resource, resource + "index.rss20");
  -        assertEquals(feeds[1].method, FeedReference.METHOD_PROBE_DISCOVERY);
  -        assertNull(feeds[1].title, null);
  -        assertEquals(feeds[1].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[1].resource, resource + "index.rss");
  +        assertEquals(feeds[0].resource, resource + "index.rss");
           /* test through the FeedLocator */
           list = FeedLocator.locate(resource);
           atomFeed = list.getAdAtomFeed();
  @@ -747,17 +821,13 @@
           assertEquals(blogService, BlogService.BLOSXOM);
           list = new FeedList();
           ProbeLocator.locate(resource, content, list);
  -        assertEquals(list.size(), 2);
  +        assertEquals(list.size(), 1);
           feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  -        assertEquals(feeds.length, 2);
  +        assertEquals(feeds.length, 1);
           assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
           assertNull(feeds[0].title, null);
           assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[0].resource, resource + "index.rss20");
  -        assertEquals(feeds[1].method, FeedReference.METHOD_PROBE_DISCOVERY);
  -        assertNull(feeds[1].title, null);
  -        assertEquals(feeds[1].type, FeedReference.RSS_MEDIA_TYPE);
  -        assertEquals(feeds[1].resource, resource + "index.rss");
  +        assertEquals(feeds[0].resource, resource + "index.rss");
           /* test through the FeedLocator */
           list = FeedLocator.locate(resource);
           atomFeed = list.getAdAtomFeed();
  @@ -767,6 +837,31 @@
           assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
           // gets a different location
           assertEquals(rssFeed.resource, "http://www.pipetree.com/qmacro/xml");
  +        
  +        // This site should have a single RSS feed
  +        resource = "http://www.bitbucketheaven.com/cgi-bin/blosxom.cgi";
  +        content = getContent(resource);
  +        assertNotNull(content);
  +        blogService = BlogServiceDiscovery.discover(resource, content);
  +        assertEquals(blogService, BlogService.BLOSXOM);
  +        list = new FeedList();
  +        ProbeLocator.locate(resource, content, list);
  +        assertEquals(list.size(), 1);
  +        feeds = (FeedReference[])list.toArray(new FeedReference[list.size()]);
  +        assertEquals(feeds.length, 1);
  +        assertEquals(feeds[0].method, FeedReference.METHOD_PROBE_DISCOVERY);
  +        assertNull(feeds[0].title, null);
  +        assertEquals(feeds[0].type, FeedReference.RSS_MEDIA_TYPE);
  +        assertEquals(feeds[0].resource, resource + "/index.rss");
  +        /* test through the FeedLocator */
  +        list = FeedLocator.locate(resource);
  +        atomFeed = list.getAdAtomFeed();
  +        rssFeed = list.getAdRSSFeed();
  +        assertNull(atomFeed);
  +        assertNotNull(rssFeed);
  +        assertEquals(rssFeed.type, FeedReference.RSS_MEDIA_TYPE);
  +        // gets a different location
  +        assertEquals(rssFeed.resource, resource + "/index.rss");
       }
       
       public void testRadioUserland() throws Exception {
  @@ -905,25 +1000,6 @@
           }
           
           return results.toString();
  -    }
  -
  -    public static void main( String[] args ) throws Exception {
  -        
  -        TestProbeLocator test = new TestProbeLocator( null );
  -        
  -        test.testBlogger();
  -        test.testLiveJournal();
  -        test.testDiaryLand();
  -        test.testMovableType();
  -        test.testXanga();
  -        test.testWordPress();
  -        test.testAOLJournal();
  -        test.testTypePad();
  -        test.testGreyMatter();
  -        test.testPMachine();
  -        test.testBlosxom();
  -        test.testRadioUserland();
  -        test.testTextPattern();
       }
   
   }
  
  
  
  1.1                  jakarta-commons-sandbox/feedparser/tests/filter/nbsp-1.xml
  
  Index: nbsp-1.xml
  ===================================================================
  <?xml version="1.0"?>
  
  <!-- name="generator" content="blosxom/2.0" -->
  
  <rss version="0.91">
    <channel>
      <title>EEK Speaks   </title>
      <link>http://www.eekim.com/blog</link>
      <description>Eugene Eric Kim's worklog on collaboration and communities.</description>
      <language>en</language>
  
    <item>
      <title>Self-Organizing Collaboration at the World Trade Center Ruins</title>
      <link>http://www.eekim.com/blog/2004/08/31#americanground</link>
      <description>
  
          &nbsp;
  
  &lt;p&gt;&lt;a name=&quot;nid2AW&quot; id=&quot;nid2AW&quot;&gt;&lt;/a&gt;In early 2003, I had lunch with &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?RichardGabriel&quot; class=&quot;wikiword&quot;&gt;RichardGabriel&lt;/a&gt; for the first time, and I explained to him my desire to uncover common collaborative patterns across different disciplines, starting with &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?OpenSource&quot; class=&quot;wikiword&quot;&gt;OpenSource&lt;/a&gt; communities.  Richard recommended that I read &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?WilliamLangewiesche&quot; class=&quot;wikiword&quot;&gt;WilliamLangewiesche&lt;/a&gt;'s &lt;i&gt;American Ground: Unbuilding the World Trade Center&lt;/i&gt;, a book that described the dismantling of the ruins and the self-organizing process that emerged. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;2AW&quot; href=&quot;http://www.eekim.com/blog/2004/08/31/americanground#nid2AW&quot;&gt;(2AW)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid2AX&quot; id=&quot;nid2AX&quot;&gt;&lt;/a&gt;Over a year later, I finally got around to following Richard's advice, and I'm
  glad that I did.  Langewiesche's book is a gripping, thoughtful account of
  what happened at the &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?WorldTradeCenter&quot; class=&quot;wikiword&quot;&gt;WorldTradeCenter&lt;/a&gt; site immediately following 9/11. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;2AX&quot; href=&quot;http://www.eekim.com/blog/2004/08/31/americanground#nid2AX&quot;&gt;(2AX)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;i&gt;&lt;a href=&quot;http://www.eekim.com/blog/2004/08/31/americanground&quot; class=&quot;extlink&quot;&gt;See more....&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;
  </description>
    </item>
    <item>
      <title>TPVortex: Intro, Call For Help</title>
      <link>http://www.eekim.com/blog/2004/08/12#tpvortex-cfh</link>
      <description>&lt;p&gt;&lt;a name=&quot;nid247&quot; id=&quot;nid247&quot;&gt;&lt;/a&gt;In my &lt;a href=&quot;http://www.blueoxen.org/papers/0000D/&quot; class=&quot;extlink&quot;&gt;manifesto for
  collaborative tools&lt;/a&gt;, I &lt;a href=&quot;http://www.blueoxen.org/papers/0000D/#nid3M6&quot; class=&quot;extlink&quot;&gt;cited&lt;/a&gt; &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt; as an example of a common, yet oft-overlooked
  conceptual construct in collaborative tools.  Those who know me well
  know that my strategy for implementing some of &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?DougEngelbart&quot; class=&quot;wikiword&quot;&gt;DougEngelbart&lt;/a&gt;'s ideas
  (which I crafted over three years ago) has always been to create
  simple, concrete tools that could easily be shoehorned into existing
  applications.  The plan was to start with &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?GranularAddressability&quot; class=&quot;wikiword&quot;&gt;GranularAddressability&lt;/a&gt;
  (&lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleNumbers&quot; class=&quot;wikiword&quot;&gt;PurpleNumbers&lt;/a&gt;), then move on to &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt;. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;247&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid247&quot;&gt;(247)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid248&quot; id=&quot;nid248&quot;&gt;&lt;/a&gt;For a number of reasons, now seems to be the right time for me to
  start shifting my technical focus to &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt;.  The strategy for
  doing this is to implement a generic, &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?OpenSource&quot; class=&quot;wikiword&quot;&gt;OpenSource&lt;/a&gt;, &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLink&quot; class=&quot;wikiword&quot;&gt;BackLink&lt;/a&gt; database
  (dubbed &lt;a href=&quot;http://www.eekim.com/software/tpvortex/&quot; class=&quot;extlink&quot;&gt;&quot;TPVortex&quot;&lt;/a&gt; and
  integrate it into several existing tools: &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt;, blosxom,
  &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?MovableType&quot; class=&quot;wikiword&quot;&gt;MovableType&lt;/a&gt;, &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?MHonArc&quot; class=&quot;wikiword&quot;&gt;MHonArc&lt;/a&gt;.  I'm looking for folks who might be interested
  in participating in this project. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;248&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid248&quot;&gt;(248)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid249&quot; id=&quot;nid249&quot;&gt;&lt;/a&gt;The motivation for such a tool is straightforward: &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt; provide
  useful, contextual information.  Most Wikis already implement
  &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt;.  Some of them display &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt; on the main page, which is
  the correct behavior.  Others (including &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt;) do not.  In order
  to implement this properly, you need a &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLink&quot; class=&quot;wikiword&quot;&gt;BackLink&lt;/a&gt; database. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;249&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid249&quot;&gt;(249)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid24A&quot; id=&quot;nid24A&quot;&gt;&lt;/a&gt;Once you have a &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLink&quot; class=&quot;wikiword&quot;&gt;BackLink&lt;/a&gt; database, you might as well use it for other
  applications besides Wikis, such as blogs.  We have this integration
  in &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt; (see &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?WikisAsTopicMaps&quot; class=&quot;wikiword&quot;&gt;WikisAsTopicMaps&lt;/a&gt; for the resulting benefits), but
  again, it would be much nicer to display the &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLinks&quot; class=&quot;wikiword&quot;&gt;BackLinks&lt;/a&gt; on the page
  itself rather than requiring a person to click on a link to see them.
  In order to implement this properly, the database has to store
  document metadata, such as title and author, not just the &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BackLink&quot; class=&quot;wikiword&quot;&gt;BackLink&lt;/a&gt;.
  For this reason, I think that TPVortex should use an RDF database on
  the backend. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;24A&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid24A&quot;&gt;(24A)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid24B&quot; id=&quot;nid24B&quot;&gt;&lt;/a&gt;Other thoughts: &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;24B&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid24B&quot;&gt;(24B)&lt;/a&gt;&lt;/p&gt;
  &lt;ul&gt;
  &lt;li&gt;&lt;a name=&quot;nid24C&quot; id=&quot;nid24C&quot;&gt;&lt;/a&gt;Use &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?TrackBack&quot; class=&quot;wikiword&quot;&gt;TrackBack&lt;/a&gt; or &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PingBack&quot; class=&quot;wikiword&quot;&gt;PingBack&lt;/a&gt; as the protocol for updating the database. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;24C&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid24C&quot;&gt;(24C)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a name=&quot;nid24D&quot; id=&quot;nid24D&quot;&gt;&lt;/a&gt;Use &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?IdentityCommons&quot; class=&quot;wikiword&quot;&gt;IdentityCommons&lt;/a&gt; i-names for identification and authentication. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;24D&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid24D&quot;&gt;(24D)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a name=&quot;nid24E&quot; id=&quot;nid24E&quot;&gt;&lt;/a&gt;Implement stubs in multiple languages. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;24E&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid24E&quot;&gt;(24E)&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;a name=&quot;nid24F&quot; id=&quot;nid24F&quot;&gt;&lt;/a&gt;I welcome help in all forms -- comments, critiques, and especially
  coding.  I've set up a Wiki page at the &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?CollaborationCollaboratory&quot; class=&quot;wikiword&quot;&gt;CollaborationCollaboratory&lt;/a&gt; --
  &lt;a href=&quot;http://collab.blueoxen.net/cgi-bin/wiki.pl?TpVortex&quot; class=&quot;interwiki&quot;&gt;Collab:TpVortex&lt;/a&gt; -- to serve as the center of design discussions.  If
  you're interested in contributing or commenting, please do it there.
  Feel free to drop me an email as well. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;24F&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/tpvortex-cfh#nid24F&quot;&gt;(24F)&lt;/a&gt;&lt;/p&gt;
  </description>
    </item>
    <item>
      <title>Wiki Linking Using Ontologies</title>
      <link>http://www.eekim.com/blog/2004/08/12#ontologywiki</link>
      <description>&lt;p&gt;&lt;a name=&quot;nid242&quot; id=&quot;nid242&quot;&gt;&lt;/a&gt;Last weekend, I posted some notes on &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?MarkupFreeAutoLinkingWiki&quot; class=&quot;wikiword&quot;&gt;MarkupFreeAutoLinkingWiki&lt;/a&gt;.  The
  idea is that instead of relying on user syntax for identifying and
  linking to Wiki pages, the Wiki could do a linguistic scan of the text
  and link words based on a site-specific ontology. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;242&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/ontologywiki#nid242&quot;&gt;(242)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid243&quot; id=&quot;nid243&quot;&gt;&lt;/a&gt;I posted my notes mainly as a &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?BlueSkyIdea&quot; class=&quot;wikiword&quot;&gt;BlueSkyIdea&lt;/a&gt;, but it ended up generating
  a ton of
  &lt;a href=&quot;http://collab.blueoxen.net/forums/tools-yak/2004-08/msg00005.html&quot; class=&quot;extlink&quot;&gt;discussion&lt;/a&gt; at the &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?CollaborationCollaboratory&quot; class=&quot;wikiword&quot;&gt;CollaborationCollaboratory&lt;/a&gt;.  That discussion
  made me realize that this idea may not be all that blue sky after all,
  and that -- given the proper &lt;a href=&quot;http://purplewiki.blueoxen.net/cgi-bin/wiki.pl?DataBase&quot; class=&quot;interwiki&quot;&gt;PurpleWiki:DataBase&lt;/a&gt; design -- we're not
  all that far off from implementing something like this in &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt;. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;243&quot; href=&quot;http://www.eekim.com/blog/2004/08/12/ontologywiki#nid243&quot;&gt;(243)&lt;/a&gt;&lt;/p&gt;
  </description>
    </item>
    <item>
      <title>PurpleWiki 0.94 Released</title>
      <link>http://www.eekim.com/blog/2004/08/11#pw-094</link>
      <description>&lt;p&gt;&lt;a name=&quot;nid23X&quot; id=&quot;nid23X&quot;&gt;&lt;/a&gt;The latest release of &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt; has mucho changes.  The most visible
  is customizable look-and-feel using templates (see
  &lt;a href=&quot;http://purplewiki.blueoxen.net/cgi-bin/wiki.pl?Templates&quot; class=&quot;interwiki&quot;&gt;PurpleWiki:Templates),&lt;/a&gt; but there are a slew of other important changes
  as well. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23X&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/pw-094#nid23X&quot;&gt;(23X)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23Y&quot; id=&quot;nid23Y&quot;&gt;&lt;/a&gt;Thanks to a growing user base (which included many folks who tested
  the beta code in live environments), many bugs have been eradicated.
  The code has advanced to the point where there's only one significant
  chunk of &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?UseModWiki&quot; class=&quot;wikiword&quot;&gt;UseModWiki&lt;/a&gt; code left -- the database, which is on our list of
  things to replace next. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23Y&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/pw-094#nid23Y&quot;&gt;(23Y)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23Z&quot; id=&quot;nid23Z&quot;&gt;&lt;/a&gt;All this means two things: First, &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt; is becoming a very good,
  very stable, production-quality Wiki.  It's not quite there yet -- We
  could use a better installation script and more documentation, and
  there's still some refactoring that needs to be done -- but it's
  close.  Second, with a lot of the grunt work out of the way, folks
  hacking on &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt; can start refocusing on the more interesting
  features -- &lt;a href=&quot;http://purple.blueoxen.net/cgi-bin/wiki.pl?DistributedPurpleNumbers&quot; class=&quot;interwiki&quot;&gt;Purple:DistributedPurpleNumbers,&lt;/a&gt; &lt;a href=&quot;http://purplewiki.blueoxen.net/cgi-bin/wiki.pl?TransClusion&quot; class=&quot;interwiki&quot;&gt;PurpleWiki:TransClusion,&lt;/a&gt;
  etc.  You're going to start seeing a lot of cool stuff. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23Z&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/pw-094#nid23Z&quot;&gt;(23Z)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid240&quot; id=&quot;nid240&quot;&gt;&lt;/a&gt;One of these cool features is support for &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?IdentityCommons&quot; class=&quot;wikiword&quot;&gt;IdentityCommons&lt;/a&gt;'s i-names
  (see &lt;a href=&quot;http://purplewiki.blueoxen.net/cgi-bin/wiki.pl?INames&quot; class=&quot;interwiki&quot;&gt;PurpleWiki:INames).&lt;/a&gt;  &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?PurpleWiki&quot; class=&quot;wikiword&quot;&gt;PurpleWiki&lt;/a&gt; is the first publically available
  tool to support this important new technology. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;240&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/pw-094#nid240&quot;&gt;(240)&lt;/a&gt;&lt;/p&gt;
  </description>
    </item>
    <item>
      <title>Amber Alert in Action</title>
      <link>http://www.eekim.com/blog/2004/08/11#amberalert</link>
      <description>&lt;p&gt;&lt;a name=&quot;nid23L&quot; id=&quot;nid23L&quot;&gt;&lt;/a&gt;On Monday, I found myself in the middle of a car chase.  More
  importantly, I saw &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?AmberAlert&quot; class=&quot;wikiword&quot;&gt;AmberAlert&lt;/a&gt; working first-hand. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23L&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/amberalert#nid23L&quot;&gt;(23L)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23M&quot; id=&quot;nid23M&quot;&gt;&lt;/a&gt;I was driving south on 101 to Campbell from RedwoodCity&lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?action=edit&amp;amp;id=RedwoodCity&quot; class=&quot;wikiword&quot;&gt;?&lt;/a&gt; for lunch and
  a slew of meetings.  As I drove through &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?MountainView&quot; class=&quot;wikiword&quot;&gt;MountainView&lt;/a&gt;, I saw an
  &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?AmberAlert&quot; class=&quot;wikiword&quot;&gt;AmberAlert&lt;/a&gt; on an electronic billboard, which said that a girl had been
  abducted in a blue Land Rover.  I noted the first few numbers of the
  license plate in my head, then thought about how great &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?AmberAlert&quot; class=&quot;wikiword&quot;&gt;AmberAlert&lt;/a&gt; was,
  and how interesting it would be to see it in action.  I was thinking
  about how &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?AmberAlert&quot; class=&quot;wikiword&quot;&gt;AmberAlert&lt;/a&gt; could potentially use InstantMessenging&lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?action=edit&amp;amp;id=InstantMessenging&quot; class=&quot;wikiword&quot;&gt;?&lt;/a&gt; in cell
  phones when I saw the second notice on the sign at &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?GreatAmerica&quot; class=&quot;wikiword&quot;&gt;GreatAmerica&lt;/a&gt; in
  SantaClara&lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?action=edit&amp;amp;id=SantaClara&quot; class=&quot;wikiword&quot;&gt;?&lt;/a&gt;. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23M&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/amberalert#nid23M&quot;&gt;(23M)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23N&quot; id=&quot;nid23N&quot;&gt;&lt;/a&gt;In SanJose&lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?action=edit&amp;amp;id=SanJose&quot; class=&quot;wikiword&quot;&gt;?&lt;/a&gt;, I merged onto 17 towards Campbell, and a few minutes
  later, I saw flashing lights in my mirror.  I was running a bit late
  for my lunch appointment, so I glanced at my speedometer to see if I
  were in trouble, and to my relief, I discovered that -- thanks to
  traffic -- I was right at 65 miles per hour. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23N&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/amberalert#nid23N&quot;&gt;(23N)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23O&quot; id=&quot;nid23O&quot;&gt;&lt;/a&gt;Checking my mirrors again, I noticed the blue SUV behind me change to
  the fast lane.  I remember thinking, &quot;That's strange.  Makes more
  sense to switch into the slow lane.&quot;  Yes, I can be slow at times.  As
  the SUV zoomed past me, I noticed &quot;Land Rover&quot; on the tire cover and
  recognized the first few letters of the license plate.  The three
  police cars in pursuit confirmed what had slowly dawned on me.  That
  was the kidnapper. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23O&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/amberalert#nid23O&quot;&gt;(23O)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23P&quot; id=&quot;nid23P&quot;&gt;&lt;/a&gt;I fully realize that if I were truly cool, I would have captured the
  chase on my cell phone camera and moblogged it immediately.  Folks
  would have seen the chase snapshot live, rather than having to wait
  for this account two days later.  In my defense, I was calm enough to
  do it.  As I watched all of this unfold, I actually called my friend
  and told him that I was in the middle of a car chase and would be a
  few minutes late.  Unfortunately, my cell phone is four years old.  It
  doesn't have a camera, and it won't connect to the Internet. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23P&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/amberalert#nid23P&quot;&gt;(23P)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid23Q&quot; id=&quot;nid23Q&quot;&gt;&lt;/a&gt;I can happily report that the police did eventually
  &lt;a href=&quot;http://sfgate.com/cgi-bin/article.cgi?f=/c/a/2004/08/10/ABDUCT.TMP&amp;amp;nl=top&quot; class=&quot;extlink&quot;&gt;catch&lt;/a&gt; the culprit (in &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?SanLuisObispo&quot; class=&quot;wikiword&quot;&gt;SanLuisObispo&lt;/a&gt;, about five hours south of
  &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?SanFrancisco&quot; class=&quot;wikiword&quot;&gt;SanFrancisco&lt;/a&gt;), and the girl is safe and sound. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;23Q&quot; href=&quot;http://www.eekim.com/blog/2004/08/11/amberalert#nid23Q&quot;&gt;(23Q)&lt;/a&gt;&lt;/p&gt;
  </description>
    </item>
    <item>
      <title>Precinct Walking in Mountain View</title>
      <link>http://www.eekim.com/blog/2004/08/08#precinctwalking</link>
      <description>&lt;p&gt;&lt;a name=&quot;nid22Z&quot; id=&quot;nid22Z&quot;&gt;&lt;/a&gt;November is just around the corner, and like many folks who care about
  the upcoming election, I spent this gorgeous day campaigning... for my
  friend, &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?StephanieSchaaf&quot; class=&quot;wikiword&quot;&gt;StephanieSchaaf&lt;/a&gt;.  Steph is &lt;a href=&quot;http://www.stephanieschaaf.com/&quot; class=&quot;extlink&quot;&gt;running&lt;/a&gt; for city council in &lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?MountainView&quot; class=&quot;wikiword&quot;&gt;MountainView&lt;/a&gt;.  She's very active
  politically, especially about environmental issues, and will make a
  great city council person.  She's also running a very tight ship with
  her campaign, and has a large, well-organized team of active
  volunteers. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;22Z&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid22Z&quot;&gt;(22Z)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid230&quot; id=&quot;nid230&quot;&gt;&lt;/a&gt;This was my first experience precinct walking, and it brought back
  mixed memories of selling candy and gift wrap door-to-door for
  elementary school fundraisers.  Each of us had a list of registered
  voters broken down by street.  The goal was to visit as many of these
  voters as humanly possible, and to tell them about Steph and give them
  literature.  It was hard and slow work.  I'm in decent shape, and my
  recent &lt;a href=&quot;http://www.eekim.com/blog/2004/07/11/midwest20040710&quot; class=&quot;extlink&quot;&gt;travels&lt;/a&gt;
  left me conditioned to the heat (about 90 degrees today, with low
  humidity), but even so, I only managed to tackle 95 houses in about
  three hours.  There are about 35,000 registered voters in Mountain
  View.  The lesson?  You can't visit them all. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;230&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid230&quot;&gt;(230)&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;&lt;a name=&quot;nid231&quot; id=&quot;nid231&quot;&gt;&lt;/a&gt;I enjoyed the experience more than I expected.  It was great exploring
  the neighborhoods and interacting with the residents, even if most of
  those conversations were thirty seconds at most.  The few blocks that
  I walked were diverse ethnically and economically, which was nice to
  see.  My day broke down as follows: &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;231&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid231&quot;&gt;(231)&lt;/a&gt;&lt;/p&gt;
  &lt;ul&gt;
  &lt;li&gt;&lt;a name=&quot;nid232&quot; id=&quot;nid232&quot;&gt;&lt;/a&gt;Visited 95 homes. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;232&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid232&quot;&gt;(232)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a name=&quot;nid233&quot; id=&quot;nid233&quot;&gt;&lt;/a&gt;39 people were home. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;233&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid233&quot;&gt;(233)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a name=&quot;nid234&quot; id=&quot;nid234&quot;&gt;&lt;/a&gt;6 people refused to talk to me. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;234&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid234&quot;&gt;(234)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a name=&quot;nid235&quot; id=&quot;nid235&quot;&gt;&lt;/a&gt;2 people asked questions. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;235&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid235&quot;&gt;(235)&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;&lt;a name=&quot;nid236&quot; id=&quot;nid236&quot;&gt;&lt;/a&gt;These numbers made me wonder how much of an impact I made.  Both Steph
  and her boyfriend, RafaelReyes&lt;a href=&quot;http://www.eekim.com/cgi-bin/wiki.pl?action=edit&amp;amp;id=RafaelReyes&quot; class=&quot;wikiword&quot;&gt;?&lt;/a&gt;, who's also quite active politically,
  insisted that precinct walking is extremely important in local
  elections, and that the face-to-face interaction -- brief as it is --
  leaves strong impressions on voters.  The nice thing about elections
  is that the precinct breakdowns will quantitatively show the impact
  that we had. &amp;nbsp;&amp;nbsp; &lt;a class=&quot;nid&quot; title=&quot;236&quot; href=&quot;http://www.eekim.com/blog/2004/08/08/precinctwalking#nid236&quot;&gt;(236)&lt;/a&gt;&lt;/p&gt;
  </description>
    </item>
    </channel>
  </rss>
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message