Author: ssolsagl
Date: 2006-11-23 11:09:47 +0100 (Thu, 23 Nov 2006)
New Revision: 4011

Modified:
   
trunk/core-api/src/main/java/no/schibstedsok/searchportal/view/velocity/ShareHoldersDirective.java
Log:

Fixed codestyle,
Ported xml coding from dom4j to org.w3c.dom (inconvenient shit:-)
added tests



Modified: 
trunk/core-api/src/main/java/no/schibstedsok/searchportal/view/velocity/ShareHoldersDirective.java
===================================================================
--- 
trunk/core-api/src/main/java/no/schibstedsok/searchportal/view/velocity/ShareHoldersDirective.java
  2006-11-23 10:03:12 UTC (rev 4010)
+++ 
trunk/core-api/src/main/java/no/schibstedsok/searchportal/view/velocity/ShareHoldersDirective.java
  2006-11-23 10:09:47 UTC (rev 4011)
@@ -1,23 +1,31 @@
 package no.schibstedsok.searchportal.view.velocity;
 
-import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
 import java.util.ArrayList;
 import java.util.List;
 
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+import javax.xml.transform.OutputKeys;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.dom.DOMSource;
+import javax.xml.transform.stream.StreamResult;
+
 import org.apache.log4j.Logger;
+import org.apache.velocity.context.InternalContextAdapter;
 import org.apache.velocity.exception.MethodInvocationException;
+import org.apache.velocity.exception.ParseErrorException;
 import org.apache.velocity.exception.ResourceNotFoundException;
 import org.apache.velocity.runtime.directive.Directive;
 import org.apache.velocity.runtime.parser.node.Node;
