/* * This file is part of the Wayback archival access software * (http://archive-access.sourceforge.net/projects/wayback/). * * Licensed to the Internet Archive (IA) by one or more individual * contributors. * * The IA licenses this file to You 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. */ package org.archive.wayback.archivalurl; import org.archive.wayback.core.WaybackRequest; import org.archive.wayback.util.url.UrlOperations; /** * @author brad * */ public class ArchivalUrl { public final static String STAR = "*"; private WaybackRequest wbRequest; // public ArchivalUrl(String path) { // // } public ArchivalUrl(WaybackRequest wbRequest) { this.wbRequest = wbRequest; } /** * * @return A string representation of this object. */ @Override public String toString() { if(wbRequest.isReplayRequest()) { return toReplayString(wbRequest.getRequestUrl()); } else if(wbRequest.isCaptureQueryRequest()) { return toQueryString(wbRequest.getRequestUrl()); } return toPrefixQueryString(wbRequest.getRequestUrl()); } public String toPrefixQueryString(String url) { return toQueryString(url) + STAR; } public String toQueryString(String url) { String datespec = STAR; String exactDateTimestamp = getEmptyStringIfNull(wbRequest.get(WaybackRequest.REQUEST_EXACT_DATE)); String startTimestamp = getEmptyStringIfNull(wbRequest.getStartTimestamp()); String endTimestamp = getEmptyStringIfNull(wbRequest.getEndTimestamp()); if (!exactDateTimestamp.isEmpty()) { datespec = exactDateTimestamp + STAR; } else if (!startTimestamp.isEmpty() || !endTimestamp.isEmpty()) { datespec = String.format("%s-%s%s", startTimestamp, endTimestamp, STAR); } return toString(datespec, url); } private String getEmptyStringIfNull(String string) { if (string == null) { return ""; } else { return string; } } public String toReplayString(String url) { return toString(wbRequest.getReplayTimestamp(),url); } /** * Create a new datespec + flags which represent the same options * as requested by the instances own WaybackRequest, using the constant WaybackRequest.REQUEST_DATE constant as * a prefix. * @return a String representing the flags on the WaybackRequest. */ public String getDateSpec() { return getDateSpec(wbRequest.getReplayTimestamp()); } /** * Given a date, create a new datespec + flags which represent the same options * as requested by the instances own WaybackRequest. * @param datespec The date specification prefix. * @return a String representing the flags on the WaybackRequest for the * specified date */ public String getDateSpec(String datespec) { return getDateSpec(wbRequest, datespec); } /** * Given a date, create a new datespec + flags * which represent the same options as requested by the WaybackRequest * @param wbRequest * @param datespec The date specification prefix. * @return a String representing the flags on the WaybackRequest for the * specified date */ public static String getDateSpec(WaybackRequest wbRequest, String datespec) { int dateLen = 0; if(datespec != null) { dateLen = datespec.length(); } StringBuilder sb = new StringBuilder(dateLen +10); if(dateLen > 0) { sb.append(datespec); } if(wbRequest.isCSSContext()) { sb.append(ArchivalUrlRequestParser.CSS_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } if(wbRequest.isJSContext()) { sb.append(ArchivalUrlRequestParser.JS_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } if(wbRequest.isIMGContext()) { sb.append(ArchivalUrlRequestParser.IMG_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } if(wbRequest.isObjectEmbedContext()) { sb.append(ArchivalUrlRequestParser.OBJECT_EMBED_WRAPPED_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } if(wbRequest.isIdentityContext()) { sb.append(ArchivalUrlRequestParser.IDENTITY_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } if(wbRequest.isIFrameWrapperContext()) { sb.append(ArchivalUrlRequestParser.IFRAME_WRAPPED_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } if(wbRequest.isFrameWrapperContext()) { sb.append(ArchivalUrlRequestParser.FRAME_WRAPPED_CONTEXT); sb.append(ArchivalUrlRequestParser.FLAG_DELIM); dateLen++; } return sb.toString(); } public String toString(String datespec, String url) { int dateLen = 0; if(datespec != null) { dateLen = datespec.length(); } StringBuilder sb = new StringBuilder(url.length() + dateLen +10); String dateSpec = getDateSpec(datespec); sb.append(dateSpec); if(dateSpec.length() > 0) { sb.append("/"); } sb.append(UrlOperations.stripDefaultPortFromUrl(url)); return sb.toString(); } /** * @param wbRequest * @param flagsStr : "js_", "", "cs_", "cs_js_" */ public static void assignFlags(WaybackRequest wbRequest, String flagsStr) { if(flagsStr != null) { String[] flags = flagsStr.split( ArchivalUrlRequestParser.FLAG_DELIM); for(String flag: flags) { if(flag.equals(ArchivalUrlRequestParser.CSS_CONTEXT)) { wbRequest.setCSSContext(true); } else if(flag.equals(ArchivalUrlRequestParser.JS_CONTEXT)) { wbRequest.setJSContext(true); } else if(flag.equals(ArchivalUrlRequestParser.IMG_CONTEXT)) { wbRequest.setIMGContext(true); } else if(flag.equals(ArchivalUrlRequestParser.OBJECT_EMBED_WRAPPED_CONTEXT)) { wbRequest.setObjectEmbedContext(true); } else if(flag.equals(ArchivalUrlRequestParser.IDENTITY_CONTEXT)) { wbRequest.setIdentityContext(true); } else if(flag.equals(ArchivalUrlRequestParser.FRAME_WRAPPED_CONTEXT)) { wbRequest.setFrameWrapperContext(true); } else if(flag.equals(ArchivalUrlRequestParser.IFRAME_WRAPPED_CONTEXT)) { wbRequest.setIFrameWrapperContext(true); } else if(flag.startsWith(ArchivalUrlRequestParser.CHARSET_MODE)) { String modeString = flag.substring( ArchivalUrlRequestParser.CHARSET_MODE.length()); int mode = Integer.parseInt(modeString); wbRequest.setCharsetMode(mode); } } } } }