001/**************************************************************** 002 * Licensed to the Apache Software Foundation (ASF) under one * 003 * or more contributor license agreements. See the NOTICE file * 004 * distributed with this work for additional information * 005 * regarding copyright ownership. The ASF licenses this file * 006 * to you under the Apache License, Version 2.0 (the * 007 * "License"); you may not use this file except in compliance * 008 * with the License. You may obtain a copy of the License at * 009 * * 010 * http://www.apache.org/licenses/LICENSE-2.0 * 011 * * 012 * Unless required by applicable law or agreed to in writing, * 013 * software distributed under the License is distributed on an * 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 015 * KIND, either express or implied. See the License for the * 016 * specific language governing permissions and limitations * 017 * under the License. * 018 ****************************************************************/ 019 020package org.apache.james.mime4j.storage; 021 022/** 023 * Allows for a default {@link StorageProvider} instance to be configured on an 024 * application level. 025 * <p> 026 * The default instance can be set by either calling 027 * {@link #setInstance(StorageProvider)} when the application starts up or by 028 * setting the system property 029 * <code>org.apache.james.mime4j.defaultStorageProvider</code> to the class 030 * name of a <code>StorageProvider</code> implementation. 031 * <p> 032 * If neither option is used or if the class instantiation fails this class 033 * provides a pre-configured default instance. 034 */ 035public class DefaultStorageProvider { 036 037 /** Value is <code>org.apache.james.mime4j.defaultStorageProvider</code> */ 038 public static final String DEFAULT_STORAGE_PROVIDER_PROPERTY = 039 "org.apache.james.mime4j.defaultStorageProvider"; 040 041 private static volatile StorageProvider instance = null; 042 043 static { 044 initialize(); 045 } 046 047 private DefaultStorageProvider() { 048 } 049 050 /** 051 * Returns the default {@link StorageProvider} instance. 052 * 053 * @return the default {@link StorageProvider} instance. 054 */ 055 public static StorageProvider getInstance() { 056 return instance; 057 } 058 059 /** 060 * Sets the default {@link StorageProvider} instance. 061 * 062 * @param instance 063 * the default {@link StorageProvider} instance. 064 */ 065 public static void setInstance(StorageProvider instance) { 066 if (instance == null) { 067 throw new IllegalArgumentException(); 068 } 069 070 DefaultStorageProvider.instance = instance; 071 } 072 073 private static void initialize() { 074 String clazz = System.getProperty(DEFAULT_STORAGE_PROVIDER_PROPERTY); 075 try { 076 if (clazz != null) { 077 instance = (StorageProvider) Class.forName(clazz).newInstance(); 078 } 079 } catch (Exception e) { 080 } 081 if (instance == null) { 082 StorageProvider backend = new TempFileStorageProvider(); 083 instance = new ThresholdStorageProvider(backend, 1024); 084 } 085 } 086 087 // for unit tests only 088 static void reset() { 089 instance = null; 090 initialize(); 091 } 092 093}