/* * 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.netbeans.modules.maven.newproject; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Enumeration; import java.util.List; import java.util.Map; import java.util.Properties; import java.util.regex.Pattern; import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectManager; import org.netbeans.api.templates.CreateDescriptor; import org.netbeans.api.templates.CreateFromTemplateHandler; import org.netbeans.modules.maven.api.archetype.Archetype; import org.netbeans.modules.maven.api.archetype.ArchetypeWizards; import org.netbeans.modules.maven.api.archetype.ProjectInfo; import org.netbeans.spi.project.ActionProvider; import org.netbeans.spi.project.ui.support.CommonProjectActions; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.NbBundle; import org.openide.util.NbCollections; import org.openide.util.lookup.ServiceProvider; @ServiceProvider(service = CreateFromTemplateHandler.class, position = 5000) public final class ArchetypeTemplateHandler extends CreateFromTemplateHandler { public ArchetypeTemplateHandler() { } @Override protected boolean accept(CreateDescriptor desc) { return desc.getTemplate().hasExt("archetype"); // NOI18N } @NbBundle.Messages({ "MSG_NoVersion=No version attribute specified for the Maven project", "MSG_NoArtifactId=No artifactId attribute specified for the Maven project", "MSG_NoGroupId=No groupId attribute specified for the Maven project", }) @Override protected List<FileObject> createFromTemplate(CreateDescriptor desc) throws IOException { Properties archetype = new Properties(); try (InputStream is = desc.getTemplate().getInputStream()) { archetype.load(is); } mergeProperties(desc, archetype); String version = archetype.getProperty("version"); // NOI18N if (version == null) { throw new IOException(Bundle.MSG_NoVersion()); } String artifactId = archetype.getProperty("artifactId"); // NOI18N if (version == null) { throw new IOException(Bundle.MSG_NoArtifactId()); } String groupId = archetype.getProperty("groupId"); // NOI18N if (version == null) { throw new IOException(Bundle.MSG_NoGroupId()); } String packageName = archetype.getProperty("package"); // NOI18N ProjectInfo pi = new ProjectInfo(groupId, artifactId, version, packageName); Archetype arch = new Archetype(); arch.setArtifactId(archetype.getProperty("archetypeArtifactId")); // NOI18N arch.setGroupId(archetype.getProperty("archetypeGroupId")); // NOI18N arch.setVersion(archetype.getProperty("archetypeVersion")); // NOI18N File projDir = desc.getValue(CommonProjectActions.PROJECT_PARENT_FOLDER); if (projDir == null) { projDir = FileUtil.toFile(desc.getTarget()).getParentFile(); } if (projDir == null) { throw new IOException(CommonProjectActions.PROJECT_PARENT_FOLDER + " not specified"); } Map<String, String> filteredProperties = NbCollections.checkedMapByFilter(archetype, String.class, String.class, false); final File toCreate = new File(projDir, pi.artifactId); ArchetypeWizards.createFromArchetype(toCreate, pi, arch, filteredProperties, true); FileObject fo = FileUtil.toFileObject(toCreate); List<FileObject> fos = new ArrayList<>(); collectPomDirs(fo, fos); final String toOpen = archetype.getProperty("archetypeOpen"); // NOI18N if (toOpen != null) { collectFiles(fo, fos, toOpen.split(",")); // NOI18N } if ("true".equals(archetype.getProperty("archetypeBuild"))) { // NOI18N Project prj = ProjectManager.getDefault().findProject(fo); ActionProvider ap = prj == null ? null : prj.getLookup().lookup(ActionProvider.class); if (ap != null) { ap.invokeAction(ActionProvider.COMMAND_BUILD, prj.getLookup()); } } return fos; } static void mergeProperties(CreateDescriptor desc, Properties archetype) { putAllTo(desc.getParameters(), archetype); Map<String,?> wizardParams = desc.getValue("wizard"); // NOI18N if (wizardParams != null) { putAllTo(wizardParams, archetype); } } private static void collectPomDirs(FileObject dir, Collection<? super FileObject> found) { if (dir == null || !dir.isFolder()) { return; } if (dir.getFileObject("pom.xml") == null) { return; } found.add(dir); for (FileObject f : dir.getChildren()) { collectPomDirs(f, found); } } static void collectFiles(FileObject root, Collection<? super FileObject> found, String... includes) { Pattern[] check = new Pattern[includes.length]; for (int i = 0; i < check.length; i++) { check[i] = Pattern.compile(includes[i]); } Enumeration<? extends FileObject> en = root.getChildren(true); while (en.hasMoreElements()) { FileObject fo = en.nextElement(); String relPath = FileUtil.getRelativePath(root, fo); if (relPath == null) { continue; } for (Pattern p : check) { if (p.matcher(relPath).matches()) { found.add(fo); break; } } } } private static void putAllTo(Map<String, ?> parameters, Properties archetype) { for (Map.Entry<String, ?> entry : parameters.entrySet()) { if (entry.getValue() != null) { archetype.put(entry.getKey(), entry.getValue()); } } } }