File Source: WebloggerStartup.java
1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. The ASF licenses this file to You
4 * under the Apache License, Version 2.0 (the "License"); you may not
5 * use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License. For additional information regarding
15 * copyright in this work, please see the NOTICE file in the top level
16 * directory of this distribution.
17 */
18
19 package org.apache.roller.weblogger.business.startup;
20
21 import java.util.List;
22 import org.apache.commons.logging.Log;
23 import org.apache.commons.logging.LogFactory;
24 import org.apache.roller.weblogger.business.DatabaseProvider;
25 import org.apache.roller.weblogger.business.MailProvider;
26 import org.apache.roller.weblogger.config.WebloggerConfig;
27
28
29 /**
30 * Manages Roller Weblogger startup process.
31 */
32 public final class WebloggerStartup {
33
/*
P/P * Method: org.apache.roller.weblogger.business.startup.WebloggerStartup__static_init
*
* Postconditions:
* dbInstaller == null
* dbProvider == null
* dbProviderException == null
* mailProvider == null
* init'ed(log)
* prepared == 0
*/
34 private static final Log log = LogFactory.getLog(WebloggerStartup.class);
35
36 private static boolean prepared = false;
37
38 private static DatabaseProvider dbProvider = null;
39 private static StartupException dbProviderException = null;
40
41 private static MailProvider mailProvider = null;
42
43 private static DatabaseInstaller dbInstaller = null;
44
45
46 // non-instantiable
/*
P/P * Method: void org.apache.roller.weblogger.business.startup.WebloggerStartup()
*/
47 private WebloggerStartup() {}
48
49
50 /**
51 * Is the Roller Weblogger app properly prepared to be bootstrapped?
52 */
53 public static boolean isPrepared() {
/*
P/P * Method: bool isPrepared()
*
* Preconditions:
* init'ed(prepared)
*
* Postconditions:
* return_value == prepared
* init'ed(return_value)
*/
54 return prepared;
55 }
56
57
58 /**
59 * Get a reference to the currently configured DatabaseProvider.
60 *
61 * @return DatabaseProvider The configured database provider.
62 * @throws IllegalStateException If the app has not been properly prepared yet.
63 */
64 public static DatabaseProvider getDatabaseProvider() {
/*
P/P * Method: DatabaseProvider getDatabaseProvider()
*
* Preconditions:
* dbProvider != null
*
* Postconditions:
* return_value == dbProvider
* return_value != null
*/
65 if (dbProvider == null) {
66 throw new IllegalStateException("Roller Weblogger has not been prepared yet");
67 }
68 return dbProvider;
69 }
70
71
72 /**
73 * Get a reference to the exception thrown while instantiating the
74 * database provider, if any.
75 *
76 * @return StartupException Exception from db provider, or null if no exception thrown.
77 */
78 public static StartupException getDatabaseProviderException() {
/*
P/P * Method: StartupException getDatabaseProviderException()
*
* Preconditions:
* init'ed(dbProviderException)
*
* Postconditions:
* return_value == dbProviderException
* init'ed(return_value)
*/
79 return dbProviderException;
80 }
81
82
83 /**
84 * Get a reference to the currently configured MailProvider, if available.
85 *
86 * @return MailProvider The configured mail provider, or null if none configured.
87 */
88 public static MailProvider getMailProvider() {
/*
P/P * Method: MailProvider getMailProvider()
*
* Preconditions:
* init'ed(mailProvider)
*
* Postconditions:
* return_value == mailProvider
* init'ed(return_value)
*/
89 return mailProvider;
90 }
91
92
93 /**
94 * Does the app need to create the database tables?
95 */
96 public static boolean isDatabaseCreationRequired() {
/*
P/P * Method: bool isDatabaseCreationRequired()
*
* Preconditions:
* dbProvider != null
* init'ed(dbProvider.type)
* (soft) dbProvider.dataSource != null
* (soft) init'ed(dbProvider.jdbcConnectionURL)
* (soft) dbProvider.props != null
* (soft) dbProvider.props._tainted == 0
* (soft) org/apache/roller/weblogger/business/startup/DatabaseInstaller.log != null
*
* Postconditions:
* init'ed(return_value)
*/
97 return getDatabaseInstaller().isCreationRequired();
98 }
99
100
101 /**
102 * Run database creation scripts.
103 */
104 public static List<String> createDatabase() throws StartupException {
105
/*
P/P * Method: List createDatabase()
*
* Preconditions:
* dbProvider != null
* init'ed(dbProvider.type)
* org/apache/roller/weblogger/business/startup/SQLScriptRunner.log != null
* (soft) dbProvider.dataSource != null
* (soft) init'ed(dbProvider.jdbcConnectionURL)
* (soft) dbProvider.props != null
* (soft) dbProvider.props._tainted == 0
* (soft) org/apache/roller/weblogger/business/startup/DatabaseInstaller.log != null
*
* Presumptions:
* java.util.Properties:getProperty(...)@65 != null
*
* Postconditions:
* prepared == 1
* return_value == &new ArrayList(DatabaseInstaller#1)
* new ArrayList(DatabaseInstaller#1) num objects == 1
*/
106 DatabaseInstaller installer = getDatabaseInstaller();
107 try {
108 installer.createDatabase();
109
110 // any time we've successfully installed a db we are prepared
111 prepared = true;
112
113 } catch (StartupException se) {
114 throw new StartupException(se.getMessage(), se.getRootCause(), installer.getMessages());
115 }
116
117 return installer.getMessages();
118 }
119
120
121 /**
122 * Does the app require any upgrading?
123 */
124 public static boolean isDatabaseUpgradeRequired() {
/*
P/P * Method: bool isDatabaseUpgradeRequired()
*
* Preconditions:
* dbProvider != null
* (soft) dbProvider.dataSource != null
* (soft) init'ed(dbProvider.jdbcConnectionURL)
* (soft) dbProvider.props != null
* (soft) dbProvider.props._tainted == 0
* (soft) init'ed(dbProvider.type)
* (soft) org/apache/roller/weblogger/business/startup/DatabaseInstaller.log != null
*
* Presumptions:
* java.util.Properties:getProperty(...)@65 != null
*
* Postconditions:
* init'ed(return_value)
*/
125 return getDatabaseInstaller().isUpgradeRequired();
126 }
127
128
129 /**
130 * Run database upgrade work, optionally including upgrade scripts.
131 */
132 public static List<String> upgradeDatabase(boolean runScripts)
133 throws StartupException {
134
/*
P/P * Method: List upgradeDatabase(bool)
*
* Preconditions:
* dbProvider != null
* (soft) dbProvider.dataSource != null
* (soft) init'ed(dbProvider.jdbcConnectionURL)
* (soft) dbProvider.props != null
* (soft) dbProvider.props._tainted == 0
* (soft) init'ed(dbProvider.type)
* (soft) org/apache/roller/weblogger/business/startup/DatabaseInstaller.log != null
* (soft) org/apache/roller/weblogger/business/startup/SQLScriptRunner.log != null
*
* Presumptions:
* java.util.Properties:getProperty(...)@65 != null
*
* Postconditions:
* prepared == 1
* return_value == &new ArrayList(DatabaseInstaller#1)
* new ArrayList(DatabaseInstaller#1) num objects == 1
*/
135 DatabaseInstaller installer = getDatabaseInstaller();
136 try {
137 installer.upgradeDatabase(true);
138
139 // any time we've successfully upgraded a db we are prepared
140 prepared = true;
141
142 } catch (StartupException se) {
143 throw new StartupException(se.getMessage(), se.getRootCause(), installer.getMessages());
144 }
145
146 return installer.getMessages();
147 }
148
149
150 /**
151 * Get a database installer.
152 *
153 * @return DatabaseInstaller A database installer.
154 * @throws IllegalStateException If the database provider has not been properly setup yet.
155 */
156 private static DatabaseInstaller getDatabaseInstaller() {
/*
P/P * Method: DatabaseInstaller getDatabaseInstaller()
*
* Preconditions:
* dbProvider != null
* (soft) org/apache/roller/weblogger/business/startup/DatabaseInstaller.log != null
*
* Postconditions:
* return_value == &new DatabaseInstaller(getDatabaseInstaller#1)
* new ArrayList(DatabaseInstaller#1) num objects == 1
* new ClasspathDatabaseScriptProvider(getDatabaseInstaller#2) num objects == 1
* new DatabaseInstaller(getDatabaseInstaller#1) num objects == 1
* return_value.db == dbProvider
* return_value.db != null
* return_value.messages == &new ArrayList(DatabaseInstaller#1)
* return_value.scripts == &new ClasspathDatabaseScriptProvider(getDatabaseInstaller#2)
* init'ed(return_value.version)
*/
157 return new DatabaseInstaller(getDatabaseProvider(), new ClasspathDatabaseScriptProvider());
158 }
159
160
161 /**
162 * Run the Roller Weblogger preparation sequence.
163 *
164 * This sequence is what prepares the core services of the application such
165 * as setting up the database and mail providers.
166 */
167 public static void prepare() throws StartupException {
168
169 // setup database provider
170 try {
/*
P/P * Method: void prepare()
*
* Preconditions:
* org/apache/roller/weblogger/business/DatabaseProvider.log != null
* org/apache/roller/weblogger/config/WebloggerConfig.config != null
* org/apache/roller/weblogger/config/WebloggerConfig.log != null
* (soft) dbProvider.props._tainted == 0
* (soft) org/apache/roller/weblogger/business/startup/DatabaseInstaller.log != null
* (soft) org/apache/roller/weblogger/business/startup/SQLScriptRunner.log != null
*
* Presumptions:
* java.util.Properties:getProperty(...)@65 != null
* org.apache.commons.logging.LogFactory:getLog(...)@34 != null
*
* Postconditions:
* dbProvider == &new DatabaseProvider(prepare#1)
* dbProviderException == old dbProviderException
* mailProvider == One-of{&new MailProvider(prepare#2), old mailProvider}
* possibly_updated(prepared)
* new ArrayList(DatabaseProvider#1) num objects == 1
* new DatabaseProvider(prepare#1) num objects == 1
* new DatabaseProvider(prepare#1).dataSource != null
* init'ed(new DatabaseProvider(prepare#1).jdbcConnectionURL)
* init'ed(new DatabaseProvider(prepare#1).jdbcDriverClass)
* init'ed(new DatabaseProvider(prepare#1).jdbcPassword)
* ...
*
* Test Vectors:
* java.lang.String:equals(...)@186: {0}, {1}
*/
171 dbProvider = new DatabaseProvider();
172 } catch(StartupException ex) {
173 dbProviderException = ex;
174 throw ex;
175 }
176
177 // setup mail provider, if configured
178 try {
179 mailProvider = new MailProvider();
180 } catch(StartupException ex) {
181 log.warn("Failed to setup mail provider, continuing anways.\n"+
182 "Reason: "+ex.getMessage(), ex);
183 }
184
185 // now we need to deal with database install/upgrade logic
186 if("manual".equals(WebloggerConfig.getProperty("installation.type"))) {
187
188 // if we are doing manual install then all that is needed is the
189 // app handled database upgrade work, not the db scripts
190 DatabaseInstaller dbInstaller = getDatabaseInstaller();
191 if(dbInstaller.isUpgradeRequired()) {
192 dbInstaller.upgradeDatabase(false);
193 }
194
195 prepared = true;
196
197 } else {
198
199 // we are in auto install mode, so see if there is any work to do
200 DatabaseInstaller dbInstaller = getDatabaseInstaller();
201 if(!dbInstaller.isCreationRequired() &&
202 !dbInstaller.isUpgradeRequired()) {
203 prepared = true;
204 }
205 }
206
207 }
208
209 }
SofCheck Inspector Build Version : 2.18479
| WebloggerStartup.java |
2009-Jan-02 14:24:50 |
| WebloggerStartup.class |
2009-Sep-04 03:12:31 |