Move methods to convert to and from URL to Page.
[arachne.git] / src / net / pterodactylus / arachne / core / Page.java
index 0a94be7..2651de0 100644 (file)
@@ -3,6 +3,11 @@
  */
 package net.pterodactylus.arachne.core;
 
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import de.ina.util.validation.Validation;
+
 /**
  * Container for a page. A page consists of an {@link Edition} and a path within
  * the edition.
@@ -48,6 +53,100 @@ public class Page {
                return path;
        }
 
+       /**
+        * Creates a URL from the given page.
+        *
+        * @param host
+        *            The host of the URL
+        * @param port
+        *            The port number of the URL
+        * @return The created URL, or <code>null</code> if the URL could not be
+        *         created
+        */
+       public URL toURL(String host, int port) {
+               try {
+                       return new URL("http://" + host + ":" + port + "/SSK@" + getEdition().getSite().getKey() + "/" + getEdition().getSite().getBasename() + "-" + getEdition().getNumber() + "/" + getPath());
+               } catch (MalformedURLException mue1) {
+                       /* nearly impossible. */
+               }
+               return null;
+       }
+
+       //
+       // STATIC METHODS
+       //
+
+       /**
+        * Creates a page from the given URL.
+        *
+        * @param url
+        *            The URL to create a page from
+        * @return The created page, or <code>null</code> if the page could not be
+        *         created
+        */
+       public static Page fromURL(URL url) {
+               String path = url.getPath();
+               if (path.length() == 0) {
+                       path = "/";
+               }
+               String[] pathComponents = path.split("/");
+               if (pathComponents.length < 2) {
+                       throw new IllegalArgumentException("URL “" + url + "” is not a valid freenet page.");
+               }
+               String siteName = pathComponents[1];
+               String[] siteComponents = siteName.split("@");
+               if (siteComponents.length != 2) {
+                       throw new IllegalArgumentException("siteName “" + siteName + "” is not a valid freenet page.");
+               }
+               if (!"USK".equals(siteComponents[0]) && !"SSK".equals(siteComponents[0]) && !"CHK".equals(siteComponents[0])) {
+                       throw new IllegalArgumentException("siteName “" + siteName + "” is not a valid freenet page.");
+               }
+               if ("USK".equals(siteComponents[0])) {
+                       Site site = new Site(siteComponents[1], pathComponents[2]);
+                       Edition edition = new Edition(site, Integer.parseInt(pathComponents[3]));
+                       Page page = new Page(edition, createPath(pathComponents, 4));
+                       return page;
+               }
+               if ("SSK".equals(siteComponents[0])) {
+                       int lastDash = pathComponents[2].lastIndexOf('-');
+                       String basename = pathComponents[2].substring(0, lastDash);
+                       int editionNumber = Integer.parseInt(pathComponents[2].substring(lastDash + 1));
+                       Site site = new Site(siteComponents[1], basename);
+                       Edition edition = new Edition(site, editionNumber);
+                       Page page = new Page(edition, createPath(pathComponents, 3));
+                       return page;
+               }
+               /* TODO: handle CHK */
+               return null;
+       }
+
+       //
+       // PRIVATE METHODS
+       //
+
+       /**
+        * Creates a path from the given String array, starting at the given index.
+        * The path is created by joining all Strings from the array, separating
+        * them with a slash (‘/’).
+        *
+        * @param pathComponents
+        *            The array of path components
+        * @param index
+        *            The index of the first path components
+        * @return The joined path
+        */
+       private static String createPath(String[] pathComponents, int index) {
+               Validation.begin().isNotNull("pathComponents", pathComponents).check().isLessOrEqual("index", index, pathComponents.length).check();
+               StringBuilder path = new StringBuilder();
+               for (int pathComponentIndex = index; pathComponentIndex < pathComponents.length; pathComponentIndex++) {
+                       if (path.length() > 0) {
+                               path.append('/');
+                       }
+                       path.append(pathComponents[pathComponentIndex]);
+               }
+               return path.toString();
+       }
+
        //
        // OBJECT METHODS
        //