001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. The ASF licenses this file to You
004: * under the Apache License, Version 2.0 (the "License"); you may not
005: * use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License. For additional information regarding
015: * copyright in this work, please see the NOTICE file in the top level
016: * directory of this distribution.
017: */
018:
019: package org.apache.roller.business;
020:
021: import org.apache.commons.logging.Log;
022: import org.apache.commons.logging.LogFactory;
023: import org.apache.roller.config.RollerConfig;
024:
025: /**
026: * Provides access to the Roller instance.
027: */
028: public abstract class RollerFactory {
029:
030: private static Log log = LogFactory.getLog(RollerFactory.class);
031:
032: private static final String DEFAULT_IMPL = "org.apache.roller.business.hibernate.HibernateRollerImpl";
033:
034: private static Roller rollerInstance = null;
035:
036: // non-instantiable
037: private RollerFactory() {
038: // hello all you beautiful people
039: }
040:
041: /**
042: * Static accessor for the instance of Roller.
043: */
044: public static Roller getRoller() {
045:
046: // check to see if we need to instantiate
047: if (rollerInstance == null) {
048:
049: // lookup value for the roller classname to use
050: String roller_classname = RollerConfig
051: .getProperty("persistence.roller.classname");
052: if (roller_classname == null
053: || roller_classname.trim().length() < 1)
054: roller_classname = DEFAULT_IMPL;
055:
056: try {
057: Class rollerClass = Class.forName(roller_classname);
058: java.lang.reflect.Method instanceMethod = rollerClass
059: .getMethod("instantiate", (Class[]) null);
060:
061: // do the invocation
062: rollerInstance = (Roller) instanceMethod.invoke(
063: rollerClass, (Object[]) null);
064:
065: log.info("Using Roller Impl: " + roller_classname);
066:
067: } catch (Throwable e) {
068:
069: // uh oh
070: log.error("Error instantiating " + roller_classname, e);
071:
072: try {
073: // if we didn't already try DEFAULT_IMPL then try it now
074: if (!DEFAULT_IMPL.equals(roller_classname)) {
075:
076: log.info("** Trying DEFAULT_IMPL "
077: + DEFAULT_IMPL + " **");
078:
079: Class rollerClass = Class.forName(DEFAULT_IMPL);
080: java.lang.reflect.Method instanceMethod = rollerClass
081: .getMethod("instantiate",
082: (Class[]) null);
083:
084: // do the invocation
085: rollerInstance = (Roller) instanceMethod
086: .invoke(rollerClass, (Object[]) null);
087: } else {
088: // we just do this so that the logger gets the message
089: throw new Exception(
090: "Doh! Couldn't instantiate a roller class");
091: }
092:
093: } catch (Exception re) {
094: log
095: .fatal(
096: "Failed to instantiate fallback roller impl",
097: re);
098: }
099: }
100: }
101:
102: return rollerInstance;
103: }
104:
105: }
|