package krasa.mavenrun.analyzer.action; import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel; import org.jetbrains.idea.maven.dom.model.MavenDomShortArtifactCoordinates; import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.model.MavenArtifactNode; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.navigator.MavenNavigationUtil; import org.jetbrains.idea.maven.project.MavenProject; import org.jetbrains.idea.maven.project.MavenProjectsManager; import com.intellij.openapi.project.DumbAwareAction; import com.intellij.openapi.project.Project; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.Navigatable; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiManager; import com.intellij.psi.xml.XmlFile; import com.intellij.util.xml.DomFileElement; import com.intellij.util.xml.DomManager; import com.intellij.util.xml.GenericDomValue; /** * @author Vojtech Krasa */ public abstract class BaseAction extends DumbAwareAction { public static final String MAVEN_HELPER_DEPENDENCY_ANALYZER_NOTIFICATION = "Maven Helper - Dependency Analyzer - notification"; protected final Project project; protected final MavenProject mavenProject; protected final MavenArtifactNode mavenArtifactNode; public BaseAction(Project project, MavenProject mavenProject, MavenArtifactNode myTreeNode, final String text) { super(text); this.project = project; this.mavenProject = mavenProject; mavenArtifactNode = myTreeNode; } protected MavenArtifactNode getOldestParentMavenArtifact() { MavenArtifactNode oldestParent = mavenArtifactNode.getParent(); if (oldestParent == null) { return mavenArtifactNode; } MavenArtifactNode parentNode = oldestParent.getParent(); while (parentNode != null) { oldestParent = parentNode; parentNode = oldestParent.getParent(); } return oldestParent; } protected DomFileElement getDomFileElement(MavenArtifactNode mavenArtifactNode) { XmlFile xmlFile = getXmlFile(mavenArtifactNode); return xmlFile == null ? null : DomManager.getDomManager(project).getFileElement(xmlFile, MavenDomProjectModel.class); } protected XmlFile getXmlFile(MavenArtifactNode artifact) { VirtualFile virtualFile = getVirtualFile(artifact); if (virtualFile != null) { PsiFile psiFile = PsiManager.getInstance(project).findFile(virtualFile); return (XmlFile) psiFile; } return null; } /** org.jetbrains.idea.maven.navigator.MavenProjectsStructure.DependencyNode#getNavigatable() */ public Navigatable getNavigatable(MavenArtifactNode myArtifactNode) { final VirtualFile file = getVirtualFile(myArtifactNode); return file == null ? null : MavenNavigationUtil.createNavigatableForDependency(project, file, myArtifactNode.getArtifact()); } private VirtualFile getVirtualFile(MavenArtifactNode myArtifactNode) { final MavenArtifactNode parent = myArtifactNode.getParent(); final VirtualFile file; if (parent == null) { file = mavenProject.getFile(); } else { // final MavenId id = parent.getArtifact().getMavenId(); //this doesn't work for snapshots MavenArtifact artifact = parent.getArtifact(); final MavenId id = new MavenId(artifact.getGroupId(), artifact.getArtifactId(), artifact.getBaseVersion()); final MavenProject pr = MavenProjectsManager.getInstance(project).findProject(id); file = pr == null ? MavenNavigationUtil.getArtifactFile(project, id) : pr.getFile(); } return file; } protected boolean isSameDependency(MavenArtifact parent, MavenDomShortArtifactCoordinates mavenDomDependency) { GenericDomValue artifactID = mavenDomDependency.getArtifactId(); GenericDomValue<String> groupId = mavenDomDependency.getGroupId(); return isSameDependency(parent, artifactID, groupId); } protected boolean isSameDependency(MavenArtifact parent, GenericDomValue artifactID, GenericDomValue<String> groupId) { return artifactID != null && groupId != null && parent.getArtifactId().equals(artifactID.getValue()) && parent.getGroupId().equals(groupId.getValue()); } }