package org.netbeans.gradle.project.model;
import java.io.File;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.jtrim.utils.ExceptionHelper;
import org.netbeans.gradle.model.ProjectId;
import org.netbeans.gradle.model.util.CollectionUtils;
import org.netbeans.gradle.project.NbStrings;
import org.netbeans.gradle.project.extensions.NbGradleExtensionRef;
import org.netbeans.gradle.project.script.CommonScripts;
import org.netbeans.gradle.project.script.ScriptFileProvider;
import org.netbeans.gradle.project.tasks.vars.VariableResolver;
import org.netbeans.gradle.project.tasks.vars.VariableResolvers;
import org.netbeans.gradle.project.view.DisplayableTaskVariable;
import org.openide.filesystems.FileObject;
public final class NbGradleModel {
public static final class Builder {
private final NbGenericModelInfo genericInfo;
private final Map<String, Object> extensionModels;
private boolean rootWithoutSettingsGradle;
public Builder(NbGenericModelInfo genericInfo) {
ExceptionHelper.checkNotNullArgument(genericInfo, "genericInfo");
this.genericInfo = genericInfo;
this.extensionModels = new HashMap<>();
this.rootWithoutSettingsGradle = false;
}
public Builder(NbGradleModel base) {
this.genericInfo = base.getGenericInfo();
this.extensionModels = new HashMap<>(base.extensionModels);
}
public File getProjectDir() {
return genericInfo.getProjectDir();
}
public void setRootWithoutSettingsGradle(boolean rootWithoutSettingsGradle) {
this.rootWithoutSettingsGradle = rootWithoutSettingsGradle;
}
public void setModelForExtension(NbGradleExtensionRef extension, Object model) {
setModelForExtension(extension.getName(), model);
}
public void setModelForExtension(String extensionName, Object model) {
extensionModels.put(extensionName, model);
}
public NbGradleModel create() {
return new NbGradleModel(genericInfo, extensionModels, rootWithoutSettingsGradle);
}
}
private final NbGenericModelInfo genericInfo;
// Maps extension name to extension model
private final Map<String, Object> extensionModels;
// If true, we must instruct Gradle not to search for a settings.gradle.
private final boolean rootWithoutSettingsGradle;
public NbGradleModel(NbGradleMultiProjectDef projectDef, ScriptFileProvider scriptProvider) {
this(new NbGenericModelInfo(projectDef, scriptProvider),
Collections.<String, Object>emptyMap(),
false,
false);
}
public NbGradleModel(
NbGenericModelInfo genericInfo,
Map<String, Object> extensionModels,
boolean rootWithoutSettingsGradle) {
this(genericInfo, extensionModels, true, rootWithoutSettingsGradle);
}
private NbGradleModel(
NbGenericModelInfo genericInfo,
Map<String, Object> extensionModels,
boolean copyMap,
boolean rootWithoutSettingsGradle) {
ExceptionHelper.checkNotNullArgument(genericInfo, "genericInfo");
this.genericInfo = genericInfo;
this.extensionModels = copyMap
? CollectionUtils.copyNullSafeHashMapWithNullValues(extensionModels)
: extensionModels;
this.rootWithoutSettingsGradle = rootWithoutSettingsGradle;
}
public static List<NbGradleModel> createAll(Collection<? extends Builder> builders) {
List<NbGradleModel> result = new ArrayList<>(builders.size());
for (Builder builder: builders) {
result.add(builder.create());
}
return result;
}
public boolean isRootWithoutSettingsGradle() {
return rootWithoutSettingsGradle;
}
public NbGenericModelInfo getGenericInfo() {
return genericInfo;
}
public boolean hasModelOfExtension(NbGradleExtensionRef extension) {
return hasModelOfExtension(extension.getName());
}
public boolean hasModelOfExtension(String extensionName) {
return extensionModels.containsKey(extensionName);
}
public Object getModelOfExtension(NbGradleExtensionRef extension) {
return extensionModels.get(extension.getName());
}
public Object getModelOfExtension(String extensionName) {
return extensionModels.get(extensionName);
}
public Map<String, Object> getExtensionModels() {
return extensionModels;
}
public void setModelForExtension(NbGradleExtensionRef extension) {
extension.setModelForExtension(extensionModels.get(extension.getName()));
}
public static Path findSettingsGradle(Path projectDir, ScriptFileProvider scriptProvider) {
return NbGenericModelInfo.findSettingsGradle(projectDir, scriptProvider);
}
public static FileObject findSettingsGradle(FileObject projectDir, ScriptFileProvider scriptProvider) {
return NbGenericModelInfo.findSettingsGradle(projectDir, scriptProvider);
}
public ProjectId getProjectId() {
return genericInfo.getMainProject().getGenericProperties().getProjectId();
}
public String getDisplayName(String namePattern) {
VariableResolver resolver = VariableResolvers.getDefault();
String rawName = resolver.replaceVars(namePattern, DisplayableTaskVariable.createVarReplaceMap(this));
if (isBuildSrc()) {
return NbStrings.getBuildSrcMarker(rawName);
}
if (isRootProject()) {
return NbStrings.getRootProjectMarker(rawName);
}
return rawName;
}
public String getDisplayName() {
return getDisplayName(DisplayableTaskVariable.PROJECT_NAME.getScriptReplaceConstant());
}
public String getDescription() {
if (isBuildSrc()) {
File ownerProjectDir = getProjectDir().getParentFile();
if (ownerProjectDir == null) {
ownerProjectDir = getProjectDir();
}
String name = ownerProjectDir.getName();
String projectDir = ownerProjectDir.getAbsolutePath();
return NbStrings.getBuildSrcDescription(name, projectDir);
}
else {
String name = getMainProject().getProjectFullName();
name = name.trim();
if (name.isEmpty()) {
name = getProjectDir().getName();
}
String projectDir = getProjectDir().getAbsolutePath();
if (isRootProject()) {
return NbStrings.getRootProjectDescription(name, projectDir);
}
else {
return NbStrings.getSubProjectDescription(name, projectDir);
}
}
}
public static boolean isBuildSrcDirectory(File projectDir) {
return projectDir.getName().equalsIgnoreCase(CommonScripts.BUILD_SRC_NAME);
}
public boolean isBuildSrc() {
return isBuildSrcDirectory(getProjectDir());
}
public boolean isRootProject() {
return genericInfo.isRootProject();
}
public NbGradleMultiProjectDef getProjectDef() {
return genericInfo.getProjectDef();
}
public NbGradleProjectTree getMainProject() {
return genericInfo.getMainProject();
}
public NbGradleModel createNonDirtyCopy() {
return new NbGradleModel(genericInfo, extensionModels, rootWithoutSettingsGradle);
}
public File getProjectDir() {
return genericInfo.getProjectDir();
}
/**
* Returns the directory containing the {@code settings.gradle} file.
* This method also works for the {@code buildSrc} project, for which this
* returns the directory of the root project this {@code buildSrc} project
* belongs to.
*
* @return the directory containing the {@code settings.gradle} file.
* This method never returns {@code null}.
*/
public Path getSettingsDir() {
return genericInfo.getSettingsDir();
}
public File getBuildFile() {
return genericInfo.getBuildFile();
}
public Path getSettingsFile() {
return genericInfo.getSettingsFile();
}
public SettingsGradleDef getSettingsGradleDef() {
return new SettingsGradleDef(getSettingsFile(), !rootWithoutSettingsGradle);
}
public FileObject tryGetProjectDirAsObj() {
return genericInfo.tryGetProjectDirAsObj();
}
public FileObject tryGetBuildFileObj() {
return genericInfo.tryGetBuildFileObj();
}
public FileObject tryGetSettingsFileObj() {
return genericInfo.tryGetSettingsFileObj();
}
public NbGradleModel updateEntry(NbGradleModel newContent) {
Map<String, Object> newExtensionModels
= new HashMap<>(extensionModels);
for (Map.Entry<String, Object> entry: newContent.extensionModels.entrySet()) {
newExtensionModels.put(entry.getKey(), entry.getValue());
}
return new NbGradleModel(newContent.getGenericInfo(), newExtensionModels, false);
}
}