r46728 - in speeltuin/andre/mmget: . src/main/config/components src/main/java/org/mmbase/mmget src/main/webapp/mmbase/components/mmget

0 views
Skip to first unread message

andre

unread,
Aug 6, 2015, 5:00:45 PM8/6/15
to mmbase...@googlegroups.com
Author: andre
Date: 2015-08-06 23:00:44 +0200 (Thu, 06 Aug 2015)
New Revision: 46728

Modified:
speeltuin/andre/mmget/
speeltuin/andre/mmget/src/main/config/components/mmget.xml
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/CSSReader.java
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/HTMLReader.java
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/MMGet.java
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceReWriter.java
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceWriter.java
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReader.java
speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReaders.java
speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/index.jspx
speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/status.jspx
Log:
updated code a bit


Property changes on: speeltuin/andre/mmget
___________________________________________________________________
Added: svn:ignore
+ .idea
target
mmbase-mmget.iml


Modified: speeltuin/andre/mmget/src/main/config/components/mmget.xml
===================================================================
--- speeltuin/andre/mmget/src/main/config/components/mmget.xml 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/config/components/mmget.xml 2015-08-06 21:00:44 UTC (rev 46728)
@@ -18,14 +18,14 @@
<title xml:lang="en">MMGet</title>
<title xml:lang="nl">MMGet</title>
<description xml:lang="en">
- An application like 'wget', it downloads a site from an url and saves it in a directory.
+ This applications it downloads a site from an url and saves it in a directory, it is a ver basic wget.
Both parameters or fields must be specified. Additional settings, like the default homepage,
can be configured in 'config/utils/mmget.xml'.
</description>
<description xml:lang="nl">
- Een applicatie zoals 'wget', het download een site en saved die in een directory.
- Vul een volledige link in van een pagina vanaf je waar wilt starten met downloaden, plus de
- directory in de webapp waarin de site gesaved moet worden. Beide parameters of velden zijn verplicht.
+ Download een gehele site inclusief afbeeldingen en eventuele andere files zoals stylesheets en dergelijke.
+ Vul een link in - bij voorkeur de homepage - vanaf waar de download moet starten.
+ De site wordt opgeslagen in de opgegeven directory. Beide parameters of velden zijn verplicht.
Andere voorkeuren, zoals de default homepage, kunnen opgegeven worden in 'config/utils/mmget.xml'.
</description>
<body jsp="index.jspx">

Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/CSSReader.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/CSSReader.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/CSSReader.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,16 +1,14 @@
package org.mmbase.mmget;

-import java.io.*;
-import java.net.*;
-import java.util.*;
-
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;