-import org.apache.velocity.context.InternalContextAdapter;
-import org.apache.velocity.exception.ParseErrorException;
-import org.dom4j.Document;
-import org.dom4j.DocumentHelper;
-import org.dom4j.Element;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
 
 /**
  * Directive to display share holder information in the yellowInfopage.vm. The
@@ -43,258 +51,300 @@
  * 
  */
 public class ShareHoldersDirective extends Directive {
-       /** Logger */
-       private static Logger log = 
Logger.getLogger(ShareHoldersDirective.class);
+    /** Logger */
+    private static Logger log = Logger.getLogger(ShareHoldersDirective.class);
 
-       // Constants -----------------------------------------------------
-       /** Title Name */
-       static final String MSG_NAME_SHAREHOLDER_TITLE = "Aksjonærer";
+    // Constants -----------------------------------------------------
+ 
+    /** Title Name */
+    static final String MSG_NAME_SHAREHOLDER_TITLE = "Aksjonærer";
 
-       /** Th Name */
-       static final String MSG_NAME = "Navn";
+    /** Th Name */
+    static final String MSG_NAME = "Navn";
 
-       /** Th number of shares */
-       static final String MSG_NUMB_OF_SHARES = "Antall aksjer";
+    /** Th number of shares */
+    static final String MSG_NUMB_OF_SHARES = "Antall aksjer";
 
-       /** Th shares in percent */
-       static final String MSG_SHARES_IN_PERCENT = "Andel i %";
+    /** Th shares in percent */
+    static final String MSG_SHARES_IN_PERCENT = "Andel i %";
 
-       
-       // Attributes -------------------------------------------------------
-       /** Table Background colors, switch between white and gray */
-       public enum TableBgColor {
-               GRAY, WHITE
-       }
+    // Attributes -------------------------------------------------------
+  
+    /** Table Background colors, switch between white and gray */
+    public enum TableBgColor {
+        GRAY, WHITE
+    }
 
-       /** The first row in the shareholders table is color white */
-       private TableBgColor tableBgColor = TableBgColor.WHITE;
+    /** The first row in the shareholders table is color white */
+    private TableBgColor tableBgColor = TableBgColor.WHITE;
 
-       /** Html elements used for building up the table */
-       static final String HTML_DIV = "div";
+    /** Html elements used for building up the table */
+    static final String HTML_DIV = "div";
 
-       /** Table Tag */
-       static final String HTML_TABLE = "table";
+    /** Table Tag */
+    static final String HTML_TABLE = "table";
 
-       /** Tr Tag */
-       static final String HTML_TR = "tr";
+    /** Tr Tag */
+    static final String HTML_TR = "tr";
 
-       /** Th Tag */
-       static final String HTML_TH = "th";
+    /** Th Tag */
+    static final String HTML_TH = "th";
 
-       /** Td Tag */
-       static final String HTML_TD = "td";
+    /** Td Tag */
+    static final String HTML_TD = "td";
 
-       /** Html Class */
-       static final String HTML_CLASS = "class";
+    /** Html Class */
+    static final String HTML_CLASS = "class";
 
-       /** Not supported by IE ? Equivalent to the css attribute 
border-spacing */
-       static final String HTML_CELLSPACING = "cellspacing";
+    /** Not supported by IE ? Equivalent to the css attribute border-spacing */
+    static final String HTML_CELLSPACING = "cellspacing";
 
-       /**
-        * This is the information we get from the field 'yproller' aboute
-        * shareholders.
-        */
-       private class ShareHolder 
-       {
-               /** Name of the shareHolder field #1 */
-               String name;
-               /** Id so we can link to WhitePages */
-               String id; 
-               /** Stocks in percent, field #2 */
-               String sharesInPercent;
-               /** Number of stocks, field #2 */
-               String numberOfShares;
-       }
+    /**
+     * This is the information we get from the field 'yproller' aboute
+     * shareholders.
+     */
+    private class ShareHolder {
+        /** Name of the shareHolder field #1 */
+        String name;
 
+        /** Id so we can link to WhitePages */
+        String id;
+
+        /** Stocks in percent, field #2 */
+        String sharesInPercent;
+
+        /** Number of stocks, field #2 */
+        String numberOfShares;
+    }
+
     // Public --------------------------------------------------------
 
-       /**
-        * Name of Directive
-        * 
-        * @return directive name
-        */
-       public String getName() 
-       {
-               return "shareHolders";
-       }
+    /**
+     * Name of Directive
+     * 
+     * @return directive name
+     */
+    public String getName() {
+        return "shareHolders";
+    }
 
-       /**
-        * Type of Directive
-        * 
-        * @return type as int value
-        */
-       public int getType() 
-       {
-               return LINE;
-       }
+    /**
+     * Type of Directive
+     * 
+     * @return type as int value
+     */
+    public int getType() {
+        return LINE;
+    }
 
-       /**
-        * Render content (non-Javadoc)
-        * 
-        * @see 
org.apache.velocity.runtime.directive.Directive#render(org.apache.velocity.context.InternalContextAdapter,
-        *      java.io.Writer, org.apache.velocity.runtime.parser.node.Node)
-        */
-       public boolean render(InternalContextAdapter ica, Writer writer, Node 
node)
-                       throws IOException, ResourceNotFoundException, 
ParseErrorException,
-                       MethodInvocationException 
-       {
-        if (node.jjtGetNumChildren() != 1) 
-        {
+    /**
+     * Render content 
+     * 
+     * @see 
org.apache.velocity.runtime.directive.Directive#render(org.apache.velocity.context.InternalContextAdapter,
+     *      java.io.Writer, org.apache.velocity.runtime.parser.node.Node)
+     */
+    public boolean render(InternalContextAdapter ica, Writer writer, Node node)
+            throws IOException, ResourceNotFoundException, ParseErrorException,
+            MethodInvocationException {
+
+        if (node.jjtGetNumChildren() != 1) {
             rsvc.error("#" + getName() + " - wrong number of arguments");
             return false;
         }
         // The text string from datafield which all the roledata is stored
         String ypRoles = node.jjtGetChild(0).value(ica).toString();
 
-        /*
-        ypRoles = "#aksjonaer0##sepnl#\n " +  
-        "#bold#Navn#sep#Eierandel i %#sep#Antall aksjer#sepnl#\n" +
-        "STENSENTERET AS#id#2703596#sep#50#sep#100#sepnl#\n" +  
-        "ARILD C. GUSTAVSEN#id##sep#25#sep#50#sepnl#\n" +
-        "INGER A. O. GUSTAVSEN#id##sep#25#sep#50#sepnl#";
-               */
+        return internalRender(ypRoles, writer, node);
+    }
 
-        List<ShareHolder> shareHolders = parse(ypRoles);
+    // Private --------------------------------------------------------
 
-        if(shareHolders.size() == 0 )
-        {
-                       return true;
+    // -- Inerntal Render
+    private boolean internalRender(String shareHoldersRaw, Writer writer,
+            Node node) throws IOException {
+
+        List<ShareHolder> shareHolders = parse(shareHoldersRaw);
+
+        if (hasShareHolders(shareHolders)) {
+            return true;
         }
-               Document content = internalRender(parse(ypRoles));
+        Document root = createDocument();
+        Element header = root.createElement(HTML_DIV);
+        header.setAttribute(HTML_CLASS, "tabs_header");
+        header.appendChild(root.createTextNode(MSG_NAME_SHAREHOLDER_TITLE));
+        root.appendChild(header);
+        internalWriteDocument(root, writer);
+        writer.write("\n");
+        // Write the parsed shareholders information
+        Document content = createDocumentFromShareHolders(shareHolders);
+        internalWriteDocument(content, writer);
+        return true;
+    }
 
-               // If we found shareHolders then print header.
-               Document root = DocumentHelper.createDocument();
-               Element header = 
root.addElement(HTML_DIV).addAttribute(HTML_CLASS,
-                               "tabs_header");
-               header.addText(MSG_NAME_SHAREHOLDER_TITLE);
-               writer.write(stripXmlHeader(header.asXML()));
-               writer.write("\n");
-               writer.write(stripXmlHeader(content.asXML()));
-               return true;
-       }
+    // -- Check if we should print header and stuff
+    private boolean hasShareHolders(List<ShareHolder> shareHolders) {
+        return shareHolders.size() > 0;
+    }
 
-       /*
-        * internal render content
-        */
-       private Document internalRender(List<ShareHolder> shareHolders) {
+    // -- Thransform objects into xml document
+    private Document createDocumentFromShareHolders(
+            List<ShareHolder> shareHolders) {
+        Document doc = createDocument();
 
-               Document document = DocumentHelper.createDocument();
-               Element div = document.addElement(HTML_DIV);
-               Element table = div.addElement(HTML_TABLE);
-               table.addAttribute(HTML_CLASS, "roletable").
-                     addAttribute("cellspacing", "1");
+        Element root = doc.createElement(HTML_DIV);
+        Element table = doc.createElement(HTML_TABLE);
+        table.setAttribute(HTML_CLASS, "roletable");
+        table.setAttribute("cellspacing", "1");
+        root.appendChild(table);
 
-               Element tr1 = table.addElement(HTML_TR);
-               tr1.addElement(HTML_TH).addAttribute(HTML_CLASS, "sh_left").
-                  addText(MSG_NAME);
-               tr1.addElement(HTML_TH).addAttribute(HTML_CLASS, "sh_middle").
-                  addText(MSG_NUMB_OF_SHARES);
-               tr1.addElement(HTML_TH).addAttribute(HTML_CLASS, "sh_right").
-                  addText(MSG_SHARES_IN_PERCENT);
+        Element trH = doc.createElement(HTML_TR);
 
-               // Body goes here
-               table.addAttribute(HTML_CLASS, "roletable").
-                     addAttribute("cellspacing","1");
+        Element th = doc.createElement(HTML_TH);
+        th.setAttribute(HTML_CLASS, "sh_left");
+        th.appendChild(doc.createTextNode(MSG_NAME));
+        trH.appendChild(th);
 
-               for (ShareHolder sh : shareHolders) 
-               {
-                       Element tr = table.addElement(HTML_TR);
-                       addTd(tr, "sh_left").addText(sh.name);
-                       addTd(tr, "sh_middle").addText(sh.numberOfShares);
-                       addTd(tr, "sh_right").addText(sh.sharesInPercent);
+        th = doc.createElement(HTML_TH);
+        th.setAttribute(HTML_CLASS, "sh_middle");
+        th.appendChild(doc.createTextNode(MSG_NUMB_OF_SHARES));
+        trH.appendChild(th);
 
-                       switchBgColor();
-               }
-               return document;
-       }
+        th = doc.createElement(HTML_TH);
+        th.setAttribute(HTML_CLASS, "sh_right");
+        th.appendChild(doc.createTextNode(MSG_SHARES_IN_PERCENT));
+        trH.appendChild(th);
 
-       /** 
-        * Strip away the xml header generated by dom4j
-        * 
-        * @param xml to be striped
-        * @return xml without header
-        */
-       public String stripXmlHeader(String xml) 
-       {
-               return xml.replace("<?xml version=\"1.0\" 
encoding=\"UTF-8\"?>", "");
-       }
+        table.appendChild(trH);
 
-       /**
-        * Switch color
-        */
-       private void switchBgColor() 
-       {
-               if (tableBgColor == TableBgColor.WHITE) 
-               {
-                       tableBgColor = TableBgColor.GRAY;
-               }
-               else 
-               {
-                       tableBgColor = TableBgColor.WHITE;
-               }
-       }
+        // Loop through all the shareholders and add them to the table
+        for (ShareHolder sh : shareHolders) {
+            Element tr = doc.createElement(HTML_TR);
+            addTd(doc, tr, "sh_left").appendChild(doc.createTextNode(sh.name));
+            addTd(doc, tr, "sh_middle").appendChild(
+                    doc.createTextNode(sh.numberOfShares));
+            addTd(doc, tr, "sh_right").appendChild(
+                    doc.createTextNode(sh.sharesInPercent));
+            table.appendChild(tr);
+            // Hover the td background color(white/gray)
+            switchBgColor();
+        }
+        doc.appendChild(root);
+        return doc;
+    }
+    
+    // -- Switch bg color
+    private void switchBgColor() {
+        if (tableBgColor == TableBgColor.WHITE) {
+            tableBgColor = TableBgColor.GRAY;
+        } else {
+            tableBgColor = TableBgColor.WHITE;
+        }
+    }
+    
+    // -- Add td to table row
+    private Element addTd(Document doc, Element tableRow, String cssClass) {
 
-       /*
-        * Add a HTML_TD element to a HTML_TR element and add td attributes.
-        */
-       private Element addTd(Element tableRow, String cssClass) 
-       {
+        if (tableBgColor == TableBgColor.WHITE) {
+            Element td = doc.createElement(HTML_TD);
+            td.setAttribute(HTML_CLASS, cssClass);
+            tableRow.appendChild(td);
+            return td;
+        } else {
+            Element td = doc.createElement(HTML_TD);
+            td.setAttribute(HTML_CLASS, cssClass + " hover_on");
+            tableRow.appendChild(td);
+            return td;
+        }
+    }
 
-               if (tableBgColor == TableBgColor.WHITE) 
-               {
-                       return 
tableRow.addElement(HTML_TD).addAttribute(HTML_CLASS,
-                                       cssClass);
-               }
-               else
-               {
-                       return 
tableRow.addElement(HTML_TD).addAttribute(HTML_CLASS,
-                                       cssClass + " hover_on");
-               }
-       }
-       
-       List<ShareHolder> parse(String content) {
-       
-               List<ShareHolder> shareHolders = new ArrayList();
-               boolean isShareHoldersStarted = false;
-               boolean isShareHolderRow = false;
+    // -- Parse the the inpurt , using old school seperators like #sep#
+    List<ShareHolder> parse(String content) {
+        List<ShareHolder> shareHolders = new ArrayList();
+        boolean isShareHoldersStarted = false;
+        boolean isShareHolderRow = false;
+        
+        // Return empty list
+        if (content == null) {
+            return shareHolders;
+        }
+        if ("".equals(content.trim())) {
+            return shareHolders;
+        }
+        String row[] = content.split("#sepnl#");
 
-                       // Check input
-               if(content == null) {
-                       return shareHolders;
-               }
-               if("".equals(content.trim())) {
-                       return shareHolders;
-               }
-               
-               String row[] = content.split("#sepnl#");
+        for (String s : content.split("#sepnl#")) {
+            s = s.trim();
+            if (isShareHolderRow) {
+                String tmp[] = s.split("#sep#");
 
-               for(String s : content.split("#sepnl#")) 
-               {
-                       s= s.trim();
-                       if(isShareHolderRow) {
-                               String tmp[] = s.split("#sep#");
-                       
-                               if(tmp.length == 3) {
-                                       ShareHolder sh = new ShareHolder();
-                                       String tmp2[] = tmp[0].split("#id#");
-                                       sh.name = tmp2[0];
-                                       if(tmp2.length==2){
-                                               sh.id = tmp2[1];
-                                       }
-                                       sh.sharesInPercent = tmp[1];
-                                       sh.numberOfShares = tmp[2];
-                                       shareHolders.add(sh);
-                               }
-                       }
-                       if(s.startsWith("#aksjonaer")) 
-                       {
-                               isShareHoldersStarted = true;
-                       }
-                       if(s.startsWith("#bold#Navn#sep") && 
isShareHoldersStarted) 
-                       {
-                               isShareHolderRow = true;
-                       }
-               }
-               return shareHolders;
-       }
+                if (tmp.length == 3) {
+                    ShareHolder sh = new ShareHolder();
+                    String tmp2[] = tmp[0].split("#id#");
+                    sh.name = tmp2[0];
+                    if (tmp2.length == 2) {
+                        sh.id = tmp2[1];
+                    }
+                    sh.sharesInPercent = tmp[1];
+                    sh.numberOfShares = tmp[2];
+                    shareHolders.add(sh);
+                }
+            }
+            if (s.startsWith("#aksjonaer")) {
+                isShareHoldersStarted = true;
+            }
+            if (s.startsWith("#bold#Navn#sep") && isShareHoldersStarted) {
+                isShareHolderRow = true;
+            }
+        }
+        return shareHolders;
+    }
+
+    // -- Write the document to the writer
+    private void internalWriteDocument(Document d, Writer w) {
+        DOMSource source = new DOMSource(d);
+        StreamResult result = new StreamResult(new OutputStreamWriter(
+                System.out));
+
+        TransformerFactory factory = TransformerFactory.newInstance();
+        Transformer transformer;
+        try {
+            transformer = factory.newTransformer();
+            transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION,
+                    "yes");
+            transformer.transform(source, result);
+        } catch (TransformerConfigurationException e) {
+            throw new RuntimeException("Xml Parser: " + e);
+        } catch (TransformerException ignore) {
+        }
+    }
+
+    // -- Create a DOM document
+    private Document createDocument() {
+        DocumentBuilderFactory docFactory = DocumentBuilderFactory
+                .newInstance();
+        DocumentBuilder builder = null;
+        try {
+            builder = docFactory.newDocumentBuilder();
+        } catch (ParserConfigurationException e) {
+            throw new RuntimeException(e);
+        }
+
+        Document doc = builder.newDocument();
+        return doc;
+    }
+
+    /*
+    public static void main(String[] argv) throws TransformerException,
+            ResourceNotFoundException, ParseErrorException,
+            MethodInvocationException, IOException {
+        String shareHolders = "#aksjonaer0##sepnl#\n "
+                + "#bold#Navn#sep#Eierandel i %#sep#Antall aksjer#sepnl#\n"
+                + "STENSENTERET AS#id#2703596#sep#50#sep#100#sepnl#\n"
+                + "ARILD C. GUSTAVSEN#id##sep#25#sep#50#sepnl#\n"
+                + "INGER A. O. GUSTAVSEN#id##sep#25#sep#50#sepnl#";
+
+        new ShareHoldersDirective().internalRender(shareHolders,
+                new OutputStreamWriter(System.out), null);
+    }
+    */
 }

_______________________________________________
Kernel-commits mailing list
[email protected]
http://sesat.no/mailman/listinfo/kernel-commits

Reply via email to