/*
* Encog(tm) Core v3.3 - Java Version
* http://www.heatonresearch.com/encog/
* https://github.com/encog/encog-java-core
* Copyright 2008-2014 Heaton Research, Inc.
*
* 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.
*
* For more information on Heaton Research copyrights, licenses
* and trademarks visit:
* http://www.heatonresearch.com/copyright
*/
package org.encog.bot.browse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import org.encog.bot.browse.range.DocumentRange;
import org.encog.bot.browse.range.Form;
import org.encog.bot.browse.range.FormElement;
import org.encog.bot.browse.range.Input;
import org.encog.bot.browse.range.Link;
import org.encog.util.http.FormUtility;
import org.encog.util.logging.EncogLogging;
/**
* The main class for web browsing. This class allows you to navigate to a
* specific URL. Once you navigate to one URL, you can naviage to any URL
* contained on the page.
*
* @author jheaton
*
*/
public class Browser {
/**
* The page that is currently being browsed.
*/
private WebPage currentPage;
/**
* @return The page currently being browsed.
*/
public final WebPage getCurrentPage() {
return this.currentPage;
}
/**
* Navigate to the specified form by performing a submit of that form.
*
* @param form
* The form to be submitted.
*/
public final void navigate(final Form form) {
navigate(form, null);
}
/**
* Navigate based on a form. Complete and post the form.
*
* @param form
* The form to be posted.
* @param submit
* The submit button on the form to simulate clicking.
*/
public final void navigate(final Form form, final Input submit) {
try {
EncogLogging.log(EncogLogging.LEVEL_INFO, "Posting a form");
InputStream is;
URLConnection connection = null;
OutputStream os;
URL targetURL;
if (form.getMethod() == Form.Method.GET) {
os = new ByteArrayOutputStream();
} else {
connection = form.getAction().getUrl().openConnection();
os = connection.getOutputStream();
}
// add the parameters if present
final FormUtility formData = new FormUtility(os, null);
for (final DocumentRange dr : form.getElements()) {
if (dr instanceof FormElement) {
final FormElement element = (FormElement) dr;
if ((element == submit) || element.isAutoSend()) {
final String name = element.getName();
String value = element.getValue();
if (name != null) {
if (value == null) {
value = "";
}
formData.add(name, value);
}
}
}
}
// now execute the command
if (form.getMethod() == Form.Method.GET) {
String action = form.getAction().getUrl().toString();
os.close();
action += "?";
action += os.toString();
targetURL = new URL(action);
connection = targetURL.openConnection();
is = connection.getInputStream();
} else {
targetURL = form.getAction().getUrl();
os.close();
is = connection.getInputStream();
}
navigate(targetURL, is);
is.close();
} catch (final IOException e) {
throw new BrowseError(e);
}
}
/**
* Navigate to a new page based on a link.
*
* @param link
* The link to navigate to.
*/
public final void navigate(final Link link) {
final Address address = link.getTarget();
if (address.getUrl() != null) {
navigate(address.getUrl());
} else {
navigate(address.getOriginal());
}
}
/**
* Navigate based on a string URL.
*
* @param url
* The URL to navigate to.
*/
public final void navigate(final String url) {
try {
navigate(new URL(url));
} catch (final MalformedURLException e) {
EncogLogging.log(EncogLogging.LEVEL_ERROR, e);
throw new BrowseError(e);
}
}
/**
* Navigate to a page based on a URL object. This will be an HTTP GET
* operation.
*
* @param url
* The URL to navigate to.
*/
public final void navigate(final URL url) {
try {
EncogLogging.log(EncogLogging.LEVEL_INFO,
"Navigating to page:" + url);
final URLConnection connection = url.openConnection();
final InputStream is = connection.getInputStream();
navigate(url, is);
is.close();
} catch (final IOException e) {
EncogLogging.log(EncogLogging.LEVEL_ERROR, e);
throw new BrowseError(e);
}
}
/**
* Navigate to a page and post the specified data.
*
* @param url
* The URL to post the data to.
* @param is
* The data to post to the page.
*/
public final void navigate(final URL url, final InputStream is) {
EncogLogging.log(EncogLogging.LEVEL_INFO, "POSTing to page:" + url);
final LoadWebPage load = new LoadWebPage(url);
this.currentPage = load.load(is);
}
/**
* Set the current page.
*
* @param theCurrentPage
* The current page.
*/
public final void setCurrentPage(final WebPage theCurrentPage) {
this.currentPage = theCurrentPage;
}
/** {@inheritDoc} */
public final String toString() {
StringBuilder result = new StringBuilder("[");
result.append(getClass().getSimpleName());
result.append(" currentPage=");
result.append(this.currentPage.toString());
result.append("]");
return result.toString();
}
}