-import org.mmbase.util.logging.Logger;
-import org.mmbase.util.logging.Logging;
-
/**
* Reads a css web resource an returns its tags that may contain links to other resources.
*
@@ -22,12 +20,12 @@
* @version $Id$
*/
public final class CSSReader extends UrlReader {
- private static final Logger log = Logging.getLoggerInstance(CSSReader.class);
+ //private static final Logger log = Logging.getLoggerInstance(CSSReader.class);

private HttpURLConnection huc = null;
private BufferedReader inrdr = null;

- /*
+ /* Patterns for:
list-style-image: url("images/bullet.png");
@import "form.css";
@import url("mystyle.css");
@@ -52,8 +50,9 @@

/**
* Parses a css file and passes it to a regexp parser
- * @param
- * @return
+ * @param line line of html to check for pattern
+ * @param p pattern to use
+ * @return List links to check for resources
*/
private ArrayList<String> parseCSS(String line, Pattern p) {
ArrayList<String> list = new ArrayList<String>();
@@ -66,7 +65,9 @@
//if (log.isDebugEnabled()) log.debug("Found match: " + match);

// remove first and last " if any
- if (match.indexOf("\"") > -1) match = match.replace("\"", "");
+ if (match.contains("\"")) match = match.replace("\"", "");
+ // TODO: and also for ' ?
+
list.add(match);
}
return list;

Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/HTMLReader.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/HTMLReader.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/HTMLReader.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,16 +1,15 @@
package org.mmbase.mmget;

-import java.io.*;
-import java.net.*;
-import java.util.*;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;

+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.ArrayList;
+
/**
* Reads a web resource an returns its tags that may contain links to other resources.
*
@@ -24,20 +23,24 @@
private BufferedReader inrdr = null;

/**
- * Tags to be looking for.
+ * Tags with src or href attributes to be looking for.
*/
public final static String[] wantTags = {
- "<a ", "<A ",
- "<applet", "<APPLET",
- "<area", "<AREA",
- "<embed", "<EMBED",
- "<frame", "<FRAME",
- //"<input", "<INPUT", // TODO: <input type="image" src=".." />
- "<iframe", "<IFRAME",
- "<img", "<IMG",
- "<link", "<LINK",
- "<object", "<OBJECT",
- "<script", "<SCRIPT",
+ "<a ", "<A ",
+ "<applet", "<APPLET",
+ "<area", "<AREA",
+ "<audio", "<AUDIO",
+ "<embed", "<EMBED",
+ "<frame", "<FRAME",
+ //"<input", "<INPUT", // TODO: <input type="image" src=".." />
+ "<iframe", "<IFRAME",
+ "<img", "<IMG",
+ "<link", "<LINK",
+ "<object", "<OBJECT",
+ "<script", "<SCRIPT",
+ "<source", "<SOURCE",
+ "<track", "<TRACK",
+ "<video", "<VIDEO",
};

public HTMLReader(HttpURLConnection huc) throws IOException {
@@ -53,11 +56,13 @@
ArrayList<String> al = new ArrayList<String>();
String tag;
while ((tag = nextTag()) != null) {
- for (int i = 0; i < wantTags.length; i++) {
- if (tag.startsWith(wantTags[i])) {
+ for (String wantTag : wantTags) {
+ if (tag.startsWith(wantTag)) {
String link = extractHREF(tag);
- if (link != null) al.add(link);
- continue; // optimization
+ if (link != null) {
+ al.add(link);
+ }
+ break;
}
}
}
@@ -77,7 +82,7 @@
* @return the tag
*/
protected String readTag() throws IOException {
- StringBuffer theTag = new StringBuffer("<");
+ StringBuilder theTag = new StringBuilder("<");
int i = '<';
while (i != '>' && (i = inrdr.read()) != -1) {
theTag.append((char)i);
@@ -133,8 +138,7 @@
while ((i = inrdr.read()) != -1) {
char c = (char)i;
if (c == '<') {
- String tag = readTag();
- return tag;
+ return readTag();
}
}
return null;

Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/MMGet.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/MMGet.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/MMGet.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,25 +1,22 @@
package org.mmbase.mmget;

-import java.util.*;
-import java.util.regex.*;
-import java.util.concurrent.*;
-import java.util.concurrent.Future;
-import java.util.concurrent.Callable;
-
-import java.io.*;
-import java.net.*;
-
-import org.mmbase.bridge.*;
import org.mmbase.module.core.MMBase;
-
+import org.mmbase.util.ResourceLoader;
import org.mmbase.util.ThreadPools;
import org.mmbase.util.UriParser;
-import org.mmbase.util.ResourceLoader;
-import org.mmbase.util.xml.UtilReader;
-
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;
+import org.mmbase.util.xml.UtilReader;

+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.*;
+import java.util.concurrent.*;
+
/**
* An MMBase application that excepts and url to export all files 'below' that url.
* TODO: init rootURL early on, and check all urls against it (so we don't travel up the rootURL)
@@ -42,11 +39,16 @@
public static String serverpart;
protected static URL startURL;
protected static URL startdirURL;
-
- /* location the files should be saved to, directory to save files should be in the webroot (for now) */
+
+ /**
+ * Location the files should be saved to, directory to save files should be in the webroot (for now)
+ */
public static String directory;
+ /**
+ * Directory to save in
+ */
protected static File savedir;
-
+
public static Future<String> future = null;
protected boolean done = false;

@@ -56,9 +58,14 @@
protected static List<URL> readURLs = Collections.synchronizedList(new ArrayList<URL>());
/* saved: url -> filename */
protected static Map<URL,String> savedURLs = Collections.synchronizedMap(new HashMap<URL,String>());
- /* rewrite these: url -> link in page / new link in rewritten page */
- protected static Map<URL,Map<String,String>> url2links = Collections.synchronizedMap(new HashMap<URL,Map<String,String>>());
-
+ /**
+ * rewrite these: url -> link in page / new link in rewritten page
+ */
+ protected static Map<URL,Map<String,String>> url2links;
+ static {
+ url2links = Collections.synchronizedMap(new HashMap<URL, Map<String, String>>());
+ }
+
/* homepage to use when saving a file with no extension (thus presuming directory) */
protected static String homepage = "index.html";
protected static List<String> contentheadersHTML = Arrays.asList(
@@ -113,7 +120,7 @@

/**
* Reads configuration
- * @param configuration config properties
+ * @param config configuration properties
*/
synchronized static void configure(Map<String, String> config) {
//if (log.isDebugEnabled()) log.debug("Reading configuration..");
@@ -148,8 +155,8 @@
* @return Message with the name of the Future thread
*/
public String downloadSite(String url, String dir) {
- this.directory = dir;
- this.url = url;
+ MMGet.directory = dir;
+ MMGet.url = url;

String status = "";
try {
@@ -187,7 +194,7 @@
return start();
}
});
- ThreadPools.identify(future, "MMGet download of '" + startURL.toString() + "' in '" + savedir.toString() + "'");
+ ThreadPools.identify(future, "MMGet download of url '" + startURL.toString() + "'<br />in directory '" + savedir.toString() + "'");
String fname = ThreadPools.getString(future);
log.debug("fname: " + fname);
int timeout = 10;
@@ -212,7 +219,6 @@

/**
* Kick method that starts export from the initial link
- * @param link
*/
private String start() {
readURLs.clear();
@@ -231,7 +237,7 @@

/**
* Parses urls it recieves.
- * @param url link to html page or css
+ * @param url link to html page or css
*/
private void readUrl(URL url) {
if (future.isCancelled()) return;
@@ -263,13 +269,11 @@
//if (startdirURL == null) startdirURL = dirURL;
if (log.isDebugEnabled()) log.debug("@@ dirURL: " + dirURL.toString());
if (log.isDebugEnabled()) log.debug("@@ startdirURL: " + startdirURL.toString());
-
- Iterator<String> it = links.iterator();
- while (it.hasNext()) {
- String link = it.next();
+
+ for (String link : links) {
link = removeSessionid(link); // remove sessionid crud etc. (changes over time)
URL linkURL;
- if (link.indexOf("://") < 0) {
+ if (!link.contains("://")) {
try {
linkURL = new URL(url, link);
} catch (MalformedURLException e) {
@@ -285,7 +289,7 @@
}
}
//log.debug("link: " + linkURL.toString());
-
+
if (ignoredURLs.contains(linkURL)) continue;
if (!linkURL.getHost().equals(url.getHost())) {
//log.info(linkURL.toString() + " -- OFFSITE, not following");
@@ -299,54 +303,54 @@
continue;
}
*/
-
+
String filename = getSavedFilename(linkURL); // already saved?
if (filename == null) {
ResourceWriter rw = null;
try {
rw = new ResourceWriter(linkURL);
filename = rw.getFilename();
-
+
if (rw.getContentType() < 1) {
rw.write();
rw.disconnect();
-
+
} else {
if (rw.getContentType() == CONTENTTYPE_HTML
- && !linkURL.toString().startsWith(startdirURL.toString())) {
- log.info(linkURL.toString() + " -- UP TREE, not following");
-
- if (!link.equals(linkURL.toString()) && !links2files.containsKey(link)) {
- links2files.put(link, linkURL.toString()); // replace with full url
- }
- rw.disconnect();
- continue;
+ && !linkURL.toString().startsWith(startdirURL.toString())) {
+ log.info(linkURL.toString() + " -- UP TREE, not following");
+
+ if (!link.equals(linkURL.toString()) && !links2files.containsKey(link)) {
+ links2files.put(link, linkURL.toString()); // replace with full url
+ }
+ rw.disconnect();
+ continue;
}
rw.disconnect();
// save for later
- synchronized(readURLs) {
+ synchronized (readURLs) {
if (!readURLs.contains(linkURL)) readURLs.add(linkURL);
}
-
+
}
- } catch(IOException e) {
+ } catch (IOException e) {
log.error(e);
ignoredURLs.add(linkURL);
continue;
}
}
-
+
StringBuilder calclink = new StringBuilder(serverpart);
calclink.append("/").append(filename); // 'calculated' link
- String calcdir = dirURL.toString();
+ String calcdir = dirURL.toString();
if (calcdir.endsWith("/")) calcdir = calcdir.substring(0, calcdir.lastIndexOf("/"));
-
+
String relative = UriParser.makeRelative(calcdir, calclink.toString());
if (!"".equals(link) && !links2files.containsKey(link) && !link.equals(relative)) { // only when different
//log.debug("link2files: " + link + " -> " + relative);
links2files.put(link, relative); /* /dir/css/bla.css + ../css/bla.css */
}
-
+
} // while ends

reader.close();
@@ -372,7 +376,7 @@

}

- protected final static int contentType(URLConnection uc) {
+ protected static int contentType(URLConnection uc) {
String contentheader = uc.getHeaderField("content-type");
//log.debug("header: " + contentheader);
int pk = contentheader.indexOf(";");
@@ -417,7 +421,7 @@
/**
* remove ;jsessionid=a69bd9e162de1cfa3ea57ef6f3cf03af
*/
- public final static String removeSessionid(String str) {
+ public static String removeSessionid(String str) {
int pk = str.indexOf(";");
if (pk > -1) {
int q = str.indexOf("?");
@@ -466,7 +470,7 @@
* @param file path or filename to check (not an URL!)
* @return true if it contains an extension like .html f.e.
*/
- public static final boolean hasExtension(String file) {
+ public static boolean hasExtension(String file) {
int i = file.lastIndexOf(".");
return (i != -1 && i != file.length() - 1);
}

Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceReWriter.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceReWriter.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceReWriter.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,12 +1,14 @@
package org.mmbase.mmget;

-import java.io.*;
-import java.net.*;
-import java.util.*;
-
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;

+import java.io.*;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.Map;
+
/**
* Writes and rewrites a resource found on an url to disk.
* Typically to be used for html and css files.
@@ -20,7 +22,7 @@
private URL url;
private HttpURLConnection huc = null;
private static String filename;
- private static int contenttype;
+ //private static int contenttype;

/**
* Constructs rewriter.
@@ -32,8 +34,8 @@
this.huc = super.huc;

this.url = getUrl();
- this.contenttype = MMGet.contentType(huc);
- this.filename = makeFilename(url);
+ contenttype = MMGet.contentType(huc);
+ filename = makeFilename(url);
}

/**
@@ -73,14 +75,14 @@

StringBuilder sblink = new StringBuilder();
sblink.append("\"").append(link);
-
+
int pos1 = line.indexOf(sblink.toString());
if (pos1 > -1) {
int pos2 = line.indexOf("\"", pos1 + 1);

String hitlink = line.substring(pos1 + 1, pos2);
String testlink = hitlink;
- if (hitlink.indexOf(";") > -1) testlink = MMGet.removeSessionid(hitlink);
+ if (hitlink.contains(";")) testlink = MMGet.removeSessionid(hitlink);
//log.debug("hitlink: '" + hitlink + "', testlink: '" + testlink + "'" + "', link: '" + link + "'");
if (!testlink.equals(link)) continue;


Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceWriter.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceWriter.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/ResourceWriter.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,14 +1,12 @@
package org.mmbase.mmget;

-import java.io.*;
-import java.net.*;
-import java.util.*;
-
import org.mmbase.util.ResourceLoader;
-
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;

+import java.io.*;
+import java.net.*;
+
/**
* Writes a resource found on an url to disk.
*
@@ -39,8 +37,8 @@
}

this.url = getUrl();
- this.contenttype = MMGet.contentType(huc);
- this.filename = makeFilename(url);
+ contenttype = MMGet.contentType(huc);
+ filename = makeFilename(this.url);
}

protected URL getUrl() {
@@ -67,20 +65,20 @@
*/
protected void write() throws IOException {
File f = getFile(filename);
-
+
if (f.exists()) {
//log.warn("File '" + f.toString() + "' already exists, deleting it and saving again.");
if (f.lastModified() <= huc.getLastModified()) {
f.delete();
-
+
} else {
log.info("Not modified: " + f.toString() + ", f:" + f.lastModified() + " huc:" + huc.getLastModified());
// MMGet.savedURLs.put(url, filename);
- MMGet.addSavedURL(url, filename);
-
+ MMGet.addSavedURL(this.url, filename);
+
return;
}
-
+
}


@@ -98,7 +96,7 @@

log.debug("Saved: " + f.toString() );
// MMGet.savedURLs.put(url, filename);
- MMGet.addSavedURL(url, filename);
+ MMGet.addSavedURL(this.url, filename);
}

/**
@@ -107,7 +105,7 @@
* @param url
* @return a connection or null in case of a bad response (f.e. not a 200)
*/
- private static HttpURLConnection getURLConnection(URL url) throws SocketException, IOException {
+ private static HttpURLConnection getURLConnection(URL url) throws IOException {
URLConnection uc = url.openConnection();
//HttpURLConnection huc
if (url.getProtocol().equals("http") || url.getProtocol().equals("https")) {

Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReader.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReader.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReader.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,16 +1,12 @@
package org.mmbase.mmget;

-import java.io.IOException;
-import java.net.*;
-import java.util.*;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;

+import java.io.IOException;
+import java.net.URL;
+import java.util.ArrayList;
+
/**
* Reads a web resource an returns its tags that may contain links to other resources.
*

Modified: speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReaders.java
===================================================================
--- speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReaders.java 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/java/org/mmbase/mmget/UrlReaders.java 2015-08-06 21:00:44 UTC (rev 46728)
@@ -1,16 +1,12 @@
package org.mmbase.mmget;

-import java.io.IOException;
-import java.net.*;
-import java.util.*;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.regex.PatternSyntaxException;
-
import org.mmbase.util.logging.Logger;
import org.mmbase.util.logging.Logging;

+import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.URL;
+
/**
* Initiates an UrlReader matching the url's contenttype and passes it the initiated
* URLConnection.

Modified: speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/index.jspx
===================================================================
--- speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/index.jspx 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/index.jspx 2015-08-06 21:00:44 UTC (rev 46728)
@@ -44,9 +44,9 @@

<form action="${mm:link('mmget')}" method="post">
<p>
- <label for="link">URL to start from</label>
+ <label for="link">Start from URL</label>
<input name="url" id="url" type="text" value="${url}" size="72" maxlength="255" />
- <label for="dir">Directory to save in</label>
+ <label for="dir">Save in directory</label>
<input name="dir" id="dir" type="text" value="${dir}" size="72" maxlength="255" />
</p>
<p>
@@ -56,7 +56,6 @@

<mm:link page="mmget-status">
<p>
- <img src="${mm:link('/mmbase/style/images/next.png')}" alt="view" width="21" height="20" />
<a href="${_}">MMGet status</a>
</p>
</mm:link>

Modified: speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/status.jspx
===================================================================
--- speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/status.jspx 2015-08-06 19:01:52 UTC (rev 46727)
+++ speeltuin/andre/mmget/src/main/webapp/mmbase/components/mmget/status.jspx 2015-08-06 21:00:44 UTC (rev 46728)
@@ -44,20 +44,17 @@

<p>
<mm:link page="mmget-status">
- <a href="${_}"><img src="${mm:link('/mmbase/style/images/reload.png')}" alt="reload" width="21" height="20" /></a>
<a href="${_}">Reload</a>
</mm:link>
or
<mm:link page="mmget-status">
<mm:param name="cancel">please</mm:param>
- <a href="${_}"><img src="${mm:link('/mmbase/style/images/delete.png')}" alt="cancel" width="21" height="20" /></a>
<a href="${_}">Cancel</a>
</mm:link>
</p>

<mm:link page="mmget">
<p>
- <img src="${mm:link('/mmbase/style/images/back.png')}" alt="back" width="21" height="20" />
<a href="${_}">Back to MMGet</a>
</p>
</mm:link>

Reply all
Reply to author
Forward
0 new messages