Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-6333993

NodeList.item() returns null in 1.5.0_02

XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: P3 P3
    • 1.4.0
    • 1.0
    • xml
    • h1189
    • x86
    • windows_xp
    • Verified

      FULL PRODUCT VERSION :
      does'nt work in JAVA 1.5.0_02. Works on java 1.4.2_04

      ADDITIONAL OS VERSION INFORMATION :
      Windows Xp and windows 2000

      A DESCRIPTION OF THE PROBLEM :
      <<<
                     // Get first member of contextItem i.e. menuName
                      item = (Element)contextItem.item(0); <<<< Returns null in JRE 1.5
                     
                      if (item.getNodeName().equals("separator"))
                      {
                          m_contextActions[i] = new ContextAction();
                      }
      >>>


      STEPS TO FOLLOW TO REPRODUCE THE PROBLEM :
      Just run the code given in testcase section.Running MXCSTestApp.java in java 1.5.0_XX fails. giving output..
      When Run On Java 1.5.0_02

      >>>MXCSTestApp()
      <<<MXCSTestApp()
      >>>MXCSTestApp.init()
      m_XMLDocument.getDocumentElement();
      root.getChildNodes();
      root_elems.getLength();
      This node has only one icon to display all of the time.MxCS/images/MXCS16.gif
      Exception in parseTreeNode()java.lang.NullPointerException
      java.lang.NullPointerException
      at MXCSTest.MXCSTestApp.parseGUI(MXCSTestApp.java:194)
      at MXCSTest.MXCSTestApp.parseTreeNode(MXCSTestApp.java:109)
      at MXCSTest.MXCSTestApp.init(MXCSTestApp.java:251)
      at MXCSTest.MXCSTestApp.main(MXCSTestApp.java:303)
      <<<MXCSTestApp.init()
      >>>MXCSTestApp.start()
      <<<MXCSTestApp.start()
      ================================
      When Run on Java 1.4.2_04
      >>>MXCSTestApp()
      <<<MXCSTestApp()
      >>>MXCSTestApp.init()
      m_XMLDocument.getDocumentElement();
      root.getChildNodes();
      root_elems.getLength();
      This node has only one icon to display all of the time.MxCS/images/MXCS16.gif
      A new ContextAction ServiceStart is added for the menu Item Start and is Enabled
      A new ContextAction ServiceStop is added for the menu Item Stop... and is Disabled
      parseGUI((Element)root_elems.item(0));
      parseChildren((Element)root_elems.item(1));
      <<<MXCSTestApp.init()
      >>>MXCSTestApp.start()
      <<<MXCSTestApp.start()
      ==================================
      List of files.....
      ./MXCSTest
      ./MXCSTest/MXCSTestApp.java
      ./XMLTree
      ./XMLTree/service.xml
      ./XMLTree/XMLDocEntityResolver.java
      ./XMLTree/XMLTreeErrorHandler.java
      ./XMLTree/XML
      ./XMLTree/XML/node.dtd
      ./XMLTree/XML/nodeType.dtd

      EXPECTED VERSUS ACTUAL BEHAVIOR :
      EXPECTED -
      When Run on Java 1.4.2_04
      >>>MXCSTestApp()
      <<<MXCSTestApp()
      >>>MXCSTestApp.init()
      m_XMLDocument.getDocumentElement();
      root.getChildNodes();
      root_elems.getLength();
      This node has only one icon to display all of the time.MxCS/images/MXCS16.gif
      A new ContextAction ServiceStart is added for the menu Item Start and is Enabled
      A new ContextAction ServiceStop is added for the menu Item Stop... and is Disabled
      parseGUI((Element)root_elems.item(0));
      parseChildren((Element)root_elems.item(1));
      <<<MXCSTestApp.init()
      >>>MXCSTestApp.start()
      <<<MXCSTestApp.start()
      ==================================
      same application fails on java 1.5.0_XX
      ACTUAL -
      When Run On Java 1.5.0_02

      >>>MXCSTestApp()
      <<<MXCSTestApp()
      >>>MXCSTestApp.init()
      m_XMLDocument.getDocumentElement();
      root.getChildNodes();
      root_elems.getLength();
      This node has only one icon to display all of the time.MxCS/images/MXCS16.gif
      Exception in parseTreeNode()java.lang.NullPointerException
      java.lang.NullPointerException
      at MXCSTest.MXCSTestApp.parseGUI(MXCSTestApp.java:194)
      at MXCSTest.MXCSTestApp.parseTreeNode(MXCSTestApp.java:109)
      at MXCSTest.MXCSTestApp.init(MXCSTestApp.java:251)
      at MXCSTest.MXCSTestApp.main(MXCSTestApp.java:303)
      <<<MXCSTestApp.init()
      >>>MXCSTestApp.start()
      <<<MXCSTestApp.start()
      ================================

      ERROR MESSAGES/STACK TRACES THAT OCCUR :
      Exception in parseTreeNode()java.lang.NullPointerException
      java.lang.NullPointerException
      at MXCSTest.MXCSTestApp.parseGUI(MXCSTestApp.java:194)
      at MXCSTest.MXCSTestApp.parseTreeNode(MXCSTestApp.java:109)
      at MXCSTest.MXCSTestApp.init(MXCSTestApp.java:251)
      at MXCSTest.MXCSTestApp.main(MXCSTestApp.java:303)

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------


      -------------------------------------------------------
      ----- ./MXCSTest/MXCSTestApp.java
      -------------------------------------------------------

      /*
       * Created on Apr 28, 2005
       * @author NOT Sri Hari.
       * Leveraged entirely from Linville, Kevin original MXCS applet code,
       * This is test applet to reproduce a problem found with MXCS on JRE 1.5.
       */
      package MXCSTest;

      import java.awt.HeadlessException;
      import java.io.IOException;
      import java.net.URL;

      import javax.swing.JApplet;
      import javax.xml.parsers.DocumentBuilder;
      import javax.xml.parsers.DocumentBuilderFactory;
      import javax.xml.parsers.FactoryConfigurationError;
      import javax.xml.parsers.ParserConfigurationException;

      import org.w3c.dom.Document;
      import org.w3c.dom.Element;
      import org.w3c.dom.NodeList;
      import org.w3c.dom.Text;
      import org.xml.sax.SAXException;

      import XMLTree.XMLDocEntityResolver;
      import XMLTree.XMLTreeErrorHandler;

      /**
       * @author srihari
       */
      public class MXCSTestApp extends JApplet {
          static URL XMLDocName = null;
      static final String SERVICE_XML = "XMLTree/service.xml";
          
          
      private void loadXML()
      {
      boolean bError = false;
      try
              {
                  DocumentBuilderFactory factory =
                                                 DocumentBuilderFactory.newInstance();
                  factory.setIgnoringElementContentWhitespace(true);
                  factory.setValidating(true);
                  DocumentBuilder builder = factory.newDocumentBuilder();
                  builder.setEntityResolver(new XMLDocEntityResolver());
                  builder.setErrorHandler(new XMLTreeErrorHandler());

                  XMLDocName = getClass().getClassLoader().getResource(SERVICE_XML);
                  m_XMLDocument = builder.parse(XMLDocName.toString());
                  
              }
              catch (FactoryConfigurationError fcError)
              {
                  bError = true;
              }
              catch (ParserConfigurationException pcException)
              {
                  bError = true;
              }
              catch (SAXException sException)
              {
                  // This exception will be handled by the XMLTreeErrorHandler,
                  // however we still need to still flag that this exception occured.
                  bError = true;
              }
              catch (IOException ioException)
              {
                  bError = true;
              }
              catch (IllegalArgumentException iaException)
              {
                  bError = true;
              }
              finally
              {
                  // Nullify erroneous m_XMLDocument if an exception occured.
                  // Set all array variables to zero length arrays.
                  if (bError)
                  {
                      String message = "Unable to generate a DOM document from ";
                      System.out.println("");
                  }
              }
      }
      private void parseTreeNode()
          {
              // Set variables to default values if m_XMLDocument couldn't be loaded.
              if (m_XMLDocument == null)
              {
                  return;
              }
              
              try
              {
                  Element root = m_XMLDocument.getDocumentElement();
                  System.out.println("m_XMLDocument.getDocumentElement();");
                  NodeList root_elems = root.getChildNodes();
                  System.out.println("root.getChildNodes();");
                  // Setup the GUI and children related members.
                  int count = root_elems.getLength();
                  System.out.println("root_elems.getLength();");
                  parseGUI((Element)root_elems.item(0));
                  System.out.println("parseGUI((Element)root_elems.item(0));");
                  parseChildren((Element)root_elems.item(1));
                  System.out.println("parseChildren((Element)root_elems.item(1));");
              }
              catch(Exception e)
              {
                 System.out.println("Exception in parseTreeNode()"+e);
                 e.printStackTrace();
                  
              }
          }
      private void parseGUI(Element e)
          {
              Element icon, member;
              String iconName;
              NodeList members, iconList, contextList;
              int nodeCount = 0;
              int tempCount = 0;

              // Get the GUI nodes.
              members = e.getChildNodes();
              nodeCount = members.getLength();
              
              // Get the name element.
              member = (Element)members.item(0);
              m_strTypeName = ((Text)member.getFirstChild()).getData();
              
              // Get the icon element(s).
              member = (Element)members.item(1);
              iconList = member.getChildNodes();

              // This node has a special list of icons to display.
              tempCount = iconList.getLength();
              String openIcon = "";
              String closedIcon = "";
              String leafIcon = "";

              icon = (Element)iconList.item(0);
              iconName = ((Text)icon.getFirstChild()).getData();

              if (tempCount == 1)
              {
                  // This node has only one icon to display all of the time.
               System.out.println("This node has only one icon to display all of the time."+iconName);
              }
              else
              {
                  // This icon has three icons to display
                  openIcon = iconName;
                  icon = (Element)iconList.item(1);
                  closedIcon = ((Text)icon.getFirstChild()).getData();
                  icon = (Element)iconList.item(2);
                  leafIcon = ((Text)icon.getFirstChild()).getData();
              }

              // Get the context elements.
              if (nodeCount < 3)
              {
                  // Context is optional. If it's empty, initialize m_contextActions
                  // to an empty Action array.
                  System.out.println("So NodeCount< 3 i.e No Contextitems");
              }
              else
              {
                  
                  String menuName, action;
                  NodeList contextItem;
                  Element item;
                  
                  // Get contextMenu Element.
                  member = (Element)members.item(2);
                  
                  // Get list of subelements of contextMenu i.e. list of contextItems
                  contextList = member.getChildNodes();
                  tempCount = contextList.getLength();

                  for (int i = 0; i < tempCount; i++)
                  {
                      // Get next contextItem
                      contextItem = (NodeList)contextList.item(i);
                      
                      // Get first member of contextItem i.e. menuName
                      item = (Element)contextItem.item(0);
                     
                      if (item.getNodeName().equals("separator"))
                      {
                          System.out.println("Oh!. This item is a separator.");
                      }
                      else
                      {
                          menuName = ((Text)item.getFirstChild()).getData();
                          boolean isEnabled =
                                          item.getAttribute("enabled").equals("true");
                          item = (Element)contextItem.item(1);
                          action = ((Text)item.getFirstChild()).getData();
                          
                          String aStr = (isEnabled) ? "Enabled": "Disabled";
                          System.out.println("A new ContextAction "+action+" is added for the menu Item "+
                           menuName+" and is " +aStr);
                          
                      }
                  }
              }
          }

      private void parseChildren(Element e)
          {
              m_bHasDynamicChildren = e.getAttribute("dynamic").equals("true");
          }

      public MXCSTestApp() throws HeadlessException {
      super();
      try
      {
      System.out.println(">>>MXCSTestApp() ");
      // Actual code goes here...

      }
      finally
      {
      System.out.println("<<<MXCSTestApp()");
      }
      }

      /* (non-Javadoc)
      * @see java.applet.Applet#init()
      */
      public void init() {
      super.init();
      try
      {
      System.out.println(">>>MXCSTestApp.init()");
      // Actual code goes here...
      loadXML();
      parseTreeNode();
      }
      finally
      {
      System.out.println("<<<MXCSTestApp.init()");
      }

      }

      /* (non-Javadoc)
      * @see java.applet.Applet#start()
      */
      public void start() {
      super.start();
      try
      {
      System.out.println(">>>MXCSTestApp.start()");
      // Actual code goes here...

      }
      finally
      {
      System.out.println("<<<MXCSTestApp.start()");
      }

      }
      /* (non-Javadoc)
      * @see java.applet.Applet#stop()
      */
      public void stop() {
      super.stop();
      try
      {
      System.out.println(">>>MXCSTestApp.stop()");
      // Actual code goes here...

      }
      finally
      {
      System.out.println("<<<MXCSTestApp.stop()");
      }

      }
      /* (non-Javadoc)
      * @see java.applet.Applet#destroy()
      */
      public void destroy() {
      super.destroy();
      }

      public static void main(String[] args) {
      if(theApp==null)
      {
      theApp = new MXCSTestApp();
      }
      theApp.init();
      theApp.start();
      }

      // Runit as an APP.
      private static MXCSTestApp theApp=null;
      private boolean m_bHasDynamicChildren = false;
      private String m_strTypeName = "";
      private Document m_XMLDocument;
      }


      -------------------------------------------------------
      ----- ./XMLTree/service.xml
      -------------------------------------------------------

      <?xml version="1.0"?>
      <!DOCTYPE TreeNodeType SYSTEM "XMLTree/XML/nodeType.dtd">
      <TreeNodeType>
        <GUI>
          <name>Service</name>
          <icon>
            <monoIcon>MxCS/images/MXCS16.gif</monoIcon>
          </icon>
          <contextMenu>
            <contextItem>
              <menuName>Start</menuName>
              <action>ServiceStart</action>
            </contextItem>
            <contextItem>
              <menuName enabled = "false">Stop...</menuName>
              <action>ServiceStop</action>
            </contextItem>
          </contextMenu>
        </GUI>
        <children/>
      </TreeNodeType>

      -------------------------------------------------------
      ----- ./XMLTree/XMLDocEntityResolver.java
      -------------------------------------------------------

      /*
       * XMLDocEntityResolver.java
       *
       * Created on April 10, 2003, 12:14 PM
       */

      package XMLTree;

      import org.xml.sax.*;
      import java.net.*;
      /**
       *
       * @author Kevin Linville
       */
      /**This class resolves the location of the dtd files that are used for parsing
       * the XML documents used by the <code>XMLTree</code>.
       */
      public class XMLDocEntityResolver implements EntityResolver
      {
          
          /** Creates a new instance of XMLDocEntityResolver */
          public XMLDocEntityResolver()
          {
          }
          
          public InputSource resolveEntity(String publicId, String systemId)
          {
              URL res;
              
              if (systemId.endsWith("node.dtd"))
              {
                  res = getClass().getClassLoader().getResource("XMLTree/XML/node.dtd");
                  return new InputSource(res.toString());
              }
              if (systemId.endsWith("nodeType.dtd"))
              {
                  res = getClass().getClassLoader().getResource("XMLTree/XML/nodeType.dtd");
                  return new InputSource(res.toString());
              }
              
              return null;
          }
      }

      ---------- END SOURCE ----------

      CUSTOMER SUBMITTED WORKAROUND :
      No workaround.

            joehw Joe Wang
            emcmanus Eamonn McManus
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: