1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package com.sun.syndication.io.impl;
18
19 import com.sun.syndication.feed.rss.Channel;
20 import com.sun.syndication.feed.rss.Description;
21 import com.sun.syndication.feed.rss.Image;
22 import com.sun.syndication.feed.rss.Item;
23 import com.sun.syndication.io.FeedException;
24 import org.jdom.Attribute;
25 import org.jdom.Document;
26 import org.jdom.Element;
27 import org.jdom.Namespace;
28
29 import java.util.List;
30 import java.util.Date;
31
32 /***
33 * Feed Generator for RSS 0.91
34 * <p/>
35 *
36 * @author Elaine Chien
37 *
38 */
39 public class RSS091UserlandGenerator extends RSS090Generator {
40 private String _version;
41
42 public RSS091UserlandGenerator() {
43 this("rss_0.91U","0.91");
44 }
45
46 protected RSS091UserlandGenerator(String type,String version) {
47 super(type);
48 _version = version;
49 }
50
51 protected String getVersion() {
52 return _version;
53 }
54
55 protected Namespace getFeedNamespace() {
56 return Namespace.NO_NAMESPACE;
57 }
58
59 protected Document createDocument(Element root) {
60 return new Document(root);
61 }
62
63 protected Element createRootElement(Channel channel) {
64 Element root = new Element("rss",getFeedNamespace());
65 Attribute version = new Attribute("version", getVersion());
66 root.setAttribute(version);
67 generateModuleNamespaceDefs(root);
68 return root;
69 }
70
71 protected void populateFeed(Channel channel,Element parent) throws FeedException {
72 addChannel(channel,parent);
73 }
74
75 protected void addChannel(Channel channel,Element parent) throws FeedException {
76 super.addChannel(channel,parent);
77 Element eChannel = parent.getChild("channel",getFeedNamespace());
78
79 addImage(channel,eChannel);
80 addTextInput(channel,eChannel);
81 addItems(channel,eChannel);
82 }
83
84 protected void populateChannel(Channel channel,Element eChannel) {
85 super.populateChannel(channel,eChannel);
86 String language = channel.getLanguage();
87 if (language != null) {
88 eChannel.addContent(generateSimpleElement("language", language));
89 }
90
91 String rating = channel.getRating();
92 if (rating != null) {
93 eChannel.addContent(generateSimpleElement("rating", rating));
94 }
95
96 String copyright = channel.getCopyright();
97 if (copyright != null) {
98 eChannel.addContent(generateSimpleElement("copyright", copyright));
99 }
100
101 Date pubDate = channel.getPubDate();
102 if (pubDate != null) {
103 eChannel.addContent(generateSimpleElement("pubDate", DateParser.formatRFC822(pubDate)));
104 }
105
106 Date lastBuildDate = channel.getLastBuildDate();
107 if (lastBuildDate != null) {
108 eChannel.addContent(generateSimpleElement("lastBuildDate", DateParser.formatRFC822(lastBuildDate)));
109 }
110
111 String docs = channel.getDocs();
112 if (docs != null) {
113 eChannel.addContent(generateSimpleElement("docs", docs));
114 }
115
116 String managingEditor = channel.getManagingEditor();
117 if (managingEditor != null) {
118 eChannel.addContent(generateSimpleElement("managingEditor", managingEditor));
119 }
120
121 String webMaster = channel.getWebMaster();
122 if (webMaster != null) {
123 eChannel.addContent(generateSimpleElement("webMaster", webMaster));
124 }
125
126 List skipHours = channel.getSkipHours();
127 if (skipHours != null && skipHours.size()>0) {
128 eChannel.addContent(generateSkipHoursElement(skipHours));
129 }
130
131 List skipDays = channel.getSkipDays();
132 if (skipDays != null && skipDays.size()>0) {
133 eChannel.addContent(generateSkipDaysElement(skipDays));
134 }
135 }
136
137 protected Element generateSkipHoursElement(List hours) {
138 Element skipHoursElement = new Element("skipHours",getFeedNamespace());
139 for (int i = 0; i < hours.size(); i++) {
140 skipHoursElement.addContent(generateSimpleElement("hour", hours.get(i).toString()));
141 }
142 return skipHoursElement;
143 }
144
145 protected Element generateSkipDaysElement(List days) {
146 Element skipDaysElement = new Element("skipDays");
147 for (int i = 0; i < days.size(); i++) {
148 skipDaysElement.addContent(generateSimpleElement("day", days.get(i).toString()));
149 }
150 return skipDaysElement;
151 }
152
153 protected void populateImage(Image image,Element eImage) {
154 super.populateImage(image,eImage);
155
156 int width = image.getWidth();
157 if (width>-1) {
158 eImage.addContent(generateSimpleElement("width",String.valueOf(width)));
159 }
160 int height = image.getHeight();
161 if (height>-1) {
162 eImage.addContent(generateSimpleElement("height",String.valueOf(height)));
163 }
164
165 String description = image.getDescription();
166 if (description!=null) {
167 eImage.addContent(generateSimpleElement("description",description));
168 }
169 }
170
171 protected void populateItem(Item item,Element eItem) {
172 super.populateItem(item,eItem);
173 Description description = item.getDescription();
174 if (description!=null) {
175 eItem.addContent(generateSimpleElement("description",description.getValue()));
176 }
177 }
178
179 /***
180 * To be overriden by RSS 0.91 Netscape and RSS 0.94
181 */
182 protected boolean isHourFormat24() {
183 return true;
184 }
185
186 protected void checkChannelConstraints(Element eChannel) throws FeedException {
187 checkNotNullAndLength(eChannel,"title", 1, 100);
188 checkNotNullAndLength(eChannel,"description", 1, 500);
189 checkNotNullAndLength(eChannel,"link", 1, 500);
190 checkNotNullAndLength(eChannel,"language", 2, 5);
191
192 checkLength(eChannel,"rating", 20, 500);
193 checkLength(eChannel,"copyright", 1, 100);
194 checkLength(eChannel,"pubDate", 1, 100);
195 checkLength(eChannel,"lastBuildDate", 1, 100);
196 checkLength(eChannel,"docs", 1, 500);
197 checkLength(eChannel,"managingEditor", 1, 100);
198 checkLength(eChannel,"webMaster", 1, 100);
199
200 Element skipHours = eChannel.getChild("skipHours");
201 if (skipHours!=null) {
202 List hours = skipHours.getChildren();
203 for (int i=0;i<hours.size();i++) {
204 Element hour = (Element) hours.get(i);
205 int value = Integer.parseInt(hour.getText());
206 if (isHourFormat24()) {
207 if (value<1 || value>24) {
208 throw new FeedException("Invalid hour value "+value+", it must be between 1 and 24");
209 }
210 }
211 else {
212 if (value<0 || value>23) {
213 throw new FeedException("Invalid hour value "+value+", it must be between 0 and 23");
214 }
215 }
216 }
217 }
218 }
219
220 protected void checkImageConstraints(Element eImage) throws FeedException {
221 checkNotNullAndLength(eImage,"title", 1, 100);
222 checkNotNullAndLength(eImage,"url", 1, 500);
223
224 checkLength(eImage,"link", 1, 500);
225 checkLength(eImage,"width", 1, 3);
226 checkLength(eImage,"width", 1, 3);
227 checkLength(eImage,"description", 1, 100);
228 }
229
230
231 protected void checkTextInputConstraints(Element eTextInput) throws FeedException {
232 checkNotNullAndLength(eTextInput,"title", 1, 100);
233 checkNotNullAndLength(eTextInput,"description", 1, 500);
234 checkNotNullAndLength(eTextInput,"name", 1, 20);
235 checkNotNullAndLength(eTextInput,"link", 1, 500);
236 }
237
238 protected void checkItemConstraints(Element eItem) throws FeedException {
239 checkNotNullAndLength(eItem,"title", 1, 100);
240 checkNotNullAndLength(eItem,"link", 1, 500);
241
242 checkLength(eItem,"description", 1, 500);
243 }
244
245 }