/* * Copyright 2000-2004 The Apache Software Foundation. * * 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. */ package org.apache.jetspeed.services.webpage; // java.io import java.io.IOException; import java.io.FileOutputStream; // java.util import java.util.StringTokenizer; import java.util.Date; import java.text.SimpleDateFormat; // java.net import java.net.InetAddress; import java.net.UnknownHostException; // javax.servlet import javax.servlet.http.Cookie; /** * Helper methods for WebPage Service * * @author <a href="mailto:taylor@apache.org">David Sean Taylor</a> * @version $Id: WebPageHelper.java,v 1.3 2004/02/23 03:46:26 jford Exp $ */ public class WebPageHelper { public static final int CT_TEXT = 0; public static final int CT_BINARY = 1; public static final int CT_APPLICATION = 2; public static final int CT_HTML = 3; public static final int CT_IMAGE = 4; public static final int CT_CSS = 5; public static final int CT_JS = 6; /** * Given the content-type header string, returns a content type id * * @param typeString the http content-type header string. * @return the integer value of the content-type */ public static int getContentType(String typeString, String resource) { int contentType = CT_HTML; if (null == typeString) { if (null == resource) { return contentType; } if (resource.endsWith(".js")) { return CT_JS; } else if (resource.endsWith(".gif") || resource.endsWith(".jpg") || resource.endsWith(".png")) { return CT_IMAGE; } else if (resource.endsWith(".css") ) { return CT_CSS; } return contentType; } if (typeString.equalsIgnoreCase("text/html")) contentType = CT_HTML; else if (typeString.startsWith("image")) contentType = CT_IMAGE; else if (typeString.startsWith("text/css")) contentType = CT_CSS; else if (typeString.startsWith("text")) contentType = CT_TEXT; else if (typeString.startsWith("binary")) contentType = CT_BINARY; else if (typeString.equals("application/x-javascript") ) contentType = CT_JS; else if (typeString.startsWith("application")) contentType = CT_APPLICATION; return contentType; } /** * Given a cookie object, build a http-compliant cookie string header * * @param Cookie the cookie source object. * @return the cookie string formatted as a http header. * */ public static String buildCookieString(Cookie cookie) { StringBuffer buffer = new StringBuffer(); int version = cookie.getVersion(); if (version != -1) { buffer.append("$Version=\""); buffer.append(cookie.getVersion()); buffer.append("\"; "); } // cookie name/value buffer.append(cookie.getName()); //buffer.append("=\""); buffer.append("="); buffer.append(cookie.getValue()); //buffer.append("\"; "); // cookie path String path = cookie.getPath(); if (path != null) { //buffer.append("path=\""); // $Path buffer.append("; path="); buffer.append(path); //buffer.append("\""); } String cookieHeader = buffer.toString(); return cookieHeader; } /** * Parses cookies from the HTTP response header string * and stores them into this instance's cookies collection * * @param cookieHeader the string from the response header with the cookies. * @return true when cookies were found, otherwise false * */ public static boolean parseCookies(String cookieHeader, SiteSession session) { StringTokenizer st = new StringTokenizer(cookieHeader, " =;"); String token, value; boolean firstTime = true; // cookie name/value always comes first Cookie cookie = null; while (st.hasMoreTokens()) { token = st.nextToken(); if (firstTime) { value = st.nextToken(); cookie = new Cookie(token, value); cookie.setVersion(-1); firstTime = false; } else if (token.equalsIgnoreCase("path")) { cookie.setPath(st.nextToken()); } else if (token.equalsIgnoreCase("version")) { cookie.setVersion(Integer.getInteger(st.nextToken()).intValue()); } else if (token.equalsIgnoreCase("max-age")) { cookie.setMaxAge( Integer.getInteger(st.nextToken()).intValue() ); } else if (token.equalsIgnoreCase("domain")) { cookie.setDomain( st.nextToken() ); } else if (token.equalsIgnoreCase("secure")) { cookie.setSecure(true); } else { if (null != cookie) session.addCookieToSession(cookie); if (!st.hasMoreTokens()) { break; } value = st.nextToken(); cookie = new Cookie(token, value); cookie.setVersion(-1); } } if (null != cookie) session.addCookieToSession(cookie); return (null != cookie); // found a cookie } /** * given a stringbuffer, replaces 'find' with 'replacement' * * @param buffer the string to be manipulated. * @param find the string to be replaced. * @param replacement the string that is put in place. * */ public static StringBuffer replaceAll(StringBuffer buffer, String find, String replacement) { int bufidx = buffer.length() - 1; int offset = find.length(); while( bufidx > -1 ) { int findidx = offset -1; while( findidx > -1 ) { if( bufidx == -1 ) { //Done return buffer; } if( buffer.charAt( bufidx ) == find.charAt( findidx ) ) { findidx--; //Look for next char bufidx--; } else { findidx = offset - 1; //Start looking again bufidx--; if( bufidx == -1 ) { //Done return buffer; } continue; } } buffer.replace( bufidx+1, bufidx+1+offset, replacement); //start looking again } //No more matches return buffer; } /** * Given a base string and a path string, concatenates the strings to make a full URL. * Handles the concatenation for proper path separators. * * @param base the base part of a URL, such as http://localhost/ * @param path the path part of the url, such as /webinterface/controllers/x.php * @param the concatenated path, such as http://localhost/webinterface/controllers/x.php * */ public static String concatURLs(String base, String path) { String result = ""; if (base.endsWith("/")) { if (path.startsWith("/")) { result = base.concat( path.substring(1)); return result; } } else { if (!path.startsWith("/")) { result = base.concat("/").concat(path); return result; } } return base.concat(path); } /* * Maps the availability status code to a small string message * * @param status the integer availability status code. * @return the corresponding string message for the status code. */ public static String getAvailabilityStatus(int status) { switch(status) { case 0: return "Not Initialized"; case 1: return "Online"; default: return "Offline"; } } /* * Writes the date/time stamp header to the content log. * * @param fos The file output stream that is written to (the content log). * */ private static final String DATE_PATTERN = "yyyy-MM-dd HH:mm:ss"; private static final String CONTENT_LOG_HEADER = "------------------------------------------------------" ; public static void writeHeader(FileOutputStream fos, String resource) throws IOException { fos.write(13); fos.write(10); fos.write(CONTENT_LOG_HEADER.getBytes()); fos.write(13); fos.write(10); SimpleDateFormat sdf = new SimpleDateFormat(DATE_PATTERN); fos.write(sdf.format(new Date()).getBytes()); fos.write(13); fos.write(10); fos.write(resource.getBytes()); fos.write(13); fos.write(10); } /* * Gets the IP address for a given hostname. * * @param hostname The hostname that we are looking up the IP address for. * @return The IP address of the given hostname. */ public static String getIP(String hostname) { String ip = null; try { InetAddress computer = InetAddress.getByName(hostname); ip = computer.getHostAddress(); } catch (UnknownHostException ex) { } return ip; } private static int id = 0; public static synchronized long generateId() { id = id + 1; return id; } }