1 /************************************************************************ 2 * Copyright (c) 2000-2006 The Apache Software Foundation. * 3 * All rights reserved. * 4 * ------------------------------------------------------------------- * 5 * Licensed under the Apache License, Version 2.0 (the "License"); you * 6 * may not use this file except in compliance with the License. You * 7 * may obtain a copy of the License at: * 8 * * 9 * http://www.apache.org/licenses/LICENSE-2.0 * 10 * * 11 * Unless required by applicable law or agreed to in writing, software * 12 * distributed under the License is distributed on an "AS IS" BASIS, * 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or * 14 * implied. See the License for the specific language governing * 15 * permissions and limitations under the License. * 16 ***********************************************************************/ 17 18 package org.apache.james.context; 19 20 import org.apache.avalon.framework.context.Context; 21 import org.apache.avalon.framework.context.ContextException; 22 23 import java.io.File; 24 import java.io.IOException; 25 26 /*** 27 * This class is essentially a set of static functions for 28 * extracting information from the Avalon context. This class 29 * should never be instantiated. Each function takes the context 30 * as a first argument. 31 */ 32 public class AvalonContextUtilities { 33 34 /*** 35 * The file URL prefix 36 */ 37 private static String filePrefix = "file://"; 38 39 /*** 40 * The file URL prefix length 41 */ 42 private static int filePrefixLength = filePrefix.length(); 43 44 /*** 45 * Gets the file or directory described by the argument file URL. 46 * 47 * @param context the Avalon context 48 * @param fileURL an appropriately formatted URL describing a file on 49 * the filesystem on which the server is running. The 50 * URL is evaluated as a location relative to the 51 * application home, unless it begins with a slash. In 52 * the latter case the file location is evaluated relative 53 * to the underlying file system root. 54 * 55 * @throws IllegalArgumentException if the arguments are null or the file 56 * URL is not appropriately formatted. 57 * @throws ContextException if the underlying context generates a 58 * ContextException, if the application home is 59 * not correct, or if an IOException is generated 60 * while accessing the file. 61 */ 62 public static File getFile(Context context, String fileURL) 63 throws Exception { 64 if ((context == null) || (fileURL == null)) { 65 throw new IllegalArgumentException("The getFile method doesn't allow null arguments."); 66 } 67 String internalFileURL = fileURL.trim(); 68 if (!(internalFileURL.startsWith(filePrefix))) { 69 throw new IllegalArgumentException("The fileURL argument to getFile doesn't start with the required file prefix - " + filePrefix); 70 } 71 72 String fileName = fileURL.substring(filePrefixLength); 73 if (!(fileName.startsWith("/"))) { 74 String baseDirectory = ""; 75 try { 76 File applicationHome = 77 (File)context.get(AvalonContextConstants.APPLICATION_HOME); 78 baseDirectory = applicationHome.toString(); 79 } catch (ContextException ce) { 80 throw new ContextException("Encountered exception when resolving application home in Avalon context.", ce); 81 } catch (ClassCastException cce) { 82 throw new ContextException("Application home object stored in Avalon context was not of type java.io.File.", cce); 83 } 84 StringBuffer fileNameBuffer = 85 new StringBuffer(128) 86 .append(baseDirectory) 87 .append(File.separator) 88 .append(fileName); 89 fileName = fileNameBuffer.toString(); 90 } 91 try { 92 File returnValue = (new File(fileName)).getCanonicalFile(); 93 return returnValue; 94 } catch (IOException ioe) { 95 throw new ContextException("Encountered an unexpected exception while retrieving file.", ioe); 96 } 97 } 98 99 /*** 100 * Private constructor to ensure that instances of this class aren't 101 * instantiated. 102 */ 103 private AvalonContextUtilities() {} 104 }