package jp.co.worksap.workspace.ide.eclipse; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; import java.util.ArrayList; import javax.annotation.ParametersAreNonnullByDefault; import lombok.extern.slf4j.Slf4j; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Charsets; import com.google.common.base.Optional; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.base.Strings; import com.google.common.collect.FluentIterable; import com.google.common.collect.Iterables; import com.google.common.io.Files; @Slf4j @ParametersAreNonnullByDefault class JavaFormatterConfigurator { private static final String METADATA_DIRECTORY = ".metadata/.plugins/org.eclipse.core.runtime/.settings"; private static final String METADATA_FILE = "org.eclipse.jdt.core.prefs"; private static final String PREFIX_OF_PARAMETER = "org.eclipse.jdt.core.formatter."; void configure(Optional<JavaFormatterConfiguration> configuration, File workspace) { if (! configuration.isPresent()) { log.info("no configuration provided. skip configuring Java formatter."); return; } String sourcePath = configuration.get().getMetadata(); if (Strings.isNullOrEmpty(sourcePath)) { log.info("no metadata file specified. skip configuring Java formatter."); return; } File sourceMetadata = new File(sourcePath); File metadataFile = metadataIn(workspace); if (! sourceMetadata.isFile()) { log.warn("source of metadata file does not exist: {}", sourceMetadata.getAbsolutePath()); return; } addLines(sourceMetadata, metadataFile); } /** * Replace lines in current metadata with configuration. * Lines which starts with PREFIX_OF_PARAMETER is the target. */ @VisibleForTesting void addLines(File configuration, File existingMetadataFile) { PrefixFilter prefixFilter = new PrefixFilter(); Charset configurationFileCharset = Charsets.UTF_8; try { FluentIterable<String> existingOtherMetadata; if (existingMetadataFile.exists()) { existingOtherMetadata = FluentIterable.from(Files.readLines(existingMetadataFile, configurationFileCharset)) .filter(Predicates.not(prefixFilter)); } else { existingOtherMetadata = FluentIterable.from(new ArrayList<String>()); } FluentIterable<String> givenConfiguartion = FluentIterable.from(Files.readLines(configuration, configurationFileCharset)) .filter(prefixFilter); Iterable<String> newConfiguration = Iterables.concat(existingOtherMetadata, givenConfiguartion); Files.asCharSink(existingMetadataFile, configurationFileCharset).writeLines(newConfiguration); } catch (IOException e) { throw new IllegalStateException(e); } } private File metadataIn(File workspace) { File metadataDirectory = new File(workspace, METADATA_DIRECTORY); if (! metadataDirectory.isDirectory()) { metadataDirectory.mkdirs(); } return new File(metadataDirectory, METADATA_FILE); } private static final class PrefixFilter implements Predicate<String> { @Override public boolean apply(String string) { return string.startsWith(PREFIX_OF_PARAMETER); } } }