From 7e8873a14ccc2cb25213489d7d7ba97f09673831 Mon Sep 17 00:00:00 2001 From: James Moger <james.moger@gitblit.com> Date: Wed, 07 Dec 2011 19:14:34 -0500 Subject: [PATCH] Unit testing overhaul. --- src/com/gitblit/GitBlit.java | 140 ++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 122 insertions(+), 18 deletions(-) diff --git a/src/com/gitblit/GitBlit.java b/src/com/gitblit/GitBlit.java index 49f93e4..60a96e6 100644 --- a/src/com/gitblit/GitBlit.java +++ b/src/com/gitblit/GitBlit.java @@ -25,7 +25,6 @@ import java.text.MessageFormat; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; @@ -66,7 +65,6 @@ import com.gitblit.models.FederationProposal; import com.gitblit.models.FederationSet; import com.gitblit.models.Metric; -import com.gitblit.models.ObjectCache; import com.gitblit.models.RepositoryModel; import com.gitblit.models.ServerSettings; import com.gitblit.models.ServerStatus; @@ -77,6 +75,7 @@ import com.gitblit.utils.JGitUtils; import com.gitblit.utils.JsonUtils; import com.gitblit.utils.MetricUtils; +import com.gitblit.utils.ObjectCache; import com.gitblit.utils.StringUtils; /** @@ -248,14 +247,61 @@ } /** + * Returns the file object for the specified configuration key. + * + * @return the file + */ + public static File getFileOrFolder(String key, String defaultFileOrFolder) { + String fileOrFolder = GitBlit.getString(key, defaultFileOrFolder); + return getFileOrFolder(fileOrFolder); + } + + /** + * Returns the file object which may have it's base-path determined by + * environment variables for running on a cloud hosting service. All Gitblit + * file or folder retrievals are (at least initially) funneled through this + * method so it is the correct point to globally override/alter filesystem + * access based on environment or some other indicator. + * + * @return the file + */ + public static File getFileOrFolder(String fileOrFolder) { + String openShift = System.getenv("OPENSHIFT_DATA_DIR"); + if (!StringUtils.isEmpty(openShift)) { + // running on RedHat OpenShift + return new File(openShift, fileOrFolder); + } + return new File(fileOrFolder); + } + + /** + * Returns the path of the repositories folder. This method checks to see if + * Gitblit is running on a cloud service and may return an adjusted path. + * + * @return the repositories folder path + */ + public static File getRepositoriesFolder() { + return getFileOrFolder(Keys.git.repositoriesFolder, "git"); + } + + /** + * Returns the path of the proposals folder. This method checks to see if + * Gitblit is running on a cloud service and may return an adjusted path. + * + * @return the proposals folder path + */ + public static File getProposalsFolder() { + return getFileOrFolder(Keys.federation.proposalsFolder, "proposals"); + } + + /** * Updates the list of server settings. * * @param settings * @return true if the update succeeded */ - public boolean updateSettings(Collection<SettingModel> settings) { - // TODO update the settings - return false; + public boolean updateSettings(Map<String, String> updatedSettings) { + return settings.saveSettings(updatedSettings); } public ServerStatus getStatus() { @@ -557,7 +603,7 @@ return null; } if (model.accessRestriction.atLeast(AccessRestrictionType.VIEW)) { - if (user != null && user.canAccessRepository(model.name)) { + if (user != null && user.canAccessRepository(model)) { return model; } return null; @@ -594,6 +640,7 @@ model.isFrozen = getConfig(config, "isFrozen", false); model.showReadme = getConfig(config, "showReadme", false); model.skipSizeCalculation = getConfig(config, "skipSizeCalculation", false); + model.skipSummaryMetrics = getConfig(config, "skipSummaryMetrics", false); model.federationStrategy = FederationStrategy.fromName(getConfig(config, "federationStrategy", null)); model.federationSets = new ArrayList<String>(Arrays.asList(config.getStringList( @@ -814,6 +861,7 @@ config.setBoolean("gitblit", null, "isFrozen", repository.isFrozen); config.setBoolean("gitblit", null, "showReadme", repository.showReadme); config.setBoolean("gitblit", null, "skipSizeCalculation", repository.skipSizeCalculation); + config.setBoolean("gitblit", null, "skipSummaryMetrics", repository.skipSummaryMetrics); config.setStringList("gitblit", null, "federationSets", repository.federationSets); config.setString("gitblit", null, "federationStrategy", repository.federationStrategy.name()); @@ -1120,8 +1168,7 @@ try { // make the proposals folder - File proposalsFolder = new File(getString(Keys.federation.proposalsFolder, "proposals") - .trim()); + File proposalsFolder = getProposalsFolder(); proposalsFolder.mkdirs(); // cache json to a file @@ -1153,7 +1200,7 @@ */ public List<FederationProposal> getPendingFederationProposals() { List<FederationProposal> list = new ArrayList<FederationProposal>(); - File folder = new File(getString(Keys.federation.proposalsFolder, "proposals").trim()); + File folder = getProposalsFolder(); if (folder.exists()) { File[] files = folder.listFiles(new FileFilter() { @Override @@ -1276,7 +1323,7 @@ * @return true if the proposal was deleted */ public boolean deletePendingFederationProposal(FederationProposal proposal) { - File folder = new File(getString(Keys.federation.proposalsFolder, "proposals").trim()); + File folder = getProposalsFolder(); File file = new File(folder, proposal.token + Constants.PROPOSAL_EXT); return file.delete(); } @@ -1307,7 +1354,12 @@ */ public ServerSettings getSettingsModel() { // ensure that the current values are updated in the setting models - settingsModel.updateCurrentValues(settings); + for (String key : settings.getAllKeys(null)) { + SettingModel setting = settingsModel.get(key); + if (setting != null) { + setting.currentValue = settings.getString(key, ""); + } + } return settingsModel; } @@ -1324,7 +1376,7 @@ // Read bundled Gitblit properties to extract setting descriptions. // This copy is pristine and only used for populating the setting // models map. - InputStream is = servletContext.getResourceAsStream("/WEB-INF/gitblit.properties"); + InputStream is = servletContext.getResourceAsStream("/WEB-INF/reference.properties"); BufferedReader propertiesReader = new BufferedReader(new InputStreamReader(is)); StringBuilder description = new StringBuilder(); SettingModel setting = new SettingModel(); @@ -1383,13 +1435,14 @@ * * @param settings */ + @SuppressWarnings("deprecation") public void configureContext(IStoredSettings settings, boolean startFederation) { logger.info("Reading configuration from " + settings.toString()); this.settings = settings; - repositoriesFolder = new File(settings.getString(Keys.git.repositoriesFolder, "git")); + repositoriesFolder = getRepositoriesFolder(); logger.info("Git repositories folder " + repositoriesFolder.getAbsolutePath()); repositoryResolver = new FileResolver<Void>(repositoriesFolder, exportAll); - serverStatus = new ServerStatus(); + serverStatus = new ServerStatus(isGO()); String realm = settings.getString(Keys.realm.userService, "users.properties"); IUserService loginService = null; try { @@ -1401,16 +1454,51 @@ } catch (Throwable t) { // not a login service class or class could not be instantiated. // try to use default file login service - File realmFile = new File(realm); - if (!realmFile.exists()) { + File realmFile = getFileOrFolder(Keys.realm.userService, "users.conf"); + if (realmFile.exists()) { + // load the existing realm file + if (realmFile.getName().toLowerCase().endsWith(".properties")) { + // load the v0.5.0 - v0.7.0 properties-based realm file + loginService = new FileUserService(realmFile); + + // automatically create a users.conf realm file from the + // original users.properties file + File usersConfig = new File(realmFile.getParentFile(), "users.conf"); + if (!usersConfig.exists()) { + logger.info(MessageFormat.format("Automatically creating {0} based on {1}", + usersConfig.getAbsolutePath(), realmFile.getAbsolutePath())); + ConfigUserService configService = new ConfigUserService(usersConfig); + for (String username : loginService.getAllUsernames()) { + UserModel userModel = loginService.getUserModel(username); + configService.updateUserModel(userModel); + } + } + + // issue suggestion about switching to users.conf + logger.warn("Please consider using \"users.conf\" instead of the deprecated \"users.properties\" file"); + } else if (realmFile.getName().toLowerCase().endsWith(".conf")) { + // load the config-based realm file + loginService = new ConfigUserService(realmFile); + } + } else { + // Create a new realm file and add the default admin + // account. This is necessary for bootstrapping a dynamic + // environment like running on a cloud service. + // As of v0.8.0 the default realm file is ConfigUserService. try { + realmFile = getFileOrFolder(Keys.realm.userService, "users.conf"); realmFile.createNewFile(); + loginService = new ConfigUserService(realmFile); + UserModel admin = new UserModel("admin"); + admin.password = "admin"; + admin.canAdmin = true; + admin.excludeFromFederation = true; + loginService.updateUserModel(admin); } catch (IOException x) { logger.error( MessageFormat.format("COULD NOT CREATE REALM FILE {0}!", realmFile), x); } } - loginService = new FileUserService(realmFile); } setUserService(loginService); mailExecutor = new MailExecutor(settings); @@ -1436,9 +1524,25 @@ settingsModel = loadSettingModels(); if (settings == null) { // Gitblit WAR is running in a servlet container - WebXmlSettings webxmlSettings = new WebXmlSettings(contextEvent.getServletContext()); + ServletContext context = contextEvent.getServletContext(); + WebXmlSettings webxmlSettings = new WebXmlSettings(context); + + // 0.7.0 web.properties in the deployed war folder + File overrideFile = new File(context.getRealPath("/WEB-INF/web.properties")); + if (overrideFile.exists()) { + webxmlSettings.applyOverrides(overrideFile); + } + + // 0.8.0 gitblit.properties file located outside the deployed war + // folder lie, for example, on RedHat OpenShift. + overrideFile = getFileOrFolder("gitblit.properties"); + if (!overrideFile.getPath().equals("gitblit.properties")) { + webxmlSettings.applyOverrides(overrideFile); + } configureContext(webxmlSettings, true); } + + serverStatus.servletContainer = servletContext.getServerInfo(); } /** -- Gitblit v1.9.1