diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java index d94c2711bf68..b8b441798333 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsElementFactory.java @@ -4,6 +4,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsLibraryType; +import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleReference; import org.jetbrains.jps.model.module.JpsModuleType; @@ -28,6 +29,9 @@ public abstract class JpsElementFactory { public abstract JpsLibraryReference createLibraryReference(@NotNull String libraryName, @NotNull JpsElementReference parentReference); + @NotNull + public abstract JpsLibraryReference createSdkReference(@NotNull String sdkName, @NotNull JpsSdkType sdkType); + @NotNull public abstract JpsElementReference createProjectReference(); diff --git a/jps/model-api/src/org/jetbrains/jps/model/JpsProject.java b/jps/model-api/src/org/jetbrains/jps/model/JpsProject.java index 5c093dee34d0..600cfddae8a2 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/JpsProject.java +++ b/jps/model-api/src/org/jetbrains/jps/model/JpsProject.java @@ -6,6 +6,7 @@ import org.jetbrains.jps.model.library.JpsLibraryCollection; import org.jetbrains.jps.model.library.JpsLibraryType; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleType; +import org.jetbrains.jps.model.module.JpsSdkReferencesTable; import java.util.List; @@ -28,4 +29,7 @@ public interface JpsProject extends JpsCompositeElement, JpsReferenceableElement @NotNull JpsLibraryCollection getLibraryCollection(); + + @NotNull + JpsSdkReferencesTable getSdkReferencesTable(); } diff --git a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java index 4c94fca2439a..4919c80b1be0 100644 --- a/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java +++ b/jps/model-api/src/org/jetbrains/jps/model/library/JpsLibrary.java @@ -24,4 +24,7 @@ public interface JpsLibrary extends JpsNamedElement, JpsReferenceableElement getType(); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java index 21902607503a..c6b8f29662fb 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsElementFactoryImpl.java @@ -5,8 +5,10 @@ import org.jetbrains.jps.model.*; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryReference; import org.jetbrains.jps.model.library.JpsLibraryType; +import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.library.impl.JpsLibraryImpl; import org.jetbrains.jps.model.library.impl.JpsLibraryReferenceImpl; +import org.jetbrains.jps.model.library.impl.JpsSdkReferenceImpl; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleReference; import org.jetbrains.jps.model.module.JpsModuleType; @@ -41,6 +43,12 @@ public class JpsElementFactoryImpl extends JpsElementFactory { return new JpsLibraryReferenceImpl(libraryName, parentReference); } + @NotNull + @Override + public JpsLibraryReference createSdkReference(@NotNull String sdkName, @NotNull JpsSdkType sdkType) { + return new JpsSdkReferenceImpl(sdkName, sdkType, createGlobalReference()); + } + @NotNull @Override public JpsElementReference createProjectReference() { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java index 168652b6ee5e..69f5f830cc85 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsNamedElementReferenceBase.java @@ -37,13 +37,17 @@ public abstract class JpsNamedElementReferenceBase elements = parent.getContainer().getChild(myCollectionKind).getElements(); for (T element : elements) { - if (element.getName().equals(myElementName)) { + if (resolvesTo(element)) { return element; } } return null; } + protected boolean resolvesTo(T element) { + return element.getName().equals(myElementName); + } + public JpsElementReference getParentReference() { return myContainer.getChild(PARENT_REFERENCE_KIND); } diff --git a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java index d1f835eb914e..40a71516a564 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/impl/JpsProjectImpl.java @@ -12,8 +12,10 @@ import org.jetbrains.jps.model.library.impl.JpsLibraryCollectionImpl; import org.jetbrains.jps.model.library.impl.JpsLibraryKind; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleType; +import org.jetbrains.jps.model.module.JpsSdkReferencesTable; import org.jetbrains.jps.model.module.impl.JpsModuleImpl; import org.jetbrains.jps.model.module.impl.JpsModuleKind; +import org.jetbrains.jps.model.module.impl.JpsSdkReferencesTableImpl; import java.util.List; @@ -29,6 +31,7 @@ public class JpsProjectImpl extends JpsRootElementBase implement super(model, eventDispatcher); myContainer.setChild(JpsModuleKind.MODULE_COLLECTION_KIND); myContainer.setChild(EXTERNAL_REFERENCES_COLLECTION_KIND); + myContainer.setChild(JpsSdkReferencesTableImpl.KIND); myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND)); } @@ -71,6 +74,12 @@ public class JpsProjectImpl extends JpsRootElementBase implement return myLibraryCollection; } + @Override + @NotNull + public JpsSdkReferencesTable getSdkReferencesTable() { + return myContainer.getChild(JpsSdkReferencesTableImpl.KIND); + } + @NotNull @Override public JpsElementReference createReference() { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java index 995d25cef8a6..fdc23fcecac1 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsLibraryImpl.java @@ -25,6 +25,12 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase getType() { + return myContainer.getChild(TYPED_DATA_KIND).getType(); + } + @NotNull @Override public List getRoots(@NotNull JpsOrderRootType rootType) { diff --git a/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java new file mode 100644 index 000000000000..e2d13614d58c --- /dev/null +++ b/jps/model-impl/src/org/jetbrains/jps/model/library/impl/JpsSdkReferenceImpl.java @@ -0,0 +1,50 @@ +package org.jetbrains.jps.model.library.impl; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.jps.model.JpsCompositeElement; +import org.jetbrains.jps.model.JpsElementReference; +import org.jetbrains.jps.model.JpsModel; +import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase; +import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsLibraryReference; +import org.jetbrains.jps.model.library.JpsSdkType; + +/** + * @author nik + */ +public class JpsSdkReferenceImpl extends JpsNamedElementReferenceBase implements JpsLibraryReference { + @NotNull private final JpsSdkType mySdkType; + + public JpsSdkReferenceImpl(@NotNull String elementName, @NotNull JpsSdkType sdkType, @NotNull JpsElementReference parentReference) { + super(JpsLibraryKind.LIBRARIES_COLLECTION_KIND, elementName, parentReference); + mySdkType = sdkType; + } + + public JpsSdkReferenceImpl(JpsSdkReferenceImpl original) { + super(original); + mySdkType = original.mySdkType; + } + + @NotNull + @Override + public String getLibraryName() { + return myElementName; + } + + @Override + protected boolean resolvesTo(JpsLibrary element) { + return super.resolvesTo(element) && element.getType().equals(mySdkType); + } + + @NotNull + @Override + public JpsSdkReferenceImpl createCopy() { + return new JpsSdkReferenceImpl(this); + } + + @Override + public JpsLibraryReference asExternal(@NotNull JpsModel model) { + model.registerExternalReference(this); + return this; + } +} diff --git a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java index 5fcbfa581d95..ae6bda4553b1 100644 --- a/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java +++ b/jps/model-impl/src/org/jetbrains/jps/model/module/impl/JpsModuleImpl.java @@ -1,10 +1,8 @@ package org.jetbrains.jps.model.module.impl; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jps.model.JpsElementCollection; -import org.jetbrains.jps.model.JpsElementKind; -import org.jetbrains.jps.model.JpsElementProperties; -import org.jetbrains.jps.model.JpsUrlList; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.*; import org.jetbrains.jps.model.impl.*; import org.jetbrains.jps.model.library.JpsLibrary; import org.jetbrains.jps.model.library.JpsLibraryCollection; @@ -34,7 +32,7 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase implements JpsSdkReferencesTable { - public static final JpsElementKind KIND = new JpsElementKindBase("sdk references"); + public static final JpsSdkReferencesTableKind KIND = new JpsSdkReferencesTableKind(); public JpsSdkReferencesTableImpl() { super(); @@ -56,4 +56,16 @@ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase implements JpsElementCreator { + public JpsSdkReferencesTableKind() { + super("sdk references"); + } + + @NotNull + @Override + public JpsSdkReferencesTable create() { + return new JpsSdkReferencesTableImpl(); + } + } } diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java index a6e4b81e40f6..7522ee250ed6 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsLibraryTableLoader.java @@ -31,7 +31,10 @@ public class JpsLibraryTableLoader { } public static JpsLibrary loadLibrary(Element libraryElement) { - String name = libraryElement.getAttributeValue("name"); + return loadLibrary(libraryElement, libraryElement.getAttributeValue("name")); + } + + public static JpsLibrary loadLibrary(Element libraryElement, String name) { String typeId = libraryElement.getAttributeValue("type"); JpsLibrary library = JpsElementFactory.getInstance().createLibrary(name, getLibraryType(typeId)); diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java index 17b560a893be..65fdc032c626 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsModuleLoader.java @@ -1,5 +1,6 @@ package org.jetbrains.jps.model.serialization; +import com.intellij.openapi.util.text.StringUtil; import org.jdom.Element; import org.jetbrains.jps.model.JpsCompositeElement; import org.jetbrains.jps.model.JpsElementFactory; @@ -24,7 +25,7 @@ public class JpsModuleLoader { module.getContentRootsList().addUrl(url); for (Element sourceElement : getChildren(contentElement, "sourceFolder")) { final String sourceUrl = sourceElement.getAttributeValue(URL_ATTRIBUTE); - final String packagePrefix = sourceElement.getAttributeValue("packagePrefix"); + final String packagePrefix = StringUtil.notNullize(sourceElement.getAttributeValue("packagePrefix")); final boolean testSource = Boolean.parseBoolean(sourceElement.getAttributeValue("isTestSource")); final JavaSourceRootType rootType = testSource ? JavaSourceRootType.SOURCE : JavaSourceRootType.TEST_SOURCE; module.addSourceRoot(rootType, sourceUrl, new JavaSourceRootProperties(packagePrefix)); @@ -47,8 +48,7 @@ public class JpsModuleLoader { String sdkTypeId = orderEntry.getAttributeValue("jskType"); final JpsSdkType sdkType = getSdkType(sdkTypeId); dependenciesList.addSdkDependency(sdkType); - module.getSdkReferencesTable() - .setSdkReference(sdkType, elementFactory.createLibraryReference(sdkName, elementFactory.createGlobalReference())); + module.getSdkReferencesTable().setSdkReference(sdkType, elementFactory.createSdkReference(sdkName, sdkType)); } else if ("inheritedJdk".equals(type)) { dependenciesList.addSdkDependency(JpsJavaSdkType.INSTANCE); @@ -62,7 +62,11 @@ public class JpsModuleLoader { } else if ("module-library".equals(type)) { final Element moduleLibraryElement = orderEntry.getChild("library"); - final JpsLibrary library = JpsLibraryTableLoader.loadLibrary(moduleLibraryElement); + String name = moduleLibraryElement.getAttributeValue("name"); + if (name == null) { + name = "#" + (moduleLibraryNum++); + } + final JpsLibrary library = JpsLibraryTableLoader.loadLibrary(moduleLibraryElement, name); module.addModuleLibrary(library); final JpsLibraryDependency dependency = dependenciesList.addLibraryDependency(library); diff --git a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java index 45751864903d..553100c85efc 100644 --- a/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java +++ b/jps/model-serialization/src/org/jetbrains/jps/model/serialization/JpsProjectLoader.java @@ -13,6 +13,7 @@ import org.jetbrains.jps.model.JpsGlobal; import org.jetbrains.jps.model.JpsProject; import org.jetbrains.jps.model.java.JpsJavaModuleType; import org.jetbrains.jps.model.library.JpsLibrary; +import org.jetbrains.jps.model.library.JpsSdkType; import org.jetbrains.jps.model.module.JpsModule; import org.jetbrains.jps.model.module.JpsModuleType; @@ -58,6 +59,7 @@ public class JpsProjectLoader { private void loadFromDirectory(File dir) { initMacroMap(dir.getParentFile()); + loadProjectRoot(loadRootElement(new File(dir, "misc.xml"))); loadModules(loadRootElement(new File(dir, "modules.xml"))); final File[] libraryFiles = new File(dir, "libraries").listFiles(); if (libraryFiles != null) { @@ -72,10 +74,23 @@ public class JpsProjectLoader { private void loadFromIpr(File iprFile) { initMacroMap(iprFile.getParentFile()); final Element root = loadRootElement(iprFile); + loadProjectRoot(root); loadModules(root); loadProjectLibraries(findComponent(root, "libraryTable")); } + private void loadProjectRoot(Element root) { + Element rootManagerElement = findComponent(root, "ProjectRootManager"); + if (rootManagerElement != null) { + String sdkName = rootManagerElement.getAttributeValue("project-jdk-name"); + String sdkTypeId = rootManagerElement.getAttributeValue("project-jdk-type"); + if (sdkName != null && sdkTypeId != null) { + JpsSdkType sdkType = JpsModuleLoader.getSdkType(sdkTypeId); + myProject.getSdkReferencesTable().setSdkReference(sdkType, JpsElementFactory.getInstance().createSdkReference(sdkName, sdkType)); + } + } + } + private void initMacroMap(File projectBaseDir) { myMacroToPathMap = new ExpandMacroToPathMap(); myMacroToPathMap.addMacroExpand("PROJECT_DIR", FileUtil.toSystemIndependentName(projectBaseDir.getAbsolutePath())); diff --git a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java index bb7a5a0970b4..1d8409b476e3 100644 --- a/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java +++ b/jps/model-serialization/testSrc/org/jetbrains/jps/model/serialization/JpsModuleSerializationTest.java @@ -2,10 +2,12 @@ package org.jetbrains.jps.model.serialization; import com.intellij.openapi.application.PathManager; import org.jetbrains.jps.model.JpsModelTestCase; +import org.jetbrains.jps.model.java.JpsJavaSdkType; import org.jetbrains.jps.model.library.JpsLibrary; -import org.jetbrains.jps.model.module.JpsModule; +import org.jetbrains.jps.model.module.*; import java.io.IOException; +import java.util.List; /** * @author nik @@ -15,8 +17,17 @@ public class JpsModuleSerializationTest extends JpsModelTestCase { loadProject("iprProject/iprProject.ipr"); final JpsModule module = assertOneElement(myModel.getProject().getModules()); assertEquals("iprProject", module.getName()); + final JpsLibrary library = assertOneElement(myModel.getProject().getLibraryCollection().getLibraries()); assertEquals("junit", library.getName()); + + List dependencies = module.getDependenciesList().getDependencies(); + JpsSdkDependency sdkDependency = assertInstanceOf(dependencies.get(0), JpsSdkDependency.class); + assertSame(JpsJavaSdkType.INSTANCE, sdkDependency.getSdkType()); + assertEquals("1.6", sdkDependency.getSdkReference().getLibraryName()); + assertInstanceOf(dependencies.get(1), JpsModuleSourceDependency.class); + assertInstanceOf(dependencies.get(2), JpsLibraryDependency.class); + assertInstanceOf(dependencies.get(3), JpsLibraryDependency.class); } private void loadProject(final String path) {