/******************************************************************************* * Copyright (c) 2012-2017 Codenvy, S.A. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Codenvy, S.A. - initial API and implementation *******************************************************************************/ package org.eclipse.che.ide.commons; import java.io.File; import java.io.IOException; import java.nio.file.FileSystems; import java.nio.file.FileVisitOption; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.PathMatcher; import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.EnumSet; import java.util.List; import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.file.FileVisitResult.CONTINUE; import static java.nio.file.FileVisitResult.TERMINATE; /** * A smattering of useful methods to work with GWT module descriptor (*.gwt.xml) files. * * @author Artem Zatsarynnyi */ public class GwtXmlUtils { /** Filename suffix used for GWT module XML files. */ public static final String GWT_MODULE_XML_SUFFIX = ".gwt.xml"; private GwtXmlUtils() { } /** * Inherit the specified module name in the provided GWT module descriptor. * * @param path * GWT module descriptor * @param inheritableModuleLogicalName * logical name of the GWT module to inherit * @throws java.io.IOException * error occurred while reading or writing content of file */ public static void inheritGwtModule(Path path, String inheritableModuleLogicalName) throws IOException { final String inheritsString = " <inherits name='" + inheritableModuleLogicalName + "'/>"; List<String> content = Files.readAllLines(path, UTF_8); // insert custom module as last 'inherits' entry int i = 0, lastInheritsLine = 0; for (String str : content) { i++; if (str.contains("<inherits")) { lastInheritsLine = i; } } content.add(lastInheritsLine, inheritsString); Files.write(path, content, UTF_8); } /** * Returns logical name of the first found GWT module. * * @param folder * path to folder that contains project sources * @return GWT module logical name * @throws java.io.IOException * if an I/O error is thrown while finding GWT module descriptor * @throws IllegalArgumentException * if GWT module descriptor not found */ public static String detectGwtModuleLogicalName(Path folder) throws IOException { final String resourcesDir = folder.toString(); Finder finder = new Finder("*" + GWT_MODULE_XML_SUFFIX); Files.walkFileTree(folder, EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, finder); if (finder.getFirstMatchedFile() == null) { throw new IllegalArgumentException("GWT module descriptor (*.gwt.xml) not found."); } String filePath = finder.getFirstMatchedFile().toString(); filePath = filePath.substring(filePath.indexOf(resourcesDir) + resourcesDir.length() + 1, filePath.length() - GWT_MODULE_XML_SUFFIX.length()); return filePath.replace(File.separatorChar, '.'); } /** A {@code FileVisitor} that finds first file that match the specified pattern. */ private static class Finder extends SimpleFileVisitor<Path> { final PathMatcher matcher; Path firstMatchedFile; Finder(String pattern) { matcher = FileSystems.getDefault().getPathMatcher("glob:" + pattern); } /** {@inheritDoc} */ @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { Path fileName = file.getFileName(); if (fileName != null && matcher.matches(fileName)) { firstMatchedFile = file; return TERMINATE; } return CONTINUE; } /** Returns the first matched {@link java.nio.file.Path}. */ Path getFirstMatchedFile() { return firstMatchedFile; } } }