jps: make validator configuration available via JpsModel

This is required to implement JSP Validation in external build process (IDEA-206443).
This commit is contained in:
nik
2019-02-01 12:59:52 +03:00
parent c708c57e50
commit 3678e1c2fd
11 changed files with 149 additions and 26 deletions
@@ -127,14 +127,14 @@ public class ValidationConfigurable implements SearchableConfigurable, Configura
return o1.getDescription().equals(o2.getDescription());
}
});
return myConfiguration.VALIDATE_ON_BUILD != myValidateBox.isSelected() ||
return myConfiguration.isValidateOnBuild() != myValidateBox.isSelected() ||
set.retainAll(markedValidators) ||
myExcludedConfigurable.isModified();
}
@Override
public void apply() throws ConfigurationException {
myConfiguration.VALIDATE_ON_BUILD = myValidateBox.isSelected();
myConfiguration.setValidateOnBuild(myValidateBox.isSelected());
for (int i = 0; i < myValidators.getElementCount(); i++) {
final Compiler validator = myValidators.getElementAt(i);
myConfiguration.setSelected(validator, myValidators.isElementMarked(validator));
@@ -144,7 +144,7 @@ public class ValidationConfigurable implements SearchableConfigurable, Configura
@Override
public void reset() {
myValidateBox.setSelected(myConfiguration.VALIDATE_ON_BUILD);
myValidateBox.setSelected(myConfiguration.isValidateOnBuild());
final List<Compiler> validators = getValidators();
Collections.sort(validators, Comparator.comparing(Compiler::getDescription));
myValidators.setElements(validators, false);
@@ -13,22 +13,18 @@ import com.intellij.openapi.project.Project;
import com.intellij.util.xmlb.XmlSerializerUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.serialization.java.compiler.JpsCompilerValidationExcludeSerializer;
import java.util.HashMap;
import java.util.Map;
import org.jetbrains.jps.model.serialization.java.compiler.JpsValidationSerializer;
/**
* @author Dmitry Avdeev
*/
@State(name = "ValidationConfiguration", storages = @Storage("validation.xml"))
public class ValidationConfiguration implements PersistentStateComponent<ValidationConfiguration> {
public boolean VALIDATE_ON_BUILD = false;
public Map<String, Boolean> VALIDATORS = new HashMap<>();
@State(name = JpsValidationSerializer.COMPONENT_NAME, storages = @Storage(JpsValidationSerializer.CONFIG_FILE_NAME))
public class ValidationConfiguration implements PersistentStateComponent<JpsValidationSerializer.ValidationConfigurationState> {
private final JpsValidationSerializer.ValidationConfigurationState myState = new JpsValidationSerializer.ValidationConfigurationState();
public static boolean shouldValidate(Compiler validator, CompileContext context) {
ValidationConfiguration configuration = getInstance(context.getProject());
return (configuration.VALIDATE_ON_BUILD) && configuration.isSelected(validator);
return (configuration.myState.VALIDATE_ON_BUILD) && configuration.isSelected(validator);
}
public boolean isSelected(Compiler validator) {
@@ -36,16 +32,24 @@ public class ValidationConfiguration implements PersistentStateComponent<Validat
}
public boolean isSelected(String validatorDescription) {
final Boolean selected = VALIDATORS.get(validatorDescription);
final Boolean selected = myState.VALIDATORS.get(validatorDescription);
return selected == null || selected.booleanValue();
}
public boolean isValidateOnBuild() {
return myState.VALIDATE_ON_BUILD;
}
public void setValidateOnBuild(boolean value) {
myState.VALIDATE_ON_BUILD = value;
}
public void setSelected(Compiler validator, boolean selected) {
setSelected(validator.getDescription(), selected);
}
public void setSelected(String validatorDescription, boolean selected) {
VALIDATORS.put(validatorDescription, selected);
myState.VALIDATORS.put(validatorDescription, selected);
}
public static ValidationConfiguration getInstance(Project project) {
@@ -57,13 +61,14 @@ public class ValidationConfiguration implements PersistentStateComponent<Validat
}
@Override
public ValidationConfiguration getState() {
return this;
@NotNull
public JpsValidationSerializer.ValidationConfigurationState getState() {
return myState;
}
@Override
public void loadState(@NotNull final ValidationConfiguration state) {
XmlSerializerUtil.copyBean(state, this);
public void loadState(@NotNull final JpsValidationSerializer.ValidationConfigurationState state) {
XmlSerializerUtil.copyBean(state, myState);
}
@State(
@@ -23,6 +23,7 @@ import org.jetbrains.jps.model.module.JpsModule;
import java.io.File;
import java.util.Collection;
import java.util.List;
import java.util.Set;
/**
* @author nik
@@ -43,6 +44,11 @@ public interface JpsJavaCompilerConfiguration extends JpsElement {
@NotNull
JpsCompilerExcludes getValidationExcludes();
@NotNull
JpsValidationConfiguration getValidationConfiguration();
void setValidationConfiguration(boolean validateOnBuild, @NotNull Set<String> disabledValidators);
@NotNull
ProcessorConfigProfile getDefaultAnnotationProcessingProfile();
ProcessorConfigProfile addAnnotationProcessingProfile();
@@ -0,0 +1,8 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.jps.model.java.compiler;
public interface JpsValidationConfiguration {
boolean isValidateOnBuild();
boolean isValidatorEnabled(String validatorId);
}
@@ -20,10 +20,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jps.model.JpsElementChildRole;
import org.jetbrains.jps.model.ex.JpsCompositeElementBase;
import org.jetbrains.jps.model.ex.JpsElementChildRoleBase;
import org.jetbrains.jps.model.java.compiler.JpsCompilerExcludes;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions;
import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile;
import org.jetbrains.jps.model.java.compiler.*;
import org.jetbrains.jps.model.module.JpsModule;
import java.io.File;
@@ -49,6 +46,7 @@ public class JpsJavaCompilerConfigurationImpl extends JpsCompositeElementBase<Jp
private String myJavaCompilerId = "Javac";
private Map<JpsModule, ProcessorConfigProfile> myAnnotationProcessingProfileMap;
private ResourcePatterns myCompiledPatterns;
private JpsValidationConfiguration myValidationConfiguration = new JpsValidationConfigurationImpl(false, Collections.emptySet());
public JpsJavaCompilerConfigurationImpl() {
}
@@ -105,6 +103,17 @@ public class JpsJavaCompilerConfigurationImpl extends JpsCompositeElementBase<Jp
return myValidationExcludes;
}
@NotNull
@Override
public JpsValidationConfiguration getValidationConfiguration() {
return myValidationConfiguration;
}
@Override
public void setValidationConfiguration(boolean validateOnBuild, @NotNull Set<String> disabledValidators) {
myValidationConfiguration = new JpsValidationConfigurationImpl(validateOnBuild, disabledValidators);
}
@NotNull
@Override
public ProcessorConfigProfile getDefaultAnnotationProcessingProfile() {
@@ -0,0 +1,26 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.jps.model.java.impl.compiler;
import org.jetbrains.jps.model.java.compiler.JpsValidationConfiguration;
import java.util.Set;
public class JpsValidationConfigurationImpl implements JpsValidationConfiguration {
private final boolean myValidateOnBuild;
private final Set<String> myDisabledValidators;
public JpsValidationConfigurationImpl(boolean validateOnBuild, Set<String> disabledValidators) {
myValidateOnBuild = validateOnBuild;
myDisabledValidators = disabledValidators;
}
@Override
public boolean isValidateOnBuild() {
return myValidateOnBuild;
}
@Override
public boolean isValidatorEnabled(String validatorId) {
return !myDisabledValidators.contains(validatorId);
}
}
@@ -98,6 +98,7 @@ public class JpsJavaModelSerializerExtension extends JpsModelSerializerExtension
public List<? extends JpsProjectExtensionSerializer> getProjectExtensionSerializers() {
return Arrays.asList(new JavaProjectExtensionSerializer(),
new JpsJavaCompilerConfigurationSerializer(),
new JpsValidationSerializer(),
new JpsJavaCompilerNotNullableSerializer(),
new JpsCompilerValidationExcludeSerializer(),
new JpsJavaCompilerWorkspaceConfigurationSerializer(),
@@ -0,0 +1,44 @@
// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.jps.model.serialization.java.compiler;
import com.intellij.util.xmlb.XmlSerializer;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jps.model.JpsProject;
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration;
import org.jetbrains.jps.model.serialization.JpsProjectExtensionSerializer;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
public class JpsValidationSerializer extends JpsProjectExtensionSerializer {
public static final String COMPONENT_NAME = "ValidationConfiguration";
public static final String CONFIG_FILE_NAME = "validation.xml";
public JpsValidationSerializer() {
super(CONFIG_FILE_NAME, COMPONENT_NAME);
}
@Override
public void loadExtension(@NotNull JpsProject project, @NotNull Element componentTag) {
JpsJavaCompilerConfiguration configuration = JpsJavaExtensionService.getInstance().getOrCreateCompilerConfiguration(project);
ValidationConfigurationState state = XmlSerializer.deserialize(componentTag, ValidationConfigurationState.class);
Set<String> disabledValidators = state.VALIDATORS.entrySet().stream()
.filter(e -> e.getValue() == Boolean.FALSE)
.map(e -> e.getKey())
.collect(Collectors.toSet());
configuration.setValidationConfiguration(state.VALIDATE_ON_BUILD, disabledValidators);
}
@Override
public void saveExtension(@NotNull JpsProject project, @NotNull Element componentTag) {
}
public static class ValidationConfigurationState {
public boolean VALIDATE_ON_BUILD = false;
public Map<String, Boolean> VALIDATORS = new HashMap<>();
}
}
@@ -55,5 +55,14 @@
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_6" assert-keyword="true" jdk-15="true" project-jdk-name="1.6" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
<component name="ValidationConfiguration">
<option name="VALIDATE_ON_BUILD" value="true" />
<option name="VALIDATORS">
<map>
<entry key="Hibernate Validator" value="false" />
<entry key="Jasper Validator" value="true" />
</map>
</option>
</component>
</project>
@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ValidationConfiguration">
<option name="VALIDATE_ON_BUILD" value="true" />
<option name="VALIDATORS">
<map>
<entry key="Hibernate Validator" value="false" />
<entry key="Jasper Validator" value="true" />
</map>
</option>
</component>
</project>
@@ -17,10 +17,7 @@ package org.jetbrains.jps.model.serialization;
import com.intellij.openapi.util.io.FileUtil;
import org.jetbrains.jps.model.java.JpsJavaExtensionService;
import org.jetbrains.jps.model.java.compiler.JpsCompilerExcludes;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerConfiguration;
import org.jetbrains.jps.model.java.compiler.JpsJavaCompilerOptions;
import org.jetbrains.jps.model.java.compiler.ProcessorConfigProfile;
import org.jetbrains.jps.model.java.compiler.*;
import org.jetbrains.jps.util.JpsPathUtil;
import java.io.File;
@@ -72,6 +69,12 @@ public class JpsCompilerConfigurationTest extends JpsSerializationTestCase {
assertEquals(2, override.size());
assertEquals("-param_1", override.get("mod_1"));
assertEquals("-param_2", override.get("mod_2"));
JpsValidationConfiguration validationConfiguration = configuration.getValidationConfiguration();
assertTrue(validationConfiguration.isValidateOnBuild());
assertTrue(validationConfiguration.isValidatorEnabled("Jasper Validator"));
assertFalse(validationConfiguration.isValidatorEnabled("Hibernate Validator"));
assertTrue(validationConfiguration.isValidatorEnabled("JPA Validator"));
}
private boolean isExcluded(JpsCompilerExcludes excludes, final String path) {