new project model: sdk references

This commit is contained in:
nik
2012-07-04 09:58:11 +04:00
parent 518c4bcba3
commit de12964a33
15 changed files with 163 additions and 16 deletions
@@ -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<? extends JpsCompositeElement> parentReference);
@NotNull
public abstract JpsLibraryReference createSdkReference(@NotNull String sdkName, @NotNull JpsSdkType<?> sdkType);
@NotNull
public abstract JpsElementReference<JpsProject> createProjectReference();
@@ -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();
}
@@ -24,4 +24,7 @@ public interface JpsLibrary extends JpsNamedElement, JpsReferenceableElement<Jps
@NotNull
JpsLibraryReference createReference();
@NotNull
JpsLibraryType<?> getType();
}
@@ -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<JpsProject> createProjectReference() {
@@ -37,13 +37,17 @@ public abstract class JpsNamedElementReferenceBase<T extends JpsNamedElement, Se
final List<? extends T> 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<? extends JpsCompositeElement> getParentReference() {
return myContainer.getChild(PARENT_REFERENCE_KIND);
}
@@ -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<JpsProjectImpl> 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<JpsProjectImpl> implement
return myLibraryCollection;
}
@Override
@NotNull
public JpsSdkReferencesTable getSdkReferencesTable() {
return myContainer.getChild(JpsSdkReferencesTableImpl.KIND);
}
@NotNull
@Override
public JpsElementReference<JpsProject> createReference() {
@@ -25,6 +25,12 @@ public class JpsLibraryImpl extends JpsNamedCompositeElementBase<JpsLibraryImpl,
super(original);
}
@Override
@NotNull
public JpsLibraryType<?> getType() {
return myContainer.getChild(TYPED_DATA_KIND).getType();
}
@NotNull
@Override
public List<JpsLibraryRoot> getRoots(@NotNull JpsOrderRootType rootType) {
@@ -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<JpsLibrary, JpsSdkReferenceImpl> implements JpsLibraryReference {
@NotNull private final JpsSdkType<?> mySdkType;
public JpsSdkReferenceImpl(@NotNull String elementName, @NotNull JpsSdkType<?> sdkType, @NotNull JpsElementReference<? extends JpsCompositeElement> 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;
}
}
@@ -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<JpsModuleImpl, J
myContainer.setChild(DEPENDENCIES_LIST_KIND, new JpsDependenciesListImpl());
myLibraryCollection = new JpsLibraryCollectionImpl(myContainer.setChild(JpsLibraryKind.LIBRARIES_COLLECTION_KIND));
myContainer.setChild(JpsModuleSourceRootKind.ROOT_COLLECTION_KIND);
myContainer.setChild(JpsSdkReferencesTableImpl.KIND, new JpsSdkReferencesTableImpl());
myContainer.setChild(JpsSdkReferencesTableImpl.KIND);
}
private JpsModuleImpl(JpsModuleImpl original) {
@@ -134,4 +132,10 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase<JpsModuleImpl, J
public JpsLibraryCollection getLibraryCollection() {
return myLibraryCollection;
}
@Nullable
public JpsProject getProject() {
JpsModel model = getModel();
return model != null ? model.getProject() : null;
}
}
@@ -2,6 +2,7 @@ package org.jetbrains.jps.model.module.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.library.JpsLibrary;
import org.jetbrains.jps.model.library.JpsLibraryReference;
import org.jetbrains.jps.model.library.JpsSdkType;
@@ -44,7 +45,16 @@ public class JpsSdkDependencyImpl extends JpsDependencyElementBase<JpsSdkDepende
@Override
@Nullable
public JpsLibraryReference getSdkReference() {
return getDependenciesList().getParent().getSdkReferencesTable().getSdkReference(mySdkType);
JpsModuleImpl module = getDependenciesList().getParent();
JpsLibraryReference sdkReference = module.getSdkReferencesTable().getSdkReference(mySdkType);
if (sdkReference != null) {
return sdkReference;
}
JpsProject project = module.getProject();
if (project != null) {
return project.getSdkReferencesTable().getSdkReference(mySdkType);
}
return null;
}
@Override
@@ -1,9 +1,9 @@
package org.jetbrains.jps.model.module.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElementKind;
import org.jetbrains.jps.model.impl.JpsElementKindBase;
import org.jetbrains.jps.model.JpsElementCreator;
import org.jetbrains.jps.model.impl.JpsCompositeElementBase;
import org.jetbrains.jps.model.impl.JpsElementKindBase;
import org.jetbrains.jps.model.library.JpsLibraryReference;
import org.jetbrains.jps.model.library.JpsSdkType;
import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
@@ -12,7 +12,7 @@ import org.jetbrains.jps.model.module.JpsSdkReferencesTable;
* @author nik
*/
public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase<JpsSdkReferencesTableImpl> implements JpsSdkReferencesTable {
public static final JpsElementKind<JpsSdkReferencesTableImpl> KIND = new JpsElementKindBase<JpsSdkReferencesTableImpl>("sdk references");
public static final JpsSdkReferencesTableKind KIND = new JpsSdkReferencesTableKind();
public JpsSdkReferencesTableImpl() {
super();
@@ -56,4 +56,16 @@ public class JpsSdkReferencesTableImpl extends JpsCompositeElementBase<JpsSdkRef
return obj instanceof JpsSdkReferenceKind && myType.equals(((JpsSdkReferenceKind)obj).myType);
}
}
private static class JpsSdkReferencesTableKind extends JpsElementKindBase<JpsSdkReferencesTable> implements JpsElementCreator<JpsSdkReferencesTable> {
public JpsSdkReferencesTableKind() {
super("sdk references");
}
@NotNull
@Override
public JpsSdkReferencesTable create() {
return new JpsSdkReferencesTableImpl();
}
}
}
@@ -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));
@@ -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);
@@ -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()));
@@ -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<JpsDependencyElement> 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) {