Coverage Report - yarfraw.utils.extension.ExtensionUtils
 
Classes in this File Line Coverage Branch Coverage Complexity
ExtensionUtils
75% 
99% 
0
 
 1  0
 package yarfraw.utils.extension;
 2  
 
 3  
 import static yarfraw.io.parser.ExtensionElementQname.*;
 4  
 import static yarfraw.utils.XMLUtils.same;
 5  
 
 6  
 import java.math.BigDecimal;
 7  
 import java.math.BigInteger;
 8  
 import java.util.ArrayList;
 9  
 import java.util.Iterator;
 10  
 import java.util.List;
 11  
 
 12  
 import javax.xml.bind.JAXBContext;
 13  
 import javax.xml.bind.JAXBElement;
 14  
 import javax.xml.bind.JAXBException;
 15  
 import javax.xml.bind.Marshaller;
 16  
 import javax.xml.bind.Unmarshaller;
 17  
 import javax.xml.datatype.XMLGregorianCalendar;
 18  
 import javax.xml.namespace.QName;
 19  
 import javax.xml.parsers.DocumentBuilderFactory;
 20  
 import javax.xml.parsers.ParserConfigurationException;
 21  
 
 22  
 import org.apache.commons.logging.Log;
 23  
 import org.apache.commons.logging.LogFactory;
 24  
 import org.georss.georss._10.GeoRssExtension;
 25  
 import org.georss.georss._10.SimplePositionType;
 26  
 import org.georss.georss._10.Where;
 27  
 import org.w3c.dom.Document;
 28  
 import org.w3c.dom.Element;
 29  
 import org.w3c.dom.Node;
 30  
 import org.w3c.dom.NodeList;
 31  
 
 32  
 import yarfraw.core.datamodel.FeedFormat;
 33  
 import yarfraw.core.datamodel.YarfrawException;
 34  
 import yarfraw.generated.admin.elements.AdminExtension;
 35  
 import yarfraw.generated.admin.elements.AdminType;
 36  
 import yarfraw.generated.atom03.ext.elements.Atom03Extension;
 37  
 import yarfraw.generated.atom03.ext.elements.ContentType;
 38  
 import yarfraw.generated.blogger.elements.BloggerExtension;
 39  
 import yarfraw.generated.feedburner.elements.FeedburnerExtension;
 40  
 import yarfraw.generated.googlebase.elements.CurrencyCodeEnumeration;
 41  
 import yarfraw.generated.googlebase.elements.DateTimeRangeType;
 42  
 import yarfraw.generated.googlebase.elements.GenderEnumeration;
 43  
 import yarfraw.generated.googlebase.elements.GoogleBaseExtension;
 44  
 import yarfraw.generated.googlebase.elements.ObjectFactory;
 45  
 import yarfraw.generated.googlebase.elements.PaymentMethodEnumeration;
 46  
 import yarfraw.generated.googlebase.elements.PriceTypeEnumeration;
 47  
 import yarfraw.generated.googlebase.elements.ShippingType;
 48  
 import yarfraw.generated.itunes.elements.ItunesCategoryType;
 49  
 import yarfraw.generated.itunes.elements.ItunesExtension;
 50  
 import yarfraw.generated.itunes.elements.ItunesImageType;
 51  
 import yarfraw.generated.itunes.elements.ItunesOwnerType;
 52  
 import yarfraw.generated.mrss.elements.MrssCategoryType;
 53  
 import yarfraw.generated.mrss.elements.MrssContentType;
 54  
 import yarfraw.generated.mrss.elements.MrssCopyrightType;
 55  
 import yarfraw.generated.mrss.elements.MrssCreditType;
 56  
 import yarfraw.generated.mrss.elements.MrssDescriptionType;
 57  
 import yarfraw.generated.mrss.elements.MrssExtension;
 58  
 import yarfraw.generated.mrss.elements.MrssGroupType;
 59  
 import yarfraw.generated.mrss.elements.MrssHashType;
 60  
 import yarfraw.generated.mrss.elements.MrssPlayerType;
 61  
 import yarfraw.generated.mrss.elements.MrssRatingType;
 62  
 import yarfraw.generated.mrss.elements.MrssRestrictionType;
 63  
 import yarfraw.generated.mrss.elements.MrssTextType;
 64  
 import yarfraw.generated.mrss.elements.MrssThumbnailType;
 65  
 import yarfraw.generated.mrss.elements.MrssTitleType;
 66  
 import yarfraw.generated.rss10.elements.DcType;
 67  
 import yarfraw.generated.rss10.elements.DublinCoreExtension;
 68  
 import yarfraw.generated.rss10.elements.SyndicationExtension;
 69  
 import yarfraw.generated.rss10.elements.UpdatePeriodEnum;
 70  
 import yarfraw.generated.slash.elements.SlashExtension;
 71  
 import yarfraw.generated.wfw.elements.WellFormedWebExtension;
 72  
 import yarfraw.utils.JAXBUtils;
 73  
 
 74  39
 public class ExtensionUtils{
 75  
   private static final String HTTP_BASE_GOOGLE_COM_CNS_1_0 = "http://base.google.com/ns/1.0";
 76  
   private static final String ITUNES_JAXB_CONTEXT = "yarfraw.generated.itunes.elements";
 77  
   private static final String MRSS_JAXB_CONTEXT = "yarfraw.generated.mrss.elements";
 78  
   private static final String GOOGLEBASE_JAXB_CONTEXT = "yarfraw.generated.googlebase.elements";
 79  
   private static final String DUBLINCORE_JAXB_CONTEXT = "yarfraw.generated.rss10.elements";
 80  
   private static final String GEORSS_JAXB_CONTEXT = "org.georss.georss._10";
 81  
   private static final String WFW_JAXB_CONTEXT = "yarfraw.generated.wfw.elements";
 82  
   private static final String SY_JAXB_CONTEXT = "yarfraw.generated.rss10.elements";
 83  
   private static final String BLOGGER_JAXB_CONTEXT = "yarfraw.generated.blogger.elements";
 84  
   private static final String ADMIN_JAXB_CONTEXT = "yarfraw.generated.admin.elements";
 85  
   private static final String FEEDBURNER_JAXB_CONTEXT = "yarfraw.generated.feedburner.elements";
 86  
   private static final String SLASH_JAXB_CONTEXT = "yarfraw.generated.slash.elements";
 87  
   private static final String ATOM03_JAXB_CONTEXT = "yarfraw.generated.atom03.ext.elements";
 88  
 
 89  
   
 90  
   //FIXME: should merge the constants into the enum
 91  468
   private static enum ContextEnum{
 92  36
     DC, SY, ITUNES, GOOGLEBASE, WFW, MRSS, GEORSS, BLOGGER, ADMIN, FEEDBURNER, SLASH, ATOM03
 93  
   }
 94  
   
 95  39
   private static final ObjectFactory GOOGLEBASE_FACTORY = new ObjectFactory();
 96  
   
 97  39
   private static final Log LOG = LogFactory.getLog(ExtensionUtils.class);
 98  0
   private ExtensionUtils(){}
 99  
   
 100  
   
 101  
   /**
 102  
    * Extracts the Atom 0.3 extension elements <b>that are not mapped to the core models</b>
 103  
    * from the input list into an {@link Atom03Extension}
 104  
    * object. <br/>
 105  
    * The extracted elements will be removed from the original input list.
 106  
    * <br/>
 107  
    * see http://yarfraw.sourceforge.net about these
 108  
    * extension elements
 109  
    * @param otherElements - any elements
 110  
    * @return an {@link Atom03Extension} object
 111  
    * @throws YarfrawException 
 112  
    */
 113  
   @SuppressWarnings("unchecked")
 114  
   public static Atom03Extension extractAtom03Extension(List<Element> otherElements) throws YarfrawException {
 115  3
     Atom03Extension ret = new Atom03Extension();
 116  
     try{
 117  3
       if(otherElements != null){
 118  3
         Unmarshaller u = getContext(ContextEnum.ATOM03).createUnmarshaller();
 119  3
         Iterator<Element> it = otherElements.iterator();
 120  18
         while(it.hasNext()){
 121  12
           Element e = it.next();
 122  12
           if(e == null){
 123  0
             continue;
 124  
           }
 125  12
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 126  12
           if(same(name, ATOM03_CONTENT_QNAME)){
 127  3
             ContentType c = ((JAXBElement<ContentType>)u.unmarshal(e)).getValue();
 128  3
             ret.getContent().add(c);
 129  3
             it.remove();
 130  9
           }else if(same(name, ATOM03_INFO_QNAME)){
 131  0
             ContentType c = ((JAXBElement<ContentType>)u.unmarshal(e)).getValue();
 132  0
             ret.setInfo(c);
 133  0
             it.remove();
 134  9
           }else if(same(name, ATOM03_ISSUED_QNAME)){
 135  3
             ret.setIssued(e.getTextContent());
 136  3
             it.remove();
 137  6
           }else if(same(name, ATOM03_SUMMARY_QNAME)){
 138  3
             ContentType c = ((JAXBElement<ContentType>)u.unmarshal(e)).getValue();
 139  3
             ret.setSummary(c);
 140  3
             it.remove();
 141  3
           }else if(same(name, ATOM03_TITLE_QNAME)){
 142  3
             ContentType c = ((JAXBElement<ContentType>)u.unmarshal(e)).getValue();
 143  3
             ret.setTitle(c);
 144  3
             it.remove();
 145  0
           }else if(same(name, ATOM03_TAGLINE_QNAME)){
 146  0
             ContentType c = ((JAXBElement<ContentType>)u.unmarshal(e)).getValue();
 147  0
             ret.setTagline(c);
 148  0
             it.remove();
 149  
           }
 150  
         }
 151  
       }
 152  0
     }catch (JAXBException e) {
 153  0
       throw new YarfrawException("unable to unmarshal element", e);
 154  
     }
 155  3
     return ret;
 156  
   }
 157  
   
 158  
   /**
 159  
    * Extracts the itunes extension elements from the input list into an {@link ItunesExtension}
 160  
    * object. <br/>
 161  
    * The extracted elements will be removed from the original input list.
 162  
    * <br/>
 163  
    * see http://www.apple.com/itunes/store/podcaststechspecs.html about these
 164  
    * extension elements
 165  
    * @param otherElements - any elements
 166  
    * @return an {@link ItunesExtension} object
 167  
    * @throws YarfrawException 
 168  
    */
 169  
   @SuppressWarnings("unchecked")
 170  
   public static ItunesExtension extractItunesExtension(List<Element> otherElements) throws YarfrawException {
 171  3
     ItunesExtension ret = new ItunesExtension();
 172  
     try{
 173  3
       if(otherElements != null){
 174  3
         Unmarshaller u = getContext(ContextEnum.ITUNES).createUnmarshaller();
 175  3
         Iterator<Element> it = otherElements.iterator();
 176  39
         while(it.hasNext()){
 177  33
           Element e = it.next();
 178  33
           if(e == null){
 179  0
             continue;
 180  
           }
 181  33
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 182  33
           if(same(name, ITUNES_AUTHOR_QNAME)){
 183  3
             ret.setAuthor(e.getTextContent());
 184  3
             it.remove();
 185  30
           }else if(same(name, ITUNES_BLOCK_QNAME)){
 186  3
             ret.setBlock(e.getTextContent());
 187  3
             it.remove();
 188  27
           }else if(same(name, ITUNES_CATEGORY_QNAME)){
 189  6
             ItunesCategoryType cat = ((JAXBElement<ItunesCategoryType>)u.unmarshal(e)).getValue();
 190  6
             ret.getCategory().add(cat);
 191  6
             it.remove();
 192  21
           }else if(same(name, ITUNES_DURATION_QNAME)){
 193  3
             ret.setDuration(e.getTextContent());
 194  3
             it.remove();
 195  18
           }else if(same(name, ITUNES_EXPLICIT_QNAME)){
 196  3
             ret.setExplicit(e.getTextContent());
 197  3
             it.remove();
 198  15
           }else if(same(name, ITUNES_IMAGE_QNAME)){
 199  3
             ItunesImageType img  = ((JAXBElement<ItunesImageType>)u.unmarshal(e)).getValue();
 200  3
             ret.setImage(img);
 201  3
             it.remove();
 202  12
           }else if(same(name, ITUNES_KEYWORDS_QNAME)){
 203  3
             ret.setKeywords(e.getTextContent());
 204  3
             it.remove();
 205  9
           }else if(same(name, ITUNES_OWNER_QNAME)){
 206  3
             ItunesOwnerType owner = ((JAXBElement<ItunesOwnerType>)u.unmarshal(e)).getValue();
 207  3
             ret.setOwner(owner);
 208  3
             it.remove();
 209  6
           }else if(same(name, ITUNES_SUBTITLE_QNAME)){
 210  3
             ret.setSubtitle(e.getTextContent());
 211  3
             it.remove();
 212  3
           }else if(same(name, ITUNES_SUMMARY_QNAME)){
 213  3
             ret.setSummary(e.getTextContent());
 214  3
             it.remove();
 215  0
           }else if(same(name, ITUNES_NewFeedUrl_QNAME)){
 216  0
             ret.setNewFeedUrl(e.getTextContent());
 217  0
             it.remove();
 218  
           }
 219  
         }
 220  
       }
 221  0
     }catch (JAXBException e) {
 222  0
       throw new YarfrawException("unable to unmarshal element", e);
 223  
     }
 224  3
     return ret;
 225  
   }
 226  
 
 227  
   /**
 228  
    * Extracts the itunes extension elements from the input list into an {@link DublinCoreExtension}
 229  
    * object. <br/>
 230  
    * The extracted elements will be removed from the original input list.
 231  
    * <br/>
 232  
    * see http://dublincore.org/documents/2002/07/31/dcmes-xml/ about these
 233  
    * extension elements
 234  
    * @param otherElements - any elements
 235  
    * @return an {@link DublinCoreExtension} object
 236  
    * @throws YarfrawException 
 237  
    */
 238  
   @SuppressWarnings("unchecked")
 239  
   public static DublinCoreExtension extractDublinCoreExtension(List<Element> otherElements) throws YarfrawException {
 240  3
     DublinCoreExtension ret = new DublinCoreExtension();
 241  
     try {
 242  3
       if(otherElements != null){
 243  3
         Iterator<Element> it = otherElements.iterator();
 244  3
         Unmarshaller u = getContext(ContextEnum.SY).createUnmarshaller();
 245  45
         while(it.hasNext()){
 246  39
           Element e = it.next();
 247  39
           if(e == null){
 248  0
             continue;
 249  
           }
 250  39
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 251  39
           if(same(name, DC_Contributor_QNAME)){
 252  0
             ret.getContributor().add(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 253  0
             it.remove();
 254  39
           }else if(same(name, DC_Coverage_QNAME)){
 255  3
             ret.setCoverage(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 256  3
             it.remove();
 257  36
           }else if(same(name, DC_Creator_QNAME)){
 258  3
             ret.setCreator(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 259  3
             it.remove();
 260  33
           }else if(same(name, DC_Date_QNAME)){
 261  3
             ret.setDate(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 262  3
             it.remove();
 263  30
           }else if(same(name, DC_Description_QNAME)){
 264  3
             ret.setDescription(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 265  3
             it.remove();
 266  27
           }else if(same(name, DC_Format_QNAME)){
 267  3
             ret.setFormat(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 268  3
             it.remove();
 269  24
           }else if(same(name, DC_Identifier_QNAME)){
 270  3
             ret.setIdentifier(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 271  3
             it.remove();
 272  21
           }else if(same(name, DC_Language_QNAME)){
 273  3
             ret.setLanguage(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 274  3
             it.remove();
 275  18
           }else if(same(name, DC_Publisher_QNAME)){
 276  3
             ret.setPublisher(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 277  3
             it.remove();
 278  15
           }else if(same(name, DC_Relation_QNAME)){
 279  3
             ret.setRelation(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 280  3
             it.remove();
 281  12
           }else if(same(name, DC_Rights_QNAME)){
 282  3
             ret.setRights(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 283  3
             it.remove();
 284  9
           }else if(same(name, DC_Source_QNAME)){
 285  3
             ret.setSource(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 286  3
             it.remove();
 287  6
           }else if(same(name, DC_Subject_QNAME)){
 288  0
             ret.getSubject().add(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 289  0
             it.remove();
 290  6
           }else if(same(name, DC_Title_QNAME)){
 291  3
             ret.setTitle(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 292  3
             it.remove();
 293  3
           }else if(same(name, DC_Type_QNAME)){
 294  3
             ret.setType(((JAXBElement<DcType>)u.unmarshal(e)).getValue());
 295  3
             it.remove();
 296  
           }
 297  
         }
 298  
       }
 299  0
     }catch (JAXBException e) {
 300  0
       throw new YarfrawException("unable to unmarshal element", e);
 301  
     }
 302  3
     return ret;
 303  
   }
 304  
   
 305  
   /**
 306  
    * Extracts the well-formed web extension elements from the input list into an {@link WellFormedWebExtension}
 307  
    * object. <br/>
 308  
    * The extracted elements will be removed from the original input list.
 309  
    * <br/>
 310  
    * see http://wellformedweb.org/news/wfw_namespace_elements about these
 311  
    * extension elements
 312  
    * @param otherElements - any elements
 313  
    * @return an {@link WellFormedWebExtension} object
 314  
    * @throws YarfrawException 
 315  
    */
 316  
   public static WellFormedWebExtension extractWellFormedWebExtension(List<Element> otherElements) throws YarfrawException {
 317  3
     WellFormedWebExtension ret = new WellFormedWebExtension();
 318  3
       if(otherElements != null){
 319  3
         Iterator<Element> it = otherElements.iterator();
 320  12
         while(it.hasNext()){
 321  6
           Element e = it.next();
 322  6
           if(e == null){
 323  0
             continue;
 324  
           }
 325  6
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 326  6
           if(same(name, WFW_Comment_QNAME)){
 327  3
             ret.setComment(e.getTextContent());
 328  3
             it.remove();
 329  3
           }else if(same(name, WFW_CommentRss_QNAME)){
 330  3
             ret.setCommentRss(e.getTextContent());
 331  3
             it.remove();
 332  
           }
 333  
         }
 334  
       }
 335  3
     return ret;
 336  
   }
 337  
 
 338  
   /**
 339  
    * Extracts the well-formed web extension elements from the input list into an {@link AdminExtension}
 340  
    * object. <br/>
 341  
    * The extracted elements will be removed from the original input list.
 342  
    * <br/>
 343  
    * see http://web.resource.org/rss/1.0/modules/admin/ about these
 344  
    * extension elements
 345  
    * @param otherElements - any elements
 346  
    * @return an {@link AdminExtension} object
 347  
    * @throws YarfrawException 
 348  
    */
 349  
   @SuppressWarnings("unchecked")
 350  
   public static AdminExtension extractAdminExtension(List<Element> otherElements) throws YarfrawException {
 351  3
     AdminExtension ret = new AdminExtension();
 352  
     try {
 353  3
       if(otherElements != null){
 354  3
         Iterator<Element> it = otherElements.iterator();
 355  3
         Unmarshaller u = getContext(ContextEnum.ADMIN).createUnmarshaller();
 356  12
         while(it.hasNext()){
 357  6
           Element e = it.next();
 358  6
           if(e == null){
 359  0
             continue;
 360  
           }
 361  6
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 362  6
           if(same(name, ADMIN_ErrorReportsTo_QNAME)){
 363  3
             if(e.getTextContent() != null){
 364  3
               ret.setErrorReportsTo(((JAXBElement<AdminType>)u.unmarshal(e)).getValue());
 365  
             }
 366  3
           }else if(same(name, ADMIN_GeneratorAgent_QNAME)){
 367  3
             if(e.getTextContent() != null){
 368  3
               ret.setGeneratorAgent(((JAXBElement<AdminType>)u.unmarshal(e)).getValue());
 369  
             }
 370  
           }
 371  
         }
 372  
       }
 373  
     }
 374  0
     catch (JAXBException e) {
 375  0
       throw new YarfrawException("unable to unmarshal element", e);
 376  
     }
 377  
 
 378  3
     return ret;
 379  
   }
 380  
   
 381  
   /**
 382  
    * Extracts the feedburner extension elements from the input list into an {@link FeedburnerExtension}
 383  
    * object. <br/>
 384  
    * The extracted elements will be removed from the original input list.
 385  
    * <br/>
 386  
    * see www.feedburner.com about these
 387  
    * extension elements
 388  
    * @param otherElements - any elements
 389  
    * @return an {@link FeedburnerExtension} object
 390  
    * @throws YarfrawException 
 391  
    */
 392  
   @SuppressWarnings("unchecked")
 393  
   public static FeedburnerExtension extractFeedburnerExtension(List<Element> otherElements) throws YarfrawException {
 394  3
     FeedburnerExtension ret = new FeedburnerExtension();
 395  3
     if(otherElements != null){
 396  3
       Iterator<Element> it = otherElements.iterator();
 397  12
       while(it.hasNext()){
 398  6
         Element e = it.next();
 399  6
         if(e == null){
 400  0
           continue;
 401  
         }
 402  6
         QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 403  6
         if(same(name, FEEDBURNER_BrowserFriendly_QNAME)){
 404  3
           ret.setBrowserFriendly(e.getTextContent());
 405  3
         }else if(same(name, FEEDBURNER_OrigLink_QNAME)){
 406  3
           ret.setOrigLink(e.getTextContent());
 407  
         }
 408  
       }
 409  
     }
 410  3
     return ret;
 411  
   }
 412  
 
 413  
   /**
 414  
    * Extracts the slash extension elements from the input list into an {@link SlashExtension}
 415  
    * object. <br/>
 416  
    * The extracted elements will be removed from the original input list.
 417  
    * <br/>
 418  
    * see http://web.resource.org/rss/1.0/modules/slash/ these
 419  
    * extension elements
 420  
    * @param otherElements - any elements
 421  
    * @return an {@link SlashExtension} object
 422  
    * @throws YarfrawException 
 423  
    */
 424  
   @SuppressWarnings("unchecked")
 425  
   public static SlashExtension extractSlashExtension(List<Element> otherElements) throws YarfrawException {
 426  3
     SlashExtension ret = new SlashExtension();
 427  
     try {
 428  3
       if(otherElements != null){
 429  3
         Iterator<Element> it = otherElements.iterator();
 430  3
         Unmarshaller u = getContext(ContextEnum.SLASH).createUnmarshaller();
 431  18
         while(it.hasNext()){
 432  12
           Element e = it.next();
 433  12
           if(e == null){
 434  0
             continue;
 435  
           }
 436  12
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 437  12
           if(same(name, SLASH_Comments_QNAME)){
 438  3
             ret.setComments(((JAXBElement<BigInteger>)u.unmarshal(e)).getValue());
 439  9
           }else if(same(name, SLASH_Department_QNAME)){
 440  3
             ret.setDepartment(e.getTextContent());
 441  6
           }else if(same(name, SLASH_HitParade_QNAME)){
 442  3
             ret.setHitParade(e.getTextContent());
 443  3
           }else if(same(name, SLASH_Section_QNAME)){
 444  3
             ret.setSection(e.getTextContent());
 445  
           }
 446  
         }
 447  
       }
 448  
     }
 449  0
     catch (JAXBException e) {
 450  0
       throw new YarfrawException("unable to unmarshal element", e);
 451  
     }
 452  
 
 453  3
     return ret;
 454  
   }
 455  
   
 456  
   /**
 457  
    * Extracts the well-formed web extension elements from the input list into an {@link BloggerExtension}
 458  
    * object. <br/>
 459  
    * The extracted elements will be removed from the original input list.
 460  
    * <br/>
 461  
    * see http://code.blogger.com/archives/atom-docs.html#extensions about these
 462  
    * extension elements
 463  
    * @param otherElements - any elements
 464  
    * @return an {@link BloggerExtension} object
 465  
    * @throws YarfrawException 
 466  
    */
 467  
   public static BloggerExtension extractBloggerExtension(List<Element> otherElements) throws YarfrawException {
 468  3
     BloggerExtension ret = new BloggerExtension();
 469  3
       if(otherElements != null){
 470  3
         Iterator<Element> it = otherElements.iterator();
 471  12
         while(it.hasNext()){
 472  6
           Element e = it.next();
 473  6
           if(e == null){
 474  0
             continue;
 475  
           }
 476  6
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 477  6
           if(same(name, BLOGGER_ConvertLineBreaks_QNAME)){
 478  3
             if(e.getTextContent() != null){
 479  3
               ret.setConvertLineBreaks(Boolean.valueOf(e.getTextContent()));
 480  
             }
 481  3
           }else if(same(name, BLOGGER_Draft_QNAME)){
 482  3
             if(e.getTextContent() != null){
 483  3
               ret.setDraft(Boolean.valueOf(e.getTextContent()));
 484  
             }
 485  
           }
 486  
         }
 487  
       }
 488  3
     return ret;
 489  
   }
 490  
   
 491  
   /**
 492  
    * Extracts the well-formed web extension elements from the input list into an {@link SyndicationExtension}
 493  
    * object. <br/>
 494  
    * The extracted elements will be removed from the original input list.
 495  
    * <br/>
 496  
    * see http://web.resource.org/rss/1.0/modules/syndication/ about these
 497  
    * extension elements
 498  
    * @param otherElements - any elements
 499  
    * @return an {@link SyndicationExtension} object
 500  
    * @throws YarfrawException 
 501  
    */
 502  
   @SuppressWarnings("unchecked")
 503  
   public static SyndicationExtension extractSyndicationExtension(List<Element> otherElements) throws YarfrawException {
 504  3
     SyndicationExtension ret = new SyndicationExtension();
 505  
     try {
 506  3
       if(otherElements != null){
 507  3
         Iterator<Element> it = otherElements.iterator();
 508  3
         Unmarshaller u = getContext(ContextEnum.SY).createUnmarshaller();
 509  15
         while(it.hasNext()){
 510  9
           Element e = it.next();
 511  9
           if(e == null){
 512  0
             continue;
 513  
           }
 514  9
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 515  9
           if(same(name, SY_UpdateBase_QNAME)){
 516  3
             ret.setUpdateBase(e.getTextContent());
 517  3
             it.remove();
 518  6
           }else if(same(name, SY_UpdateFrequency_QNAME)){
 519  3
             ret.setUpdateFrequency(((JAXBElement<BigInteger>)u.unmarshal(e)).getValue());
 520  3
             it.remove();
 521  3
           }else if(same(name, SY_UpdatePeriod_QNAME)){
 522  3
             ret.setUpdatePeriod(((JAXBElement<UpdatePeriodEnum>)u.unmarshal(e)).getValue());
 523  3
             it.remove();
 524  
           }
 525  
         }
 526  
       }
 527  0
     }catch (Exception e) {
 528  0
       throw new YarfrawException("unable to unmarshal element", e);
 529  
     }
 530  3
     return ret;
 531  
   }
 532  
   
 533  
   /**
 534  
    * Extracts the googlebase extension elements from the input list into an {@link GoogleBaseExtension}
 535  
    * object.
 536  
    * <br/>
 537  
    * see http://www.apple.com/itunes/store/podcaststechspecs.html about these
 538  
    * extension elements
 539  
    * @param otherElements - any elements
 540  
    * @return an {@link GoogleBaseExtension} object
 541  
    * @throws YarfrawException 
 542  
    */
 543  
   @SuppressWarnings("unchecked")
 544  
   public static GoogleBaseExtension extractGoogleBaseExtension(List<Element> otherElements) throws YarfrawException {
 545  42
     GoogleBaseExtension ret = new GoogleBaseExtension();
 546  
     try{
 547  42
       if(otherElements != null){
 548  42
         Unmarshaller u = JAXBContext.newInstance(GOOGLEBASE_JAXB_CONTEXT).createUnmarshaller();
 549  42
         Iterator<Element> it = otherElements.iterator();
 550  621
         while(it.hasNext()){
 551  537
           Element e = it.next();
 552  537
           if(e == null){
 553  0
             continue;
 554  
           }
 555  537
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 556  537
           if(same(name, GOOGLEBASE_Actor_QNAME)){
 557  0
             ret.getActor().add(e.getTextContent());
 558  0
             it.remove();
 559  537
           }else if(same(name, GOOGLEBASE_Agent_QNAME)){
 560  9
             ret.getAgent().add(e.getTextContent());
 561  9
             it.remove();
 562  528
           }else if(same(name, GOOGLEBASE_Age_QNAME)){
 563  9
             ret.setAge(e.getTextContent() == null ? null : Short.valueOf(e.getTextContent()));
 564  9
             it.remove();
 565  519
           }else if(same(name, GOOGLEBASE_ApparelType_QNAME)){
 566  0
             ret.setApparelType(e.getTextContent());
 567  0
             it.remove();
 568  519
           }else if(same(name, GOOGLEBASE_Area_QNAME)){
 569  9
             ret.setArea(e.getTextContent());
 570  9
             it.remove();
 571  510
           }else if(same(name, GOOGLEBASE_Artist_QNAME)){
 572  0
             ret.getArtist().add(e.getTextContent());
 573  0
             it.remove();
 574  510
           }else if(same(name, GOOGLEBASE_Author_QNAME)){
 575  0
             ret.getAuthor().add(e.getTextContent());
 576  0
             it.remove();
 577  510
           }else if(same(name, GOOGLEBASE_Bathrooms_QNAME)){
 578  9
             ret.setBathrooms(e.getTextContent() == null ? null : new BigDecimal(e.getTextContent()));
 579  9
             it.remove();
 580  501
           }else if(same(name, GOOGLEBASE_Bedrooms_QNAME)){
 581  9
             ret.setBedrooms(e.getTextContent() == null ? null : Short.valueOf(e.getTextContent()));
 582  9
             it.remove();
 583  492
           }else if(same(name, GOOGLEBASE_Brand_QNAME)){
 584  0
             ret.setBrand(e.getTextContent());
 585  0
             it.remove();
 586  492
           }else if(same(name, GOOGLEBASE_Color_QNAME)){
 587  0
             ret.getColor().add(e.getTextContent());
 588  0
             it.remove();
 589  492
           }else if(same(name, GOOGLEBASE_Condition_QNAME)){
 590  0
             ret.setCondition(e.getTextContent());
 591  0
             it.remove();
 592  492
           }else if(same(name, GOOGLEBASE_CourseDateRange_QNAME)){
 593  0
             DateTimeRangeType d = ((JAXBElement<DateTimeRangeType>)u.unmarshal(e)).getValue();
 594  0
             ret.setCourseDateRange(d);
 595  0
             it.remove();
 596  492
           }else if(same(name, GOOGLEBASE_CourseNumber_QNAME)){
 597  0
             ret.setCourseNumber(e.getTextContent());
 598  0
             it.remove();
 599  492
           }else if(same(name, GOOGLEBASE_CourseTimes_QNAME)){
 600  0
             ret.setCourseTimes(e.getTextContent());
 601  0
             it.remove();
 602  492
           }else if(same(name, GOOGLEBASE_Currency_QNAME)){
 603  0
             ret.setCurrency(((JAXBElement<CurrencyCodeEnumeration>)u.unmarshal(e)).getValue());
 604  0
             it.remove();
 605  492
           }else if(same(name, GOOGLEBASE_DeliveryNotes_QNAME)){
 606  0
             ret.setDeliveryNotes(e.getTextContent());
 607  0
             it.remove();
 608  492
           }else if(same(name, GOOGLEBASE_DeliveryRadius_QNAME)){
 609  0
             ret.setDeliveryRadius(e.getTextContent());
 610  0
             it.remove();
 611  492
           }else if(same(name, GOOGLEBASE_DevelopmentStatus_QNAME)){
 612  0
             ret.setDevelopmentStatus(e.getTextContent());
 613  0
             it.remove();
 614  492
           }else if(same(name, GOOGLEBASE_Education_QNAME)){
 615  18
             ret.getEducation().add(e.getTextContent());
 616  18
             it.remove();
 617  474
           }else if(same(name, GOOGLEBASE_Employer_QNAME)){
 618  18
             ret.getEmployer().add(e.getTextContent());
 619  18
             it.remove();
 620  456
           }else if(same(name, GOOGLEBASE_Ethnicity_QNAME)){
 621  9
             ret.getEthnicity().add(e.getTextContent());
 622  9
             it.remove();
 623  447
           }else if(same(name, GOOGLEBASE_EventDateRange_QNAME)){
 624  9
             DateTimeRangeType d = ((JAXBElement<DateTimeRangeType>)u.unmarshal(e)).getValue();
 625  9
             ret.setEventDateRange(d);
 626  9
             it.remove();
 627  438
           }else if(same(name, GOOGLEBASE_ExpirationDate_QNAME)){
 628  42
             XMLGregorianCalendar d = ((JAXBElement<XMLGregorianCalendar>)u.unmarshal(e)).getValue();
 629  42
             ret.setExpirationDate(d);
 630  42
             it.remove();
 631  396
           }else if(same(name, GOOGLEBASE_ExpirationDateTime_QNAME)){
 632  0
             XMLGregorianCalendar d = ((JAXBElement<XMLGregorianCalendar>)u.unmarshal(e)).getValue();
 633  0
             ret.setExpirationDateTime(d);
 634  0
             it.remove();
 635  396
           }else if(same(name, GOOGLEBASE_Format_QNAME)){
 636  0
             ret.getFormat().add(e.getTextContent());
 637  0
             it.remove();
 638  396
           }else if(same(name, GOOGLEBASE_ForSale_QNAME)){
 639  0
             ret.setForSale(((JAXBElement<Boolean>)u.unmarshal(e)).getValue());
 640  0
             it.remove();
 641  396
           }else if(same(name, GOOGLEBASE_FromLocation_QNAME)){
 642  6
             ret.setFromLocation(e.getTextContent());
 643  6
             it.remove();
 644  390
           }else if(same(name, GOOGLEBASE_Gender_QNAME)){
 645  9
             ret.setGender(((JAXBElement<GenderEnumeration>)u.unmarshal(e)).getValue());
 646  9
             it.remove();
 647  381
           }else if(same(name, GOOGLEBASE_HoaDues_QNAME)){
 648  3
             ret.setHoaDues(((JAXBElement<BigDecimal>)u.unmarshal(e)).getValue());
 649  3
             it.remove();
 650  378
           }else if(same(name, GOOGLEBASE_Id_QNAME)){
 651  0
             ret.setId(e.getTextContent());
 652  0
             it.remove();
 653  378
           }else if(same(name, GOOGLEBASE_ImageLink_QNAME)){
 654  42
             ret.getImageLink().add(e.getTextContent());
 655  42
             it.remove();
 656  336
           }else if(same(name, GOOGLEBASE_ImmigrationStatus_QNAME)){
 657  9
             ret.setImmigrationStatus(e.getTextContent());
 658  9
             it.remove();
 659  327
           }else if(same(name, GOOGLEBASE_InterestedIn_QNAME)){
 660  9
             ret.setInterestedIn(e.getTextContent());
 661  9
             it.remove();
 662  318
           }else if(same(name, GOOGLEBASE_Isbn_QNAME)){
 663  0
             ret.setIsbn(e.getTextContent());
 664  0
             it.remove();
 665  318
           }else if(same(name, GOOGLEBASE_JobFunction_QNAME)){
 666  9
             ret.getJobFunction().add(e.getTextContent());
 667  9
             it.remove();
 668  309
           }else if(same(name, GOOGLEBASE_JobIndustry_QNAME)){
 669  9
             ret.getJobIndustry().add(e.getTextContent());
 670  9
             it.remove();
 671  300
           }else if(same(name, GOOGLEBASE_JobType_QNAME)){
 672  9
             ret.getJobType().add(e.getTextContent());
 673  9
             it.remove();
 674  291
           }else if(same(name, GOOGLEBASE_Label_QNAME)){
 675  0
             ret.getLabel().add(e.getTextContent());
 676  0
             it.remove();
 677  291
           }else if(same(name, GOOGLEBASE_License_QNAME)){
 678  0
             ret.getLicense().add(e.getTextContent());
 679  0
             it.remove();
 680  291
           }else if(same(name, GOOGLEBASE_ListingType_QNAME)){
 681  9
             ret.getListingType().add(e.getTextContent());
 682  9
             it.remove();
 683  282
           }else if(same(name, GOOGLEBASE_Location_QNAME)){
 684  33
             ret.setLocation(e.getTextContent());
 685  33
             it.remove();
 686  249
           }else if(same(name, GOOGLEBASE_Make_QNAME)){
 687  0
             ret.setMake(e.getTextContent());
 688  0
             it.remove();
 689  249
           }else if(same(name, GOOGLEBASE_Manufacturer_QNAME)){
 690  0
             ret.setManufacturer(e.getTextContent());
 691  0
             it.remove();
 692  249
           }else if(same(name, GOOGLEBASE_ManufacturerId_QNAME)){
 693  0
             ret.setManufacturerId(e.getTextContent());
 694  0
             it.remove();
 695  249
           }else if(same(name, GOOGLEBASE_MaritalStatus_QNAME)){
 696  9
             ret.setMaritalStatus(e.getTextContent());
 697  9
             it.remove();
 698  240
           }else if(same(name, GOOGLEBASE_Megapixels_QNAME)){
 699  0
             ret.setMegapixels(e.getTextContent());
 700  0
             it.remove();
 701  240
           }else if(same(name, GOOGLEBASE_Memory_QNAME)){
 702  0
             ret.setMemory(e.getTextContent());
 703  0
             it.remove();
 704  240
           }else if(same(name, GOOGLEBASE_Mileage_QNAME)){
 705  0
             ret.setMileage(e.getTextContent());
 706  0
             it.remove();
 707  240
           }else if(same(name, GOOGLEBASE_Model_QNAME)){
 708  0
             ret.setModel(e.getTextContent());
 709  0
             it.remove();
 710  240
           }else if(same(name, GOOGLEBASE_ModelNumber_QNAME)){
 711  0
             ret.setModelNumber(e.getTextContent());
 712  0
             it.remove();
 713  240
           }else if(same(name, GOOGLEBASE_NameOfItemReviewed_QNAME)){
 714  0
             ret.setNameOfItemReviewed(e.getTextContent());
 715  0
             it.remove();
 716  240
           }else if(same(name, GOOGLEBASE_NewsSource_QNAME)){
 717  0
             ret.setNewsSource(e.getTextContent());
 718  0
             it.remove();
 719  240
           }else if(same(name, GOOGLEBASE_Occupation_QNAME)){
 720  9
             ret.setOccupation(e.getTextContent());
 721  9
             it.remove();
 722  231
           }else if(same(name, GOOGLEBASE_OperatingSystems_QNAME)){
 723  0
             ret.setOperatingSystems(e.getTextContent());
 724  0
             it.remove();
 725  231
           }else if(same(name, GOOGLEBASE_Pages_QNAME)){
 726  0
             ret.setPages(((JAXBElement<BigInteger>)u.unmarshal(e)).getValue());
 727  0
             it.remove();
 728  231
           }else if(same(name, GOOGLEBASE_PaymentAccepted_QNAME)){
 729  0
             ret.getPaymentAccepted().add(((JAXBElement<PaymentMethodEnumeration>)u.unmarshal(e)).getValue());
 730  0
             it.remove();
 731  231
           }else if(same(name, GOOGLEBASE_PaymentNotes_QNAME)){
 732  0
             ret.setPaymentNotes(e.getTextContent());
 733  0
             it.remove();
 734  231
           }else if(same(name, GOOGLEBASE_Pickup_QNAME)){
 735  0
             ret.setPickup(((JAXBElement<Boolean>)u.unmarshal(e)).getValue());
 736  0
             it.remove();
 737  231
           }else if(same(name, GOOGLEBASE_Price_QNAME)){
 738  24
             ret.setPrice(e.getTextContent());
 739  24
             it.remove();
 740  207
           }else if(same(name, GOOGLEBASE_PriceType_QNAME)){
 741  24
             ret.setPriceType(((JAXBElement<PriceTypeEnumeration>)u.unmarshal(e)).getValue());
 742  24
             it.remove();
 743  183
           }else if(same(name, GOOGLEBASE_ProcessorSpeed_QNAME)){
 744  0
             ret.setProcessorSpeed(e.getTextContent());
 745  0
             it.remove();
 746  183
           }else if(same(name, GOOGLEBASE_ProductType_QNAME)){
 747  0
             ret.getProductType().add(e.getTextContent());
 748  0
             it.remove();
 749  183
           }else if(same(name, GOOGLEBASE_ProgrammingLanguage_QNAME)){
 750  0
             ret.getProgrammingLanguage().add(e.getTextContent());
 751  0
             it.remove();
 752  183
           }else if(same(name, GOOGLEBASE_PropertyType_QNAME)){
 753  9
             ret.getPropertyType().add(e.getTextContent());
 754  9
             it.remove();
 755  174
           }else if(same(name, GOOGLEBASE_PublicationName_QNAME)){
 756  0
             ret.setPublicationName(e.getTextContent());
 757  0
             it.remove();
 758  174
           }else if(same(name, GOOGLEBASE_PublicationVolume_QNAME)){
 759  0
             ret.setPublicationVolume(e.getTextContent());
 760  0
             it.remove();
 761  174
           }else if(same(name, GOOGLEBASE_PublishDate_QNAME)){
 762  18
             ret.setPublishDate(((JAXBElement<XMLGregorianCalendar>)u.unmarshal(e)).getValue());
 763  18
             it.remove();
 764  156
           }else if(same(name, GOOGLEBASE_Quantity_QNAME)){
 765  15
             ret.setQuantity(((JAXBElement<BigInteger>)u.unmarshal(e)).getValue());
 766  15
             it.remove();
 767  141
           }else if(same(name, GOOGLEBASE_Rating_QNAME)){
 768  0
             ret.setRating(e.getTextContent());
 769  0
             it.remove();
 770  141
           }else if(same(name, GOOGLEBASE_RatingType_QNAME)){
 771  0
             ret.setRatingType(e.getTextContent());
 772  0
             it.remove();
 773  141
           }else if(same(name, GOOGLEBASE_RelatedLink_QNAME)){
 774  0
             ret.getRelatedLink().add(e.getTextContent());
 775  0
             it.remove();
 776  141
           }else if(same(name, GOOGLEBASE_ReviewerType_QNAME)){
 777  0
             ret.setReviewerType(e.getTextContent());
 778  0
             it.remove();
 779  141
           }else if(same(name, GOOGLEBASE_ReviewType_QNAME)){
 780  0
             ret.setReviewType(e.getTextContent());
 781  0
             it.remove();
 782  141
           }else if(same(name, GOOGLEBASE_Salary_QNAME)){
 783  9
             ret.setSalary(((JAXBElement<BigDecimal>)u.unmarshal(e)).getValue());
 784  9
             it.remove();
 785  132
           }else if(same(name, GOOGLEBASE_SalaryType_QNAME)){
 786  9
             ret.setSalaryType(((JAXBElement<PriceTypeEnumeration>)u.unmarshal(e)).getValue());
 787  9
             it.remove();
 788  123
           }else if(same(name, GOOGLEBASE_SchoolDistrict_QNAME)){
 789  9
             ret.setSchoolDistrict(e.getTextContent());
 790  9
             it.remove();
 791  114
           }else if(same(name, GOOGLEBASE_ServiceType_QNAME)){
 792  0
             ret.setServiceType(e.getTextContent());
 793  0
             it.remove();
 794  114
           }else if(same(name, GOOGLEBASE_SexualOrientation_QNAME)){ //what the hell?
 795  9
             ret.setSexualOrientation(e.getTextContent());
 796  9
             it.remove();
 797  105
           }else if(same(name, GOOGLEBASE_Shipping_QNAME)){
 798  0
             ret.getShipping().add(((JAXBElement<ShippingType>)u.unmarshal(e)).getValue());
 799  0
             it.remove();
 800  105
           }else if(same(name, GOOGLEBASE_Size_QNAME)){
 801  0
             ret.getSize().add(e.getTextContent());
 802  0
             it.remove();
 803  105
           }else if(same(name, GOOGLEBASE_SquareFootage_QNAME)){
 804  0
             ret.getSquareFootage().add(e.getTextContent());
 805  0
             it.remove();
 806  105
           }else if(same(name, GOOGLEBASE_Subject_QNAME)){
 807  0
             ret.getSubject().add(e.getTextContent());
 808  0
             it.remove();
 809  105
           }else if(same(name, GOOGLEBASE_SubjectArea_QNAME)){
 810  0
             ret.getSubjectArea().add(e.getTextContent());
 811  0
             it.remove();
 812  105
           }else if(same(name, GOOGLEBASE_TaxPercent_QNAME)){
 813  0
             ret.setTaxPercent(((JAXBElement<BigDecimal>)u.unmarshal(e)).getValue());
 814  0
             it.remove();
 815  105
           }else if(same(name, GOOGLEBASE_TaxRegion_QNAME)){
 816  0
             ret.setTaxRegion(e.getTextContent());
 817  0
             it.remove();
 818  105
           }else if(same(name, GOOGLEBASE_ToLocation_QNAME)){
 819  6
             ret.setToLocation(e.getTextContent());
 820  6
             it.remove();
 821  99
           }else if(same(name, GOOGLEBASE_TravelDateRange_QNAME)){
 822  6
             DateTimeRangeType d = ((JAXBElement<DateTimeRangeType>)u.unmarshal(e)).getValue();
 823  6
             ret.setTravelDateRange(d);
 824  6
             it.remove();
 825  93
           }else if(same(name, GOOGLEBASE_University_QNAME)){
 826  0
             ret.setUniversity(e.getTextContent());
 827  0
             it.remove();
 828  93
           }else if(same(name, GOOGLEBASE_Upc_QNAME)){
 829  0
             ret.setUpc(e.getTextContent());
 830  0
             it.remove();
 831  93
           }else if(same(name, GOOGLEBASE_UrlOfItemReviewed_QNAME)){
 832  0
             ret.setUrlOfItemReviewed(e.getTextContent());
 833  0
             it.remove();
 834  93
           }else if(same(name, GOOGLEBASE_VehicleType_QNAME)){
 835  0
             ret.getVehicleType().add(e.getTextContent());
 836  0
             it.remove();
 837  93
           }else if(same(name, GOOGLEBASE_Vin_QNAME)){
 838  0
             ret.setVin(e.getTextContent());
 839  0
             it.remove();
 840  93
           }else if(same(name, GOOGLEBASE_Weight_QNAME)){
 841  0
             ret.setWeight(e.getTextContent());
 842  0
             it.remove();
 843  93
           }else if(same(name, GOOGLEBASE_Year_QNAME)){
 844  9
             ret.setYear(((JAXBElement<XMLGregorianCalendar>)u.unmarshal(e)).getValue());
 845  9
             it.remove();
 846  84
           }else if(HTTP_BASE_GOOGLE_COM_CNS_1_0.equals(e.getNamespaceURI())){
 847  84
             ret.getAny().add(e);
 848  84
             it.remove();
 849  
           }
 850  
         }
 851  
       }
 852  0
     }catch (JAXBException e) {
 853  0
       throw new YarfrawException("unable to unmarshal element", e);
 854  
     }
 855  42
     return ret;
 856  
   }
 857  
 
 858  
   /**
 859  
    * Extracts the Georss extension elements from the input list into an {@link GeoRssExtension}
 860  
    * object.<br/>
 861  
    * The extracted elements will be removed from the original input list.
 862  
    * 
 863  
    * <br/>
 864  
    * see http://georss.org/ about these
 865  
    * extension elements
 866  
    * @param otherElements - any elements
 867  
    * @return an {@link GeoRssExtension} object
 868  
    * @throws YarfrawException 
 869  
    */
 870  
   @SuppressWarnings("unchecked")
 871  
   public static GeoRssExtension extractGeoRssExtension(List<Element> otherElements) throws YarfrawException {
 872  3
     GeoRssExtension ret = new GeoRssExtension();
 873  
     try{
 874  3
       if(otherElements != null){
 875  3
         Unmarshaller u = JAXBContext.newInstance(GEORSS_JAXB_CONTEXT).createUnmarshaller();
 876  3
         Iterator<Element> it = otherElements.iterator();
 877  15
         while(it.hasNext()){
 878  9
           Element e = it.next();
 879  9
           if(e == null){
 880  0
             continue;
 881  
           }
 882  9
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 883  9
           if(same(name, GEORSS_WHERE_QNAME)){
 884  3
             Where copy = ((JAXBElement<Where>)u.unmarshal(e)).getValue();
 885  3
             ret.setWhere(copy);
 886  3
             it.remove();
 887  6
           }else if(same(name, GEORSS_BOX_QNAME)){
 888  3
             SimplePositionType pos = ((JAXBElement<SimplePositionType>)u.unmarshal(e)).getValue();
 889  3
             ret.setBox(pos);
 890  3
             it.remove();
 891  3
           }else if(same(name, GEORSS_LINE_QNAME)){
 892  0
             SimplePositionType pos = ((JAXBElement<SimplePositionType>)u.unmarshal(e)).getValue();
 893  0
             ret.setLine(pos);
 894  0
             it.remove();
 895  3
           }else if(same(name, GEORSS_POINT_QNAME)){
 896  0
             SimplePositionType pos = ((JAXBElement<SimplePositionType>)u.unmarshal(e)).getValue();
 897  0
             ret.setPoint(pos);
 898  0
             it.remove();
 899  3
           }else if(same(name, GEORSS_POLYGON_QNAME)){
 900  3
             SimplePositionType pos = ((JAXBElement<SimplePositionType>)u.unmarshal(e)).getValue();
 901  3
             ret.setPolygon(pos);
 902  3
             it.remove();
 903  
           }
 904  
         }
 905  
       }
 906  0
     }catch (JAXBException e) {
 907  0
       throw new YarfrawException("unable to unmarshal element", e);
 908  
     }
 909  3
     return ret;
 910  
   }
 911  
   
 912  
   /**
 913  
    * Extracts the mrss extension elements from the input list into an {@link MrssExtension}
 914  
    * object.<br/>
 915  
    * The extracted elements will be removed from the original input list.
 916  
    * 
 917  
    * <br/>
 918  
    * see http://search.yahoo.com/mrss about these
 919  
    * extension elements
 920  
    * @param otherElements - any elements
 921  
    * @return an {@link MrssExtension} object
 922  
    * @throws YarfrawException 
 923  
    */
 924  
   @SuppressWarnings("unchecked")
 925  
   public static MrssExtension extractMrssExtension(List<Element> otherElements) throws YarfrawException {
 926  3
     MrssExtension ret = new MrssExtension();
 927  
     try{
 928  3
       if(otherElements != null){
 929  3
         Unmarshaller u = JAXBContext.newInstance(MRSS_JAXB_CONTEXT).createUnmarshaller();
 930  3
         Iterator<Element> it = otherElements.iterator();
 931  39
         while(it.hasNext()){
 932  33
           Element e = it.next();
 933  33
           if(e == null){
 934  0
             continue;
 935  
           }
 936  33
           QName name = new QName(e.getNamespaceURI(), e.getLocalName());
 937  33
           if(same(name, MRSS_CATEGORY_QNAME)){
 938  0
             MrssCategoryType cat = ((JAXBElement<MrssCategoryType>)u.unmarshal(e)).getValue();
 939  0
             ret.getCategory().add(cat);
 940  0
             it.remove();
 941  33
           }else if(same(name, MRSS_CONTENT_QNAME)){
 942  0
             MrssContentType content = ((JAXBElement<MrssContentType>)u.unmarshal(e)).getValue();
 943  0
             ret.getContent().add(content);
 944  0
             it.remove();
 945  33
           }else if(same(name, MRSS_COPYRIGHT_QNAME)){
 946  3
             MrssCopyrightType copy = ((JAXBElement<MrssCopyrightType>)u.unmarshal(e)).getValue();
 947  3
             ret.setCopyright(copy);
 948  3
             it.remove();
 949  30
           }else if(same(name, MRSS_CREDIT_QNAME)){
 950  0
             MrssCreditType copy = ((JAXBElement<MrssCreditType>)u.unmarshal(e)).getValue();
 951  0
             ret.getCredit().add(copy);
 952  0
             it.remove();
 953  30
           }else if(same(name, MRSS_DESCRIPTION_QNAME)){
 954  3
             MrssDescriptionType copy = ((JAXBElement<MrssDescriptionType>)u.unmarshal(e)).getValue();
 955  3
             ret.setDescription(copy);
 956  3
             it.remove();
 957  27
           }else if(same(name, MRSS_GROUP_QNAME)){
 958  3
             MrssGroupType copy = ((JAXBElement<MrssGroupType>)u.unmarshal(e)).getValue();
 959  3
             ret.getGroup().add(copy);
 960  3
             it.remove();
 961  24
           }else if(same(name, MRSS_HASH_QNAME)){
 962  3
             MrssHashType copy = ((JAXBElement<MrssHashType>)u.unmarshal(e)).getValue();
 963  3
             ret.setHash(copy);
 964  3
             it.remove();
 965  21
           }else if(same(name, MRSS_KEYWORDS_QNAME)){
 966  3
             ret.setKeywords(e.getTextContent());
 967  3
             it.remove();
 968  18
           }else if(same(name, MRSS_PLAYER_QNAME)){
 969  3
             MrssPlayerType copy = ((JAXBElement<MrssPlayerType>)u.unmarshal(e)).getValue();
 970  3
             ret.setPlayer(copy);
 971  3
             it.remove();
 972  15
           }else if(same(name, MRSS_RATING_QNAME)){
 973  3
             MrssRatingType copy = ((JAXBElement<MrssRatingType>)u.unmarshal(e)).getValue();
 974  3
             ret.setRating(copy);
 975  3
             it.remove();
 976  12
           }else if(same(name, MRSS_RESTRICTION_QNAME)){
 977  3
             MrssRestrictionType copy = ((JAXBElement<MrssRestrictionType>)u.unmarshal(e)).getValue();
 978  3
             ret.setRestriction(copy);
 979  3
             it.remove();
 980  9
           }else if(same(name, MRSS_TEXT_QNAME)){
 981  3
             MrssTextType copy = ((JAXBElement<MrssTextType>)u.unmarshal(e)).getValue();
 982  3
             ret.setText(copy);
 983  3
             it.remove();
 984  6
           }else if(same(name, MRSS_THUMBNAIL_QNAME)){
 985  3
             MrssThumbnailType copy = ((JAXBElement<MrssThumbnailType>)u.unmarshal(e)).getValue();
 986  3
             ret.setThumbnail(copy);
 987  3
             it.remove();
 988  3
           }else if(same(name, MRSS_TITLE_QNAME)){
 989  3
             MrssTitleType copy = ((JAXBElement<MrssTitleType>)u.unmarshal(e)).getValue();
 990  3
             ret.setTitle(copy);
 991  3
             it.remove();
 992  
           }
 993  
         }
 994  
       }
 995  0
     }catch (JAXBException e) {
 996  0
       throw new YarfrawException("unable to unmarshal element", e);
 997  
     }
 998  3
     return ret;
 999  
   }
 1000  
   /**
 1001  
    * Converts the input {@link ItunesExtension} object to an element list.
 1002  
    * <br/>
 1003  
    * see http://www.apple.com/itunes/store/podcaststechspecs.html about these
 1004  
    * extension elements
 1005  
    * 
 1006  
    * @param extensionObject an valid {@link ItunesExtension} object
 1007  
    * @return a list of elements representing all the elements in the input extension object
 1008  
    * @throws YarfrawException if conversion failed
 1009  
    */
 1010  
   public static List<Element> toItunesElements(ItunesExtension extensionObject)
 1011  
   throws YarfrawException{
 1012  6
     return toElements(extensionObject, ContextEnum.ITUNES);
 1013  
   }
 1014  
 
 1015  
   /**
 1016  
    * Converts the input {@link GeoRssExtension} object to an element list.
 1017  
    * <br/>
 1018  
    * see http://georss.org/ about these
 1019  
    * extension elements
 1020  
    * 
 1021  
    * @param extensionObject an valid {@link GeoRssExtension} object
 1022  
    * @return a list of elements representing all the elements in the input extension object
 1023  
    * @throws YarfrawException if conversion failed
 1024  
    */
 1025  
   public static List<Element> toGeoRssElements(GeoRssExtension extensionObject)
 1026  
   throws YarfrawException{
 1027  6
     return toElements(extensionObject, ContextEnum.GEORSS);
 1028  
   }
 1029  
   
 1030  
 
 1031  
   /**
 1032  
    * Converts the input {@link GoogleBaseExtension} object to an element list.
 1033  
    * <br/>
 1034  
    * see http://base.google.com/support/bin/answer.py?answer=58085&hl=en about these
 1035  
    * extension elements
 1036  
    * 
 1037  
    * @param extensionObject an valid {@link GoogleBaseExtension} object
 1038  
    * @return a list of elements representing all the elements in the input extension object
 1039  
    * @throws YarfrawException if conversion failed
 1040  
    */
 1041  
   public static List<Element> toGoogleBaseElements(GoogleBaseExtension extensionObject)
 1042  
   throws YarfrawException{
 1043  
     //XXX: not sure why i have to do this to make it marshall
 1044  3
     JAXBElement<GoogleBaseExtension> jaxb = GOOGLEBASE_FACTORY.createGoogleBaseExtension(extensionObject);
 1045  3
     return toElements(jaxb, ContextEnum.GOOGLEBASE);
 1046  
   }
 1047  
   
 1048  
   /**
 1049  
    * Converts the input {@link MrssExtension} object to an element list.
 1050  
    * <br/>
 1051  
    * see http://search.yahoo.com/mrss about these
 1052  
    * extension elements
 1053  
    * 
 1054  
    * @param extensionObject an valid {@link MrssExtension} object
 1055  
    * @return a list of elements representing all the elements in the input extension object
 1056  
    * @throws YarfrawException if conversion failed
 1057  
    */
 1058  
   public static List<Element> toMrssElements(MrssExtension extensionObject)
 1059  
   throws YarfrawException{
 1060  6
     return toElements(extensionObject, ContextEnum.MRSS);
 1061  
   }
 1062  
 
 1063  
   /**
 1064  
    * Converts the input {@link WellFormedWebExtension} object to an element list.
 1065  
    * <br/>
 1066  
    * see http://wellformedweb.org/news/wfw_namespace_elements about these
 1067  
    * extension elements
 1068  
    * 
 1069  
    * @param extensionObject an valid {@link WellFormedWebExtension} object
 1070  
    * @return a list of elements representing all the elements in the input extension object
 1071  
    * @throws YarfrawException if conversion failed
 1072  
    */
 1073  
   public static List<Element> toWellFormedWebElements(WellFormedWebExtension extensionObject)
 1074  
   throws YarfrawException{
 1075  6
     return toElements(extensionObject, ContextEnum.WFW);
 1076  
   }
 1077  
   
 1078  
   /**
 1079  
    * Converts the input {@link DublinCoreExtension} object to an element list.
 1080  
    * <br/>
 1081  
    * see http://dublincore.org/documents/2002/07/31/dcmes-xml/ about these
 1082  
    * extension elements
 1083  
    * 
 1084  
    * @param extensionObject an valid {@link DublinCoreExtension} object
 1085  
    * @return a list of elements representing all the elements in the input extension object
 1086  
    * @throws YarfrawException if conversion failed
 1087  
    */
 1088  
   public static List<Element> toDublinCoreElements(DublinCoreExtension extensionObject)
 1089  
   throws YarfrawException{
 1090  6
     return toElements(extensionObject, ContextEnum.DC);
 1091  
   }
 1092  
   
 1093  
   /**
 1094  
    * Converts the input {@link SyndicationExtension} object to an element list.
 1095  
    * <br/>
 1096  
    * see http://web.resource.org/rss/1.0/modules/syndication/ about these
 1097  
    * extension elements
 1098  
    * 
 1099  
    * @param extensionObject an valid {@link SyndicationExtension} object
 1100  
    * @return a list of elements representing all the elements in the input extension object
 1101  
    * @throws YarfrawException if conversion failed
 1102  
    */
 1103  
   public static List<Element> toSyndicationElements(SyndicationExtension extensionObject)
 1104  
   throws YarfrawException{
 1105  6
     return toElements(extensionObject, ContextEnum.SY);
 1106  
   }
 1107  
   
 1108  
   /**
 1109  
    * Converts the input {@link BloggerExtension} object to an element list.
 1110  
    * <br/>
 1111  
    * see http://code.blogger.com/archives/atom-docs.html#extensions about these
 1112  
    * extension elements
 1113  
    * 
 1114  
    * @param extensionObject an valid {@link BloggerExtension} object
 1115  
    * @return a list of elements representing all the elements in the input extension object
 1116  
    * @throws YarfrawException if conversion failed
 1117  
    */
 1118  
   public static List<Element> toBloggerAtomElements(BloggerExtension extensionObject)
 1119  
   throws YarfrawException{
 1120  6
     return toElements(extensionObject, ContextEnum.BLOGGER);
 1121  
   }
 1122  
 
 1123  
   /**
 1124  
    * Converts the input {@link AdminExtension} object to an element list.
 1125  
    * <br/>
 1126  
    * see http://web.resource.org/rss/1.0/modules/admin/ about these
 1127  
    * extension elements
 1128  
    * 
 1129  
    * @param extensionObject an valid {@link AdminExtension} object
 1130  
    * @return a list of elements representing all the elements in the input extension object
 1131  
    * @throws YarfrawException if conversion failed
 1132  
    */
 1133  
   public static List<Element> toAdminAtomElements(AdminExtension extensionObject)
 1134  
   throws YarfrawException{
 1135  6
     return toElements(extensionObject, ContextEnum.ADMIN);
 1136  
   }
 1137  
 
 1138  
   /**
 1139  
    * Converts the input {@link FeedburnerExtension} object to an element list.
 1140  
    * <br/>
 1141  
    * see http://web.resource.org/rss/1.0/modules/admin/ about these
 1142  
    * extension elements
 1143  
    * 
 1144  
    * @param extensionObject an valid {@link FeedburnerExtension} object
 1145  
    * @return a list of elements representing all the elements in the input extension object
 1146  
    * @throws YarfrawException if conversion failed
 1147  
    */
 1148  
   public static List<Element> toFeedburnerElements(FeedburnerExtension extensionObject)
 1149  
   throws YarfrawException{
 1150  6
     return toElements(extensionObject, ContextEnum.FEEDBURNER);
 1151  
   }
 1152  
 
 1153  
   /**
 1154  
    * Converts the input {@link FeedburnerExtension} object to an element list.
 1155  
    * <br/>
 1156  
    * see http://web.resource.org/rss/1.0/modules/admin/ about these
 1157  
    * extension elements
 1158  
    * 
 1159  
    * @param extensionObject an valid {@link FeedburnerExtension} object
 1160  
    * @return a list of elements representing all the elements in the input extension object
 1161  
    * @throws YarfrawException if conversion failed
 1162  
    */
 1163  
   public static List<Element> toSlahsElements(SlashExtension extensionObject)
 1164  
   throws YarfrawException{
 1165  6
     return toElements(extensionObject, ContextEnum.SLASH);
 1166  
   }
 1167  
   
 1168  39
   private static JAXBContext DC_CTX = null;
 1169  39
   private static JAXBContext GEORSS_CTX = null;
 1170  39
   private static JAXBContext GOOGLEBASE_CTX = null;
 1171  39
   private static JAXBContext ITUNES_CTX = null;
 1172  39
   private static JAXBContext MRSS_CTX = null;
 1173  39
   private static JAXBContext SY_CTX = null;
 1174  39
   private static JAXBContext WFW_CTX = null;
 1175  39
   private static JAXBContext BLOGGER_CTX = null;
 1176  39
   private static JAXBContext ADMIN_CTX = null;
 1177  39
   private static JAXBContext FEEDBURNER_CTX = null;
 1178  39
   private static JAXBContext SLASH_CTX = null;
 1179  39
   private static JAXBContext ATOM03_CTX = null;
 1180  
   
 1181  
   private static synchronized JAXBContext getContext(ContextEnum ctxEnum) throws JAXBException{
 1182  81
     if(ctxEnum == ContextEnum.DC){
 1183  6
       if(DC_CTX == null){
 1184  3
         DC_CTX = JAXBContext.newInstance(DUBLINCORE_JAXB_CONTEXT); 
 1185  
       }
 1186  6
       return DC_CTX;
 1187  75
     }else if(ctxEnum == ContextEnum.ATOM03){
 1188  3
       if(ATOM03_CTX == null){
 1189  3
         ATOM03_CTX = JAXBContext.newInstance(ATOM03_JAXB_CONTEXT); 
 1190  
       }
 1191  3
       return ATOM03_CTX;
 1192  72
     }else if(ctxEnum == ContextEnum.ADMIN){
 1193  9
       if(ADMIN_CTX == null){
 1194  3
         ADMIN_CTX = JAXBContext.newInstance(ADMIN_JAXB_CONTEXT); 
 1195  
       }
 1196  9
       return ADMIN_CTX;
 1197  63
     }else if(ctxEnum == ContextEnum.BLOGGER){
 1198  6
       if(BLOGGER_CTX == null){
 1199  3
         BLOGGER_CTX = JAXBContext.newInstance(BLOGGER_JAXB_CONTEXT); 
 1200  
       }
 1201  6
       return BLOGGER_CTX;
 1202  57
     }else if(ctxEnum == ContextEnum.FEEDBURNER){
 1203  6
       if(FEEDBURNER_CTX == null){
 1204  3
         FEEDBURNER_CTX = JAXBContext.newInstance(FEEDBURNER_JAXB_CONTEXT); 
 1205  
       }
 1206  6
       return FEEDBURNER_CTX;
 1207  51
     }else if(ctxEnum == ContextEnum.SLASH){
 1208  9
       if(SLASH_CTX == null){
 1209  3
         SLASH_CTX = JAXBContext.newInstance(SLASH_JAXB_CONTEXT); 
 1210  
       }
 1211  9
       return SLASH_CTX;
 1212  42
     }else if(ctxEnum == ContextEnum.GEORSS){
 1213  6
       if(GEORSS_CTX == null){
 1214  3
         GEORSS_CTX = JAXBContext.newInstance(GEORSS_JAXB_CONTEXT); 
 1215  
       }
 1216  6
       return GEORSS_CTX;
 1217  36
     }else if(ctxEnum == ContextEnum.GOOGLEBASE){
 1218  3
       if(GOOGLEBASE_CTX == null){
 1219  3
         GOOGLEBASE_CTX = JAXBContext.newInstance(GOOGLEBASE_JAXB_CONTEXT);
 1220  
       }
 1221  3
       return GOOGLEBASE_CTX;
 1222  33
     }else if(ctxEnum == ContextEnum.ITUNES){
 1223  9
       if(ITUNES_CTX == null){
 1224  3
         ITUNES_CTX = JAXBContext.newInstance(ITUNES_JAXB_CONTEXT);
 1225  
       }
 1226  9
       return ITUNES_CTX;
 1227  24
     }else if(ctxEnum == ContextEnum.MRSS){
 1228  6
       if(MRSS_CTX == null){
 1229  3
         MRSS_CTX = JAXBContext.newInstance(MRSS_JAXB_CONTEXT);
 1230  
       }
 1231  6
       return MRSS_CTX;
 1232  18
     }else if(ctxEnum == ContextEnum.SY){
 1233  12
       if(SY_CTX == null){
 1234  6
         SY_CTX = JAXBContext.newInstance(SY_JAXB_CONTEXT);
 1235  
       }
 1236  12
       return SY_CTX;
 1237  6
     }else if(ctxEnum == ContextEnum.WFW){
 1238  6
       if(WFW_CTX == null){
 1239  3
         WFW_CTX = JAXBContext.newInstance(WFW_JAXB_CONTEXT);
 1240  
       }
 1241  6
       return WFW_CTX;
 1242  
     }
 1243  
     
 1244  0
     throw new UnsupportedOperationException("Unknown JAXB context: "+ctxEnum);
 1245  
   }
 1246  
   
 1247  
   private static List<Element> toElements(Object extensionObject, ContextEnum ctxEnum) throws YarfrawException {
 1248  63
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
 1249  63
     dbf.setNamespaceAware(true);
 1250  63
     List<Element> ret = new ArrayList<Element>();
 1251  
     try {
 1252  63
       Document doc = dbf.newDocumentBuilder().newDocument();
 1253  63
       Marshaller m = getContext(ctxEnum).createMarshaller();
 1254  63
       m.setProperty(JAXBUtils.PREFIX_MAPPER_PROPERTY_NAME, JAXBUtils.getNamespacePrefixMapper(FeedFormat.RSS20));
 1255  63
       m.marshal(extensionObject, doc);
 1256  63
       Element e = doc.getDocumentElement();
 1257  63
       NodeList list =  e.getChildNodes();
 1258  402
       for(int i =0; i< list.getLength(); i++){
 1259  339
         Node n = list.item(i);
 1260  339
         if (n instanceof Element) {
 1261  339
           Element element = (Element) n;
 1262  339
           ret.add(element);
 1263  
         }else {
 1264  0
           LOG.error("Ignore unexpected node "+n.getNodeName()+", this should not happen");
 1265  
         }
 1266  
       }
 1267  
     }
 1268  0
     catch (ParserConfigurationException e) {
 1269  0
       throw new YarfrawException("Parserconfig exception", e);
 1270  
     }
 1271  0
     catch (JAXBException e) {
 1272  0
       e.printStackTrace();
 1273  0
       throw new YarfrawException("JAXB exception", e);
 1274  
     }
 1275  63
     return ret;
 1276  
   }
 1277  
   
 1278  
 }