mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
new project model: loading facets from xml
This commit is contained in:
@@ -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());
|
||||
}
|
||||
|
||||
+5
-12
@@ -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;
|
||||
|
||||
+2
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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;
|
||||
+5
-6
@@ -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;
|
||||
}
|
||||
+62
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
+18
@@ -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;
|
||||
}
|
||||
|
||||
+1
-1
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user