encapsulate composite project root

This commit is contained in:
Alexey Kudravtsev
2017-08-24 16:38:44 +03:00
parent 0416a66b2e
commit 88e6788950
3 changed files with 42 additions and 65 deletions
@@ -22,6 +22,7 @@ import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtil;
import com.intellij.util.containers.ContainerUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -32,6 +33,10 @@ import java.util.List;
* @author mike
*/
class CompositeProjectRoot implements ProjectRoot {
@NonNls private static final String SIMPLE_ROOT = "simple";
@NonNls private static final String COMPOSITE_ROOT = "composite";
@NonNls private static final String ATTRIBUTE_TYPE = "type";
@NonNls private static final String ELEMENT_ROOT = "root";
private final List<ProjectRoot> myRoots = new ArrayList<>();
@NotNull
@@ -104,13 +109,13 @@ class CompositeProjectRoot implements ProjectRoot {
public void readExternal(Element element) {
for (Element child : element.getChildren()) {
myRoots.add(ProjectRootUtil.read(child));
myRoots.add(read(child));
}
}
public void writeExternal(Element element) {
for (ProjectRoot root : myRoots) {
Element e = ProjectRootUtil.write(root);
Element e = write(root);
element.addContent(e);
}
}
@@ -121,4 +126,37 @@ class CompositeProjectRoot implements ProjectRoot {
root.update();
}
}
@NotNull
static ProjectRoot read(Element element) {
final String type = element.getAttributeValue(ATTRIBUTE_TYPE);
if (type.equals(SIMPLE_ROOT)) {
return new SimpleProjectRoot(element);
}
if (type.equals(COMPOSITE_ROOT)) {
CompositeProjectRoot root = new CompositeProjectRoot();
root.readExternal(element);
return root;
}
throw new IllegalArgumentException("Wrong type: " + type);
}
@NotNull
static Element write(ProjectRoot projectRoot) {
Element element = new Element(ELEMENT_ROOT);
if (projectRoot instanceof SimpleProjectRoot) {
element.setAttribute(ATTRIBUTE_TYPE, SIMPLE_ROOT);
((SimpleProjectRoot)projectRoot).writeExternal(element);
}
else if (projectRoot instanceof CompositeProjectRoot) {
element.setAttribute(ATTRIBUTE_TYPE, COMPOSITE_ROOT);
((CompositeProjectRoot)projectRoot).writeExternal(element);
}
else {
throw new IllegalArgumentException("Wrong root: " + projectRoot);
}
return element;
}
}
@@ -254,7 +254,7 @@ public class ProjectRootContainerImpl implements JDOMExternalizable, ProjectRoot
if (children.size() != 1) {
LOG.error(children);
}
CompositeProjectRoot root = (CompositeProjectRoot)ProjectRootUtil.read(children.get(0));
CompositeProjectRoot root = (CompositeProjectRoot)CompositeProjectRoot.read(children.get(0));
myRoots.put(type, root);
}
@@ -263,7 +263,7 @@ public class ProjectRootContainerImpl implements JDOMExternalizable, ProjectRoot
if (sdkRootName != null) {
Element e = new Element(sdkRootName);
roots.addContent(e);
final Element root = ProjectRootUtil.write(myRoots.get(type));
final Element root = CompositeProjectRoot.write(myRoots.get(type));
e.addContent(root);
}
}
@@ -18,7 +18,6 @@ package com.intellij.openapi.projectRoots.impl;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.projectRoots.ex.ProjectRoot;
import com.intellij.openapi.roots.OrderEnumerator;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.vfs.VirtualFile;
@@ -26,8 +25,6 @@ import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.PsiManagerImpl;
import com.intellij.psi.impl.file.impl.FileManager;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -39,67 +36,9 @@ import java.util.List;
public class ProjectRootUtil {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.projectRoots.impl.ProjectRootUtil");
@NonNls private static final String SIMPLE_ROOT = "simple";
@NonNls private static final String COMPOSITE_ROOT = "composite";
/**
* @deprecated
*/
@NonNls public static final String JDK_ROOT = "jdk";
/**
* @deprecated
*/
@NonNls public static final String OUTPUT_ROOT = "output";
/**
* @deprecated
*/
@NonNls public static final String EXCLUDED_OUTPUT = "excludedOutput";
/**
* @deprecated
*/
@NonNls public static final String LIBRARY_ROOT = "library";
/**
* @deprecated
*/
@NonNls public static final String EJB_ROOT = "ejb";
@NonNls private static final String ATTRIBUTE_TYPE = "type";
@NonNls private static final String ELEMENT_ROOT = "root";
private ProjectRootUtil() {
}
@NotNull
static ProjectRoot read(Element element) {
final String type = element.getAttributeValue(ATTRIBUTE_TYPE);
if (type.equals(SIMPLE_ROOT)) {
return new SimpleProjectRoot(element);
}
if (type.equals(COMPOSITE_ROOT)) {
CompositeProjectRoot root = new CompositeProjectRoot();
root.readExternal(element);
return root;
}
throw new IllegalArgumentException("Wrong type: " + type);
}
@NotNull
static Element write(ProjectRoot projectRoot) {
Element element = new Element(ELEMENT_ROOT);
if (projectRoot instanceof SimpleProjectRoot) {
element.setAttribute(ATTRIBUTE_TYPE, SIMPLE_ROOT);
((SimpleProjectRoot)projectRoot).writeExternal(element);
}
else if (projectRoot instanceof CompositeProjectRoot) {
element.setAttribute(ATTRIBUTE_TYPE, COMPOSITE_ROOT);
((CompositeProjectRoot)projectRoot).writeExternal(element);
}
else {
throw new IllegalArgumentException("Wrong root: " + projectRoot);
}
return element;
}
@NotNull
private static PsiDirectory[] convertRoots(final Project project, VirtualFile[] roots) {
return convertRoots(((PsiManagerImpl)PsiManager.getInstance(project)).getFileManager(), roots);