Indexer.java revision 1e4f2633aeeca23eeb54f4007ab4f54565b499a7
cd348e325366620fe047edcc849e3c9424828599Peter Bray/*
cd348e325366620fe047edcc849e3c9424828599Peter Bray * CDDL HEADER START
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco *
cd348e325366620fe047edcc849e3c9424828599Peter Bray * The contents of this file are subject to the terms of the
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * Common Development and Distribution License (the "License").
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal * You may not use this file except in compliance with the License.
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco *
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * See LICENSE.txt included in this distribution for the specific
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * language governing permissions and limitations under the License.
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray *
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco * When distributing Covered Code, include this CDDL HEADER in each
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * file and include the License file at LICENSE.txt.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * If applicable, add the following below this CDDL HEADER, with the
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * fields enclosed by brackets "[]" replaced with your own identifying
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray * information: Portions Copyright [yyyy] [name of copyright owner]
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray *
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * CDDL HEADER END
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray */
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray/*
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * Copyright (c) 2005, 2016, Oracle and/or its affiliates. All rights reserved.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray *
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * Portions Copyright 2011 Jens Elkner.
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal */
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotalpackage org.opensolaris.opengrok.index;
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.io.File;
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscoimport java.io.IOException;
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscoimport java.lang.reflect.Field;
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscoimport java.net.InetAddress;
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Koscoimport java.text.ParseException;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.util.ArrayList;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.util.Collections;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.util.Comparator;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.util.HashMap;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.util.HashSet;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport java.util.List;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport java.util.Map;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Brayimport java.util.concurrent.ExecutorService;
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Brayimport java.util.concurrent.Executors;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport java.util.concurrent.TimeUnit;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport java.util.logging.Level;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport java.util.logging.Logger;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport org.opensolaris.opengrok.Info;
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalimport org.opensolaris.opengrok.analysis.AnalyzerGuru;
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalimport org.opensolaris.opengrok.configuration.Configuration;
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotalimport org.opensolaris.opengrok.configuration.Project;
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotalimport org.opensolaris.opengrok.configuration.RuntimeEnvironment;
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalimport org.opensolaris.opengrok.history.HistoryException;
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalimport org.opensolaris.opengrok.history.HistoryGuru;
65df1e87266301e243dcead8082ca6255abea666Vladimir Kotalimport org.opensolaris.opengrok.history.Repository;
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotalimport org.opensolaris.opengrok.history.RepositoryFactory;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport org.opensolaris.opengrok.history.RepositoryInfo;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport org.opensolaris.opengrok.logger.LoggerFactory;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport org.opensolaris.opengrok.logger.LoggerUtil;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport org.opensolaris.opengrok.util.Executor;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalimport org.opensolaris.opengrok.util.Getopt;
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smetimport org.opensolaris.opengrok.util.Statistics;
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet
56c25decc0427c204cd35856e521ddf28337e75dLubos Kosco/**
56c25decc0427c204cd35856e521ddf28337e75dLubos Kosco * Creates and updates an inverted source index as well as generates Xref, file
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal * stats etc., if specified in the options
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal */
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal@SuppressWarnings({"PMD.AvoidPrintStackTrace", "PMD.SystemPrintln"})
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotalpublic final class Indexer {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal private static final Logger LOGGER = LoggerFactory.getLogger(Indexer.class);
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal /* tunables for -r (history for remote repositories) */
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina private static final String ON = "on";
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina private static final String OFF = "off";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal private static final String DIRBASED = "dirbased";
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal private static final String UIONLY = "uionly";
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco private static final Indexer index = new Indexer();
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco private static final String DERBY_EMBEDDED_DRIVER
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco = "org.apache.derby.jdbc.EmbeddedDriver";
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco private static final String DERBY_CLIENT_DRIVER
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal = "org.apache.derby.jdbc.ClientDriver";
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray public static Indexer getInstance() {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray return index;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal private static void A_usage() {
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal System.err.println("ERROR: You must specify: -A .extension:class or -A prefix.:class");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal System.err.println(" Ex: -A .foo:org.opensolaris.opengrok.analysis.c.CAnalyzer");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" will use the C analyzer for all files ending with .foo");
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco System.err.println(" Ex: -A bar.:org.opensolaris.opengrok.analysis.c.CAnalyzer");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" will use the C analyzer for all files starting with bar.");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" Ex: -A .c:-");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" will disable the c-analyzer for for all files ending with .c");
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal System.exit(1);
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal }
43dac746513591adbd09bc4f417feb385f4fd87eVladimir Kotal
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco /**
3a4816d2417e1abe89a913616de36f200793bea3Vladimir Kotal * Program entry point
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco *
610915d59310c9aba810740e858ba64c5e3e6a2fVladimir Kotal * @param argv argument vector
3a4816d2417e1abe89a913616de36f200793bea3Vladimir Kotal */
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco @SuppressWarnings("PMD.UseStringBufferForStringAppends")
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco public static void main(String argv[]) {
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco Statistics stats = new Statistics(); //this won't count JVM creation though
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco boolean runIndex = true;
fbf97ea1786d1e25add88bbfb91810170473bc9fLubos Kosco boolean update = true;
f21b682cd9b414738a4f5a38b56f6682e537e1d2Trond Norbye boolean optimizedChanged = false;
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco ArrayList<String> zapCache = new ArrayList<>();
3b0448fdd830b8d04c6a71511e5d26a4fc3b5b80Lubos Kosco CommandLineOptions cmdOptions = new CommandLineOptions();
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (argv.length == 0) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(cmdOptions.getUsage());
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
cd348e325366620fe047edcc849e3c9424828599Peter Bray Executor.registerErrorHandler();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal boolean searchRepositories = false;
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal ArrayList<String> subFiles = new ArrayList<>();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal ArrayList<String> subFilesList = new ArrayList<>();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal ArrayList<String> repositories = new ArrayList<>();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal HashSet<String> allowedSymlinks = new HashSet<>();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal String configFilename = null;
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco String configHost = null;
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal boolean addProjects = false;
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal boolean refreshHistory = false;
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco String defaultProject = null;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco boolean listFiles = false;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray boolean listRepos = false;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray boolean createDict = false;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray int noThreads = 2 + (2 * Runtime.getRuntime().availableProcessors());
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Parse command line options:
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray Getopt getopt = new Getopt(argv, cmdOptions.getCommandString());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray try {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray getopt.parse();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (ParseException ex) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println("OpenGrok: " + ex.getMessage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(cmdOptions.getUsage());
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.exit(1);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray try {
cd348e325366620fe047edcc849e3c9424828599Peter Bray Configuration cfg = null;
cd348e325366620fe047edcc849e3c9424828599Peter Bray int cmd;
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray // We need to read the configuration file first, since we
cd348e325366620fe047edcc849e3c9424828599Peter Bray // will try to overwrite options..
cd348e325366620fe047edcc849e3c9424828599Peter Bray while ((cmd = getopt.getOpt()) != -1) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (cmd == 'R') {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg = Configuration.read(new File(getopt.getOptarg()));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (cfg == null) {
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco cfg = new Configuration();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String databaseDriver = cfg.getDatabaseDriver();
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String databaseURL = cfg.getDatabaseUrl();
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray // Now we can handle all the other options..
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray getopt.reset();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray while ((cmd = getopt.getOpt()) != -1) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray switch (cmd) {
b34561d2c3d92fac37dbced05ba6a8738e3d20e9Lubos Kosco case 'A': {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String[] arg = getopt.getOptarg().split(":");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean prefix = false;
5e6c91d7e77062129cd0b6ac8aaa546dff216419Lubos Kosco
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal if (arg.length != 2) {
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal A_usage();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (arg[0].endsWith(".")) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray arg[0] = arg[0].substring(0, arg[0].lastIndexOf('.')).toUpperCase();
cd348e325366620fe047edcc849e3c9424828599Peter Bray prefix = true;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if (arg[0].startsWith(".")) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray arg[0] = arg[0].substring(arg[0].lastIndexOf('.') + 1).toUpperCase();
cd348e325366620fe047edcc849e3c9424828599Peter Bray } else {
cd348e325366620fe047edcc849e3c9424828599Peter Bray A_usage();
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (arg[1].equals("-")) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal if (prefix) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal AnalyzerGuru.addPrefix(arg[0], null);
cd348e325366620fe047edcc849e3c9424828599Peter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray AnalyzerGuru.addExtension(arg[0], null);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (prefix) {
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco try {
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco AnalyzerGuru.addPrefix(
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco arg[0],
d7c1415de39f4b07c85828f49cd1ee7a2a19eb9eLubos Kosco AnalyzerGuru.findFactory(arg[1]));
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco LOGGER.log(Level.SEVERE, "Unable to use {0} as a FileAnalyzerFactory", arg[1]);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco LOGGER.log(Level.SEVERE, "Stack: ", e.fillInStackTrace());
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray System.exit(1);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } else {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal try {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal AnalyzerGuru.addExtension(
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal arg[0],
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal AnalyzerGuru.findFactory(arg[1]));
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal LOGGER.log(Level.SEVERE, "Unable to use {0} as a FileAnalyzerFactory", arg[1]);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal LOGGER.log(Level.SEVERE, "Stack: ", e.fillInStackTrace());
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray System.exit(1);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'a':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (getopt.getOptarg().equalsIgnoreCase(ON)) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray cfg.setAllowLeadingWildcard(true);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if (getopt.getOptarg().equalsIgnoreCase(OFF)) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray cfg.setAllowLeadingWildcard(false);
cd348e325366620fe047edcc849e3c9424828599Peter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println("ERROR: You should pass either \"on\" or \"off\" as argument to -a");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" Ex: \"-a on\" will allow a search to start with a wildcard");
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal System.err.println(" \"-a off\" will disallow a search to start with a wildcard");
e9dbb478e3339d96ce4f0af5c6ab7e1d35ebb86dVladimir Kotal System.exit(1);
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal }
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal break;
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal case 'B':
d961aa46ea0d50fed47802497e45226b1965b12dVladimir Kotal cfg.setUserPage(getopt.getOptarg());
cd348e325366620fe047edcc849e3c9424828599Peter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'C':
cd348e325366620fe047edcc849e3c9424828599Peter Bray cfg.setPrintProgress(true);
cd348e325366620fe047edcc849e3c9424828599Peter Bray break;
cd348e325366620fe047edcc849e3c9424828599Peter Bray case 'c':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setCtags(getopt.getOptarg());
cd348e325366620fe047edcc849e3c9424828599Peter Bray break;
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal case 'D':
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal cfg.setHistoryCacheInDB(true);
4f3c0816485669143aa54f1c6461fcb47cf5bc5cVladimir Kotal break;
4f3c0816485669143aa54f1c6461fcb47cf5bc5cVladimir Kotal case 'd': {
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco File dataRoot = new File(getopt.getOptarg());
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (!dataRoot.exists() && !dataRoot.mkdirs()) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray System.err.println("ERROR: Cannot create data root");
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed System.exit(1);
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed }
17d95a647aba8c37d9ac34d97e4eed729aa46f67Naseer Ahmed if (!dataRoot.isDirectory()) {
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco System.err.println("ERROR: Data root must be a directory");
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray System.exit(1);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray cfg.setDataRoot(dataRoot.getCanonicalPath());
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco case 'e':
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco cfg.setGenerateHtml(false);
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco break;
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco case 'G':
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco cfg.setTagsEnabled(true);
cd348e325366620fe047edcc849e3c9424828599Peter Bray break;
b17cb0705d90907337b3528aa7b8ed1700806f26Vladimir Kotal case 'H':
d6ee3934a24d8ccc0e4bb478405d8e5f6a35825dLubos Kosco refreshHistory = true;
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal break;
8f8c3f4555e5aa3160f03f2e9c55ddbd3381357bLubos Kosco case 'h':
425278cfacbc73f1e955ab6016f206fc5ed93ccbVladimir Kotal repositories.add(getopt.getOptarg());
8f8c3f4555e5aa3160f03f2e9c55ddbd3381357bLubos Kosco break;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray case 'I':
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco cfg.getIncludedNames().add(getopt.getOptarg());
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco break;
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco case 'i':
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco cfg.getIgnoredNames().add(getopt.getOptarg());
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco break;
d70dc22c6dce3f498251b0873638d1fea0e644a3Lubos Kosco case 'j':
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray databaseDriver = getopt.getOptarg();
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco // Should be a full class name, but we also accept
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco // the shorthands "client" and "embedded". Expand
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco // the shorthands here.
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco switch (databaseDriver) {
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco case "client":
2cf31ec93bd5d8a2efeab511ce051da51e69aedaLubos Kosco databaseDriver = DERBY_CLIENT_DRIVER;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray break;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray case "embedded":
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray databaseDriver = DERBY_EMBEDDED_DRIVER;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray break;
1a5c2ab40bd94d2b2c63afda767ce7bbf29ecc4bJan Friedel }
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco break;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray case 'K':
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray listRepos = true;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal break;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal case 'k':
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal zapCache.add(getopt.getOptarg());
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal break;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal case 'L':
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal cfg.setWebappLAF(getopt.getOptarg());
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal break;
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal case 'l':
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal if (getopt.getOptarg().equalsIgnoreCase(ON)) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal cfg.setUsingLuceneLocking(true);
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal } else if (getopt.getOptarg().equalsIgnoreCase(OFF)) {
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal cfg.setUsingLuceneLocking(false);
6c8465e3b4611cb632cba9b0572e3e3737c8c341Vladimir Kotal } else {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray System.err.println("ERROR: You should pass either \"on\" or \"off\" as argument to -l");
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet System.err.println(" Ex: \"-l on\" will enable locks in Lucene");
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet System.err.println(" \"-l off\" will disable locks in Lucene");
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet }
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet break;
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet case 'm': {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet try {
6ce0623fa4ef95af9d77700a1c9c19ec1a919326Guillaume Smet cfg.setRamBufferSize(Double.parseDouble(getopt.getOptarg()));
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray } catch (NumberFormatException exp) {
cd71fb134e037849c77364b50940b1870c4684ceVladimir Kotal System.err.println("ERROR: Failed to parse argument to \"-m\": " + exp.getMessage());
983523cf73bc85cce6282cb5aa78b60f6bcd959fLubos Kosco System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'N':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray allowedSymlinks.add(getopt.getOptarg());
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco break;
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco case 'n':
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco runIndex = false;
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco break;
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco case 'O': {
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco boolean oldval = cfg.isOptimizeDatabase();
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (getopt.getOptarg().equalsIgnoreCase(ON)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setOptimizeDatabase(true);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if (getopt.getOptarg().equalsIgnoreCase(OFF)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setOptimizeDatabase(false);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println("ERROR: You should pass either \"on\" or \"off\" as argument to -O");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(" Ex: \"-O on\" will optimize the database as part of the index generation");
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco System.err.println(" \"-O off\" disable optimization of the index database");
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco }
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco if (oldval != cfg.isOptimizeDatabase()) {
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco optimizedChanged = true;
2b024356b830395446c55f50f9f724a63612e578Lubos Kosco }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray case 'o':
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray String CTagsExtraOptionsFile = getopt.getOptarg();
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye File CTagsFile = new File(CTagsExtraOptionsFile);
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (!(CTagsFile.isFile() && CTagsFile.canRead())) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray System.err.println("ERROR: File '"
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray + CTagsExtraOptionsFile
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray + "' not found for the -o option");
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco System.exit(1);
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco }
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal System.err.println("INFO: file with extra "
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal + "options for ctags: " + CTagsExtraOptionsFile);
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal cfg.setCTagsExtraOptionsFile(CTagsExtraOptionsFile);
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal break;
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco case 'P':
cd348e325366620fe047edcc849e3c9424828599Peter Bray addProjects = true;
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina break;
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina case 'p':
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina defaultProject = getopt.getOptarg();
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina break;
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina case 'Q':
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina if (getopt.getOptarg().equalsIgnoreCase(ON)) {
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina cfg.setQuickContextScan(true);
3ba66fbb56ef22f183da783a1b2718280c357a4eStanislav Kozina } else if (getopt.getOptarg().equalsIgnoreCase(OFF)) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray cfg.setQuickContextScan(false);
cd348e325366620fe047edcc849e3c9424828599Peter Bray } else {
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println("ERROR: You should pass either \"on\" or \"off\" as argument to -Q");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" Ex: \"-Q on\" will just scan a \"chunk\" of the file and insert \"[..all..]\"");
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println(" \"-Q off\" will try to build a more accurate list by reading the complete file.");
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
cd348e325366620fe047edcc849e3c9424828599Peter Bray break;
cd348e325366620fe047edcc849e3c9424828599Peter Bray case 'q':
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray cfg.setVerbose(false);
cd348e325366620fe047edcc849e3c9424828599Peter Bray LoggerUtil.setBaseConsoleLogLevel(Level.WARNING);
cd348e325366620fe047edcc849e3c9424828599Peter Bray break;
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray case 'R':
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray // already handled
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco break;
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye case 'r':
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray if (getopt.getOptarg().equalsIgnoreCase(ON)) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray cfg.setRemoteScmSupported(Configuration.RemoteSCM.ON);
8f8c3f4555e5aa3160f03f2e9c55ddbd3381357bLubos Kosco } else if (getopt.getOptarg().equalsIgnoreCase(OFF)) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye cfg.setRemoteScmSupported(Configuration.RemoteSCM.OFF);
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco } else if (getopt.getOptarg().equalsIgnoreCase(DIRBASED)) {
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco cfg.setRemoteScmSupported(Configuration.RemoteSCM.DIRBASED);
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco } else if (getopt.getOptarg().equalsIgnoreCase(UIONLY)) {
3a5046f0538ba9fb3a9429199544a9f4b93d9a4dLubos Kosco cfg.setRemoteScmSupported(Configuration.RemoteSCM.UIONLY);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
cd348e325366620fe047edcc849e3c9424828599Peter Bray System.err.println("ERROR: You should pass either \"on\" or \"off\" or \"uionly\" as argument to -r");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(" Ex: \"-r on\" will allow retrieval for remote SCM systems");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(" \"-r off\" will ignore SCM for remote systems");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(" \"-r dirbased\" will allow retrieval during history index "
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray + "only for repositories which allow getting history for directories");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(" \"-r uionly\" will support remote SCM for UI only");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'S':
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco searchRepositories = true;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 's': {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File sourceRoot = new File(getopt.getOptarg());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (!sourceRoot.isDirectory()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println("ERROR: Source root "
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray + getopt.getOptarg() + " must be a directory");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(1);
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setSourceRoot(sourceRoot.getCanonicalPath());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'T':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray try {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray noThreads = Integer.parseInt(getopt.getOptarg());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (NumberFormatException exp) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println("ERROR: Failed to parse argument to \"-T\": "
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray + exp.getMessage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 't':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray try {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int tmp = Integer.parseInt(getopt.getOptarg());
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal cfg.setTabSize(tmp);
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal } catch (NumberFormatException exp) {
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal System.err.println("ERROR: Failed to parse argument to \"-t\": "
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal + exp.getMessage());
c83dfde6b364917fa8ed28142d509a7c29a4da68Vladimir Kotal System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco case 'U':
cd348e325366620fe047edcc849e3c9424828599Peter Bray configHost = getopt.getOptarg();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
cd348e325366620fe047edcc849e3c9424828599Peter Bray case 'u':
cd348e325366620fe047edcc849e3c9424828599Peter Bray databaseURL = getopt.getOptarg();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'V':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.out.println(Info.getFullVersion());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(0);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'v':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setVerbose(true);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LoggerUtil.setBaseConsoleLogLevel(Level.INFO);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray case 'W':
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye configFilename = getopt.getOptarg();
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye break;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye case 'w': {
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal String webapp = getopt.getOptarg();
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if (webapp.charAt(0) != '/' && !webapp.startsWith("http")) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye webapp = "/" + webapp;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye if (webapp.endsWith("/")) {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye cfg.setUrlPrefix(webapp + "s?");
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye } else {
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye cfg.setUrlPrefix(webapp + "/s?");
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye break;
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye case 'X':
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setUserPageSuffix(getopt.getOptarg());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray break;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal case 'z':
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal try {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal cfg.setScanningDepth(Integer.parseInt(getopt.getOptarg()));
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal } catch (NumberFormatException exp) {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal System.err.println("ERROR: Failed to parse argument to \"-z\": "
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal + exp.getMessage());
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal System.exit(1);
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal break;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal case '?':
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal System.err.println(cmdOptions.getUsage());
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal System.exit(0);
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal break;
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal default:
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal System.err.println("Internal Error - Unimplemented cmdline option: " + (char) cmd);
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal System.exit(1);
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal }
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal List<Class<? extends Repository>> repositoryClasses
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal = RepositoryFactory.getRepositoryClasses();
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal for (Class<? extends Repository> clazz : repositoryClasses) {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal try {
f9e7e93ed37cbcb0a111b6f997bb75d567c31c0bVladimir Kotal Field f = clazz.getDeclaredField("CMD_PROPERTY_KEY");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray Object key = f.get(null);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (key != null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setRepoCmd(clazz.getCanonicalName(),
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.getProperty(key.toString()));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d0767114e1a949e4a42358f5aeaa08590b87cd80Trond Norbye } catch (Exception e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // don't care
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye //logging starts here
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (cfg.isVerbose()) {
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal String fn = LoggerUtil.getFileHandlerPattern();
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal if (fn != null) {
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal System.out.println("Logging filehandler pattern: " + fn);
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal }
c276b1ec9722ee95a86a4a381b39c5f405fc1cc4Vladimir Kotal }
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye if (cfg.isHistoryCacheInDB()) {
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye // The default database driver is Derby's client driver.
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye if (databaseDriver == null) {
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye databaseDriver = DERBY_CLIENT_DRIVER;
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye }
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // The default URL depends on the database driver.
4e854c69a0484765dcd27b0e837898c8b6969beaTrond Norbye if (databaseURL == null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray StringBuilder defaultURL = new StringBuilder();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray defaultURL.append("jdbc:derby:");
a3a5f5c0500064f4c6ac3658b1e3e4d838912329Lubos Kosco if (databaseDriver.equals(DERBY_EMBEDDED_DRIVER)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray defaultURL.append(cfg.getDataRoot())
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray .append(File.separator);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray defaultURL.append("//localhost/");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray defaultURL.append("cachedb;create=true");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray databaseURL = defaultURL.toString();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setDatabaseDriver(databaseDriver);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setDatabaseUrl(databaseURL);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // automatically allow symlinks that are directly in source root
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String file = cfg.getSourceRoot();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (file != null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File sourceRootFile = new File(file);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray File[] projectDirs = sourceRootFile.listFiles();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (projectDirs != null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (File projectDir : projectDirs) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (!projectDir.getCanonicalPath().equals(projectDir.getAbsolutePath())) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray allowedSymlinks.add(projectDir.getAbsolutePath());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray allowedSymlinks.addAll(cfg.getAllowedSymlinks());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray cfg.setAllowedSymlinks(allowedSymlinks);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Assemble the unprocessed command line arguments (possibly
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // a list of paths). This will be used to perform more fine
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // grained checking in invalidateRepositories().
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray int optind = getopt.getOptind();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (optind != -1) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray while (optind < argv.length) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray subFilesList.add(cfg.getSourceRoot() + argv[optind++]);
340e2c0d70fade14c720931c87652727b941c167Vladimir Kotal }
340e2c0d70fade14c720931c87652727b941c167Vladimir Kotal }
fe967af3e58b6c8feaecf15b06fc1d5401b07914Lubos Kosco
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Set updated configuration in RuntimeEnvironment.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray RuntimeEnvironment env = RuntimeEnvironment.getInstance();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray env.setConfiguration(cfg, subFilesList);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray /*
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * Add paths to directories under source root. If projects
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * are enabled the path should correspond to a project because
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * project path is necessary to correctly set index directory
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * (otherwise the index files will end up in index data root
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * directory and not per project data root directory).
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * For the check we need to have 'env' already set.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray */
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (String path : subFilesList) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String srcPath=env.getSourceRootPath();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (srcPath==null) { System.err.println("Error getting source root from environment. Exiting.");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray path = path.substring(srcPath.length());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (env.hasProjects()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // The paths need to correspond to a project.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (Project.getProject(path) != null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray subFiles.add(path);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println("The path " + path
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray + " does not correspond to a project");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray subFiles.add(path);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (!subFilesList.isEmpty() && subFiles.isEmpty()) {
83dcb435c5eeeb8d0d0d906f5d25a1cb1db5c40bLubos Kosco System.err.println("None of the paths were added, exiting");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Issue a warning when JDBC is used with renamed file handling.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // This causes heavy slowdown when used with JavaDB (issue #774).
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (env.isHandleHistoryOfRenamedFiles() && cfg.isHistoryCacheInDB()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.out.println("History stored in DB and renamed file "
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray + "handling is on - possible performance degradation");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Get history first.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray getInstance().prepareIndexer(env, searchRepositories, addProjects,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray defaultProject, configFilename, refreshHistory,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray listFiles, createDict, subFiles, repositories,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray zapCache, listRepos);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (listRepos || !zapCache.isEmpty()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray return;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // And now index it all.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (runIndex || (optimizedChanged && env.isOptimizeDatabase())) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray IndexChangedListener progress = new DefaultIndexChangedListener();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray getInstance().doIndexerExecution(update, noThreads, subFiles,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray progress);
340e2c0d70fade14c720931c87652727b941c167Vladimir Kotal }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Finally send new configuration to the web application.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray getInstance().sendToConfigHost(env, configHost);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (IndexerException ex) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.SEVERE, "Exception running indexer", ex);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println(cmdOptions.getUsage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (Throwable e) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.err.println("Exception: " + e.getLocalizedMessage());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.SEVERE, "Unexpected Exception", e);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.exit(1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } finally {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray stats.report(LOGGER);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray /*
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * This is the first phase of the indexing where history cache is being
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * generated for repositories (at least for those which support getting
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray * history per directory).
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray *
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal * PMD wants us to use length() > 0 && charAt(0) instead of startsWith()
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal * for performance. We prefer clarity over performance here, so silence it.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray */
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray @SuppressWarnings("PMD.SimplifyStartsWith")
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray public void prepareIndexer(RuntimeEnvironment env,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean searchRepositories,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean addProjects,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String defaultProject,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String configFilename,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean refreshHistory,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean listFiles,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean createDict,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray List<String> subFiles,
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal List<String> repositories,
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal List<String> zapCache,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean listRepoPaths) throws IndexerException, IOException {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (env.getDataRootPath() == null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new IndexerException("ERROR: Please specify a DATA ROOT path");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (env.getSourceRootFile() == null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new IndexerException("ERROR: please specify a SRC_ROOT with option -s !");
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (zapCache.isEmpty() && !env.validateExuberantCtags()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new IndexerException("Didn't find Exuberant Ctags");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (zapCache == null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray throw new IndexerException("Internal error, zapCache shouldn't be null");
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (searchRepositories || listRepoPaths || !zapCache.isEmpty()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.INFO, "Scanning for repositories...");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray long start = System.currentTimeMillis();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (refreshHistory == true) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray HistoryGuru.getInstance().addRepositories(env.getSourceRootPath());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray long time = (System.currentTimeMillis() - start) / 1000;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.INFO, "Done scanning for repositories ({0}s)", time);
578be34fc3aceb9831553e8611f8d5d59b711c3cVladimir Kotal if (listRepoPaths || !zapCache.isEmpty()) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal List<RepositoryInfo> repos = env.getRepositories();
578be34fc3aceb9831553e8611f8d5d59b711c3cVladimir Kotal String prefix = env.getSourceRootPath();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (listRepoPaths) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (repos.isEmpty()) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal System.out.println("No repositories found.");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray return;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.out.println("Repositories in " + prefix + ":");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (RepositoryInfo info : env.getRepositories()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String dir = info.getDirectoryName();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray System.out.println(dir.substring(prefix.length()));
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (!zapCache.isEmpty()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray HashSet<String> toZap = new HashSet<>(zapCache.size() << 1);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray boolean all = false;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (String repo : zapCache) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if ("*".equals(repo)) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal all = true;
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal break;
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (repo.startsWith(prefix)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray repo = repo.substring(prefix.length());
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray toZap.add(repo);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (all) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray toZap.clear();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray for (RepositoryInfo info : env.getRepositories()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray toZap.add(info.getDirectoryName()
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray .substring(prefix.length()));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray try {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray HistoryGuru.getInstance().removeCache(toZap);
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray } catch (HistoryException e) {
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray LOGGER.log(Level.WARNING, "Clearing history cache failed: {0}", e.getLocalizedMessage());
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray }
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray }
c577d2f6c082eaff9af5bc997d12f3d3bcef537cPeter Bray return;
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco }
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco }
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal if (addProjects) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal File files[] = env.getSourceRootFile().listFiles();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal List<Project> projects = env.getProjects();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal // Keep a copy of the old project list so that we can preserve
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal // the customization of existing projects.
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal Map<String, Project> oldProjects = new HashMap<>();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal for (Project p : projects) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal oldProjects.put(p.getPath(), p);
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal }
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal projects.clear();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal // Add a project for each top-level directory in source root.
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal for (File file : files) {
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal String name = file.getName();
83439b4ed8fe40097dc3f2c05168d26bd7926159Vladimir Kotal String path = "/" + name;
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco if (oldProjects.containsKey(path)) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // This is an existing object. Reuse the old project,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // possibly with customizations, instead of creating a
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // new with default values.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray projects.add(oldProjects.get(path));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if (!name.startsWith(".") && file.isDirectory()) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Found a new directory with no matching project, so
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco // create a new project with default properties.
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray Project p = new Project();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray p.setDescription(name);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray p.setPath(path);
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco p.setTabSize(env.getConfiguration().getTabSize());
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco projects.add(p);
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco }
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco }
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco // The projects should be sorted...
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco Collections.sort(projects, new Comparator<Project>() {
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal @Override
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal public int compare(Project p1, Project p2) {
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco String s1 = p1.getDescription();
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco String s2 = p2.getDescription();
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco int ret;
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco if (s1 == null) {
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal ret = (s2 == null) ? 0 : 1;
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal } else {
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco ret = s1.compareTo(s2);
3aa0947feb67d3e8292d84776638be98dd97fdc3Lubos Kosco }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray return ret;
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray });
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray }
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco if (defaultProject != null) {
c842732324ee4c74ede17887ad1f0dcdc4364a2cLubos Kosco for (Project p : env.getProjects()) {
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (p.getPath().equals(defaultProject)) {
70a0fa770eb06713d8ebf91093102044bc5799e0Lubos Kosco env.setDefaultProject(p);
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal break;
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal }
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal if (configFilename != null) {
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal LOGGER.log(Level.INFO, "Writing configuration to {0}", configFilename);
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal env.writeConfiguration(new File(configFilename));
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal LOGGER.info("Done...");
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
0b2998be561e7bf5e3479d686a5af36f712b0d9aVladimir Kotal
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray if (refreshHistory) {
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco if (repositories != null && !repositories.isEmpty()) {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco LOGGER.log(Level.INFO, "Generating history cache for specified repositories ...");
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco HistoryGuru.getInstance().createCache(repositories);
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco LOGGER.info("Done...");
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal } else {
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal LOGGER.log(Level.INFO, "Generating history cache for all repositories ...");
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal HistoryGuru.getInstance().createCache();
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal LOGGER.info("Done...");
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal if (listFiles) {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco IndexDatabase.listAllFiles(subFiles);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal if (createDict) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray IndexDatabase.listFrequentTokens(subFiles);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal /*
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal * This is the second phase of the indexer which generates Lucene index
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal * by passing source code files through Exuberant ctags, generating xrefs
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal * and storing data from the source files in the index (along with history,
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal * if any).
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal */
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal public void doIndexerExecution(final boolean update, int noThreads, List<String> subFiles,
caf0d2e1c473e03780acaa86e2a73ff953802a8bVladimir Kotal IndexChangedListener progress)
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal throws IOException {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal Statistics elapsed = new Statistics();
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal RuntimeEnvironment env = RuntimeEnvironment.getInstance().register();
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal LOGGER.info("Starting indexing");
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal ExecutorService executor = Executors.newFixedThreadPool(noThreads);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (subFiles == null || subFiles.isEmpty()) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (update) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal IndexDatabase.updateAll(executor, progress);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if (env.isOptimizeDatabase()) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray IndexDatabase.optimizeAll(executor);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } else {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal List<IndexDatabase> dbs = new ArrayList<>();
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal for (String path : subFiles) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal Project project = Project.getProject(path);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (project == null && env.hasProjects()) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal LOGGER.log(Level.WARNING, "Could not find a project for \"{0}\"", path);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } else {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal IndexDatabase db;
433943adf7f151e57fa7b81e95ad01cd86367badVladimir Kotal if (project == null) {
433943adf7f151e57fa7b81e95ad01cd86367badVladimir Kotal db = new IndexDatabase();
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } else {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal db = new IndexDatabase(project);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray int idx = dbs.indexOf(db);
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (idx != -1) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray db = dbs.get(idx);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (db.addDirectory(path)) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal if (idx == -1) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal dbs.add(db);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal } else {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal LOGGER.log(Level.WARNING, "Directory does not exist \"{0}\"", path);
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal }
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal for (final IndexDatabase db : dbs) {
bc5565fc58603964988b42b6aee40e246f35d94fVladimir Kotal final boolean optimize = env.isOptimizeDatabase();
cd348e325366620fe047edcc849e3c9424828599Peter Bray db.addIndexChangedListener(progress);
cd348e325366620fe047edcc849e3c9424828599Peter Bray executor.submit(new Runnable() {
cd348e325366620fe047edcc849e3c9424828599Peter Bray @Override
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray public void run() {
5762c9f28c2246777be0e9d49cb29d9c0f49146dLubos Kosco try {
cd348e325366620fe047edcc849e3c9424828599Peter Bray if (update) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray db.update();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else if (optimize) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray db.optimize();
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray } catch (Throwable e) {
cd348e325366620fe047edcc849e3c9424828599Peter Bray LOGGER.log(Level.SEVERE, "An error occured while "
cd348e325366620fe047edcc849e3c9424828599Peter Bray + (update ? "updating" : "optimizing")
d280c5e286f5b98be13237f52281ae5afdcf51b9Peter Bray + " index", e);
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray }
cd348e325366620fe047edcc849e3c9424828599Peter Bray });
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco }
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco executor.shutdown();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray while (!executor.isTerminated()) {
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco try {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // Wait forever
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray executor.awaitTermination(999, TimeUnit.DAYS);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (InterruptedException exp) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.WARNING, "Received interrupt while waiting for executor to finish", exp);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco try {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // It can happen that history index is not done in prepareIndexer()
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray // but via db.update() above in which case we must make sure the
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal // thread pool for renamed file handling is destroyed.
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal RuntimeEnvironment.destroyRenamedHistoryExecutor();
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (InterruptedException ex) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.SEVERE,
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray "destroying of renamed thread pool failed", ex);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray elapsed.report(LOGGER, "Done indexing data of all repositories");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray public void sendToConfigHost(RuntimeEnvironment env, String configHost) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (configHost != null) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray String[] cfg = configHost.split(":");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.INFO, "Send configuration to: {0}", configHost);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray if (cfg.length == 2) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray try {
561ec0545f30e44833b6def5168abbd3ab5cf65aVladimir Kotal InetAddress host = InetAddress.getByName(cfg[0]);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray env.writeConfiguration(host, Integer.parseInt(cfg[1]));
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } catch (NumberFormatException | IOException ex) {
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.log(Level.SEVERE, "Failed to send configuration to "
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray + configHost + " (is web application server running with opengrok deployed?)", ex);
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray } else {
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal LOGGER.severe("Syntax error: ");
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal for (String s : cfg) {
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal LOGGER.log(Level.SEVERE, "[{0}]", s);
56d93b0c761868f813ac0bc0b5bc21a7a9fefd89Vladimir Kotal }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray LOGGER.info("Configuration update routine done, check log output for errors.");
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
d2a02e104622a26dd90fa88f4f17188f2039809fPeter Bray }
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco
0ca9a2c194523c517c3aafe5758e217ac88d6baaLubos Kosco private Indexer() {
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco }
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco}
477c09a2656e6a2c1075425ad81e61d594164fa9Lubos Kosco