James Moger
2015-11-22 ed552ba47c02779c270ffd62841d6d1048dade70
commit | author | age
e24670 1 /*
JM 2  * Copyright 2013 gitblit.com.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not 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.
15  */
16 package com.gitblit.manager;
17
18 import java.io.File;
19 import java.text.SimpleDateFormat;
20 import java.util.Date;
a8100b 21 import java.util.Locale;
e24670 22 import java.util.Map;
JM 23 import java.util.TimeZone;
24
25 import org.slf4j.Logger;
26 import org.slf4j.LoggerFactory;
27
28 import com.gitblit.Constants;
29 import com.gitblit.IStoredSettings;
30 import com.gitblit.Keys;
31 import com.gitblit.models.ServerSettings;
32 import com.gitblit.models.ServerStatus;
33 import com.gitblit.models.SettingModel;
34 import com.gitblit.utils.StringUtils;
fc3a39 35 import com.gitblit.utils.XssFilter;
7d3a31 36 import com.google.inject.Inject;
c828cf 37 import com.google.inject.Injector;
7d3a31 38 import com.google.inject.Singleton;
e24670 39
7d3a31 40 @Singleton
e24670 41 public class RuntimeManager implements IRuntimeManager {
JM 42
43     private final Logger logger = LoggerFactory.getLogger(getClass());
44
45     private final IStoredSettings settings;
fc3a39 46
JM 47     private final XssFilter xssFilter;
e24670 48
JM 49     private final ServerStatus serverStatus;
50
269c50 51     private final ServerSettings settingsModel;
e24670 52
JM 53     private File baseFolder;
54
269c50 55     private TimeZone timezone;
c828cf 56
JM 57     @Inject
58     private Injector injector;
e24670 59
1b34b0 60     @Inject
fc3a39 61     public RuntimeManager(IStoredSettings settings, XssFilter xssFilter) {
JM 62         this(settings, xssFilter, null);
269c50 63     }
JM 64
fc3a39 65     public RuntimeManager(IStoredSettings settings, XssFilter xssFilter, File baseFolder) {
e24670 66         this.settings = settings;
JM 67         this.settingsModel = new ServerSettings();
68         this.serverStatus = new ServerStatus();
fc3a39 69         this.xssFilter = xssFilter;
269c50 70         this.baseFolder = baseFolder == null ? new File("") : baseFolder;
e24670 71     }
JM 72
73     @Override
269c50 74     public RuntimeManager start() {
JM 75         logger.info("Basefolder  : " + baseFolder.getAbsolutePath());
76         logger.info("Settings    : " + settings.toString());
77         logTimezone("JVM timezone: ", TimeZone.getDefault());
78         logTimezone("App timezone: ", getTimezone());
a8100b 79         logger.info("JVM locale  : " + Locale.getDefault());
JM 80         logger.info("App locale  : " +  (getLocale() == null ? "<client>" : getLocale()));
e24670 81         return this;
JM 82     }
83
84     @Override
85     public RuntimeManager stop() {
86         return this;
87     }
88
89     @Override
c828cf 90     public Injector getInjector() {
JM 91         return injector;
92     }
93
94     @Override
e24670 95     public File getBaseFolder() {
JM 96         return baseFolder;
97     }
98
99     @Override
100     public void setBaseFolder(File folder) {
101         this.baseFolder = folder;
102     }
103
104     /**
105      * Returns the boot date of the Gitblit server.
106      *
107      * @return the boot date of Gitblit
108      */
109     @Override
110     public Date getBootDate() {
111         return serverStatus.bootDate;
112     }
113
114     @Override
115     public ServerSettings getSettingsModel() {
116         // ensure that the current values are updated in the setting models
117         for (String key : settings.getAllKeys(null)) {
118             SettingModel setting = settingsModel.get(key);
119             if (setting == null) {
120                 // unreferenced setting, create a setting model
121                 setting = new SettingModel();
122                 setting.name = key;
123                 settingsModel.add(setting);
124             }
125             setting.currentValue = settings.getString(key, "");
126         }
127 //        settingsModel.pushScripts = getAllScripts();
128         return settingsModel;
129     }
130
131     /**
132      * Returns the preferred timezone for the Gitblit instance.
133      *
134      * @return a timezone
135      */
136     @Override
137     public TimeZone getTimezone() {
138         if (timezone == null) {
269c50 139             String tzid = settings.getString(Keys.web.timezone, null);
e24670 140             if (StringUtils.isEmpty(tzid)) {
JM 141                 timezone = TimeZone.getDefault();
142                 return timezone;
143             }
144             timezone = TimeZone.getTimeZone(tzid);
145         }
146         return timezone;
147     }
148
149     private void logTimezone(String type, TimeZone zone) {
150         SimpleDateFormat df = new SimpleDateFormat("z Z");
151         df.setTimeZone(zone);
152         String offset = df.format(new Date());
269c50 153         logger.info("{}{} ({})", new Object [] { type, zone.getID(), offset });
e24670 154     }
JM 155
a8100b 156     @Override
JM 157     public Locale getLocale() {
158         String lc = settings.getString(Keys.web.forceDefaultLocale, null);
159         if (!StringUtils.isEmpty(lc)) {
160             int underscore = lc.indexOf('_');
161             if (underscore > 0) {
162                 String lang = lc.substring(0, underscore);
163                 String cc = lc.substring(underscore + 1);
164                 return new Locale(lang, cc);
165             } else {
166                 return new Locale(lc);
167             }
168         }
169         return null;
170     }
171
e24670 172     /**
JM 173      * Is Gitblit running in debug mode?
174      *
175      * @return true if Gitblit is running in debug mode
176      */
177     @Override
178     public boolean isDebugMode() {
179         return settings.getBoolean(Keys.web.debugMode, false);
180     }
181
182     /**
183      * Returns the file object for the specified configuration key.
184      *
185      * @return the file
186      */
187     @Override
188     public File getFileOrFolder(String key, String defaultFileOrFolder) {
189         String fileOrFolder = settings.getString(key, defaultFileOrFolder);
190         return getFileOrFolder(fileOrFolder);
191     }
192
193     /**
194      * Returns the file object which may have it's base-path determined by
195      * environment variables for running on a cloud hosting service. All Gitblit
196      * file or folder retrievals are (at least initially) funneled through this
197      * method so it is the correct point to globally override/alter filesystem
198      * access based on environment or some other indicator.
199      *
200      * @return the file
201      */
202     @Override
203     public File getFileOrFolder(String fileOrFolder) {
204         return com.gitblit.utils.FileUtils.resolveParameter(Constants.baseFolder$,
205                 baseFolder, fileOrFolder);
206     }
207
208     /**
209      * Returns the runtime settings.
210      *
211      * @return runtime settings
212      */
213     @Override
214     public IStoredSettings getSettings() {
215         return settings;
216     }
217
218     /**
219      * Updates the runtime settings.
220      *
221      * @param settings
222      * @return true if the update succeeded
223      */
224     @Override
225     public boolean updateSettings(Map<String, String> updatedSettings) {
226         return settings.saveSettings(updatedSettings);
227     }
228
229     @Override
230     public ServerStatus getStatus() {
231         // update heap memory status
232         serverStatus.heapAllocated = Runtime.getRuntime().totalMemory();
233         serverStatus.heapFree = Runtime.getRuntime().freeMemory();
234         return serverStatus;
235     }
fc3a39 236
JM 237     /**
238      * Returns the XSS filter.
239      *
240      * @return the XSS filter
241      */
242     @Override
243     public XssFilter getXssFilter() {
244         return xssFilter;
245     }
246
e24670 247 }