Generating HTML

Discussion in 'Java' started by Jason Cavett, Oct 4, 2007.

  1. Jason Cavett

    Jason Cavett Guest

    I am attempting to generate HTML within my application for printing
    documents. Due to various restrictions, I am using the
    javax.swing.text.html.HTMLDocument package. That can't change (unless
    it is impossible to do what I want to do).

    My method takes in a TableModel and attempts to create an HTML
    document from the data in the table, replicating the table within HTML
    code. However, when I run the method below, I get the following
    exception:

    javax.swing.text.StateInvariantError: Illegal cast to
    MutableAttributeSet
    at javax.swing.text.AbstractDocument
    $AbstractElement.checkForIllegalCast(AbstractDocument.java:2055)
    at javax.swing.text.AbstractDocument
    $AbstractElement.addAttributes(AbstractDocument.java:1988)
    at javax.swing.text.AbstractDocument
    $AbstractElement.<init>(AbstractDocument.java:1781)
    at javax.swing.text.AbstractDocument
    $BranchElement.<init>(AbstractDocument.java:2248)
    at javax.swing.text.html.HTMLDocument
    $BlockElement.<init>(HTMLDocument.java:3674)
    at
    javax.swing.text.html.HTMLDocument.createBranchElement(HTMLDocument.java:
    379)
    at
    hasrd.gui.components.print.HasrdDocument.generateHTML(MyHTMLDocumentGenerator.java:
    152)
    ...

    Is it even possible to do what I want to do? If so, what am I doing
    wrong?

    Thanks

    Here is the method in question. It is self-contained.

    protected void generateHTML(TableModel dataTable) {
    AbstractDocument.AttributeContext ctx = getAttributeContext();

    // create default root element
    BranchElement root = (BranchElement) this.createDefaultRoot();

    // create the table
    AttributeSet atts = ctx.getEmptySet();
    atts = ctx.addAttribute(atts, StyleConstants.NameAttribute,
    HTML.Tag.TABLE);
    BranchElement table = (BranchElement)
    createBranchElement(root, atts); // ERROR HAPPENS HERE
    root.replace(0, 0, new Element[] { table });

    // for each row in the table, add a row to the html
    for (int row = 0; row < dataTable.getRowCount(); row++) {
    // create the table
    atts = ctx.getEmptySet();
    atts = ctx.addAttribute(atts,
    StyleConstants.NameAttribute,
    HTML.Tag.TR);
    BranchElement rowTag = (BranchElement)
    createBranchElement(table,
    atts);
    table.replace(0, 0, new Element[] { rowTag });

    // for each column
    for (int col = 0; col < dataTable.getColumnCount(); col++)
    {
    // create the cell
    atts = ctx.getEmptySet();
    atts = ctx.addAttribute(atts,
    StyleConstants.NameAttribute,
    HTML.Tag.TD);
    BranchElement cellTag = (BranchElement)
    createBranchElement(
    rowTag, atts);
    rowTag.replace(0, 0, new Element[] { cellTag });

    // put data into leaf node
    atts = ctx.getEmptySet();
    atts = ctx.addAttribute(atts,
    StyleConstants.NameAttribute,
    HTML.Tag.CONTENT);
    atts = ctx.addAttribute(atts,
    StyleConstants.ComposedTextAttribute,
    dataTable
    .getValueAt(row, col));
    Element leaf = createLeafElement(cellTag, atts, 0, 1);
    cellTag.replace(0, 0, new Element[] { leaf });
    }
    }
    }
    Jason Cavett, Oct 4, 2007
    #1
    1. Advertising

  2. Jason Cavett

    Roedy Green Guest

    On Wed, 03 Oct 2007 23:23:57 -0000, Jason Cavett
    <> wrote, quoted or indirectly quoted someone
    who said :

    >
    >Here is the method in question. It is self-contained.


    Self-contained means something you an can compile and run without
    extra stuff. You are one step away. Somebody still has to compose a
    debugging harness to test your code.

    --
    Roedy Green Canadian Mind Products
    The Java Glossary
    http://mindprod.com
    Roedy Green, Oct 4, 2007
    #2
    1. Advertising

  3. Jason Cavett

    Roedy Green Guest

    On Wed, 03 Oct 2007 23:23:57 -0000, Jason Cavett
    <> wrote, quoted or indirectly quoted someone
    who said :

    >I am attempting to generate HTML within my application for printing
    >documents. Due to various restrictions, I am using the
    >javax.swing.text.html.HTMLDocument package.


    for what you are doing, I think you would find it simpler to just use
    a StringBuilder, and create a complete HTML stream starting with
    <html><body>, then when you are done, feed it to the Document.

    You would then avoid the complications of that rather ugly API, and
    debugging becomes a snap. You squirt out your generated HTML to a
    file and run it through an HTML Validator, and look at it in a
    browser. see http://mindprod.com/jgloss/htmlvalidator.html

    The catch is, you may inadvertently use HTML that Java does not
    understand. Keep it very simple.

    Cranking out HTML programmatically is very easy. You can invent
    methods to do all the bullwork of balancing.
    --
    Roedy Green Canadian Mind Products
    The Java Glossary
    http://mindprod.com
    Roedy Green, Oct 4, 2007
    #3
  4. Jason Cavett

    Roedy Green Guest

    On Wed, 03 Oct 2007 23:23:57 -0000, Jason Cavett
    <> wrote, quoted or indirectly quoted someone
    who said :

    >javax.swing.text.StateInvariantError: Illegal cast to
    >MutableAttributeSet

    I could not find included JavaDoc on StateInvariantError. However,
    that is Eiffelian design by contract terminology for an assertion
    failed that monitors the consistence of an object. That is not much
    help.

    MutableAttributeSet is an interface implemented by:

    AbstractDocument.AbstractElement, SimpleAttributeSet,
    StyleContext.NamedStyle

    So it looks like fed you something an AttributeSet, but it needed a
    MutableAttributeSet, but did not discover the problem until run time.

    Classes implementing AttributeSet include:

    AbstractDocument.AbstractElement, SimpleAttributeSet,
    StyleContext.NamedStyle, StyleContext.SmallAttributeSet

    I would do a

    System.out.println( att.getClass() );

    just prior to the problem to see just what sort of animal you are
    actually passing. Use of interfaces may be great for maintainable
    code, but they make debugging and comprehension harder.
    --
    Roedy Green Canadian Mind Products
    The Java Glossary
    http://mindprod.com
    Roedy Green, Oct 4, 2007
    #4
  5. Jason Cavett

    Jason Cavett Guest

    On Oct 3, 8:40 pm, Roedy Green <>
    wrote:
    > On Wed, 03 Oct 2007 23:23:57 -0000, Jason Cavett
    > <> wrote, quoted or indirectly quoted someone
    > who said :
    >
    >
    >
    > >Here is the method in question. It is self-contained.

    >
    > Self-contained means something you an can compile and run without
    > extra stuff. You are one step away. Somebody still has to compose a
    > debugging harness to test your code.
    >
    > --
    > Roedy Green Canadian Mind Products
    > The Java Glossaryhttp://mindprod.com


    Ah...point taken. I guess I meant that the method does not require
    any outside "stuff" to run (other than the class declaration and
    proper includes).
    Jason Cavett, Oct 4, 2007
    #5
  6. Jason Cavett

    Jason Cavett Guest

    On Oct 3, 8:48 pm, Roedy Green <>
    wrote:
    > On Wed, 03 Oct 2007 23:23:57 -0000, Jason Cavett
    > <> wrote, quoted or indirectly quoted someone
    > who said :
    >
    > >I am attempting to generate HTML within my application for printing
    > >documents. Due to various restrictions, I am using the
    > >javax.swing.text.html.HTMLDocument package.

    >
    > for what you are doing, I think you would find it simpler to just use
    > a StringBuilder, and create a complete HTML stream starting with
    > <html><body>, then when you are done, feed it to the Document.
    >
    > You would then avoid the complications of that rather ugly API, and
    > debugging becomes a snap. You squirt out your generated HTML to a
    > file and run it through an HTML Validator, and look at it in a
    > browser. seehttp://mindprod.com/jgloss/htmlvalidator.html
    >
    > The catch is, you may inadvertently use HTML that Java does not
    > understand. Keep it very simple.
    >
    > Cranking out HTML programmatically is very easy. You can invent
    > methods to do all the bullwork of balancing.
    > --
    > Roedy Green Canadian Mind Products
    > The Java Glossaryhttp://mindprod.com


    Alright. I thought about doing that. The only thing is...I would
    like the final document to be an HTMLDocument when I am finished (so
    the printing code can handle it as it expects type HTMLDocument).
    There doesn't seem to be a way to put associate the generated HTML
    with the document.

    I'll look into it more. Thanks.
    Jason Cavett, Oct 4, 2007
    #6
  7. Jason Cavett

    Roedy Green Guest

    On Thu, 04 Oct 2007 14:28:11 -0000, Jason Cavett
    <> wrote, quoted or indirectly quoted someone
    who said :

    >Alright. I thought about doing that. The only thing is...I would
    >like the final document to be an HTMLDocument when I am finished (so
    >the printing code can handle it as it expects type HTMLDocument).
    >There doesn't seem to be a way to put associate the generated HTML
    >with the document.


    what about HTMLDocument.insertBeforeStart(Element elem, String
    htmlText)?


    Inserts the HTML specified as a string before the start of the given
    element.
    --
    Roedy Green Canadian Mind Products
    The Java Glossary
    http://mindprod.com
    Roedy Green, Oct 5, 2007
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. smrtalec
    Replies:
    0
    Views:
    456
    smrtalec
    Jan 26, 2004
  2. Lim siew Cheng

    Dynamic generating ascx within <html>?

    Lim siew Cheng, Aug 28, 2003, in forum: ASP .Net
    Replies:
    0
    Views:
    381
    Lim siew Cheng
    Aug 28, 2003
  3. Evan T. Basalik

    Generating Excel with HTML

    Evan T. Basalik, Dec 23, 2003, in forum: ASP .Net
    Replies:
    4
    Views:
    700
    Steven Cheng[MSFT]
    Feb 14, 2004
  4. Vimal
    Replies:
    0
    Views:
    495
    Vimal
    Oct 14, 2004
  5. Faisal Vali
    Replies:
    10
    Views:
    230
    Thomas 'PointedEars' Lahn
    Jun 21, 2008
Loading...

Share This Page