/*
 * $Id: WebCopy.java,v 1.6 2005/03/16 12:44:07 lawern Exp $
 *
 * Copyright (c) Siemens AG 2008 
 *           (c) Universität Paderborn 2008 
 * Licensed under EUPL 1.1. 
 *
 * $Log: WebCopy.java,v $
 * Revision 1.6  2005/03/16 12:44:07  lawern
 * Eigener LinkFilter und Erweiterung der LinkRules.
 *
 * Revision 1.5  2003/07/29 23:08:47  koppy
 * + rootFilename  in HttpDocToZipFile
 *
 * Revision 1.4  2003/07/02 13:14:09  koppy
 * WebCopy-SS verbessert zwecks 'docSize'
 *
 * Revision 1.3  2003/06/17 16:00:52  koppy
 * Initiale Version
 *
 */
package vkc.util.webcopy;

import net.matuschek.html.link.LinkRule;
import net.matuschek.html.link.LinkRuleSet;

import net.matuschek.spider.WebRobot;
import net.matuschek.spider.docfilter.FilterChain;

import java.io.IOException;

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


/**
 * Diese Klasse ermöglicht es,  ein HTML-Dokument
 * mit allen seinen Verknüpfungen (Bilderm, CSS, Javascript, etc. ) zu speichern
 *
 * @author kopppy
 * @version 1.0
 */
public class WebCopy {
    private WebCopy() {
    }

    /**
     * Speichert die übergebene URL temporär und gibt
     * die Referenz auf das korrespondierende Result-Objekt zurück
     *
     * @param URL die zu speichernde URL
     * @return Referenz auf das korrespondierende Result-Objekt
     * @throws IOException
     * @throws MalformedURLException
     */
    public static final WebCopyResult tmpStoreAsZipFile(String URL)
        throws IOException, MalformedURLException {
        return WebCopy.store(URL, new HttpDocToZipFile());
    }

    /**
     * Speichert die übergebene URL temporär und gibt
     * die Referenz auf das korrespondierende Result-Objekt zurück
     *
     * @param URL die zu speichernde URL
     * @param dir Verzeichnis, in welchem gespeichert werden soll
     * @return Referenz auf das korrespondierende Result-Objekt
     * @throws IOException
     * @throws MalformedURLException
     */
    public static final WebCopyResult storeAsZipFile(String URL, String dir)
        throws IOException, MalformedURLException {
        HttpDocToZipFile docStore = new HttpDocToZipFile(dir,
                URL.substring(URL.lastIndexOf("/") + 1) + ".zip");

        return WebCopy.store(URL, docStore);
    }

    /**
     * Speichert die übergebene URL mit gemäß dem angegebenen
     * HttpDocManager
     *
     * @param URL die zu speichernde URL
     * @param docStore der zu verwendende HttpDocManager (ZIP)
     * @return Referenz auf das korrespondierende Result-Objekt
     * @throws MalformedURLException
     */
    private static final WebCopyResult store(String URL,
        HttpDocToZipFile docStore) throws MalformedURLException {
        LinkRuleSet linkRules = new LinkRuleSet();
        linkRules.addLinkRule(new LinkRule("a", "href", false));
        linkRules.addLinkRule(new LinkRule("area", "href", false));
        linkRules.addLinkRule(new LinkRule("img", "src", true));
        linkRules.addLinkRule(new LinkRule("input", "src", true, "type='image'"));
        linkRules.addLinkRule(new LinkRule("link", "href", true,
                "rel='stylesheet', type='text/css'"));
        linkRules.addLinkRule(new LinkRule("frame", "src", true));
        linkRules.addLinkRule(new LinkRule("iframe", "src", true));
        linkRules.addLinkRule(new LinkRule("applet", "code", true));
        linkRules.addLinkRule(new LinkRule("meta", "content", true,
                "http-equiv='refresh'"));
        linkRules.addLinkRule(new LinkRule("td", "style", true));
        linkRules.addLinkRule(new LinkRule("body", "style", true));
        linkRules.addLinkRule(new LinkRule("tr", "background", true));
        linkRules.addLinkRule(new LinkRule("script", "src", true));

        FilterChain filters = new FilterChain();
        filters.add(new VKCLinkFilter());

        WebRobot robby = new WebRobot();
        robby.setStartURL(new URL(URL));

        robby.setMaxDepth(0);
        robby.setSleepTime(0);
        robby.setLinkRuleSet(linkRules);
        robby.setFilters(filters);

        robby.setDocManager(docStore);
        robby.setWebRobotCallback(docStore);

        robby.run();

        WebCopyResult result = new WebCopyResult();
        result.setFileCount(docStore.getDocCount());
        result.setFileSize(docStore.getFileSize());
        result.setZippedFile(docStore.getZipFile());
        result.setRootFilename(docStore.getRootFilename());

        return result;
    }
}
