/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 org.apache.ignite.internal.util; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; import org.apache.ignite.internal.util.lang.GridTuple3; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.U; /** * Finds configuration files located in {@code IGNITE_HOME} folder * and its subfolders. */ public final class GridConfigurationFinder { /** Path to default configuration file. */ private static final String DFLT_CFG = "config" + File.separator + "default-config.xml"; /** Prefix for questionable paths. */ public static final String Q_PREFIX = "(?)"; /** */ private static final int Q_PREFIX_LEN = Q_PREFIX.length(); /** * Ensure singleton. */ private GridConfigurationFinder() { // no-op } /** * Lists paths to all Ignite configuration files located in IGNITE_HOME with their * last modification timestamps. * * @return Collection of configuration files and their last modification timestamps. * @throws IOException Thrown in case of any IO error. */ public static List<GridTuple3<String, Long, File>> getConfigFiles() throws IOException { return getConfigFiles(new File(U.getIgniteHome())); } /** * Lists paths to all Ignite configuration files located in given directory with their * last modification timestamps. * * @param dir Directory. * @return Collection of configuration files and their last modification timestamps. * @throws IOException Thrown in case of any IO error. */ private static List<GridTuple3<String, Long, File>> getConfigFiles(File dir) throws IOException { assert dir != null; LinkedList<GridTuple3<String, Long, File>> lst = listFiles(dir); // Sort. Collections.sort(lst, new Comparator<GridTuple3<String, Long, File>>() { @Override public int compare(GridTuple3<String, Long, File> t1, GridTuple3<String, Long, File> t2) { String s1 = t1.get1(); String s2 = t2.get1(); String q1 = s1.startsWith(Q_PREFIX) ? s1.substring(Q_PREFIX_LEN + 1) : s1; String q2 = s2.startsWith(Q_PREFIX) ? s2.substring(Q_PREFIX_LEN + 1) : s2; return q1.compareTo(q2); } }); File dflt = new File(U.getIgniteHome() + File.separator + DFLT_CFG); if (dflt.exists()) lst.addFirst(F.t(DFLT_CFG, dflt.lastModified(), dflt)); return lst; } /** * Lists paths to all Ignite configuration files located in given directory with their * last modification timestamps. * * NOTE: default configuration path will be skipped. * * @param dir Directory. * @return Collection of configuration files and their last modification timestamps. * @throws IOException Thrown in case of any IO error. */ private static LinkedList<GridTuple3<String, Long, File>> listFiles(File dir) throws IOException { assert dir != null; LinkedList<GridTuple3<String, Long, File>> paths = new LinkedList<>(); String[] configs = dir.list(); if (configs != null) for (String name : configs) { File file = new File(dir, name); if (file.isDirectory()) paths.addAll(listFiles(file)); else if (file.getName().endsWith(".xml")) { try (BufferedReader reader = new BufferedReader(new FileReader(file))) { boolean springCfg = false; boolean ggCfg = false; String line; while ((line = reader.readLine()) != null) { if (line.contains("http://www.springframework.org/schema/beans")) springCfg = true; if (line.contains("class=\"org.apache.ignite.configuration.IgniteConfiguration\"")) ggCfg = true; if (springCfg && ggCfg) break; } if (springCfg) { String path = file.getAbsolutePath().substring(U.getIgniteHome().length()); if (path.startsWith(File.separator)) path = path.substring(File.separator.length()); if (!path.equals(DFLT_CFG)) { if (!ggCfg) path = Q_PREFIX + ' ' + path; paths.add(F.t(path, file.lastModified(), file)); } } } } } return paths; } }