| // Copyright (C) 2009 The Android Open Source Project | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| package com.google.gerrit.server.config; | |
| import com.google.common.collect.Iterables; | |
| import com.google.gerrit.common.Nullable; | |
| import com.google.inject.Inject; | |
| import com.google.inject.Singleton; | |
| import java.io.IOException; | |
| import java.nio.file.DirectoryStream; | |
| import java.nio.file.Files; | |
| import java.nio.file.NoSuchFileException; | |
| import java.nio.file.Path; | |
| /** Important paths within a {@link SitePath}. */ | |
| @Singleton | |
| public final class SitePaths { | |
| public static final String CSS_FILENAME = "GerritSite.css"; | |
| public static final String HEADER_FILENAME = "GerritSiteHeader.html"; | |
| public static final String FOOTER_FILENAME = "GerritSiteFooter.html"; | |
| public static final String THEME_JS_FILENAME = "gerrit-theme.js"; | |
| public final Path site_path; | |
| public final Path bin_dir; | |
| public final Path etc_dir; | |
| public final Path lib_dir; | |
| public final Path tmp_dir; | |
| public final Path logs_dir; | |
| public final Path plugins_dir; | |
| public final Path db_dir; | |
| public final Path data_dir; | |
| public final Path mail_dir; | |
| public final Path hooks_dir; | |
| public final Path static_dir; | |
| public final Path index_dir; | |
| public final Path gerrit_sh; | |
| public final Path gerrit_service; | |
| public final Path gerrit_socket; | |
| public final Path gerrit_war; | |
| public final Path gerrit_config; | |
| public final Path secure_config; | |
| public final Path notedb_config; | |
| public final Path jgit_config; | |
| public final Path ssl_keystore; | |
| public final Path ssh_key; | |
| public final Path ssh_rsa; | |
| public final Path ssh_ecdsa_256; | |
| public final Path ssh_ecdsa_384; | |
| public final Path ssh_ecdsa_521; | |
| public final Path ssh_ed25519; | |
| public final Path peer_keys; | |
| public final Path site_css; | |
| public final Path site_header; | |
| public final Path site_footer; | |
| public final Path site_theme_js; | |
| public final Path site_gitweb; | |
| /** {@code true} if {@link #site_path} has not been initialized. */ | |
| public final boolean isNew; | |
| @Inject | |
| public SitePaths(@SitePath Path sitePath) throws IOException { | |
| site_path = sitePath; | |
| Path p = sitePath; | |
| bin_dir = p.resolve("bin"); | |
| etc_dir = p.resolve("etc"); | |
| lib_dir = p.resolve("lib"); | |
| tmp_dir = p.resolve("tmp"); | |
| plugins_dir = p.resolve("plugins"); | |
| db_dir = p.resolve("db"); | |
| data_dir = p.resolve("data"); | |
| logs_dir = p.resolve("logs"); | |
| mail_dir = etc_dir.resolve("mail"); | |
| hooks_dir = p.resolve("hooks"); | |
| static_dir = p.resolve("static"); | |
| index_dir = p.resolve("index"); | |
| gerrit_sh = bin_dir.resolve("gerrit.sh"); | |
| gerrit_service = bin_dir.resolve("gerrit.service"); | |
| gerrit_socket = bin_dir.resolve("gerrit.socket"); | |
| gerrit_war = bin_dir.resolve("gerrit.war"); | |
| gerrit_config = etc_dir.resolve("gerrit.config"); | |
| secure_config = etc_dir.resolve("secure.config"); | |
| notedb_config = etc_dir.resolve("notedb.config"); | |
| jgit_config = etc_dir.resolve("jgit.config"); | |
| ssl_keystore = etc_dir.resolve("keystore"); | |
| ssh_key = etc_dir.resolve("ssh_host_key"); | |
| ssh_rsa = etc_dir.resolve("ssh_host_rsa_key"); | |
| ssh_ecdsa_256 = etc_dir.resolve("ssh_host_ecdsa_key"); | |
| ssh_ecdsa_384 = etc_dir.resolve("ssh_host_ecdsa_384_key"); | |
| ssh_ecdsa_521 = etc_dir.resolve("ssh_host_ecdsa_521_key"); | |
| ssh_ed25519 = etc_dir.resolve("ssh_host_ed25519_key"); | |
| peer_keys = etc_dir.resolve("peer_keys"); | |
| site_css = etc_dir.resolve(CSS_FILENAME); | |
| site_header = etc_dir.resolve(HEADER_FILENAME); | |
| site_footer = etc_dir.resolve(FOOTER_FILENAME); | |
| site_gitweb = etc_dir.resolve("gitweb_config.perl"); | |
| site_theme_js = static_dir.resolve(THEME_JS_FILENAME); | |
| boolean isNew; | |
| try (DirectoryStream<Path> files = Files.newDirectoryStream(site_path)) { | |
| isNew = Iterables.isEmpty(files); | |
| } catch (NoSuchFileException e) { | |
| isNew = true; | |
| } | |
| this.isNew = isNew; | |
| } | |
| /** | |
| * Resolve an absolute or relative path. | |
| * | |
| * <p>Relative paths are resolved relative to the {@link #site_path}. | |
| * | |
| * @param path the path string to resolve. May be null. | |
| * @return the resolved path; null if {@code path} was null or empty. | |
| */ | |
| @Nullable | |
| public Path resolve(String path) { | |
| if (path != null && !path.isEmpty()) { | |
| Path loc = site_path.resolve(path).normalize(); | |
| try { | |
| return loc.toRealPath(); | |
| } catch (IOException e) { | |
| return loc.toAbsolutePath(); | |
| } | |
| } | |
| return null; | |
| } | |
| } |