package org.intellij.sonar.util;
import static org.intellij.sonar.util.Placeholder.MODULE_BASE_DIR;
import static org.intellij.sonar.util.Placeholder.MODULE_BASE_DIR_NAME;
import static org.intellij.sonar.util.Placeholder.MODULE_NAME;
import static org.intellij.sonar.util.Placeholder.PROJECT_BASE_DIR;
import static org.intellij.sonar.util.Placeholder.PROJECT_BASE_DIR_NAME;
import static org.intellij.sonar.util.Placeholder.PROJECT_NAME;
import static org.intellij.sonar.util.Placeholder.SONAR_HOST_URL;
import static org.intellij.sonar.util.Placeholder.SONAR_SERVER_NAME;
import static org.intellij.sonar.util.Placeholder.SONAR_USER_NAME;
import static org.intellij.sonar.util.Placeholder.SONAR_USER_PASSWORD;
import static org.intellij.sonar.util.Placeholder.WORKING_DIR;
import static org.intellij.sonar.util.Placeholder.WORKING_DIR_NAME;
import java.io.File;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import org.intellij.sonar.persistence.SonarServerConfig;
public class TemplateProcessor {
private String myTemplate;
private Project myProject;
private Module myModule;
private SonarServerConfig mySonarServerConfig;
private File myWorkingDir;
public TemplateProcessor(String myTemplate) {
this.myTemplate = myTemplate;
}
public static TemplateProcessor of(String template) {
return new TemplateProcessor(template);
}
public TemplateProcessor withModule(Module module) {
this.myModule = module;
return this;
}
public TemplateProcessor withProject(Project project) {
this.myProject = project;
return this;
}
public TemplateProcessor withSonarServerConfiguration(SonarServerConfig sonarServerConfig) {
this.mySonarServerConfig = sonarServerConfig;
return this;
}
public TemplateProcessor withWorkingDir(File workingDir) {
this.myWorkingDir = workingDir;
return this;
}
public String process() {
if (myTemplate == null)
throw new IllegalArgumentException("template");
String template = myTemplate;
template = replacePlaceHolders(template,myProject);
template = replacePlaceHolders(template,myModule);
template = replacePlaceHolders(template,mySonarServerConfig);
template = replacePlaceHolders(template,myWorkingDir);
return template;
}
private static String replacePlaceHolders(String template,File workingDir) {
String processedTemplate = template;
String workingDirName = "";
String workingDirPath = "";
if (null != workingDir) {
workingDirName = workingDir.getName();
workingDirPath = workingDir.getPath();
}
processedTemplate = processedTemplate.replace(WORKING_DIR_NAME.getVariableName(),workingDirName);
processedTemplate = processedTemplate.replace(WORKING_DIR.getVariableName(),workingDirPath);
return processedTemplate;
}
private static String replacePlaceHolders(String template,Module module) {
String processedTemplate = template;
String moduleName = "";
String moduleBaseDirPath = "";
String moduleBaseDirName = "";
if (null != module) {
moduleName = module.getName();
final VirtualFile moduleFile = module.getModuleFile();
if (null != moduleFile) {
final VirtualFile moduleBaseDir = moduleFile.getParent();
moduleBaseDirPath = moduleBaseDir.getPath();
moduleBaseDirName = moduleBaseDir.getName();
}
}
processedTemplate = processedTemplate.replace(MODULE_NAME.getVariableName(),moduleName);
processedTemplate = processedTemplate.replace(MODULE_BASE_DIR_NAME.getVariableName(),moduleBaseDirName);
processedTemplate = processedTemplate.replace(MODULE_BASE_DIR.getVariableName(),moduleBaseDirPath);
return processedTemplate;
}
private static String replacePlaceHolders(String template,Project project) {
String processedTemplate = template;
String projectName = "";
String projectBaseDir = "";
String projectBaseDirName = "";
if (null != project) {
projectName = project.getName();
projectBaseDir = project.getBasePath();
projectBaseDirName = project.getBaseDir().getName();
}
processedTemplate = processedTemplate.replace(PROJECT_NAME.getVariableName(),projectName);
processedTemplate = processedTemplate.replace(PROJECT_BASE_DIR_NAME.getVariableName(),projectBaseDirName);
processedTemplate = processedTemplate.replace(PROJECT_BASE_DIR.getVariableName(),projectBaseDir);
return processedTemplate;
}
private static String replacePlaceHolders(String template,SonarServerConfig sonarServerConfig) {
String processedTemplate = template;
String sonarUserPassword = "";
String sonarHostUrl = "";
String sonarServerName = "";
String sonarUserName = "";
if (null != sonarServerConfig) {
sonarHostUrl = sonarServerConfig.getHostUrl();
sonarServerName = sonarServerConfig.getName();
sonarUserName = sonarServerConfig.getUser();
if (template.contains(SONAR_USER_PASSWORD.getVariableName())
&& !sonarServerConfig.isAnonymous() && !StringUtil.isEmptyOrSpaces(sonarServerConfig.getUser())) {
sonarUserPassword = sonarServerConfig.loadPassword();
}
}
processedTemplate = processedTemplate.replace(SONAR_HOST_URL.getVariableName(),sonarHostUrl);
processedTemplate = processedTemplate.replace(SONAR_SERVER_NAME.getVariableName(),sonarServerName);
processedTemplate = processedTemplate.replace(SONAR_USER_NAME.getVariableName(),sonarUserName);
processedTemplate = processedTemplate.replace(SONAR_USER_PASSWORD.getVariableName(),sonarUserPassword);
return processedTemplate;
}
}