package searchengine;
import java.io.*;
import java.net.*;
import java.sql.*;

/**
   This bean searches for similar web pages to user given webpage URL
*/
public class SearchResultBean
{
   private String user_url;
   private String message;
   private String output_message;
   private String similar_pages;
   private ResultSet result;
   private boolean next_url;
   private boolean valid_url;   
   /**
      Constructor
   */
   public SearchResultBean()
   {
      setOutput_message("");      
      similar_pages = "";
      valid_url = false;
   }

   /**
      Read-only user_url property
      @return the user given webpage URL
   */
   public String getUser_url()
   {
      return user_url;
   }
   
   /**
      Write-only user_url property
      @param input_url the the user given webpage URL
   */
   public void setUser_url(String input_url) throws IOException, SQLException
   {
      user_url = input_url;

      /* Checks for URL validity and saves to file */
      savePage();

      /* Checks database for similar pages */      
      if (valid_url)
         processSimilarPages();
   }
   
   /**
      Read-only output_message property
      @returns output_message with regards to whether url link is valid
   */
   public String getOutput_message()
   {
      return output_message;
   }
   
   /**
      Write-only output_message property
      @param input_msg the output message to report
   */
   public void setOutput_message(String input_msg)
   {
      output_message = input_msg;
   }

   /**
      Read-only result property
      @returns result 
   */
   public ResultSet getResult()
   {
      return result;
   }

   /**
      Write-only result property
      @param input_result to set result property
   */
   public void setResult(ResultSet input_result) 
   {
      result = input_result;
   }

   /**
      Read-only similar_pages property
      @returns similar_pages 
   */
   public String getSimilar_pages()
   {
      return similar_pages;
   }
   
   /**
      Write-only similar_pages property
      @param input_pages the output urls to report
   */
   public void setSimilar_pages()throws SQLException
   {
      similar_pages = result.getString("URL").trim();
   }

   /**
      Read-only next_url property
      @returns next_url 
   */
   public boolean isNext_url()
   {
      return next_url;
   }
   
   /**
      Write-only next_page property
      @param input_value to set whether next_url is valid
   */
   public void setNext_url() throws SQLException
   {
      next_url = result.next();
   }

   /**
      Checks if URL is valid and if valid saves webpage to a file
   */
   public void savePage() throws IOException
   {
      URL u;
      int code;
      boolean done;
      String file_input;
      FileWriter writer;
      PrintWriter out;

      valid_url = false;
      try
      {
         /* Open connection */
         u = new URL(user_url);
         URLConnection connection = u.openConnection();

         /* Check whether response code is HTTP_OK (200) */
         HttpURLConnection httpConnection = (HttpURLConnection)connection;

         code = httpConnection.getResponseCode();

         if (code != httpConnection.HTTP_OK)
            setOutput_message(httpConnection.getResponseMessage());
         else
         {
            valid_url = true;

            /* Retrieve web page and place into file (C:\jakarta-tomcat-5.0.19\bin) */
            writer = new FileWriter("inputpage.txt");
            out = new PrintWriter(writer);

            /* Get stream */
            InputStream in = connection.getInputStream();

            /* Turns stream into reader */
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));

            /* Read server response and write to file*/
            done = false;
            while (!done)
            {
               file_input = reader.readLine();
               if (file_input == null)
                  done = true;
               else
                  out.println(file_input);
            }
            writer.close();
         } /* End HTTP_OK */
      }
      catch (MalformedURLException exception)
      {
         setOutput_message("Invalid url format. Don't forget http://.");
      }
      catch (UnknownHostException exception)
      {
         setOutput_message("Unknown Host. Please check URL syntax.");
      }
      catch (ConnectException exception)
      {
         setOutput_message("Connection timed out.");
      }      

   } /* End method savePage */

   /**
      Checks database for similar pages
   */
   public void processSimilarPages() throws SQLException
   {
      Connection conn = null;
      try
      {
         conn = DataSourceBean.getConnection();
         Statement stat = conn.createStatement();
         String query = "SELECT URL FROM SEARCH_DATABASE";
         setResult(stat.executeQuery(query));
      }
      finally
      {
         if (conn != null) conn.close();
      }

   } /* End method getSimilarPages */

} /* End class SearchResultBean */