View Javadoc

1   package yarfraw.utils;
2   
3   import java.util.Collections;
4   import java.util.HashMap;
5   import java.util.Map;
6   
7   import javax.xml.bind.JAXBContext;
8   import javax.xml.bind.JAXBException;
9   import javax.xml.bind.Marshaller;
10  
11  import com.sun.xml.bind.marshaller.NamespacePrefixMapper;
12  
13  import yarfraw.core.datamodel.FeedFormat;
14  
15  public class JAXBUtils {
16    public static final String PREFIX_MAPPER_PROPERTY_NAME = "com.sun.xml.bind.namespacePrefixMapper";
17    private static JAXBContext RSS20_CONTEXT = null;
18    private static JAXBContext RSS10_CONTEXT = null;
19    private static JAXBContext ATOM10_CONTEXT = null;
20    private static JAXBContext ATOM03_CONTEXT = null;
21    
22    
23    private static Map<String, String> _extensionPrefixMap = null;
24    private static Map<String, String> _rss10PrefixMap = null;
25    private static Map<String, String> _rss20PrefixMap = null;
26    private static Map<String, String> _atom10PrefixMap = null;
27    private static Map<String, String> _atom03PrefixMap = null;
28    
29    /***
30     * Gets the namespace prefix map for the marshaller.
31     * @param format a {@link FeedFormat}
32     * @return a {@link NamespacePrefixMapper} object for the {@link Marshaller}
33     */
34    public static NamespacePrefixMapper  getNamespacePrefixMapper(FeedFormat format) {
35      if(format == FeedFormat.ATOM10){
36        return ATOM10_PREFIX_MAPPER;
37      }else if(format == FeedFormat.RSS10){
38        return RSS10_PREFIX_MAPPER;
39      }else if(format == FeedFormat.RSS20){
40        return RSS20_PREFIX_MAPPER;
41      }else if(format == FeedFormat.ATOM03){
42        return ATOM03_PREFIX_MAPPER;
43      }else{
44        throw new UnsupportedOperationException("Unknown format: "+format);
45      }
46    }
47  
48    private static NamespacePrefixMapper ATOM03_PREFIX_MAPPER = new NamespacePrefixMapper(){
49  
50      @Override
51      public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
52        Map<String, String> prefixMap = getAtom03PrefixMap();
53        return prefixMap.get(namespaceUri);
54      }
55      
56    };
57    
58    private static NamespacePrefixMapper ATOM10_PREFIX_MAPPER = new NamespacePrefixMapper(){
59  
60      @Override
61      public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
62        Map<String, String> prefixMap = getAtom10PrefixMap();
63        return prefixMap.get(namespaceUri);
64      }
65      
66    };
67  
68    private static NamespacePrefixMapper RSS10_PREFIX_MAPPER = new NamespacePrefixMapper(){
69  
70      @Override
71      public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
72        Map<String, String> prefixMap = getRss10PrefixMap();
73        return prefixMap.get(namespaceUri);
74      }
75      
76    };
77  
78    private static NamespacePrefixMapper RSS20_PREFIX_MAPPER = new NamespacePrefixMapper(){
79  
80      @Override
81      public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
82        Map<String, String> prefixMap = getRss20PrefixMap();
83        return prefixMap.get(namespaceUri);
84      }
85      
86    };
87  
88    private synchronized static Map<String, String> getRss10PrefixMap(){
89      if(_rss10PrefixMap == null){
90        _rss10PrefixMap = new HashMap<String, String>();
91        _rss10PrefixMap.put("http://purl.org/rss/1.0/", ""); //rss 1.0 elements go to default
92        _rss10PrefixMap.putAll(getExtensionPrefixMap());
93        _rss10PrefixMap = Collections.unmodifiableMap(_rss10PrefixMap);
94      }
95      return _rss10PrefixMap;
96    }
97    
98    private synchronized static Map<String, String> getRss20PrefixMap(){
99      if(_rss20PrefixMap == null){
100       _rss20PrefixMap = new HashMap<String, String>();
101       _rss20PrefixMap.putAll(getExtensionPrefixMap());
102       _rss20PrefixMap = Collections.unmodifiableMap(_rss20PrefixMap);
103     }
104     return _rss20PrefixMap;
105   }
106 
107   private synchronized static Map<String, String> getAtom10PrefixMap(){
108     if(_atom03PrefixMap == null){
109       _atom03PrefixMap = new HashMap<String, String>();
110       _atom03PrefixMap.put("http://www.w3.org/2005/Atom", ""); //atom 1.0 elements go to default
111       _atom03PrefixMap.putAll(getExtensionPrefixMap());
112       _atom03PrefixMap = Collections.unmodifiableMap(_atom03PrefixMap);
113     }
114     return _atom03PrefixMap;
115   }
116   
117   private synchronized static Map<String, String> getAtom03PrefixMap(){
118     if(_atom10PrefixMap == null){
119       _atom10PrefixMap = new HashMap<String, String>();
120       _atom10PrefixMap.put("http://purl.org/atom/ns#", ""); //atom 0.3 elements go to default
121       _atom10PrefixMap.putAll(getExtensionPrefixMap());
122       _atom10PrefixMap = Collections.unmodifiableMap(_atom10PrefixMap);
123     }
124     return _atom10PrefixMap;
125   }
126   
127   private synchronized static Map<String, String> getExtensionPrefixMap(){
128     if(_extensionPrefixMap == null){
129       _extensionPrefixMap = new HashMap<String, String>();
130       _extensionPrefixMap.put("http://www.w3.org/1999/02/22-rdf-syntax-ns#", "rdf");
131       _extensionPrefixMap.put("http://www.w3.org/XML/1998/namespace", "xml");
132       _extensionPrefixMap.put("http://base.google.com/ns/1.0", "g" );//google base
133       _extensionPrefixMap.put("http://www.itunes.com/dtds/podcast-1.0.dtd", "itunes");
134       _extensionPrefixMap.put("http://tools.search.yahoo.com/mrss/", "mrss");
135       _extensionPrefixMap.put("http://wellformedweb.org/CommentAPI/", "wfw");
136       _extensionPrefixMap.put("http://www.georss.org/georss/10", "georss");
137       _extensionPrefixMap.put("http://purl.org/dc/elements/1.1/", "dc");
138       _extensionPrefixMap.put("http://purl.org/rss/1.0/modules/syndication/", "sy");
139       _extensionPrefixMap.put("http://webns.net/mvcb/", "admin");
140       _extensionPrefixMap.put("http://rssnamespace.org/feedburner/ext/1.0", "feedburner");
141       _extensionPrefixMap.put("http://purl.org/rss/1.0/modules/slash/", "slash");
142       _extensionPrefixMap.put("http://www.blogger.com/atom/ns#", "blogger");
143       _extensionPrefixMap.put("http://purl.org/atom-blog/ns#", "draft");
144       _extensionPrefixMap.put("http://www.w3.org/1999/xhtml", "xhtml");
145       _extensionPrefixMap = Collections.unmodifiableMap(_extensionPrefixMap);
146     }
147     return _extensionPrefixMap;
148   }
149   
150   /***
151    * Gets the {@link JAXBContext} based on the input {@link FeedFormat}
152    * @param format
153    * @return
154    * @throws JAXBException
155    */
156   public static synchronized JAXBContext getContext(FeedFormat format) throws JAXBException{
157     
158     if(format == FeedFormat.RSS10){
159       if(RSS10_CONTEXT == null){
160         RSS10_CONTEXT = JAXBContext.newInstance(CommonUtils.RSS10_JAXB_CONTEXT);
161       }
162       return RSS10_CONTEXT;
163     }
164     if(format == FeedFormat.RSS20){
165       if(RSS20_CONTEXT == null){
166         RSS20_CONTEXT = JAXBContext.newInstance(CommonUtils.RSS20_JAXB_CONTEXT);
167       }
168       return RSS20_CONTEXT;
169     }
170     
171     if(format == FeedFormat.ATOM10){
172       if(ATOM10_CONTEXT == null){
173         ATOM10_CONTEXT = JAXBContext.newInstance(CommonUtils.ATOM10_JAXB_CONTEXT);
174       }
175       return ATOM10_CONTEXT;
176     }
177     
178     if(format == FeedFormat.ATOM03){
179       if(ATOM03_CONTEXT == null){
180         ATOM03_CONTEXT = JAXBContext.newInstance(CommonUtils.ATOM03_JAXB_CONTEXT);
181       }
182       return ATOM03_CONTEXT;
183     }
184     throw new UnsupportedOperationException("Unsupported format: "+ format);
185     
186   }
187 }