You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@abdera.apache.org by Woody Anderson <wo...@xoopit.com> on 2007/11/06 01:51:42 UTC

Re: extensionfactory to handle bad namespace

so this is my current solution:

            Reader reader = response.getReader();
            String docStr = StreamUtils.getString( reader );

           docStr = docStr.replace( "http://purl.org/atom/ns#",

"http://www.w3.org/2005/Atom" );
            Parser parser = ABDERA.getParser();
            Document<Entry> doc =  parser.parse( new StringReader( docStr ) );

which works but is clearly a complete hack.
if it becomes easier to alias this namespace or handle this with an
extension factory, please let me know.
-w

On 10/31/07, Woody Anderson <wo...@xoopit.com> wrote:
> ok. i tried to do this, but it seems i'm not understanding something
> with regard to the getElementWrapper method.. and now the mimetype
> (per Element?)
>
>     public class AliasNamespacesFactory implements ExtensionFactory {
>         HashSet<String> _namespaces = new HashSet<String>();
>         public AliasNamespacesFactory( Set<String> namespaces ) {
>             _namespaces.addAll( namespaces );
>         }
>
>         public <T extends Element> T getElementWrapper(Element internal) {
>           // ????????
>         }
>
>         public <T extends Base> String getMimeType(T base) {
>             // ??????????
>         }
>
>         public String[] getNamespaces() {
>             return _namespaces.toArray( new String[ _namespaces.size() ] );
>         }
>
>         public boolean handlesNamespace(String namespace) {
>             return _namespaces.contains( namespace );
>         }
>     }
>
>
> do i have to have a if/else to instantiate FOMEntry, FOMLink, etc.. ?
> most of the constructors are protected, which makes that sort of a non-starter.
>
> FOMFactory seems to have a lot of methods, but these take objects that
> i don't have at my disposal. And these seem much more geared toward
> creation for population, not for cloning or refacing an existing
> "Element".
>
> do i need to basically recreate the FOMFactory for myself? and
> subsequently all of the objects?
>
> on a complete hack approach:
> if i ask the ClientResponse for a reader and put the entire response
> in a string replacing the namespace with the "correct" namespace. i
> could just ask for the default parser and continue right?
> i mean this would be ugly in the extreme, but it sounds only slightly
> worse than recreating the entire FOM factory just to change broken-ns
> to atom-ns.
>
> and the only other way i see to get in front of the system is to front
> a stream reader via. createXMLStreamReader, but that seems tied up in
> axiom.. which is an extra helping of confusing.
>
> thoughts?
> -w
>
> On 10/31/07, James M Snell <ja...@gmail.com> wrote:
> > Ok, this is actually somewhat difficult right now but definitely
> > possible.  What you'd need to do is create a custom ExtensionFactory
> > implementation (that does not extend AbstractExtensionFactory) and use
> > that to create the appropriate objects.  The getElementWrapper method is
> > not required to return an instance of an actual ElementWrapper subclass.
> >
> > It would take a bit of work to do, because the internal element passed
> > in to getElementWrapper would need to be used to create a new instance
> > of the appropriate FOM impl.
> >
> > It's entirely possible that this could be made easier.
> >
> > - James
> >
> > Woody Anderson wrote:
> > > hello,
> > >
> > > i'm getting an errant namespace in responses from various servers.
> > >
> > > e.g.
> > > <?xml version="1.0" encoding="utf-8"?>
> > > <entry xmlns="http://purl.org/atom/ns#">
> > >   <title xmlns="http://purl.org/atom/ns#">Example Title</title>
> > >   <summary xmlns="http://purl.org/atom/ns#">Example Text</summary>
> > >   <content xmlns="http://purl.org/atom/ns#" mode="xml">
> > >     <div xmlns="http://www.w3.org/1999/xhtml">Example Text</div>
> > >   </content>
> > >   <id xmlns="http://purl.org/atom/ns#">urn:lj:livejournal.com:atom1:username:number</id>
> > >   <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml"
> > > rel="service.edit"
> > > href="http://www.livejournal.com/interface/atom/edit/3" title="Example
> > > Title"/>
> > >   <link xmlns="http://purl.org/atom/ns#" type="text/html"
> > > rel="alternate" href="http://username.livejournal.com/number.html"
> > > title="Example Title"/>
> > > </entry>
> > >
> > > i want to handle this as though it were a correctly namespaced entry.
> > > all types of elements from this server comeback with this namespace,
> > > so i need this for each of the model elements.
> > >
> > > I'm a bit confused about how i do this for all elements. I've been
> > > looking at AbstractExtensionFactory.
> > > and ExtensionFactory docs, but it is unclear what getElementWrapper()
> > > is supposed to do to make it all "work".
> > >
> > > i would hope that it's fairly simple to consume this bogus namespace.
> > >
> > > i found an old example doing something *similar* that extended
> > > FOMExtensionFactory (which no longer exists..) to handle an Atom03
> > > feed. This example doesn't work anymore and was still pretty confusing
> > > as it seemed to work for Feed only.
> > >
> > > is there a simple way to handle this errant ns?
> > > thanks
> > > -w
> > >
> >
>

Re: extensionfactory to handle bad namespace

Posted by James M Snell <ja...@gmail.com>.
Will do; this is on my list of things to look at very soon.  Right now
I'm focusing on making some general performance improvements.

- James

