Package org.htmlparser.beans

Source Code of org.htmlparser.beans.LinkBean

// $Header: /home/cvs/jakarta-jmeter/src/htmlparser/org/htmlparser/beans/LinkBean.java,v 1.3 2005/07/12 20:50:42 mstover1 Exp $
/*
* ====================================================================
* Copyright 2002-2004 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*   http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/

// The developers of JMeter and Apache are greatful to the developers
// of HTMLParser for giving Apache Software Foundation a non-exclusive
// license. The performance benefits of HTMLParser are clear and the
// users of JMeter will benefit from the hard work the HTMLParser
// team. For detailed information about HTMLParser, the project is
// hosted on sourceforge at http://htmlparser.sourceforge.net/.
//
// HTMLParser was originally created by Somik Raha in 2000. Since then
// a healthy community of users has formed and helped refine the
// design so that it is able to tackle the difficult task of parsing
// dirty HTML. Derrick Oswald is the current lead developer and was kind
// enough to assist JMeter.
package org.htmlparser.beans;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.Serializable;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Vector;

import org.htmlparser.Node;
import org.htmlparser.Parser;
import org.htmlparser.tags.LinkTag;
import org.htmlparser.util.ParserException;
import org.htmlparser.visitors.ObjectFindingVisitor;

/**
* Extract strings from a URL.
*
* @author Derrick Oswald Created on December 23, 2002, 5:01 PM
*/
public class LinkBean extends Object implements Serializable {
  /**
   * Property name in event where the URL contents changes.
   */
  public static final String PROP_LINKS_PROPERTY = "Links";

  /**
   * Property name in event where the URL changes.
   */
  public static final String PROP_URL_PROPERTY = "URL";

  /**
   * Bound property support.
   */
  protected PropertyChangeSupport mPropertySupport;

  /**
   * The strings extracted from the URL.
   */
  protected URL[] mLinks;

  /**
   * The parser used to extract strings.
   */
  protected Parser mParser;

  /** Creates new StringBean */
  public LinkBean() {
    mPropertySupport = new PropertyChangeSupport(this);
    mLinks = null;
    mParser = new Parser();
  }

  //
  // internals
  //

  protected URL[] extractLinks(String url) throws ParserException {
    Parser parser;
    Vector vector;
    Node node;
    LinkTag link;
    URL[] ret;

    parser = new Parser(url);
    parser.registerScanners();
    ObjectFindingVisitor visitor = new ObjectFindingVisitor(LinkTag.class);
    parser.visitAllNodesWith(visitor);
    Node[] nodes = visitor.getTags();
    vector = new Vector();
    for (int i = 0; i < nodes.length; i++)
      try {
        link = (LinkTag) nodes[i];
        vector.add(new URL(link.getLink()));
      } catch (MalformedURLException murle) {
        // vector.remove (i);
        // i--;
      }
    ret = new URL[vector.size()];
    vector.copyInto(ret);

    return (ret);
  }

  /**
   * Determine if two arrays of URL's are the same.
   *
   * @param array1
   *            One array of URL's
   * @param array2
   *            Another array of URL's
   * @return <code>true</code> if the URL's match in number and value,
   *         <code>false</code> otherwise.
   */
  protected boolean equivalent(URL[] array1, URL[] array2) {
    boolean ret;

    ret = false;
    if ((null == array1) && (null == array2))
      ret = true;
    else if ((null != array1) && (null != array2))
      if (array1.length == array2.length) {
        ret = true;
        for (int i = 0; i < array1.length && ret; i++)
          if (!(array1[i] == array2[i]))
            ret = false;
      }

    return (ret);
  }

  //
  // Property change support.
  //

  /**
   * Add a PropertyChangeListener to the listener list. The listener is
   * registered for all properties.
   *
   * @param listener
   *            The PropertyChangeListener to be added.
   */
  public void addPropertyChangeListener(PropertyChangeListener listener) {
    mPropertySupport.addPropertyChangeListener(listener);
  }

  /**
   * Remove a PropertyChangeListener from the listener list. This removes a
   * PropertyChangeListener that was registered for all properties.
   *
   * @param the
   *            PropertyChangeListener to be removed.
   */
  public void removePropertyChangeListener(PropertyChangeListener listener) {
    mPropertySupport.removePropertyChangeListener(listener);
  }

  //
  // Properties
  //

  /**
   * Refetch the URL contents.
   */
  private void setLinks() {
    String url;
    URL[] urls;
    URL[] oldValue;

    url = getURL();
    if (null != url)
      try {
        urls = extractLinks(getURL());
        if (!equivalent(mLinks, urls)) {
          oldValue = mLinks;
          mLinks = urls;
          mPropertySupport.firePropertyChange(PROP_LINKS_PROPERTY, oldValue, mLinks);
        }
      } catch (ParserException hpe) {
        mLinks = null;
      }
  }

  /**
   * Getter for property links.
   *
   * @return Value of property links.
   */
  public URL[] getLinks() {
    if (null == mLinks)
      try {
        mLinks = extractLinks(getURL());
        mPropertySupport.firePropertyChange(PROP_LINKS_PROPERTY, null, mLinks);
      } catch (ParserException hpe) {
        mLinks = null;
      }

    return (mLinks);
  }

  /**
   * Getter for property URL.
   *
   * @return Value of property URL.
   */
  public String getURL() {
    return (mParser.getURL());
  }

  /**
   * Setter for property URL.
   *
   * @param url
   *            New value of property URL.
   */
  public void setURL(String url) {
    String old;

    old = getURL();
    if (((null == old) && (null != url)) || ((null != old) && !old.equals(url))) {
      try {
        mParser.setURL(url);
        mPropertySupport.firePropertyChange(PROP_URL_PROPERTY, old, getURL());
        setLinks();
      } catch (ParserException hpe) {
        // failed... now what
      }
    }
  }

  /**
   * Getter for property Connection.
   *
   * @return Value of property Connection.
   */
  public URLConnection getConnection() {
    return (mParser.getConnection());
  }

  /**
   * Setter for property Connection.
   *
   * @param url
   *            New value of property Connection.
   */
  public void setConnection(URLConnection connection) {
    try {
      mParser.setConnection(connection);
      setLinks();
    } catch (ParserException hpe) {
      // failed... now what
    }
  }
}
TOP

Related Classes of org.htmlparser.beans.LinkBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.