1 package yarfraw.core.datamodel;
2
3 import java.io.IOException;
4 import java.util.ArrayList;
5 import java.util.HashMap;
6 import java.util.List;
7 import java.util.Locale;
8 import java.util.Map;
9
10 import javax.xml.namespace.QName;
11 import javax.xml.parsers.ParserConfigurationException;
12
13 import org.w3c.dom.Element;
14 import org.xml.sax.SAXException;
15
16 import yarfraw.utils.ValidationUtils;
17 import yarfraw.utils.XMLUtils;
18
19 /***
20 * <li>Rss 2.0 - the <category> element</li>
21 * <li>Rss 1.0 - the <dc:subject> element</li>
22 * <li>Atom 1.0 - the <category> element</li>
23 *
24 * <p>
25 * Rss 2.0: http://cyber.law.harvard.edu/rss/rss.html#syndic8 <br/>
26 * Rss 1.0: http://dublincore.org/documents/1999/07/02/dces/ - 'Dublin Core'
27 * Atom 1.0: http://atompub.org/2005/07/11/draft-ietf-atompub-format-10.html#rfc.section.4.2.2
28 * <p/>
29 * @author jliang
30 *
31 */
32 public class CategorySubject extends AbstractBaseObject{
33 /***
34 *
35 */
36 private static final long serialVersionUID = 20070927L;
37 private String _categoryOrSubjectOrTerm;
38 private String _domainOrScheme;
39 private String _label;
40 public CategorySubject() {}
41
42 /***
43 * This value is only used by Atom 1.0, it is ignored by other {@link FeedFormat}.
44 * <br/>
45 * The "label" attribute provides a human-readable label for display in end-user applications.
46 * The content of the "label" attribute is Language-Sensitive.
47 * The escaped versions of characters such as "&" and ">" represent those characters, not markup.
48 * Category elements MAY have a "label" attribute.
49 * @return label value
50 */
51 public String getLabel() {
52 return _label;
53 }
54 /***
55 * This value is only used by Atom 1.0, it is ignored by other {@link FeedFormat}.
56 * <br/>
57 * The "label" attribute provides a human-readable label for display in end-user applications.
58 * The content of the "label" attribute is Language-Sensitive.
59 * The escaped versions of characters such as "&" and ">" represent those characters, not markup.
60 * Category elements MAY have a "label" attribute.
61 *
62 * @param label label value
63 * @return this
64 */
65 public CategorySubject setLabel(String label) {
66 _label = label;
67 return this;
68 }
69
70 /***
71 * Creates a new category object.
72 *
73 * @param categoryOrSubjectOrTerm
74 * <li>Rss 2.0 - text value of the <category> element</li>
75 * <li>Rss 1.0 - text value of the <dc:subject> element</li>
76 * <li>Atom 1.0 - text value of the <category> element</li>
77 */
78 public CategorySubject(String categoryOrSubjectOrTerm) {
79 super();
80 _categoryOrSubjectOrTerm = categoryOrSubjectOrTerm;
81 }
82
83 /***
84 * <li>Rss 2.0 - Specify one or more categories that the channel belongs to. </li>
85 * <li>Rss 1.0 - The topic of the content of the resource. </li>
86 * <li>Atom 1.0 - The "term" attribute is a string that identifies the category to which the entry or feed belongs. Category elements MUST have a "term" attribute. </li>
87 * @return <li>Rss 2.0 - text value of the <category> element</li>
88 * <li>Rss 1.0 - text value of the <dc:subject> element</li>
89 * <li>Atom 1.0 - text value of the <category> element</li>
90 */
91 public String getCategoryOrSubjectOrTerm() {
92 return _categoryOrSubjectOrTerm;
93 }
94 /***
95 * <li>Rss 2.0 - Specify one or more categories that the channel belongs to. </li>
96 * <li>Rss 1.0 - The topic of the content of the resource. </li>
97 * <li>Atom 1.0 - The "term" attribute is a string that identifies the category to which the entry or feed belongs. Category elements MUST have a "term" attribute. </li>
98 * @param categoryOrSubjectOrTerm <li>Rss 2.0 - text value of the <category> element</li>
99 * <li>Rss 1.0 - text value of the <dc:subject> element</li>
100 * <li>Atom 1.0 - text value of the <category> element</li>
101 * @return this
102 */
103 public CategorySubject setCategoryOrSubjectOrTerm(String categoryOrSubjectOrTerm) {
104 _categoryOrSubjectOrTerm = categoryOrSubjectOrTerm;
105 return this;
106 }
107 /***
108 * <li> Rss 2.0 -
109 * a string that identifies a categorization taxonomy.
110 * <br/>
111 * The value of the element is a forward-slash-separated string that identifies
112 * a hierarchic location in the indicated taxonomy. Processors may establish
113 * conventions for the interpretation of categories. Two examples are provided below:
114 * <br/>
115 * <category>Grateful Dead</category>
116 * <br/>
117 * <category domain="http://www.fool.com/cusips">MSFT</category>
118 * </li>
119 * <li> Atom 1.0 -
120 * The "scheme" attribute is an IRI that identifies a categorization scheme. Category elements MAY have a "scheme" attribute.
121 * </li>
122 * <li> Rss 1.0 -
123 * Not supported by Rss 1.0.
124 * </li>
125 */
126 public String getDomainOrScheme() {
127 return _domainOrScheme;
128 }
129 /***
130 * <li> Rss 2.0 -
131 * a string that identifies a categorization taxonomy.
132 * <br/>
133 * The value of the element is a forward-slash-separated string that identifies
134 * a hierarchic location in the indicated taxonomy. Processors may establish
135 * conventions for the interpretation of categories. Two examples are provided below:
136 * <br/>
137 * <category>Grateful Dead</category>
138 * <br/>
139 * <category domain="http://www.fool.com/cusips">MSFT</category>
140 * </li>
141 * <li> Atom 1.0 -
142 * The "scheme" attribute is an IRI that identifies a categorization scheme. Category elements MAY have a "scheme" attribute.
143 * </li>
144 * <li> Rss 1.0 -
145 * Not supported by Rss 1.0.
146 * </li>
147 * @param domainOrScheme - the value of the attribute
148 * @return this
149 */
150 public CategorySubject setDomainOrScheme(String domainOrScheme) {
151 _domainOrScheme = domainOrScheme;
152 return this;
153 }
154
155
156
157 /***
158 * Any other attribute that is not in the RSS 2.0 specs.
159 */
160 public CategorySubject setOtherAttributes(Map<QName, String> otherAttributes) {
161 _otherAttributes = otherAttributes;
162 return this;
163 }
164 /***
165 * Add an attribute that is not in the RSS 2.0 specs.
166 */
167 public CategorySubject addOtherAttributes(QName namespace, String attribute) {
168 if(_otherAttributes == null){
169 _otherAttributes = new HashMap<QName, String>();
170 }
171 _otherAttributes.put(namespace, attribute);
172 return this;
173 }
174
175 /***
176 * Other additional elements that are not in the Rss specs.<br/>
177 * **Note** The element should not have an empty namespace to avoid collision with the specs elements.
178 */
179 public CategorySubject setOtherElements(List<Element> otherElements) {
180 _otherElements = otherElements;
181 return this;
182 }
183 /***
184 * Add an element that is not specified in the Rss specs.<br/>
185 * **Note** The element should not have an empty namespace to avoid collision with the specs elements.
186 * @param element - any element
187 */
188 public CategorySubject addOtherElement(Element element){
189 if(_otherElements == null){
190 _otherElements = new ArrayList<Element>();
191 }
192 _otherElements.add(element);
193 return this;
194 }
195
196 /***
197 * Add an element that is not specified in the Rss specs.<br/>
198 * **Note** The element should not have an empty namespace to avoid collision with the specs elements.
199 *
200 * @param xmlString - any element
201 * @throws ParserConfigurationException
202 * @throws IOException
203 * @throws SAXException
204 */
205 public CategorySubject addOtherElement(String xmlString) throws SAXException, IOException, ParserConfigurationException{
206 return addOtherElement(XMLUtils.parseXml(xmlString, false, false).getDocumentElement());
207 }
208
209 /***
210 * <b>Atom 1.0 only</b><br/>
211 * Any element defined by this specification MAY have an xml:base attribute
212 * [W3C.REC-xmlbase-20010627]. When xml:base is used in an Atom Document,
213 * it serves the function described in section 5.1.1 of [RFC3986], establishing
214 * the base URI (or IRI) for resolving any relative references found within the
215 * effective scope of the xml:base attribute.
216 * @param base
217 * @return
218 */
219 public CategorySubject setBase(String base) {
220 _base = base;
221 return this;
222 }
223 /***
224 * <li>Rss 2.0 - <language> element.
225 * The language the channel is written in. This allows aggregators to group
226 * all Italian language sites, for example, on a single page. A list of allowable
227 * values for this element, as provided by Netscape, is here. You may also use values
228 * defined by the W3C.
229 * Only <channel> support this element.</li>
230 * <li>Rss 1.0 - <dc:language> element. A language of the intellectual content of the resource.
231 * Only <channel> and <item> support this element. </li>
232 * <li>Atom 1.0 - 'lang' attribute</li>
233 * <br/>
234 * Note: for Rss 2.0 and Rss 1.0, only <channel> and <item>
235 * @param lang
236 * @return
237 */
238 public CategorySubject setLang(String lang) {
239 _lang = lang;
240 return this;
241 }
242
243 /***
244 * <li>Rss 2.0 - <language> element.
245 * The language the channel is written in. This allows aggregators to group
246 * all Italian language sites, for example, on a single page. A list of allowable
247 * values for this element, as provided by Netscape, is here. You may also use values
248 * defined by the W3C.
249 * Only <channel> support this element.</li>
250 * <li>Rss 1.0 - <dc:language> element. A language of the intellectual content of the resource.
251 * Only <channel> and <item> support this element. </li>
252 * <li>Atom 1.0 - 'lang' attribute</li>
253 * <br/>
254 * Note: for Rss 2.0 and Rss 1.0, only <channel> and <item>
255 * @param lang
256 * @return
257 */
258 public CategorySubject setLang(Locale lang) {
259 setLang(lang.getLanguage());
260 return this;
261 }
262 /***
263 * <b>Rss 1.0 only</b><br/>
264 * @param resource
265 * @return
266 */
267 public CategorySubject setResource(String resource) {
268 _resource = resource;
269 return this;
270 }
271 /***
272 * <b>Rss 1.0 only</b><br/>
273 * @param about
274 * @return
275 */
276 public CategorySubject setAbout(String about) {
277 _about = about;
278 return this;
279 }
280
281
282 @Override
283 public void validate(FeedFormat format) throws ValidationException {
284 ValidationUtils.validateNotNull(_categoryOrSubjectOrTerm, "Category: Category value should not be null");
285 }
286 }