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.locate;
018
019 import java.util.regex.Pattern;
020
021 /**
022 * <p>
023 * A FeedReference is used within the RSS/Atom location facility to pass back
024 * metadata for feed discoveries.
025 *
026 * <p>
027 * Right now we pass back the URL to the feeds as the `resource' parameter. The
028 * media type (application/rss+xml, application/atom+xml, etc) as the type param
029 * (which is optional). We also pass back the `title' back if its specified
030 * within autodiscovery. This will be null if another discovery method is used.
031 *
032 * <p> Its important to realize that the media type is only given if we're 100%
033 * certain of the value. If we have to use probe discovery or link discovery it
034 * might not be possible to obtain the media type without antoher network
035 * request (via HTTP headers).
036 *
037 * <p> Note that internally (within the ProbeLocator) we don't use absolute
038 * resource URLs but use relative ones and use the media type as the default
039 * media type.
040 *
041 * @author <a href="mailto:burton@apache.org">Kevin A. Burton</a>
042 */
043 public class FeedReference {
044
045 public static final String ATOM_MEDIA_TYPE = "application/atom+xml";
046 public static final String RSS_MEDIA_TYPE = "application/rss+xml";
047 public static final String XML_MEDIA_TYPE = "text/xml";
048
049 public static int METHOD_AUTO_DISCOVERY = 1;
050 public static int METHOD_PROBE_DISCOVERY = 2;
051 public static int METHOD_LINK_DISCOVERY = 4;
052
053 /**
054 * The network addressable resource forfor this feed.
055 */
056 public String resource = null;
057
058 /**
059 * The media type of this feed.
060 */
061 public String type = null;
062
063 /**
064 * The title of the reference. Usually FOAF, RSS or Atom per auto-discovery
065 * link.
066 */
067 public String title = null;
068
069 /**
070 * The method of discovery...
071 */
072 public int method = 0;
073
074 protected Pattern schemePattern = Pattern.compile("^[^:/]*:/.*$");
075
076 public FeedReference( String resource, String type ) {
077 this.resource = resource;
078 this.type = type;
079 }
080
081 public String toString() {
082 return resource;
083 }
084
085 public boolean equals(Object obj) {
086 if (obj == null || (obj instanceof FeedReference) == false)
087 return false;
088
089 FeedReference compareMe = (FeedReference)obj;
090
091 if (resource.equals(compareMe.resource)) {
092 //ignore title and type when doing equality
093 return true;
094 }
095
096 return false;
097 }
098
099 /** Determines if the resource given by this FeedReference is relative.
100 * For example, the resource could be '/atom.xml', which is relative.
101 * It could also be
102 * "http://rss.groups.yahoo.com/group/talkinaboutarchitecture/rss".
103 */
104 public boolean isRelative() {
105 if (resource == null)
106 return true;
107
108 // look for a scheme:/
109 return !schemePattern.matcher(resource).matches();
110
111 }
112
113 }