/* * Copyright 2014 Bernd Vogt and others. * * Licensed 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.sourcepit.b2.internal.maven; import static org.apache.commons.io.IOUtils.copy; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.sourcepit.b2.files.ModuleDirectory.FLAG_DERIVED; import static org.sourcepit.b2.files.ModuleDirectory.FLAG_FORBIDDEN; import static org.sourcepit.b2.files.ModuleDirectory.FLAG_HIDDEN; import static org.sourcepit.common.utils.io.IO.fileOut; import static org.sourcepit.common.utils.io.IO.write; import static org.sourcepit.common.utils.path.PathUtils.getRelativePath; import java.io.ByteArrayInputStream; import java.io.File; import java.io.OutputStream; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.maven.model.Model; import org.junit.Rule; import org.junit.Test; import org.sourcepit.common.testing.Environment; import org.sourcepit.common.testing.Workspace; import org.sourcepit.common.utils.io.Write.ToStream; import org.sourcepit.common.utils.props.LinkedPropertiesMap; import org.sourcepit.common.utils.props.PropertiesSource; import com.google.common.collect.HashMultimap; import com.google.common.collect.LinkedHashMultimap; import com.google.common.collect.Multimap; public class MavenProjectFileFlagsProviderTest { private final Environment env = Environment.get("env-test.properties"); @Rule public Workspace ws = newWorkspace(); protected Workspace newWorkspace() { return new Workspace(new File(env.getBuildDir(), "ws"), false); } @Test public void testCollectMavenModels() { init(ws.getRoot()); final File basePomFile = new File(ws.getRoot(), "pom.xml"); final Map<File, Model> fileToModelMap = new HashMap<File, Model>(); final Multimap<File, File> pomToModuleDirectoryMap = HashMultimap.create(); MavenFileFlagsProvider.collectMavenModels(basePomFile, fileToModelMap, pomToModuleDirectoryMap); assertEquals(6, fileToModelMap.size()); assertEquals(2, pomToModuleDirectoryMap.asMap().size()); Collection<File> moduleDirectory = pomToModuleDirectoryMap.get(basePomFile); assertEquals(3, moduleDirectory.size()); moduleDirectory = pomToModuleDirectoryMap.get(new File(ws.getRoot(), "3/foo.xml")); assertEquals(2, moduleDirectory.size()); } @Test public void testGetFileFlags() { final File moduleDir = ws.getRoot(); init(moduleDir); final MavenFileFlagsProvider provider = new MavenFileFlagsProvider(); final PropertiesSource properties = new LinkedPropertiesMap(); final Map<File, Integer> fileFlags = provider.getAlreadyKnownFileFlags(moduleDir, properties); assertEquals(12, fileFlags.size()); assertTrue(fileFlags.containsKey(new File(moduleDir, "pom.xml"))); for (Entry<File, Integer> flags : fileFlags.entrySet()) { String relativePath = flags.getKey().getAbsolutePath().replace(moduleDir.getAbsolutePath(), ""); if (relativePath.endsWith("pom.xml")) { assertEquals(FLAG_DERIVED | FLAG_HIDDEN, flags.getValue().intValue()); } else if (relativePath.contains("target")) // not quite exact { assertEquals(FLAG_FORBIDDEN | FLAG_HIDDEN, flags.getValue().intValue()); } } } private static void init(File baseDir) { final Multimap<File, File> parentToModules = LinkedHashMultimap.create(); final File basePomFile = new File(baseDir, "pom.xml"); parentToModules.put(basePomFile, new File(baseDir, "1")); parentToModules.put(basePomFile, new File(baseDir, "2/pom.xml")); parentToModules.put(basePomFile, new File(baseDir, "3/foo.xml")); parentToModules.put(new File(baseDir, "3/foo.xml"), new File(baseDir, "3/1/bar.xml")); parentToModules.put(new File(baseDir, "3/foo.xml"), new File(baseDir, "3/1/1/")); final Set<File> all = new HashSet<File>(); for (Entry<File, Collection<File>> entry : parentToModules.asMap().entrySet()) { final File parent = entry.getKey(); all.add(parent); final Collection<File> modules = entry.getValue(); all.addAll(modules); final StringBuilder sb = new StringBuilder(); sb.append("<project>\n"); sb.append("<modules>\n"); for (File module : modules) { sb.append("<module>"); sb.append(getRelativePath(module, parent, "/")); sb.append("</module>\n"); } sb.append("</modules>\n"); sb.append("</project>"); String content = sb.toString(); writePom(parent, content); } for (File file : all) { if (!file.exists()) { writePom(file, "<project />"); } } } private static void writePom(File file, String content) { file = file.getName().endsWith(".xml") ? file : new File(file, "pom.xml"); write(new ToStream<String>() { @Override public void write(OutputStream output, String content) throws Exception { copy(new ByteArrayInputStream(content.getBytes("UTF-8")), output); } }, fileOut(file), content); } }