Skip to content

Commit

Permalink
Enable loading eclipse rules from local repository, prepare Prettier …
Browse files Browse the repository at this point in the history
…over NodeJs
  • Loading branch information
blacelle committed Aug 13, 2021
1 parent 0334c17 commit ae66467
Show file tree
Hide file tree
Showing 58 changed files with 485 additions and 130 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,12 @@
import eu.solven.cleanthat.config.ConfigHelpers;
import eu.solven.cleanthat.config.IncludeExcludeHelpers;
import eu.solven.cleanthat.github.CleanthatRepositoryProperties;
import eu.solven.cleanthat.language.CleanthatLanguageProperties;
import eu.solven.cleanthat.language.ICodeFormatterApplier;
import eu.solven.cleanthat.language.ILanguageFormatterFactory;
import eu.solven.cleanthat.language.ILanguageProperties;
import eu.solven.cleanthat.language.ISourceCodeFormatterFactory;
import eu.solven.cleanthat.language.ISourceCodeProperties;
import eu.solven.cleanthat.language.LanguageProperties;
import eu.solven.cleanthat.language.LanguagePropertiesAndBuildProcessors;

/**
Expand Down Expand Up @@ -144,7 +144,7 @@ public CodeProviderFormatter(List<ObjectMapper> objectMappers,
}

private ILanguageProperties prepareLanguageConfiguration(CleanthatRepositoryProperties repoProperties,
CleanthatLanguageProperties dirtyLanguageConfig) {
LanguageProperties dirtyLanguageConfig) {
ConfigHelpers configHelpers = new ConfigHelpers(objectMappers);

ILanguageProperties languageP = configHelpers.mergeLanguageProperties(repoProperties,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@

import cormoran.pepper.collection.PepperMapHelper;
import eu.solven.cleanthat.codeprovider.ICodeProvider;
import eu.solven.cleanthat.language.CleanthatLanguageProperties;
import eu.solven.cleanthat.language.ILanguageProperties;
import eu.solven.cleanthat.language.ISourceCodeFormatterFactory;
import eu.solven.cleanthat.language.LanguageProperties;
import eu.solven.cleanthat.language.LanguagePropertiesAndBuildProcessors;

/**
Expand Down Expand Up @@ -68,7 +68,7 @@ protected ILanguageProperties mergeLanguageProperties(Map<String, ?> languagePro
languagePropertiesAsMap.put("source_code", sourcePropertiesAsMap);
}
ILanguageProperties languageProperties =
objectMapper.convertValue(languagePropertiesAsMap, CleanthatLanguageProperties.class);
objectMapper.convertValue(languagePropertiesAsMap, LanguageProperties.class);
return languageProperties;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@

import cormoran.pepper.collection.PepperMapHelper;
import eu.solven.cleanthat.github.CleanthatRepositoryProperties;
import eu.solven.cleanthat.language.CleanthatLanguageProperties;
import eu.solven.cleanthat.language.ILanguageProperties;
import eu.solven.cleanthat.language.ISourceCodeProperties;
import eu.solven.cleanthat.language.LanguageProperties;
import eu.solven.cleanthat.language.SourceCodeProperties;

/**
Expand Down Expand Up @@ -76,8 +76,7 @@ public ILanguageProperties mergeLanguageProperties(CleanthatRepositoryProperties
Map<String, Object> languageConfig = new LinkedHashMap<>();
languageConfig.putAll(dirtyLanguageConfig);
languageConfig.put("source_code", sourceConfig);
ILanguageProperties languageP =
objectMappers.get(0).convertValue(languageConfig, CleanthatLanguageProperties.class);
ILanguageProperties languageP = objectMappers.get(0).convertValue(languageConfig, LanguageProperties.class);
return languageP;
}

Expand All @@ -86,7 +85,7 @@ public ILanguageProperties forceIncludes(ILanguageProperties languageP, List<Str
Map<String, Object> sourceCodeAsMap = objectMappers.get(0).convertValue(languageP.getSourceCode(), Map.class);
sourceCodeAsMap.put("includes", includes);
languageAsMap.put("source_code", sourceCodeAsMap);
return objectMappers.get(0).convertValue(languageAsMap, CleanthatLanguageProperties.class);
return objectMappers.get(0).convertValue(languageAsMap, LanguageProperties.class);
}

public static ObjectMapper getJson(List<ObjectMapper> objectMappers) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import com.fasterxml.jackson.databind.PropertyNamingStrategy;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import eu.solven.cleanthat.language.CleanthatLanguageProperties;
import eu.solven.cleanthat.language.CleanthatMetaProperties;
import eu.solven.cleanthat.language.LanguageProperties;
import eu.solven.cleanthat.language.SourceCodeProperties;
import lombok.Data;

Expand Down Expand Up @@ -36,6 +36,6 @@ public final class CleanthatRepositoryProperties {

// @JsonProperty(index = -999)
// private List<Map<String, ?>> languages = Arrays.asList();
private List<CleanthatLanguageProperties> languages = Arrays.asList();
private List<LanguageProperties> languages = Arrays.asList();

}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
@JsonInclude(JsonInclude.Include.NON_NULL)
@SuppressWarnings("PMD.ImmutableField")
@Data
public class CleanthatLanguageProperties implements ILanguageProperties {
public class LanguageProperties implements ILanguageProperties {

private SourceCodeProperties sourceCode;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,18 +33,18 @@
import eu.solven.cleanthat.formatter.ISourceCodeFormatter;
import eu.solven.cleanthat.formatter.LineEnding;
import eu.solven.cleanthat.language.ILanguageProperties;
import eu.solven.cleanthat.rules.CreateTempFilesUsingNio;
import eu.solven.cleanthat.rules.EnumsWithoutEquals;
import eu.solven.cleanthat.rules.IJdkVersionConstants;
import eu.solven.cleanthat.rules.ModifierOrder;
import eu.solven.cleanthat.rules.OptionalNotEmpty;
import eu.solven.cleanthat.rules.PrimitiveBoxedForString;
import eu.solven.cleanthat.rules.UseDiamondOperator;
import eu.solven.cleanthat.rules.UseDiamondOperatorJdk8;
import eu.solven.cleanthat.rules.UseIsEmptyOnCollections;
import eu.solven.cleanthat.rules.VariableEqualsConstant;
import eu.solven.cleanthat.rules.meta.IClassTransformer;
import eu.solven.cleanthat.rules.meta.VersionWrapper;
import eu.solven.cleanthat.language.java.IJdkVersionConstants;
import eu.solven.cleanthat.language.java.rules.CreateTempFilesUsingNio;
import eu.solven.cleanthat.language.java.rules.EnumsWithoutEquals;
import eu.solven.cleanthat.language.java.rules.ModifierOrder;
import eu.solven.cleanthat.language.java.rules.OptionalNotEmpty;
import eu.solven.cleanthat.language.java.rules.PrimitiveBoxedForString;
import eu.solven.cleanthat.language.java.rules.UseDiamondOperator;
import eu.solven.cleanthat.language.java.rules.UseDiamondOperatorJdk8;
import eu.solven.cleanthat.language.java.rules.UseIsEmptyOnCollections;
import eu.solven.cleanthat.language.java.rules.VariableEqualsConstant;
import eu.solven.cleanthat.language.java.rules.meta.IClassTransformer;
import eu.solven.cleanthat.language.java.rules.meta.VersionWrapper;

/**
* Bridges to Eclipse formatting engine
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package eu.solven.cleanthat.language;

import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets;
import java.util.Optional;

import org.springframework.core.io.ByteArrayResource;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;

import eu.solven.cleanthat.codeprovider.ICodeProvider;

/**
* Knows how to load resource given a URL, with a flexible format handling 'classpath:' to load from the classpath, and
* 'code:' to load from the repository.
*
* @author Benoit Lacelle
*
*/
public class CleanthatUrlLoader {

protected CleanthatUrlLoader() {
// hidden
}

public static Resource loadUrl(ICodeProvider codeProvider, String javaConfigFile) {
Resource resource;
if (javaConfigFile.startsWith("code:")) {
// This is inspired by Spring 'classpath:'
// Here, it is used to load files from current repository
String path = javaConfigFile.substring("code:".length());
Optional<String> optContent;
try {
optContent = codeProvider.loadContentForPath(path);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
if (optContent.isEmpty()) {
throw new IllegalStateException("There is no content at: " + path);
}
resource = new ByteArrayResource(optContent.get().getBytes(StandardCharsets.UTF_8), path);
} else {
resource = new DefaultResourceLoader().getResource(javaConfigFile);
}

return resource;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package eu.solven.cleanthat.language.java;

import eu.solven.cleanthat.codeprovider.ICodeProvider;
import eu.solven.cleanthat.language.ILanguageProperties;
import eu.solven.cleanthat.language.java.eclipse.EclipseJavaFormatterProcessorProperties;
import lombok.EqualsAndHashCode;

/**
* Used as cache Key for Eclipse configuration
*
* @author Benoit Lacelle
*
*/
@EqualsAndHashCode
public class EclipseFormatterCacheKey {
// The same URL may map to different configuration (e.g. if the URL is relative to the repository)
final ICodeProvider codeProvider;
final ILanguageProperties languageProperties;
final EclipseJavaFormatterProcessorProperties eclipseJavaFormatterProcessorProperties;

public EclipseFormatterCacheKey(ICodeProvider codeProvider,
ILanguageProperties languageProperties,
EclipseJavaFormatterProcessorProperties eclipseJavaFormatterProcessorProperties) {
this.codeProvider = codeProvider;
this.languageProperties = languageProperties;
this.eclipseJavaFormatterProcessorProperties = eclipseJavaFormatterProcessorProperties;
}

}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eu.solven.cleanthat.rules;
package eu.solven.cleanthat.language.java;

import java.util.List;

Expand All @@ -9,6 +9,7 @@
*
* @author Benoit Lacelle
*/
// https://www.java.com/releases/
public interface IJdkVersionConstants {

String JDK_1 = "1";
Expand All @@ -21,8 +22,9 @@ public interface IJdkVersionConstants {

String JDK_7 = "1.7";

String JDK_8 = "8";
String JDK_8 = "1.8";

// https://www.infoq.com/news/2015/12/java-version-strings-evolve/
String JDK_9 = "9";

String JDK_11 = "11";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public class JavaFormattersFactory extends ASourceCodeFormatterFactory {
// Prevents parsing/loading remote configuration on each parse
// We expect a low number of different configurations
// Beware this can lead to race-conditions/thread-safety issues into EclipseJavaFormatter
final Cache<Map.Entry<ILanguageProperties, EclipseJavaFormatterProcessorProperties>, EclipseJavaFormatterConfiguration> configToEngine =
final Cache<EclipseFormatterCacheKey, EclipseJavaFormatterConfiguration> configToEngine =
CacheBuilder.newBuilder().maximumSize(DEFAULT_CACHE_SIZE).build();

public JavaFormattersFactory(ObjectMapper objectMapper) {
Expand Down Expand Up @@ -80,12 +80,10 @@ public ISourceCodeFormatter makeFormatter(Map<String, ?> rawProcessor,
EclipseJavaFormatterConfiguration configuration;
try {
configuration = configToEngine
.get(Map.<ILanguageProperties, EclipseJavaFormatterProcessorProperties>entry(languageProperties,
processorConfig), () -> {
// CacheLoader.from(config -> {
return new EclipseJavaFormatterConfiguration(languageProperties, processorConfig);
// })
});
.get(new EclipseFormatterCacheKey(codeProvider, languageProperties, processorConfig), () -> {
return EclipseJavaFormatterConfiguration
.load(codeProvider, languageProperties, processorConfig);
});
} catch (ExecutionException e) {
throw new RuntimeException(e);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@

import eu.solven.cleanthat.formatter.ISourceCodeFormatter;
import eu.solven.cleanthat.formatter.LineEnding;
import eu.solven.cleanthat.language.ILanguageProperties;

/**
* Bridges to Eclipse formatting engine
Expand All @@ -44,12 +43,6 @@ public class EclipseJavaFormatter implements ISourceCodeFormatter {

private final Map<String, String> defaultOptions;

@Deprecated
public EclipseJavaFormatter(ILanguageProperties languageProperties,
EclipseJavaFormatterProcessorProperties processorConfig) {
defaultOptions = new EclipseJavaFormatterConfiguration(languageProperties, processorConfig).getOptions();
}

public EclipseJavaFormatter(EclipseJavaFormatterConfiguration configuration) {
defaultOptions = configuration.getOptions();
}
Expand All @@ -64,11 +57,11 @@ public String doFormat(String code, LineEnding ending) throws IOException {
te = formatter.format(CodeFormatter.K_COMPILATION_UNIT
| CodeFormatter.F_INCLUDE_COMMENTS, code, 0, code.length(), 0, ending.getChars());
if (te == null) {
LOGGER.debug("Code cannot be formatted. Possible cause is unmatched source/target/compliance version.");
LOGGER.warn("Code cannot be formatted. Possible cause is unmatched source/target/compliance version.");
return null;
}
} catch (RuntimeException e) {
LOGGER.debug("Code cannot be formatted for text -->" + code + "<--", e);
LOGGER.warn("Code cannot be formatted for text -->" + code + "<--", e);
return null;
}
IDocument doc = new Document(code);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@
import org.eclipse.jdt.core.JavaCore;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource;
import org.xml.sax.SAXException;

import com.google.common.base.Strings;
import com.google.common.collect.ImmutableMap;

import eu.solven.cleanthat.codeprovider.ICodeProvider;
import eu.solven.cleanthat.language.CleanthatUrlLoader;
import eu.solven.cleanthat.language.ILanguageProperties;
import eu.solven.cleanthat.language.java.eclipse.revelc.ConfigReadException;
import eu.solven.cleanthat.language.java.eclipse.revelc.ConfigReader;
Expand All @@ -48,17 +50,22 @@ public class EclipseJavaFormatterConfiguration {

private final Map<String, String> options;

public EclipseJavaFormatterConfiguration(ILanguageProperties languageProperties,
public EclipseJavaFormatterConfiguration(Map<String, String> options) {
this.options = ImmutableMap.copyOf(options);
}

public static EclipseJavaFormatterConfiguration load(ICodeProvider codeProvider,
ILanguageProperties languageProperties,
EclipseJavaFormatterProcessorProperties processorConfig) {
Map<String, String> options = new LinkedHashMap<>();

String javaConfigFile = processorConfig.getUrl();

// Eclipse default
if (Strings.isNullOrEmpty(javaConfigFile)) {
LOGGER.info("There is no {}. Switching to default formatting", KEY_URL);
// https://github.com/revelc/formatter-maven-plugin/blob/master/src/main/java/net/revelc/code/formatter/FormatterMojo.java#L689
// { "1.3", "1.4", "1.5", "1.6", "1.7", "1.8", "9", "10", "11" }
LOGGER.info("There is no {}. Switching to default formatting", KEY_URL);
String jdkVersion = languageProperties.getLanguageVersion();
// if (optJdkVersion.isEmpty()) {
// LOGGER.warn("No value for {}. Defaulted to: {}", KEY_JDK_VERSION, DEFAULT_JDK_VERSION);
Expand All @@ -70,7 +77,7 @@ public EclipseJavaFormatterConfiguration(ILanguageProperties languageProperties,
} else {
LOGGER.info("Loading Eclipse java formatting configuration from {}", javaConfigFile);

Resource resource = new DefaultResourceLoader().getResource(javaConfigFile);
Resource resource = CleanthatUrlLoader.loadUrl(codeProvider, javaConfigFile);

try (InputStream is = resource.getInputStream()) {
try {
Expand All @@ -85,6 +92,6 @@ public EclipseJavaFormatterConfiguration(ILanguageProperties languageProperties,
}
}

this.options = new LinkedHashMap<>(options);
return new EclipseJavaFormatterConfiguration(options);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package eu.solven.cleanthat.rules;
package eu.solven.cleanthat.language.java.rules;

import java.util.Optional;
import java.util.concurrent.atomic.AtomicBoolean;
Expand All @@ -14,9 +14,9 @@
import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver;
import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver;

import eu.solven.cleanthat.rules.function.OnMethodName;
import eu.solven.cleanthat.rules.meta.IClassTransformer;
import eu.solven.cleanthat.rules.meta.IRuleExternalUrls;
import eu.solven.cleanthat.language.java.rules.function.OnMethodName;
import eu.solven.cleanthat.language.java.rules.meta.IClassTransformer;
import eu.solven.cleanthat.language.java.rules.meta.IRuleExternalUrls;

/**
* Enables common behavior to JavaParser-based rules
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package eu.solven.cleanthat.rules;
package eu.solven.cleanthat.language.java.rules;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.github.javaparser.ast.Node;

import eu.solven.cleanthat.rules.meta.IClassTransformer;
import eu.solven.cleanthat.language.java.IJdkVersionConstants;
import eu.solven.cleanthat.language.java.rules.meta.IClassTransformer;

/**
* Helps preparing rules
Expand Down
Loading

0 comments on commit ae66467

Please sign in to comment.