package org.netbeans.gradle.project.properties.standard; import java.nio.file.Path; import java.util.HashMap; import java.util.List; import java.util.Map; import org.jtrim.property.PropertyFactory; import org.jtrim.property.PropertySource; import org.netbeans.gradle.project.api.config.ConfigPath; import org.netbeans.gradle.project.api.config.ConfigTree; import org.netbeans.gradle.project.api.config.PropertyDef; import org.netbeans.gradle.project.api.config.PropertyValueDef; import org.netbeans.gradle.project.license.LicenseHeaderInfo; public final class LicenseHeaderInfoProperty { private static final ConfigPath CONFIG_ROOT = ConfigPath.fromKeys("license-header"); private static final String CONFIG_KEY_NAME = "name"; private static final String CONFIG_KEY_FILE = "template"; private static final String CONFIG_KEY_PROPERTY = "property"; private static final String CONFIG_KEY_PROPERTY_NAME = "#attr-name"; public static final PropertyDef<ConfigTree, LicenseHeaderInfo> PROPERTY_DEF = createPropertyDef(); private static PropertyDef<ConfigTree, LicenseHeaderInfo> createPropertyDef() { PropertyDef.Builder<ConfigTree, LicenseHeaderInfo> result = new PropertyDef.Builder<>(CONFIG_ROOT); result.setKeyEncodingDef(CommonProperties.getIdentityTreeKeyEncodingDef()); result.setValueDef(getValueDef()); return result.create(); } private static PropertyValueDef<ConfigTree, LicenseHeaderInfo> getValueDef() { return new PropertyValueDef<ConfigTree, LicenseHeaderInfo>() { @Override public PropertySource<LicenseHeaderInfo> property(ConfigTree valueKey) { return PropertyFactory.constSource(readLicenseHeader(valueKey)); } @Override public ConfigTree getKeyFromValue(LicenseHeaderInfo value) { return value != null ? writeLicenseHeader(value) : null; } }; } private static ConfigTree writeLicenseHeader(LicenseHeaderInfo licenseHeader) { ConfigTree.Builder result = new ConfigTree.Builder(); result.getChildBuilder(CONFIG_KEY_NAME).setValue(licenseHeader.getLicenseName()); Path licenseTemplateFile = licenseHeader.getLicenseTemplateFile(); if (licenseTemplateFile != null) { result.getChildBuilder(CONFIG_KEY_FILE).setValue(CommonProperties.normalizeFilePath(licenseTemplateFile)); } for (Map.Entry<String, String> entry: licenseHeader.getProperties().entrySet()) { ConfigTree.Builder propertyNode = result.addChildBuilder(CONFIG_KEY_PROPERTY); propertyNode.setValue(entry.getValue()); propertyNode.getChildBuilder(CONFIG_KEY_PROPERTY_NAME).setValue(entry.getKey()); } return result.create(); } private static LicenseHeaderInfo readLicenseHeader(ConfigTree licenseNode) { if (licenseNode == null) { return null; } String name = licenseNode.getChildTree(CONFIG_KEY_NAME).getValue(null); if (name == null) { return null; } Path licenseTemplate = CommonProperties.tryReadFilePath(licenseNode.getChildTree(CONFIG_KEY_FILE).getValue(null)); Map<String, String> properties = new HashMap<>(); List<ConfigTree> propertyNodes = licenseNode.getChildTrees(CONFIG_KEY_PROPERTY); for (ConfigTree propertyNode: propertyNodes) { String propertyName = propertyNode.getChildTree(CONFIG_KEY_PROPERTY_NAME).getValue(null); String properyValue = propertyNode.getValue(null); if (propertyName != null && properyValue != null) { properties.put(propertyName.trim(), properyValue.trim()); } } return new LicenseHeaderInfo(name.trim(), properties, licenseTemplate); } private LicenseHeaderInfoProperty() { throw new AssertionError(); } }