| // |
| // ======================================================================== |
| // Copyright (c) 1995-2017 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.BufferedReader; |
| import java.io.BufferedWriter; |
| import java.io.IOException; |
| import java.nio.charset.StandardCharsets; |
| import java.nio.file.FileVisitOption; |
| import java.nio.file.Files; |
| import java.nio.file.Path; |
| import java.nio.file.PathMatcher; |
| import java.nio.file.StandardOpenOption; |
| import java.util.ArrayList; |
| import java.util.Collections; |
| import java.util.List; |
| import java.util.Locale; |
| import java.util.Set; |
| import java.util.regex.Matcher; |
| import java.util.regex.Pattern; |
| |
| import org.eclipse.jetty.start.PathFinder; |
| import org.eclipse.jetty.start.PathMatchers; |
| import org.eclipse.jetty.start.Utils; |
| import org.eclipse.jetty.toolchain.test.MavenTestingUtils; |
| |
| /** |
| * Simple utility to scan all of the mod files and correct references |
| * to maven central URL in [files] sections to the new maven:// syntax |
| */ |
| public class CorrectMavenCentralRefs |
| { |
| public static void main(String[] args) |
| { |
| Path buildRoot = MavenTestingUtils.getProjectDir("..").toPath(); |
| buildRoot = buildRoot.normalize().toAbsolutePath(); |
| |
| // Test to make sure we are in right directory |
| Path rootPomXml = buildRoot.resolve("pom.xml"); |
| Path distPomXml = buildRoot.resolve("jetty-distribution/pom.xml"); |
| if (!Files.exists(rootPomXml) || !Files.exists(distPomXml)) |
| { |
| System.err.println("Not build root directory: " + buildRoot); |
| System.exit(-1); |
| } |
| |
| try |
| { |
| new CorrectMavenCentralRefs().fix(buildRoot); |
| } |
| catch (Throwable t) |
| { |
| t.printStackTrace(System.err); |
| } |
| } |
| |
| public void fix(Path buildRoot) throws IOException |
| { |
| // Find all of the *.mod files |
| PathFinder finder = new PathFinder(); |
| finder.setFileMatcher("glob:**/*.mod"); |
| finder.setBase(buildRoot); |
| |
| // Matcher for target directories |
| PathMatcher targetMatcher = PathMatchers.getMatcher("glob:**/target/**"); |
| PathMatcher testMatcher = PathMatchers.getMatcher("glob:**/test/**"); |
| |
| System.out.printf("Walking path: %s%n",buildRoot); |
| Set<FileVisitOption> options = Collections.emptySet(); |
| Files.walkFileTree(buildRoot,options,30,finder); |
| |
| System.out.printf("Found: %d hits%n",finder.getHits().size()); |
| int count = 0; |
| for (Path path : finder.getHits()) |
| { |
| if (Files.isDirectory(path)) |
| { |
| // skip |
| continue; |
| } |
| |
| if (targetMatcher.matches(path)) |
| { |
| // skip |
| continue; |
| } |
| |
| if (testMatcher.matches(path)) |
| { |
| // skip |
| continue; |
| } |
| |
| if (processModFile(path)) |
| { |
| count++; |
| } |
| } |
| |
| System.out.printf("Processed %,d modules",count); |
| } |
| |
| private boolean processFileRefs(List<String> lines) |
| { |
| Pattern section = Pattern.compile("\\s*\\[([^]]*)\\]\\s*"); |
| int filesStart = -1; |
| int filesEnd = -1; |
| |
| // Find [files] section |
| String sectionId = null; |
| int lineCount = lines.size(); |
| for (int i = 0; i < lineCount; i++) |
| { |
| String line = lines.get(i).trim(); |
| |
| Matcher sectionMatcher = section.matcher(line); |
| |
| if (sectionMatcher.matches()) |
| { |
| sectionId = sectionMatcher.group(1).trim().toUpperCase(Locale.ENGLISH); |
| } |
| else |
| { |
| if ("FILES".equals(sectionId)) |
| { |
| if (filesStart < 0) |
| { |
| filesStart = i; |
| } |
| filesEnd = i; |
| } |
| } |
| } |
| |
| if (filesStart == (-1)) |
| { |
| // no [files] section |
| return false; |
| } |
| |
| // process lines, only in files section |
| int updated = 0; |
| for (int i = filesStart; i <= filesEnd; i++) |
| { |
| String line = lines.get(i); |
| String keyword = "maven.org/maven2/"; |
| int idx = line.indexOf(keyword); |
| if (idx > 0) |
| { |
| int pipe = line.indexOf('|'); |
| String rawpath = line.substring(idx + keyword.length(),pipe); |
| String destpath = line.substring(pipe + 1); |
| |
| String parts[] = rawpath.split("/"); |
| int rev = parts.length; |
| String filename = parts[--rev]; |
| |
| String type = "jar"; |
| int ext = filename.lastIndexOf('.'); |
| if (ext > 0) |
| { |
| type = filename.substring(ext + 1); |
| } |
| String version = parts[--rev]; |
| String artifactId = parts[--rev]; |
| String groupId = Utils.join(parts,0,rev,"."); |
| |
| String classifier = filename.replaceFirst(artifactId + '-' + version,""); |
| classifier = classifier.replaceFirst('.' + type + '$',""); |
| if (Utils.isNotBlank(classifier) && (classifier.charAt(0) == '-')) |
| { |
| classifier = classifier.substring(1); |
| } |
| |
| StringBuilder murl = new StringBuilder(); |
| murl.append("maven://"); |
| murl.append(groupId).append('/'); |
| murl.append(artifactId).append('/'); |
| murl.append(version); |
| if (!"jar".equals(type) || Utils.isNotBlank(classifier)) |
| { |
| murl.append('/').append(type); |
| if (Utils.isNotBlank(classifier)) |
| { |
| murl.append('/').append(classifier); |
| } |
| } |
| |
| lines.set(i,murl.toString()+'|'+destpath); |
| |
| updated++; |
| } |
| } |
| |
| return (updated > 0); |
| } |
| |
| private boolean processModFile(Path path) throws IOException |
| { |
| List<String> lines = readLines(path); |
| if (processFileRefs(lines)) |
| { |
| // the lines are now dirty, save them. |
| System.out.printf("Updating: %s%n",path); |
| saveLines(path,lines); |
| return true; |
| } |
| |
| // no update performed |
| return false; |
| } |
| |
| private List<String> readLines(Path path) throws IOException |
| { |
| List<String> lines = new ArrayList<>(); |
| |
| try (BufferedReader reader = Files.newBufferedReader(path,StandardCharsets.UTF_8)) |
| { |
| String line; |
| while ((line = reader.readLine()) != null) |
| { |
| lines.add(line); |
| } |
| } |
| |
| return lines; |
| } |
| |
| private void saveLines(Path path, List<String> lines) throws IOException |
| { |
| try (BufferedWriter writer = Files.newBufferedWriter(path,StandardCharsets.UTF_8,StandardOpenOption.TRUNCATE_EXISTING)) |
| { |
| for (String line : lines) |
| { |
| writer.write(line); |
| writer.write(System.lineSeparator()); |
| } |
| } |
| } |
| } |