package jp.co.worksap.workspace.ide.eclipse;
import static com.google.common.base.Preconditions.checkNotNull;
import java.io.File;
import java.io.IOException;
import java.net.URL;
import java.nio.charset.Charset;
import lombok.AllArgsConstructor;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Charsets;
import com.google.common.base.Function;
import com.google.common.collect.FluentIterable;
import com.google.common.io.Files;
import com.google.common.io.Resources;
public class EclipseWorkspaceInitializer {
@VisibleForTesting
static final String PREFIX_OF_ENCODING = "encoding/<project>=";
/**
* @return directory which is workspace of Eclipse
*/
public void initialize(EclipseConfiguration config, File workspace) {
ensureDirectoryExists(workspace);
try {
createPrefFiles(workspace, config.getDefaultCharset());
} catch (IOException e) {
throw new IllegalStateException(e);
}
new FindBugsPluginConfigurator().configure(config.getFindbugs(), workspace);
new JavaFormatterConfigurator().configure(config.getJavaFormat(), workspace);
}
private void createPrefFiles(File workspace, Charset defaultCharset) throws IOException {
File settingDirectory = new File(workspace, ".settings");
ensureDirectoryExists(settingDirectory);
URL template = Resources.getResource(getClass(), "org.eclipse.core.resources.prefs");
File corePrefFile = new File(settingDirectory, "org.eclipse.core.resources.prefs");
FluentIterable<String> prefs = FluentIterable.from(Resources.asCharSource(template, Charsets.UTF_8).readLines());
Files.asCharSink(corePrefFile, Charsets.UTF_8).writeLines(
prefs.transform(new EncodingReplacer(defaultCharset)));
}
private void ensureDirectoryExists(File directory) {
if (!directory.isDirectory() && !directory.mkdir()) {
throw new IllegalStateException("could not create directory at:" + directory.getAbsolutePath());
}
}
@AllArgsConstructor
private static final class EncodingReplacer implements Function<String, String> {
private final Charset charset;
@Override
public String apply(String before) {
checkNotNull(before);
if (before.startsWith(PREFIX_OF_ENCODING)) {
return PREFIX_OF_ENCODING + charset.displayName();
} else {
return before;
}
}
}
}