blob: 287f338ea9c21d6747272ef07dc4414e06570ef3 [file] [log] [blame]
//
// ========================================================================
// Copyright (c) 1995-2016 Mort Bay Consulting Pty. Ltd.
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.opensource.org/licenses/apache2.0.php
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
//
package org.eclipse.jetty.start.util;
import java.io.File;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.PathMatcher;
import java.nio.file.StandardCopyOption;
import java.util.regex.Pattern;
import org.eclipse.jetty.toolchain.test.FS;
import org.eclipse.jetty.toolchain.test.MavenTestingUtils;
/**
* Utility class to rebuild the src/test/resources/dist-home from the active build tree.
* <p>
* Not really meant to be run with each build. Nor is it a good idea to attempt to do that (as this would introduce a dependency from jetty-start ->
* jetty-distribution which is a circular dependency)
*/
public class RebuildTestResources
{
public static final String JETTY_VERSION = "9.3";
public static void main(String[] args)
{
File realDistHome = MavenTestingUtils.getProjectDir("../jetty-distribution/target/distribution");
File outputDir = MavenTestingUtils.getTestResourceDir("dist-home");
try
{
new RebuildTestResources(realDistHome,outputDir).rebuild();
}
catch (Throwable t)
{
t.printStackTrace();
}
}
private static interface FileCopier
{
public void copy(Path from, Path to) throws IOException;
}
private static class NormalFileCopier implements FileCopier
{
@Override
public void copy(Path from, Path to) throws IOException
{
Files.copy(from,to,StandardCopyOption.REPLACE_EXISTING);
}
}
private static class TouchFileCopier implements FileCopier
{
@Override
public void copy(Path from, Path to) throws IOException
{
if(Files.exists(to))
{
// skip if it exists
return;
}
Files.createFile(to);
}
}
private static interface Renamer
{
public String getName(Path path);
}
private static class NoRenamer implements Renamer
{
@Override
public String getName(Path path)
{
return path.getFileName().toString();
}
}
private static class RegexRenamer implements Renamer
{
private final Pattern pat;
private final String replacement;
public RegexRenamer(String regex, String replacement)
{
this.pat = Pattern.compile(regex);
this.replacement = replacement;
}
@Override
public String getName(Path path)
{
String origName = path.getFileName().toString();
return pat.matcher(origName).replaceAll(replacement);
}
}
private final Path destDir;
private final Path srcDir;
public RebuildTestResources(File realDistHome, File outputDir) throws IOException
{
this.srcDir = realDistHome.toPath().toRealPath();
this.destDir = outputDir.toPath();
}
private void copyLibs() throws IOException
{
System.out.println("Copying libs (lib dir) ...");
Path libsDir = destDir.resolve("lib");
FS.ensureDirExists(libsDir.toFile());
PathMatcher matcher = getPathMatcher("glob:**.jar");
Renamer renamer = new RegexRenamer("-9\\.[0-9.]*(v[0-9-]*)?(-SNAPSHOT)?(RC[0-9])?(M[0-9])?","-" + JETTY_VERSION);
FileCopier copier = new TouchFileCopier();
copyDir(srcDir.resolve("lib"),libsDir,matcher,renamer,copier);
}
private void copyModules() throws IOException
{
System.out.println("Copying modules ...");
Path modulesDir = destDir.resolve("modules");
FS.ensureDirExists(modulesDir.toFile());
PathMatcher matcher = getPathMatcher("glob:**.mod");
Renamer renamer = new NoRenamer();
FileCopier copier = new NormalFileCopier();
copyDir(srcDir.resolve("modules"),modulesDir,matcher,renamer,copier);
}
private void copyXmls() throws IOException
{
System.out.println("Copying xmls (etc dir) ...");
Path xmlDir = destDir.resolve("etc");
FS.ensureDirExists(xmlDir.toFile());
PathMatcher matcher = getPathMatcher("glob:**.xml");
Renamer renamer = new NoRenamer();
FileCopier copier = new TouchFileCopier();
copyDir(srcDir.resolve("etc"),xmlDir,matcher,renamer,copier);
}
private void rebuild() throws IOException
{
copyModules();
copyLibs();
copyXmls();
System.out.println("Done");
}
private PathMatcher getPathMatcher(String pattern)
{
return FileSystems.getDefault().getPathMatcher(pattern);
}
private void copyDir(Path from, Path to, PathMatcher fileMatcher, Renamer renamer, FileCopier copier) throws IOException
{
Files.createDirectories(to);
for (Path path : Files.newDirectoryStream(from))
{
String name = renamer.getName(path);
Path dest = to.resolve(name);
if (Files.isDirectory(path))
{
copyDir(path,dest,fileMatcher,renamer,copier);
}
else
{
if (fileMatcher.matches(path))
{
copier.copy(path,dest);
}
}
}
}
}