/* TagParser.java -- a parser for applet tags
   Copyright (C) 2006  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package gnu.classpath.tools.appletviewer;

import gnu.javax.swing.text.html.parser.HTML_401F;

import gnu.xml.dom.DomNode;
import gnu.xml.dom.html2.DomHTMLAppletElement;
import gnu.xml.dom.html2.DomHTMLDocument;
import gnu.xml.dom.html2.DomHTMLEmbedElement;
import gnu.xml.dom.html2.DomHTMLObjectElement;
import gnu.xml.dom.html2.DomHTMLParamElement;
import gnu.xml.dom.html2.DomHTMLParser;

import java.io.File;
import java.io.InputStreamReader;
import java.io.IOException;
import java.io.Reader;

import java.net.MalformedURLException;
import java.net.URL;

import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Vector;

import org.w3c.dom.NodeList;


public class TagParser
{
    
  /**
   * Parsed document.
   */
  DomHTMLDocument document;
  
  /**
   * The document base of this applet.
   */
  URL documentbase;
  
  /**
   * The document base of all the applets.
   */
  static URL db;
  
  /** 
   * The tags in the document.
   */
  Vector tags = new Vector();
  
  /**
   * Default constructor.
   */
  TagParser()
  {
    // Do nothing.
  }

  /**
   * Constructs and parses document using the given location.
   * 
   * @param location - location of applet
   */
  TagParser(String location) throws IOException
  {
    documentbase = getLocationToURL(location);
    db = documentbase;
    InputStreamReader in = new InputStreamReader(documentbase.openStream());
    document = (DomHTMLDocument) (new DomHTMLParser(HTML_401F.getInstance()).parseDocument(in));
  }

  /**
   * Constructs and parses document.
   * 
   * @param in - Reader to parse document from.
   * @param documentBase - the URL of the applet
   * @throws IOException - is thrown if any IO error occurs.
   */
  TagParser(Reader in, URL documentBase) throws IOException
  {
    documentbase = documentBase;
    db = documentbase;
    document = (DomHTMLDocument) (new DomHTMLParser(HTML_401F.getInstance()).parseDocument(in));
  }
  
  /**
   * Parses all applet tags in document.
   * 
   * @return a list of AppletTag objects representing the applet tags
   * in document
   */
  ArrayList parseAppletTags()
  {    
    ArrayList allTags = new ArrayList();
    if (document == null)
      return null;;
    
    recurseDocument(document.getChildNodes());

    int sz = tags.size();
    for (int j = 0; j < sz; j++)
      {
        Object curr = tags.get(j);
        // Order of checking is important here.
        // Must check embed element before applet element
        // because DomHTMLEmbedElement extends DomHTMLAppletElement
        AppletTag a = null;
        if (curr instanceof DomHTMLEmbedElement)
          a = new AppletTag((DomHTMLEmbedElement) curr);
        else if (curr instanceof DomHTMLAppletElement)
          a = new AppletTag((DomHTMLAppletElement) curr);
        else if (curr instanceof DomHTMLObjectElement)
          a = new AppletTag((DomHTMLObjectElement) curr);
        a.documentbase = documentbase;
        allTags.add(a);
      }
    
    return allTags;
  }
  
  /**
   * Recurses the document in search for the appropriate tags.
   * 
   * @param list - the Node list.
   */
  private void recurseDocument(NodeList list)
  {
    // Recurse and store all APPLET, OBJECT and EMBED tags.
    int length = list.getLength();
    for (int i = 0; i < length; i++)
      {
        DomNode curr = (DomNode) list.item(i);
        if ((curr instanceof DomHTMLEmbedElement) || 
            (curr instanceof DomHTMLAppletElement) ||
            (curr instanceof DomHTMLObjectElement))
          tags.add(curr);
        recurseDocument(curr.getChildNodes());
      }
  }
  
  /**
   * Parses the param elements for a given node.
   * 
   * @param node - the node element to parse.
   */
  static void parseParams(DomNode node, AppletTag t)
  {
    boolean ja = false;
    boolean jb = false;
    boolean jc = false;
    NodeList l = node.getChildNodes();
    int size = l.getLength();
    
    if (size != 0)
      for (int i = 0; i < size; i++)
        {
          Object c = l.item(i);
          if (! (c instanceof DomHTMLParamElement))
            continue;
          DomHTMLParamElement curr = (DomHTMLParamElement) c;
          String key = curr.getName();
          String val = curr.getValue();
          
          if (key.equals("java_code"))
            {
              jc = true;
              t.code = val;
            }
          else if (key.equals("java_codebase"))
            {
              jb = true;
              t.codebase = val;
            }
          else if (!jc && key.equals("code"))
            t.code = val;
          else if (!jc && key.equals("classid"))
            {
              int x = val.indexOf(":");
              if (x != -1)
                val = val.substring(x + 1);
              t.code = val;
            }
          else if (!jb && key.equals("codebase"))
            t.codebase = val;
          else if (key.equals("java_archive"))
            {
              ja = true;
              t.archives = parseArchives(val, t);
              val = t.archives.toString();
            }
          else if (!ja && key.equals("archive"))
            {
              t.archives = parseArchives(val, t);
              val = t.archives.toString();
            }

          t.parameters.put(key.toLowerCase(), val);
        }
  }
  
  /**
   * Parses the archive string and returns a list.
   * 
   * @param the list of archives (comma-separated) in a String.
   */
  static ArrayList parseArchives(String arcs, AppletTag t)
  {
    try
      {
        ArrayList list = new ArrayList();

        StringTokenizer tagTokenizer = new StringTokenizer(arcs, ",");
        while (tagTokenizer.hasMoreTokens())
          list.add(t.prependCodeBase(tagTokenizer.nextToken().trim()));

        return list;
      }
    catch (MalformedURLException e)
      {
      }
    return null;
  }
  
  /**
   * Gets the location to the URL, given a location.
   * 
   * @param location - the given location.
   * @return the URL.
   */
  static URL getLocationToURL(String location) throws IOException
  {
    URL tmpDocumentBase = null;

    try
      {        
        // Try parsing location as a URL.
        tmpDocumentBase = new URL(location);
        
        // If no file was specified in the URL the assume the user
        // meant the root page.
        String f = tmpDocumentBase.getFile();
        if (f.indexOf(".") == -1 && !f.endsWith(File.separator))
          if (new File(tmpDocumentBase.getFile()).isDirectory())
            tmpDocumentBase = new URL(location.concat(File.separator));
      }
    catch (MalformedURLException e)
      {
        // location is not a URL.  See if it is an HTML file.
        String path;

        if (location.startsWith(File.separator))
          path = new File(location).getCanonicalPath();
        else
          path = new File(System.getProperty("user.dir") + File.separator
                          + location).getCanonicalPath();

        tmpDocumentBase = new URL("file", "", path);
        
        if (new File(tmpDocumentBase.getFile()).isDirectory())
          tmpDocumentBase = new URL("file", "", path + File.separator);
      }
    
    return tmpDocumentBase;
  }
}
