1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * See LICENSE.txt included in this distribution for the specific 9 * language governing permissions and limitations under the License. 10 * 11 * When distributing Covered Code, include this CDDL HEADER in each 12 * file and include the License file at LICENSE.txt. 13 * If applicable, add the following below this CDDL HEADER, with the 14 * fields enclosed by brackets "[]" replaced with your own identifying 15 * information: Portions Copyright [yyyy] [name of copyright owner] 16 * 17 * CDDL HEADER END 18 */ 19 20 /* 21 * Copyright (c) 2019, Chris Fraire <cfraire@me.com>. 22 */ 23 package org.opengrok.indexer.configuration; 24 25 import java.io.File; 26 27 /** 28 * Represents a validator of a --canonicalRoot value. 29 */ 30 public class CanonicalRootValidator { 31 32 /** 33 * Validates the specified setting, returning an error message if validation 34 * fails. 35 * @return a defined instance if not valid or {@code null} otherwise 36 */ validate(String setting, String elementDescription)37 public static String validate(String setting, String elementDescription) { 38 // Test that the value ends with the system separator. 39 if (!setting.endsWith(File.separator)) { 40 return elementDescription + " must end with a separator"; 41 } 42 // Test that the value is not like a Windows root (e.g. C:\ or Z:/). 43 if (setting.matches("\\w:(?:[/\\\\]*)")) { 44 return elementDescription + " cannot be a root directory"; 45 } 46 // Test that some character other than separators is in the value. 47 if (!setting.matches(".*[^/\\\\].*")) { 48 return elementDescription + " cannot be the root directory"; 49 } 50 51 /* 52 * There is no need to validate that the caller has not specified e.g. 53 * "/./" (i.e. an alias to the root "/") because --canonicalRoot values 54 * are matched via string comparison against true canonical values got 55 * via File.getCanonicalPath(). An alias like "/./" is therefore a 56 * never-matching value and hence inactive. 57 */ 58 return null; 59 } 60 61 /** Private to enforce static. */ CanonicalRootValidator()62 private CanonicalRootValidator() { 63 64 } 65 } 66