001    /*
002     * Copyright 1999,2004 The Apache Software Foundation.
003     * 
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     * 
008     *      http://www.apache.org/licenses/LICENSE-2.0
009     * 
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.apache.commons.feedparser;
018    
019    import java.util.Iterator;
020    import java.util.List;
021    
022    import org.jaxen.jdom.JDOMXPath;
023    import org.jdom.Attribute;
024    import org.jdom.Element;
025    import org.jdom.Namespace;
026    
027    /**
028     * Handles parsing FOAF.
029     *
030     * @author <a href="mailto:burton@apache.org">Kevin A. Burton (burtonator)</a>
031     * @version $Id: FOAFFeedParser.java 373614 2006-01-30 22:31:21Z mvdb $
032     */
033    public class FOAFFeedParser {
034    
035        /**
036         * Parse this feed.
037         *
038         * 
039         */
040        public static void parse( FeedParserListener listener,
041                                  org.jdom.Document doc ) throws Exception {
042    
043            try {
044                    
045                FeedParserState state = new FeedParserState();
046    
047                FeedVersion v = new FeedVersion();
048                v.isFOAF = true;
049                listener.onFeedVersion( v );
050    
051                listener.init();
052    
053                FOAFFeedParserListener flistener = null;
054    
055                if ( listener instanceof FOAFFeedParserListener )
056                    flistener = (FOAFFeedParserListener)listener;
057    
058                //this should be the root directory.
059                JDOMXPath xpath = new JDOMXPath( "/rdf:RDF/foaf:Person" );
060                xpath.setNamespaceContext( NS.context );
061                
062                Element person = (Element)xpath.selectSingleNode( doc );
063    
064                String name = RSSFeedParser.getChildElementTextByName( state, "name" );
065    
066                String homepage = getAttributeValue( state,
067                                                     "homepage", NS.FOAF,
068                                                     "resource", NS.RDF );
069    
070                if ( flistener != null )
071                    flistener.onPerson( state, name );
072                
073                xpath = new JDOMXPath( "foaf:knows" );
074    
075                xpath.setNamespaceContext( NS.context );
076    
077                List list = xpath.selectNodes( person );
078                Iterator i = list.iterator();
079    
080                while ( i.hasNext() ) {
081    
082                    Element knows = (Element)i.next();
083    
084                    Element currentPerson = knows.getChild( "Person", NS.FOAF );
085                    
086                    state.current = currentPerson;
087                    
088                    String title = RSSFeedParser.getChildElementTextByName( state, "name" );
089    
090                    String seeAlso = getAttributeValue( state,
091                                                        "seeAlso", NS.RDFS,
092                                                        "resource", NS.RDF );
093    
094                    homepage = getAttributeValue( state,
095                                                  "homepage", NS.FOAF,
096                                                  "resource", NS.RDF );
097    
098                    System.out.println( "seeAlso: " + seeAlso );
099                    System.out.println( "homepage: " + homepage );
100    
101                    if ( flistener != null )
102                        flistener.onKnows( state );
103                        
104                    listener.onItem( state,
105                                     title,
106                                     homepage,
107                                     null,
108                                     seeAlso );
109    
110                    if ( flistener != null ) {
111    
112                        flistener.onHomepage( state,
113                                              homepage );
114    
115                        flistener.onHomepageEnd();
116                        
117                        flistener.onSeeAlso( state,
118                                             seeAlso );
119    
120                        flistener.onSeeAlsoEnd();
121                        
122                    } 
123    
124                    listener.onItemEnd();
125    
126                    if ( flistener != null )
127                        flistener.onKnowsEnd();
128    
129                }
130    
131                if ( flistener != null )
132                    flistener.onPersonEnd();
133    
134                listener.finished();
135    
136            } catch ( Throwable t ) { throw new FeedParserException( t ); }
137    
138        }
139    
140        public static String getAttributeValue( FeedParserState state,
141                                                String name,
142                                                Namespace name_ns,
143                                                String attr,
144                                                Namespace attr_ns ) {
145    
146            Element e = state.current.getChild( name, name_ns );
147    
148            if ( e == null )
149                return null;
150    
151            Attribute a = e.getAttribute( attr, attr_ns );
152    
153            if ( a == null )
154                return null;
155    
156            return a.getValue();
157    
158        }
159        
160        private static void doParseKnows( FeedParserListener listener,
161                                          FeedParserState state ) throws Exception {
162    
163        }
164        
165    }
166