package org.mule.devkit.idea.module;
import com.intellij.ide.util.projectWizard.ModuleBuilder;
import com.intellij.ide.util.projectWizard.ModuleWizardStep;
import com.intellij.ide.util.projectWizard.SourcePathsBuilder;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.module.StdModuleTypes;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.DumbAwareRunnable;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ModifiableRootModel;
import com.intellij.openapi.roots.ui.configuration.ModulesProvider;
import com.intellij.openapi.util.IconLoader;
import com.intellij.openapi.util.Pair;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.idea.maven.model.MavenArchetype;
import org.jetbrains.idea.maven.model.MavenId;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectsManager;
import org.jetbrains.idea.maven.utils.MavenUtil;
import javax.swing.*;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
public abstract class MuleModuleBuilder extends ModuleBuilder implements SourcePathsBuilder {
private static final Icon ICON = IconLoader.getIcon("/mule24.png");
private MavenProject myAggregatorProject;
private MavenProject myParentProject;
private boolean myInheritGroupId;
private boolean myInheritVersion;
private MavenId myProjectId;
private String myContentEntryPath;
private String myModuleName;
private String myModulePackage;
@Override
public void setupRootModel(ModifiableRootModel rootModel) throws ConfigurationException {
final Project project = rootModel.getProject();
final VirtualFile root = createAndGetContentEntry();
rootModel.addContentEntry(root);
rootModel.inheritSdk();
MavenUtil.runWhenInitialized(project, new DumbAwareRunnable() {
public void run() {
new MuleModuleBuilderHelper(myProjectId, myAggregatorProject, myParentProject, myInheritGroupId,
myInheritVersion, getArchetype(), myModuleName, myModulePackage, getDescription()).configure(project, root, false);
}
});
}
private VirtualFile createAndGetContentEntry() {
String path = FileUtil.toSystemIndependentName(getContentEntryPath());
new File(path).mkdirs();
return LocalFileSystem.getInstance().refreshAndFindFileByPath(path);
}
@Override
public ModuleWizardStep[] createWizardSteps(WizardContext wizardContext, ModulesProvider modulesProvider) {
return new ModuleWizardStep[]{new MuleModuleWizardStep(wizardContext.getProject(), this)};
}
@Override
public ModuleType getModuleType() {
return StdModuleTypes.JAVA;
}
public List<Pair<String, String>> getSourcePaths() {
return Collections.emptyList();
}
public void setSourcePaths(List<Pair<String, String>> pairs) {
}
public void addSourcePath(Pair<String, String> stringStringPair) {
}
public void setAggregatorProject(MavenProject project) {
myAggregatorProject = project;
}
public MavenProject getAggregatorProject() {
return myAggregatorProject;
}
public void setParentProject(MavenProject project) {
myParentProject = project;
}
public MavenProject getParentProject() {
return myParentProject;
}
public void setProjectId(MavenId id) {
myProjectId = id;
}
public MavenId getProjectId() {
return myProjectId;
}
public String getModuleName() {
return myModuleName;
}
public void setModuleName(String myModuleName) {
this.myModuleName = myModuleName;
}
public String getModulePackage() {
return myModulePackage;
}
public void setModulePackage(String myModulePackage) {
this.myModulePackage = myModulePackage;
}
@Override
public String getBuilderId() {
return getClass().getName();
}
public void setInheritedOptions(boolean groupId, boolean version) {
myInheritGroupId = groupId;
myInheritVersion = version;
}
public boolean isInheritGroupId() {
return myInheritGroupId;
}
public boolean isInheritVersion() {
return myInheritVersion;
}
@Nullable
public String getContentEntryPath() {
if (myContentEntryPath == null) {
final String directory = getModuleFileDirectory();
if (directory == null) {
return null;
}
new File(directory).mkdirs();
return directory;
}
return myContentEntryPath;
}
public void setContentEntryPath(String moduleRootPath) {
final String path = acceptParameter(moduleRootPath);
if (path != null) {
try {
myContentEntryPath = FileUtil.resolveShortWindowsName(path);
} catch (IOException e) {
myContentEntryPath = path;
}
} else {
myContentEntryPath = null;
}
if (myContentEntryPath != null) {
myContentEntryPath = myContentEntryPath.replace(File.separatorChar, '/');
}
}
public MavenProject findPotentialParentProject(Project project) {
if (!MavenProjectsManager.getInstance(project).isMavenizedProject()) {
return null;
}
File parentDir = new File(getContentEntryPath()).getParentFile();
if (parentDir == null) {
return null;
}
VirtualFile parentPom = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(new File(parentDir, "pom.xml"));
if (parentPom == null) {
return null;
}
return MavenProjectsManager.getInstance(project).findProject(parentPom);
}
public abstract String getSubName();
public abstract MavenArchetype getArchetype();
public abstract MavenId getDefaultProjectId();
@Override
public String getName() {
return "Mule " + getSubName();
}
@Override
public String getDescription() {
return "Create a new Mule Module.";
}
@Override
public Icon getBigIcon() {
return ICON;
}
@Override
public String getPresentableName() {
return getName();
}
}