/*
* Copyright 2013 The WicketForge-Team
*
* 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 wicketforge.util;
import com.intellij.CommonBundle;
import com.intellij.codeInsight.CodeInsightBundle;
import com.intellij.ide.fileTemplates.FileTemplate;
import com.intellij.ide.fileTemplates.FileTemplateManager;
import com.intellij.ide.fileTemplates.FileTemplateUtil;
import com.intellij.ide.util.PackageUtil;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.application.Result;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ProjectFileIndex;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.ui.Messages;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.pointers.VirtualFilePointer;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiManager;
import com.intellij.refactoring.PackageWrapper;
import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassesOrPackagesUtil;
import com.intellij.refactoring.util.RefactoringMessageUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import wicketforge.Constants;
import wicketforge.facet.WicketForgeFacet;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
public final class WicketFileUtil {
private WicketFileUtil() {
}
@NotNull
public static VirtualFile[] getResourceRoots(@NotNull Module module) {
// all module source roots
VirtualFile[] result = ModuleRootManager.getInstance(module).getSourceRoots();
// alternate paths
WicketForgeFacet wicketForgeFacet = WicketForgeFacet.getInstance(module);
if (wicketForgeFacet != null) {
List<VirtualFile> alternateFiles = new SmartList<VirtualFile>();
// add all valid alternate paths to list
for (VirtualFilePointer virtualFilePointer : wicketForgeFacet.getResourcePaths()) {
VirtualFile virtualFile = virtualFilePointer.getFile();
if (virtualFile != null && virtualFile.isValid()) {
alternateFiles.add(virtualFile);
}
}
// if we have valid alternate paths
if (!alternateFiles.isEmpty()) {
// add all module source roots and list as new result
alternateFiles.addAll(Arrays.asList(result));
result = alternateFiles.toArray(new VirtualFile[alternateFiles.size()]);
}
}
//
return result;
}
/**
* @param packageName PackageName like 'com.foo.bar'
* @param project Project
* @param module Module
* @return Selected Directory or null if canceled/error
*/
@Nullable
public static PsiDirectory selectTargetDirectory(@NotNull final String packageName, @NotNull final Project project, @NotNull final Module module) {
final PackageWrapper targetPackage = new PackageWrapper(PsiManager.getInstance(project), packageName);
final VirtualFile selectedRoot = new ReadAction<VirtualFile>() {
@Override
protected void run(@NotNull Result<VirtualFile> result) throws Throwable {
VirtualFile[] roots = getResourceRoots(module);
if (roots.length == 0) return;
if (roots.length == 1) {
result.setResult(roots[0]);
} else {
PsiDirectory defaultDir = PackageUtil.findPossiblePackageDirectoryInModule(module, packageName);
result.setResult(MoveClassesOrPackagesUtil.chooseSourceRoot(targetPackage, new SmartList<VirtualFile>(roots), defaultDir));
}
}
}.execute().getResultObject();
if (selectedRoot == null) {
return null;
}
try {
return new WriteCommandAction<PsiDirectory>(project, CodeInsightBundle.message("create.directory.command")) {
@Override
protected void run(@NotNull Result<PsiDirectory> result) throws Throwable {
result.setResult(RefactoringUtil.createPackageDirectoryInSourceRoot(targetPackage, selectedRoot));
}
}.execute().getResultObject();
} catch (IncorrectOperationException e) {
Messages.showMessageDialog(project, e.getMessage(), CommonBundle.getErrorTitle(), Messages.getErrorIcon());
return null;
}
}
/**
* Creates and returns the file for the passed PsiClass.
*
* @param fileName the name of the file to create
* @param directory the directory to create in
* @param templateName the Markup Template name
* @return the created Element from Template
*/
@Nullable
public static PsiElement createFileFromTemplate(@NotNull String fileName, @NotNull PsiDirectory directory, @NotNull String templateName) {
String errorMessage = RefactoringMessageUtil.checkCanCreateFile(directory, fileName);
if (errorMessage != null) {
Messages.showMessageDialog(directory.getProject(), errorMessage, CommonBundle.getErrorTitle(), Messages.getErrorIcon());
return null;
}
final FileTemplate template = FileTemplateManager.getInstance().getJ2eeTemplate(templateName);
Properties props = FileTemplateManager.getInstance().getDefaultProperties();
props.put(Constants.PROP_WICKET_NS, WicketVersion.getVersion(directory).getNS());
try {
return FileTemplateUtil.createFromTemplate(template, fileName, props, directory);
} catch (Exception e) {
throw new RuntimeException("Unable to create template for '" + fileName + "'", e);
}
}
/**
* @param vf
* @return true if file is in library
*/
public static boolean isInLibrary(@NotNull VirtualFile vf, @NotNull Project project) {
ProjectFileIndex projectFileIndex = ProjectRootManager.getInstance(project).getFileIndex();
return projectFileIndex.isInLibrarySource(vf) || projectFileIndex.isInLibraryClasses(vf);
}
}