package org.netbeans.gradle.project.properties;
import java.util.List;
import java.util.Map;
import org.netbeans.gradle.project.api.config.ConfigTree;
final class CompatibleRootNodeProperty extends AbstractFixedOrderNodeProperty {
private static final String[] ROOT_KEYS = {
"source-encoding",
"target-platform-name",
"target-platform",
"source-level",
"common-tasks",
"script-platform",
"gradle-home",
"license-header",
"built-in-tasks"
};
public static final ConfigNodeProperty INSTANCE = new CompatibleRootNodeProperty();
private CompatibleRootNodeProperty() {
super(ROOT_KEYS);
}
@Override
public boolean ignoreValue() {
return true;
}
@Override
public ConfigNodeProperty getChildSorter(String keyName) {
switch (keyName) {
case "common-tasks":
return TaskListOrder.INSTANCE;
case "license-header":
return LicenseOrder.INSTANCE;
case "built-in-tasks":
return TaskListOrder.INSTANCE;
default:
return DefaultConfigNodeProperty.INSTANCE;
}
}
private static final class IgnoreValueProperty extends AbstractConfigNodeProperty {
public static final ConfigNodeProperty INSTANCE = new IgnoreValueProperty();
@Override
public boolean ignoreValue() {
return true;
}
}
private static abstract class AbstractFixedOrderNodePropertyWithoutValue
extends
AbstractFixedOrderNodeProperty {
public AbstractFixedOrderNodePropertyWithoutValue(String... order) {
super(order);
}
@Override
public boolean ignoreValue() {
return true;
}
}
private static final class TaskOrder extends AbstractFixedOrderNodePropertyWithoutValue {
private static final String TASK_ARGS = "task-args";
private static final String TASK_JVM_ARGS = "task-jvm-args";
private static final String[] TASK_KEYS = {
"display-name",
"non-blocking",
"task-names",
TASK_ARGS,
TASK_JVM_ARGS
};
public static final ConfigNodeProperty INSTANCE = new TaskOrder();
public TaskOrder() {
super(TASK_KEYS);
}
@Override
public ConfigNodeProperty getChildSorter(String keyName) {
switch (keyName) {
case TASK_ARGS:
return IgnoreValueProperty.INSTANCE;
case TASK_JVM_ARGS:
return IgnoreValueProperty.INSTANCE;
default:
return DefaultConfigNodeProperty.INSTANCE;
}
}
@Override
public ConfigTree adjustNodes(ConfigTree actualTree) {
Map<String, List<ConfigTree>> children = actualTree.getChildTrees();
boolean hasTaskArgs = children.containsKey(TASK_ARGS);
boolean hasTasJvmArgs = actualTree.getChildTrees().containsKey(TASK_JVM_ARGS);
if (hasTaskArgs && hasTasJvmArgs) {
return actualTree;
}
// We set their values, so that they will remain in the tree
ConfigTree.Builder result = new ConfigTree.Builder(actualTree);
result.getChildBuilder(TASK_ARGS).setValue("");
result.getChildBuilder(TASK_JVM_ARGS).setValue("");
return result.create();
}
}
private static final class LicenseOrder extends AbstractFixedOrderNodePropertyWithoutValue {
private static final String[] LICENSE_KEYS = {
"name",
"template",
"property"
};
public static final ConfigNodeProperty INSTANCE = new LicenseOrder();
public LicenseOrder() {
super(LICENSE_KEYS);
}
@Override
public ConfigNodeProperty getChildSorter(String keyName) {
return DefaultConfigNodeProperty.INSTANCE;
}
}
private static final class TaskListOrder extends AbstractFixedOrderNodePropertyWithoutValue {
public static final ConfigNodeProperty INSTANCE = new TaskListOrder();
public TaskListOrder() {
super();
}
@Override
public ConfigNodeProperty getChildSorter(String keyName) {
if ("task".equals(keyName)) {
return TaskOrder.INSTANCE;
}
else {
return DefaultConfigNodeProperty.INSTANCE;
}
}
}
}