1 package yarfraw.mapping.backward.impl;
2 import static yarfraw.io.parser.ElementQName.RSS20_COPYRIGHTS;
3 import static yarfraw.io.parser.ElementQName.RSS20_DESCRIPTION;
4 import static yarfraw.io.parser.ElementQName.RSS20_DOCS;
5 import static yarfraw.io.parser.ElementQName.RSS20_GENERATOR;
6 import static yarfraw.io.parser.ElementQName.RSS20_LANGUAGE;
7 import static yarfraw.io.parser.ElementQName.RSS20_LAST_BUILD_DATE;
8 import static yarfraw.io.parser.ElementQName.RSS20_LINK;
9 import static yarfraw.io.parser.ElementQName.RSS20_MANAGINGEDITOR;
10 import static yarfraw.io.parser.ElementQName.RSS20_PUBDATE;
11 import static yarfraw.io.parser.ElementQName.RSS20_TITLE;
12 import static yarfraw.io.parser.ElementQName.RSS20_TTL;
13 import static yarfraw.io.parser.ElementQName.RSS20_WEBMASTER;
14 import static yarfraw.utils.XMLUtils.same;
15
16 import javax.xml.bind.JAXBElement;
17
18 import org.apache.commons.lang.builder.ToStringBuilder;
19 import org.apache.commons.logging.Log;
20 import org.apache.commons.logging.LogFactory;
21 import org.w3c.dom.Element;
22
23 import yarfraw.core.datamodel.CategorySubject;
24 import yarfraw.core.datamodel.ChannelFeed;
25 import yarfraw.core.datamodel.Cloud;
26 import yarfraw.core.datamodel.Day;
27 import yarfraw.core.datamodel.Image;
28 import yarfraw.core.datamodel.TextInput;
29 import yarfraw.core.datamodel.YarfrawException;
30 import yarfraw.generated.rss20.elements.TCategory;
31 import yarfraw.generated.rss20.elements.TCloud;
32 import yarfraw.generated.rss20.elements.TImage;
33 import yarfraw.generated.rss20.elements.TRssChannel;
34 import yarfraw.generated.rss20.elements.TRssItem;
35 import yarfraw.generated.rss20.elements.TSkipDay;
36 import yarfraw.generated.rss20.elements.TSkipDaysList;
37 import yarfraw.generated.rss20.elements.TSkipHoursList;
38 import yarfraw.generated.rss20.elements.TTextInput;
39 import yarfraw.mapping.backward.ToChannelRss20;
40
41 public class ToChannelRss20Impl implements ToChannelRss20{
42 private static final Log LOG = LogFactory.getLog(ToChannelRss20Impl.class);
43 private static final ToChannelRss20 _instance = new ToChannelRss20Impl();
44
45 private ToChannelRss20Impl() {}
46 public static ToChannelRss20 getInstance(){
47 return _instance;
48 }
49
50 @SuppressWarnings("unchecked")
51 public ChannelFeed execute(TRssChannel ch) throws YarfrawException {
52 if(ch == null){
53 return null;
54 }
55 ChannelFeed c = new ChannelFeed();
56
57 if(ch.getItem() != null){
58 for(TRssItem item : ch.getItem()){
59 c.addItem(Rss20MappingUtils.toItem(item));
60 }
61 }
62 c.getOtherAttributes().putAll(ch.getOtherAttributes());
63
64 for(Object o : ch.getTitleOrLinkOrDescription()){
65 if(o == null){
66 continue;
67 }
68 if (o instanceof JAXBElement) {
69 JAXBElement jaxbElement = (JAXBElement) o;
70 Object val = jaxbElement.getValue();
71 if(same(jaxbElement.getName(), RSS20_TITLE)){
72 c.setTitle((String)jaxbElement.getValue());
73 }else if (same(jaxbElement.getName(), RSS20_LINK)) {
74 c.addLink((String)jaxbElement.getValue());
75 }else if (same(jaxbElement.getName(), RSS20_DESCRIPTION)) {
76 c.setDescriptionOrSubtitle((String)jaxbElement.getValue());
77 }else if (same(jaxbElement.getName(), RSS20_COPYRIGHTS)) {
78 c.setRights((String)jaxbElement.getValue());
79 }else if (same(jaxbElement.getName(), RSS20_DOCS)) {
80 c.setDocs((String)jaxbElement.getValue());
81 }else if (same(jaxbElement.getName(), RSS20_GENERATOR)) {
82 c.setGenerator((String)jaxbElement.getValue());
83 }else if (same(jaxbElement.getName(), RSS20_LANGUAGE)) {
84 c.setLang((String)jaxbElement.getValue());
85 }else if (same(jaxbElement.getName(), RSS20_LAST_BUILD_DATE)) {
86 c.setLastBuildOrUpdatedDate((String)jaxbElement.getValue());
87 }else if (same(jaxbElement.getName(), RSS20_MANAGINGEDITOR)) {
88 c.addManagingEditorOrAuthorOrPublisher((String)jaxbElement.getValue());
89 }else if (same(jaxbElement.getName(), RSS20_PUBDATE)) {
90 c.setPubDate((String)jaxbElement.getValue());
91 }else if (same(jaxbElement.getName(), RSS20_TTL)) {
92 c.setTtl(Integer.valueOf(jaxbElement.getValue().toString()));
93 }else if (same(jaxbElement.getName(), RSS20_WEBMASTER)) {
94 c.addWebMasterOrCreator((String)jaxbElement.getValue());
95 }else if (val instanceof TCategory) {
96 TCategory cat = (TCategory) val;
97 c.addCategorySubject(new CategorySubject(cat.getValue())
98 .setDomainOrScheme(cat.getDomain()));
99 }else if (val instanceof TSkipDaysList) {
100 TSkipDaysList sdl = (TSkipDaysList)val;
101 for(TSkipDay day : sdl.getDay()){
102 c.addSkipDay(Day.valueOf(day.value()));
103 }
104
105 }else if (val instanceof TSkipHoursList) {
106 TSkipHoursList shl = (TSkipHoursList)val;
107 for(Integer h : shl.getHour()){
108 c.addSkipHour(h);
109 }
110 }else if (val instanceof TCloud) {
111 TCloud cloud = (TCloud)val;
112 c.setCloud(new Cloud(cloud.getDomain(),
113 cloud.getPort() == null ? null : cloud.getPort().toString(),
114 cloud.getPath(), cloud.getRegisterProcedure(),
115 cloud.getProtocol()==null?null:cloud.getProtocol().value()));
116 }else if (val instanceof TImage) {
117 TImage image = (TImage)val;
118 c.setImageOrIcon(new Image(image.getUrl(), image.getTitle(), image.getLink(),
119 image.getWidth(), image.getHeight(), image.getDescription()));
120 }else if (val instanceof TTextInput) {
121 TTextInput in = (TTextInput)val;
122 c.setTexInput(new TextInput(in.getTitle(), in.getDescription(), in.getName(), in.getLink()));
123 }else{
124 LOG.warn("Unexpected jaxbElement: "+ToStringBuilder.reflectionToString(jaxbElement)+" this should not happen!");
125 }
126 }
127 else if (o instanceof Element) {
128 Element e = (Element) o;
129 c.getOtherElements().add(e);
130 }else{
131 LOG.warn("Unexpected object: "+ToStringBuilder.reflectionToString(o)+" this should not happen!");
132 }
133 }
134
135 return c;
136 }
137
138 }