Woody Anderson wrote:
> so this is my current solution:
> 
>             Reader reader = response.getReader();
>             String docStr = StreamUtils.getString( reader );
> 
>            docStr = docStr.replace( "http://purl.org/atom/ns#",
> 
> "http://www.w3.org/2005/Atom" );
>             Parser parser = ABDERA.getParser();
>             Document<Entry> doc =  parser.parse( new StringReader( docStr ) );
> 
> which works but is clearly a complete hack.
> if it becomes easier to alias this namespace or handle this with an
> extension factory, please let me know.
> -w
> 
> On 10/31/07, Woody Anderson <wo...@xoopit.com> wrote:
>> ok. i tried to do this, but it seems i'm not understanding something
>> with regard to the getElementWrapper method.. and now the mimetype
>> (per Element?)
>>
>>     public class AliasNamespacesFactory implements ExtensionFactory {
>>         HashSet<String> _namespaces = new HashSet<String>();
>>         public AliasNamespacesFactory( Set<String> namespaces ) {
>>             _namespaces.addAll( namespaces );
>>         }
>>
>>         public <T extends Element> T getElementWrapper(Element internal) {
>>           // ????????
>>         }
>>
>>         public <T extends Base> String getMimeType(T base) {
>>             // ??????????
>>         }
>>
>>         public String[] getNamespaces() {
>>             return _namespaces.toArray( new String[ _namespaces.size() ] );
>>         }
>>
>>         public boolean handlesNamespace(String namespace) {
>>             return _namespaces.contains( namespace );
>>         }
>>     }
>>
>>
>> do i have to have a if/else to instantiate FOMEntry, FOMLink, etc.. ?
>> most of the constructors are protected, which makes that sort of a non-starter.
>>
>> FOMFactory seems to have a lot of methods, but these take objects that
>> i don't have at my disposal. And these seem much more geared toward
>> creation for population, not for cloning or refacing an existing
>> "Element".
>>
>> do i need to basically recreate the FOMFactory for myself? and
>> subsequently all of the objects?
>>
>> on a complete hack approach:
>> if i ask the ClientResponse for a reader and put the entire response
>> in a string replacing the namespace with the "correct" namespace. i
>> could just ask for the default parser and continue right?
>> i mean this would be ugly in the extreme, but it sounds only slightly
>> worse than recreating the entire FOM factory just to change broken-ns
>> to atom-ns.
>>
>> and the only other way i see to get in front of the system is to front
>> a stream reader via. createXMLStreamReader, but that seems tied up in
>> axiom.. which is an extra helping of confusing.
>>
>> thoughts?
>> -w
>>
>> On 10/31/07, James M Snell <ja...@gmail.com> wrote:
>>> Ok, this is actually somewhat difficult right now but definitely
>>> possible.  What you'd need to do is create a custom ExtensionFactory
>>> implementation (that does not extend AbstractExtensionFactory) and use
>>> that to create the appropriate objects.  The getElementWrapper method is
>>> not required to return an instance of an actual ElementWrapper subclass.
>>>
>>> It would take a bit of work to do, because the internal element passed
>>> in to getElementWrapper would need to be used to create a new instance
>>> of the appropriate FOM impl.
>>>
>>> It's entirely possible that this could be made easier.
>>>
>>> - James
>>>
>>> Woody Anderson wrote:
>>>> hello,
>>>>
>>>> i'm getting an errant namespace in responses from various servers.
>>>>
>>>> e.g.
>>>> <?xml version="1.0" encoding="utf-8"?>
>>>> <entry xmlns="http://purl.org/atom/ns#">
>>>>   <title xmlns="http://purl.org/atom/ns#">Example Title</title>
>>>>   <summary xmlns="http://purl.org/atom/ns#">Example Text</summary>
>>>>   <content xmlns="http://purl.org/atom/ns#" mode="xml">
>>>>     <div xmlns="http://www.w3.org/1999/xhtml">Example Text</div>
>>>>   </content>
>>>>   <id xmlns="http://purl.org/atom/ns#">urn:lj:livejournal.com:atom1:username:number</id>
>>>>   <link xmlns="http://purl.org/atom/ns#" type="application/x.atom+xml"
>>>> rel="service.edit"
>>>> href="http://www.livejournal.com/interface/atom/edit/3" title="Example
>>>> Title"/>
>>>>   <link xmlns="http://purl.org/atom/ns#" type="text/html"
>>>> rel="alternate" href="http://username.livejournal.com/number.html"
>>>> title="Example Title"/>
>>>> </entry>
>>>>
>>>> i want to handle this as though it were a correctly namespaced entry.
>>>> all types of elements from this server comeback with this namespace,
>>>> so i need this for each of the model elements.
>>>>
>>>> I'm a bit confused about how i do this for all elements. I've been
>>>> looking at AbstractExtensionFactory.
>>>> and ExtensionFactory docs, but it is unclear what getElementWrapper()
>>>> is supposed to do to make it all "work".
>>>>
>>>> i would hope that it's fairly simple to consume this bogus namespace.
>>>>
>>>> i found an old example doing something *similar* that extended
>>>> FOMExtensionFactory (which no longer exists..) to handle an Atom03
>>>> feed. This example doesn't work anymore and was still pretty confusing
>>>> as it seemed to work for Feed only.
>>>>
>>>> is there a simple way to handle this errant ns?
>>>> thanks
>>>> -w
>>>>
>