new project model: loading facets from xml

This commit is contained in:
nik
2012-07-15 13:21:58 +04:00
parent 4a873358a7
commit 0b867d9d1e
19 changed files with 154 additions and 41 deletions
@@ -1,6 +1,7 @@
package org.jetbrains.jps.model.module;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsNamedElement;
import org.jetbrains.jps.model.JpsReferenceableElement;
@@ -17,4 +18,13 @@ public interface JpsFacet extends JpsNamedElement, JpsReferenceableElement<JpsFa
JpsFacetType<?> getType();
void delete();
@NotNull
@Override
JpsFacetReference createReference();
void setParentFacet(@NotNull JpsFacet facet);
@Nullable
JpsFacet getParentFacet();
}
@@ -0,0 +1,9 @@
package org.jetbrains.jps.model.module;
import org.jetbrains.jps.model.JpsElementReference;
/**
* @author nik
*/
public interface JpsFacetReference extends JpsElementReference<JpsFacet> {
}
@@ -33,7 +33,8 @@ public interface JpsModule extends JpsNamedElement, JpsReferenceableElement<JpsM
void removeSourceRoot(@NotNull String url, @NotNull JpsModuleSourceRootType rootType);
@NotNull
JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType<?> type);
<P extends JpsElementProperties>
JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType<P> type, @NotNull P properties);
@NotNull
List<JpsFacet> getFacets();
@@ -1,12 +1,16 @@
package org.jetbrains.jps.model.module.impl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElementCollection;
import org.jetbrains.jps.model.JpsElementReference;
import org.jetbrains.jps.model.JpsElementKind;
import org.jetbrains.jps.model.JpsElementProperties;
import org.jetbrains.jps.model.impl.JpsElementKindBase;
import org.jetbrains.jps.model.impl.JpsNamedCompositeElementBase;
import org.jetbrains.jps.model.impl.JpsTypedDataImpl;
import org.jetbrains.jps.model.impl.JpsTypedDataKind;
import org.jetbrains.jps.model.module.JpsFacet;
import org.jetbrains.jps.model.module.JpsFacetReference;
import org.jetbrains.jps.model.module.JpsFacetType;
import org.jetbrains.jps.model.module.JpsModule;
@@ -15,10 +19,12 @@ import org.jetbrains.jps.model.module.JpsModule;
*/
public class JpsFacetImpl extends JpsNamedCompositeElementBase<JpsFacetImpl> implements JpsFacet {
private static final JpsTypedDataKind<JpsFacetType<?>> TYPED_DATA_KIND = new JpsTypedDataKind<JpsFacetType<?>>();
private static final JpsElementKind<JpsFacetReference> PARENT_FACET_REFERENCE = new JpsElementKindBase<JpsFacetReference>("parent facet");
public JpsFacetImpl(JpsFacetType<?> facetType, @NotNull String name) {
public <P extends JpsElementProperties> JpsFacetImpl(JpsFacetType<?> facetType, @NotNull String name, @NotNull P properties) {
super(name);
myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl<JpsFacetType<?>>(facetType, facetType.createDefaultProperties()));
myContainer.setChild(TYPED_DATA_KIND, new JpsTypedDataImpl<JpsFacetType<?>>(facetType, properties));
myContainer.setChild(JpsFacetKind.COLLECTION_KIND);
}
private JpsFacetImpl(JpsNamedCompositeElementBase<JpsFacetImpl> original) {
@@ -37,6 +43,18 @@ public class JpsFacetImpl extends JpsNamedCompositeElementBase<JpsFacetImpl> imp
return myContainer.getChild(TYPED_DATA_KIND).getType();
}
@Override
public void setParentFacet(@NotNull JpsFacet facet) {
myContainer.setChild(PARENT_FACET_REFERENCE, facet.createReference());
}
@Override
@Nullable
public JpsFacet getParentFacet() {
final JpsFacetReference reference = myContainer.getChild(PARENT_FACET_REFERENCE);
return reference != null ? reference.resolve() : null;
}
@Override
public JpsModule getModule() {
return myParent != null ? (JpsModule)myParent.getParent() : null;
@@ -44,7 +62,7 @@ public class JpsFacetImpl extends JpsNamedCompositeElementBase<JpsFacetImpl> imp
@NotNull
@Override
public JpsElementReference<JpsFacet> createReference() {
public JpsFacetReference createReference() {
return new JpsFacetReferenceImpl(getName(), getModule().createReference());
}
@@ -5,12 +5,13 @@ import org.jetbrains.jps.model.JpsElementReference;
import org.jetbrains.jps.model.JpsModel;
import org.jetbrains.jps.model.impl.JpsNamedElementReferenceBase;
import org.jetbrains.jps.model.module.JpsFacet;
import org.jetbrains.jps.model.module.JpsFacetReference;
import org.jetbrains.jps.model.module.JpsModuleReference;
/**
* @author nik
*/
public class JpsFacetReferenceImpl extends JpsNamedElementReferenceBase<JpsFacet, JpsFacetReferenceImpl> {
public class JpsFacetReferenceImpl extends JpsNamedElementReferenceBase<JpsFacet, JpsFacetReferenceImpl> implements JpsFacetReference {
public JpsFacetReferenceImpl(String facetName, JpsModuleReference moduleReference) {
super(JpsFacetKind.COLLECTION_KIND, facetName, moduleReference);
}
@@ -92,10 +92,10 @@ public class JpsModuleImpl extends JpsNamedCompositeElementBase<JpsModuleImpl> i
}
}
@Override
@NotNull
public JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType<?> type) {
return myContainer.getChild(JpsFacetKind.COLLECTION_KIND).addChild(new JpsFacetImpl(type, name));
@Override
public <P extends JpsElementProperties> JpsFacet addFacet(@NotNull String name, @NotNull JpsFacetType<P> type, @NotNull P properties) {
return myContainer.getChild(JpsFacetKind.COLLECTION_KIND).addChild(new JpsFacetImpl(type, name, properties));
}
@NotNull
@@ -12,12 +12,12 @@ import org.jetbrains.jps.model.module.JpsModule;
public class JpsFacetTest extends JpsModelTestCase {
public void testAddFacet() {
final JpsModule m = myModel.getProject().addModule("m", JpsJavaModuleType.INSTANCE);
m.addFacet("f", MY_FACET_TYPE);
m.addFacet("f", MY_FACET_TYPE, DummyJpsElementProperties.INSTANCE);
assertEquals("f", assertOneElement(m.getFacets()).getName());
}
public void testCreateReferenceByFacet() {
final JpsFacet facet = myModel.getProject().addModule("m", JpsJavaModuleType.INSTANCE).addFacet("f", MY_FACET_TYPE);
final JpsFacet facet = myModel.getProject().addModule("m", JpsJavaModuleType.INSTANCE).addFacet("f", MY_FACET_TYPE, DummyJpsElementProperties.INSTANCE);
final JpsElementReference<JpsFacet> reference = facet.createReference().asExternal(myModel);
assertSame(facet, reference.resolve());
}
@@ -4,13 +4,12 @@ import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsCompositeElement;
import org.jetbrains.jps.model.JpsElementProperties;
import org.jetbrains.jps.model.JpsElementReference;
import org.jetbrains.jps.model.library.JpsOrderRootType;
import org.jetbrains.jps.model.library.JpsSdkType;
import org.jetbrains.jps.model.module.JpsDependencyElement;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.module.JpsModuleType;
import org.jetbrains.jps.model.serialization.facet.JpsFacetPropertiesLoader;
import java.util.Collections;
import java.util.List;
@@ -41,16 +40,6 @@ public abstract class JpsModelLoaderExtension {
return null;
}
@Nullable
public JpsModuleType<?> getModuleType(@NotNull String typeId) {
return null;
}
@Nullable
public <P extends JpsElementProperties> P loadModuleProperties(JpsModuleType<P> type, Element moduleRoot) {
return null;
}
@NotNull
public List<JpsModulePropertiesLoader<?>> getModulePropertiesLoaders() {
return Collections.emptyList();
@@ -66,6 +55,10 @@ public abstract class JpsModelLoaderExtension {
return Collections.emptyList();
}
public List<? extends JpsFacetPropertiesLoader<?>> getFacetPropertiesLoaders() {
return Collections.emptyList();
}
@Nullable
public JpsOrderRootType getSdkRootType(@NotNull String typeId) {
return null;
@@ -12,6 +12,7 @@ import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.java.JpsJavaModuleType;
import org.jetbrains.jps.model.library.JpsSdkType;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.facet.JpsFacetLoader;
import org.jetbrains.jps.service.JpsServiceManager;
import java.io.File;
@@ -134,6 +135,7 @@ public class JpsProjectLoader extends JpsLoaderBase {
final JpsModulePropertiesLoader<?> loader = getModulePropertiesLoader(typeId);
final JpsModule module = createModule(name, moduleRoot, loader);
JpsModuleLoader.loadRootModel(module, findComponent(moduleRoot, "NewModuleRootManager"));
JpsFacetLoader.loadFacets(module, findComponent(moduleRoot, "FacetManager"));
return module;
}
@@ -14,7 +14,7 @@
* limitations under the License.
*/
package com.intellij.facet.impl;
package org.jetbrains.jps.model.serialization.facet;
import com.intellij.util.xmlb.annotations.AbstractCollection;
import com.intellij.util.xmlb.annotations.Property;
@@ -14,9 +14,8 @@
* limitations under the License.
*/
package com.intellij.facet.impl;
package org.jetbrains.jps.model.serialization.facet;
import com.intellij.facet.FacetManagerImpl;
import com.intellij.util.xmlb.annotations.Attribute;
import com.intellij.util.xmlb.annotations.Tag;
import com.intellij.util.xmlb.annotations.AbstractCollection;
@@ -29,24 +28,24 @@ import java.util.ArrayList;
/**
* @author nik
*/
@Tag(FacetManagerImpl.FACET_ELEMENT)
@Tag(JpsFacetLoader.FACET_ELEMENT)
public class FacetState {
private String myFacetType;
private String myName;
private Element myConfiguration;
private List<FacetState> mySubFacets = new ArrayList<FacetState>();
@Attribute(FacetManagerImpl.TYPE_ATTRIBUTE)
@Attribute(JpsFacetLoader.TYPE_ATTRIBUTE)
public String getFacetType() {
return myFacetType;
}
@Attribute(FacetManagerImpl.NAME_ATTRIBUTE)
@Attribute(JpsFacetLoader.NAME_ATTRIBUTE)
public String getName() {
return myName;
}
@Tag(FacetManagerImpl.CONFIGURATION_ELEMENT)
@Tag(JpsFacetLoader.CONFIGURATION_ELEMENT)
public Element getConfiguration() {
return myConfiguration;
}
@@ -0,0 +1,62 @@
package org.jetbrains.jps.model.serialization.facet;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElementProperties;
import org.jetbrains.jps.model.module.JpsFacet;
import org.jetbrains.jps.model.module.JpsModule;
import org.jetbrains.jps.model.serialization.JpsModelLoaderExtension;
import org.jetbrains.jps.service.JpsServiceManager;
import java.util.List;
/**
* @author nik
*/
public class JpsFacetLoader {
@NonNls public static final String FACET_ELEMENT = "facet";
@NonNls public static final String TYPE_ATTRIBUTE = "type";
@NonNls public static final String CONFIGURATION_ELEMENT = "configuration";
@NonNls public static final String NAME_ATTRIBUTE = "name";
public static void loadFacets(JpsModule module, @Nullable Element facetManagerElement) {
if (facetManagerElement == null) return;
final FacetManagerState state = XmlSerializer.deserialize(facetManagerElement, FacetManagerState.class);
if (state != null) {
addFacets(module, state.getFacets(), null);
}
}
private static void addFacets(JpsModule module, List<FacetState> facets, @Nullable final JpsFacet parentFacet) {
for (FacetState facetState : facets) {
final JpsFacetPropertiesLoader<?> loader = getFacetPropertiesLoader(facetState.getFacetType());
if (loader != null) {
final JpsFacet facet = addFacet(module, loader, facetState);
if (parentFacet != null) {
facet.setParentFacet(parentFacet);
}
addFacets(module, facetState.getSubFacets(), facet);
}
}
}
private static <P extends JpsElementProperties> JpsFacet addFacet(JpsModule module, JpsFacetPropertiesLoader<P> loader, FacetState facet) {
return module.addFacet(facet.getName(), loader.getType(), loader.loadProperties(facet.getConfiguration()));
}
@Nullable
private static JpsFacetPropertiesLoader<?> getFacetPropertiesLoader(@NotNull String typeId) {
for (JpsModelLoaderExtension extension : JpsServiceManager.getInstance().getExtensions(JpsModelLoaderExtension.class)) {
for (JpsFacetPropertiesLoader<?> loader : extension.getFacetPropertiesLoaders()) {
if (loader.getTypeId().equals(typeId)) {
return loader;
}
}
}
return null;
}
}
@@ -0,0 +1,18 @@
package org.jetbrains.jps.model.serialization.facet;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsElementProperties;
import org.jetbrains.jps.model.module.JpsFacetType;
import org.jetbrains.jps.model.serialization.JpsElementPropertiesLoader;
/**
* @author nik
*/
public abstract class JpsFacetPropertiesLoader<P extends JpsElementProperties> extends JpsElementPropertiesLoader<P, JpsFacetType<P>> {
public JpsFacetPropertiesLoader(JpsFacetType<P> type, String typeId) {
super(type, typeId);
}
public abstract P loadProperties(@NotNull Element facetConfigurationElement);
}
@@ -9,7 +9,6 @@
<webroots>
<root url="file://$MODULE_DIR$/web" relative="/" />
</webroots>
<context-artifact name="explodedWar" />
</configuration>
</facet>
</component>
@@ -19,6 +19,7 @@ package com.intellij.conversion;
import com.intellij.facet.FacetManagerImpl;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.serialization.facet.JpsFacetLoader;
import java.util.List;
@@ -44,9 +45,9 @@ public class DetachFacetConversionProcessor extends ConversionProcessor<ModuleSe
final Element facetManagerElement = moduleSettings.getComponentElement(FacetManagerImpl.COMPONENT_NAME);
if (facetManagerElement == null) return;
final Element[] facetElements = getChildren(facetManagerElement, FacetManagerImpl.FACET_ELEMENT);
final Element[] facetElements = getChildren(facetManagerElement, JpsFacetLoader.FACET_ELEMENT);
for (Element facetElement : facetElements) {
final String facetType = facetElement.getAttributeValue(FacetManagerImpl.TYPE_ATTRIBUTE);
final String facetType = facetElement.getAttributeValue(JpsFacetLoader.TYPE_ATTRIBUTE);
for (String facetName : myFacetNames) {
if (facetName.equals(facetType)) {
facetElement.detach();
@@ -32,6 +32,7 @@ import com.intellij.util.containers.ContainerUtil;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.serialization.facet.JpsFacetLoader;
import java.io.File;
import java.util.*;
@@ -70,8 +71,8 @@ public class ModuleSettingsImpl extends ComponentManagerSettingsImpl implements
public Collection<? extends Element> getFacetElements(@NotNull String facetTypeId) {
final Element facetManager = getComponentElement(FacetManagerImpl.COMPONENT_NAME);
final ArrayList<Element> elements = new ArrayList<Element>();
for (Element child : JDOMUtil.getChildren(facetManager, FacetManagerImpl.FACET_ELEMENT)) {
if (facetTypeId.equals(child.getAttributeValue(FacetManagerImpl.TYPE_ATTRIBUTE))) {
for (Element child : JDOMUtil.getChildren(facetManager, JpsFacetLoader.FACET_ELEMENT)) {
if (facetTypeId.equals(child.getAttributeValue(JpsFacetLoader.TYPE_ATTRIBUTE))) {
elements.add(child);
}
}
@@ -38,6 +38,8 @@ import org.jdom.Element;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.serialization.facet.FacetManagerState;
import org.jetbrains.jps.model.serialization.facet.FacetState;
import java.util.*;
@@ -54,10 +56,6 @@ import java.util.*;
)
public class FacetManagerImpl extends FacetManager implements ModuleComponent, PersistentStateComponent<FacetManagerState> {
private static final Logger LOG = Logger.getInstance("#com.intellij.facet.FacetManagerImpl");
@NonNls public static final String FACET_ELEMENT = "facet";
@NonNls public static final String TYPE_ATTRIBUTE = "type";
@NonNls public static final String CONFIGURATION_ELEMENT = "configuration";
@NonNls public static final String NAME_ATTRIBUTE = "name";
@NonNls public static final String COMPONENT_NAME = "FacetManager";
private final Module myModule;
@@ -30,6 +30,7 @@ import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.serialization.facet.JpsFacetLoader;
import java.lang.reflect.TypeVariable;
import java.util.Arrays;
@@ -94,7 +95,7 @@ public class FacetUtil {
return XmlSerializer.serialize(state, new SkipDefaultValuesSerializationFilters());
}
else {
final Element config = new Element(FacetManagerImpl.CONFIGURATION_ELEMENT);
final Element config = new Element(JpsFacetLoader.CONFIGURATION_ELEMENT);
configuration.writeExternal(config);
return config;
}
@@ -16,7 +16,7 @@
package com.intellij.facet.impl.invalid;
import com.intellij.facet.FacetConfiguration;
import com.intellij.facet.impl.FacetState;
import org.jetbrains.jps.model.serialization.facet.FacetState;
import com.intellij.facet.ui.FacetEditorContext;
import com.intellij.facet.ui.FacetEditorTab;
import com.intellij.facet.ui.FacetValidatorsManager;