[jsword-devel] BookDataListener: Question 1

Jacky Cheung jsword-devel@crosswire.org
Fri, 16 May 2003 10:23:02 +0800


Hi,

I think we have to make a deadline and decide which approach we will 
adopt. I am working on <WH>, etc support on GBF and pending to wait for 
this decision (existing BookDataListener does not work for these tags).

Jacky

Joe Walker wrote:

>Hi,
>
>Thanks for the ideas Eric, I've re-numbered them 6[abc] rather than
>5[abc] to save conflict with Jacky's ideas
>
>Eric Galluzzo wrote:
>  
>
>>How about this one.  We can make the existing interface even more
>>SAX-like by passing each method a map of attributes.  In general I
>>strongly dislike what I call "map-oriented programming" (i.e. no objects
>>but just maps of maps of maps -- generic but meaningless), but I think
>>that perhaps in this case the map is warranted.
>>
>>This could be expressed in three ways:
>>
>>6a.
>>
>>public interface BookDataListener
>>{
>>    void startWord( Map attributes );
>>    void endWord();
>>    void startReference( Map attributes );
>>    void endReference();
>>}
>>
>>Advantages:
>>    - very extensible
>>    - small API to maintain
>>
>>Disadvantages:
>>    - hard to use (what goes in the map?)
>>    - tied tightly to XML
>>    
>>
>
>Unless I misunderstand what "tied tightly to XML" means, I think
>everything will have the same problem, since we are modelling OSIS which
>is XML.
>Oh, hang on - explained below, I think that all attributes must be
>strings, and we can't use types like Passage?
>There is only one place I can think of that use of non-obvious types
>(String, int, etc) is required, and that is osisID, which maps well to
>Verse. (We can convert using verse.getOsisName();)
>
>  
>
>>6b.
>>
>>public interface BookDataListener
>>{
>>    void startWord( OSISAttributes attributes );
>>    void endWord();
>>    void startReference( OSISAttributes attributes );
>>    void endReference();
>>}
>>
>>public class OSISAttributes
>>{
>>    Passage fPassage;
>>    String fMorph;
>>
>>    public Passage getPassage()
>>    {
>>        return fPassage;
>>    }
>>    
>>
>...
>
>There is a simpler half-way house (call it 6d?) - we define a list of
>attributes using a typesafe Enum pattern (like jakarta commons-lang
>Enum), and then definde OSISAttributes to have:
>
>void setAttribute(OSISAttrName name, String value)
>String getAttribute(OSISAttrName name)
>
>Which in my book gets the benefits of 6b and 6a
>
>  
>
>>6c.
>>
>>public interface BookDataListener
>>{
>>    void startWord( WordAttributes attributes );
>>    void endWord();
>>    void startReference( ReferenceAttributes attributes );
>>    void endReference();
>>}
>>
>>public class CommonAttributes
>>{
>>    // common attributes here
>>}
>>
>>public class WordAttributes extends CommonAttributes
>>{
>>    protected String fMorph;
>>
>>    public String getMorph()
>>    {
>>        return fMorph;
>>    }
>>
>>    public void setMorph( String morph )
>>    {
>>        fMorph = morph;
>>    }
>>
>>    // ...
>>}
>>    
>>
>
>Like you I'm not keen on this, mostly because it creates lots of classes
>
>
>  
>
>>I'd probably favor 5b myself.  Failing that, I'd favor the original #2
>>(populating an XML-like tree ourselves).  The only problem with that, as
>>you said, is depending heavily on auto-generated classes, which means
>>that if JAXB suddenly changes, we're out of luck; and we can't add our
>>own "business methods."
>>    
>>
>
>I don't see changes to JAXB as being a huge issue, partly because Sun
>are usually very careful about deprecating stuff, and partly because I
>think we can do a lot to customize the way things are done using
>binding-schema.
>
>See http://java.sun.com/xml/jaxb/faq.html under "Do I have any control
>over how the schema compiler generates the Java classes?"
>
>And to the business-method point:
>See http://java.sun.com/xml/jaxb/extendingJaxbGeneratedClasses.html at
>the top under "How can I extend JAXB's generated implementation
>classes?"
>
>I can't say I've done either of the above, but I did feel happier
>knowing that it can be done.
>
>For me, I think I like 2 best and then 5b/d.
>
>  
>
>>Well, I'm certainly not an expert; however, that's never stopped me
>>before. ;)  As far as I have seen, there is a large difference between,
>>say, MIDP (built on CLDC) and Personal Profile (built on CDC).  MIDP is
>>extremely limited in application size (e.g. <50K for an application's
>>jar file), API richness, screen size, and language features (e.g. no
>>finalizers, no floating point, no native methods).  On the other hand,
>>the Personal Profile often uses a "real" JVM and has access to almost
>>all of the JDK 1.1.8 APIs.  So perhaps we need:
>>
>>    - JSword
>>    - KSword
>>        - base library using kSOAP
>>        - MIDP UI (e.g. options, search screen, unformatted text
>>          display, book browser, and that's about it)
>>        - Personal Profile UI (e.g. rich-ish UI with formatted text
>>          display)
>>
>>We'd have to design the KSword API so that it could return formatted or
>>unformatted text, I suppose.  Also, KSword may not be the best name,
>>since it wouldn't necessarily be limited to the KVM; and the KDE folks
>>might get upset. :)
>>    
>>
>
>Agreed.
>When we start work on the "project formerly referred to by the codename
>KSword" we should consider giving it a better name. ;-)
>
>Joe.
>
>
>
>
>
>_______________________________________________
>jsword-devel mailing list
>jsword-devel@crosswire.org
>http://www.crosswire.org/mailman/listinfo/jsword-devel
>
>  
>