package org.netbeans.gradle.project.license; import java.io.IOException; import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; import java.util.List; import java.util.Locale; import java.util.logging.Level; import java.util.logging.Logger; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; public final class DefaultLicenseStore implements LicenseStore<DefaultLicenseDef>, LicenseSource { private static final Logger LOGGER = Logger.getLogger(DefaultLicenseStore.class.getName()); private static final String LICENSE_FILE_PREFIX = "license-"; private static final String LICENSE_FILE_SUFFIX = ".txt"; @Override public void addLicense(DefaultLicenseDef licenseDef) throws IOException { FileObject licenseRoot = getLicenseRoot(); if (licenseRoot == null) { LOGGER.warning("License root does not exist."); return; } String baseFileName = toLicenseFileName(licenseDef.getLicenseId()); if (licenseRoot.getFileObject(baseFileName) != null) { LOGGER.log(Level.INFO, "License file already exists: {0}", baseFileName); return; } Path licenseTemplateFile = licenseDef.getSrc(); licenseTemplateFile = licenseTemplateFile.normalize(); if (licenseTemplateFile.getNameCount() == 0) { return; } FileObject licenseTemplateSrc = FileUtil.toFileObject(licenseTemplateFile.toFile()); if (licenseTemplateSrc == null) { LOGGER.log(Level.WARNING, "Missing license template file: {0}", licenseTemplateFile); return; } FileObject templateFile = licenseTemplateSrc.copy(licenseRoot, baseFileName, ""); templateFile.setAttribute("template", true); templateFile.setAttribute("displayName", licenseDef.getDisplayName()); templateFile.setAttribute("dynamicLicense", true); } @Override public Collection<LicenseRef> getAllLicense() { FileObject licenseRoot = tryGetLicenseRoot(); if (licenseRoot == null) { return Collections.emptySet(); } List<LicenseRef> result = new ArrayList<>(); Enumeration<? extends FileObject> children = licenseRoot.getChildren(false); while (children.hasMoreElements()) { FileObject child = children.nextElement(); LicenseRef licenseRef = tryGetLicenseRef(child); if (licenseRef != null) { result.add(licenseRef); } } return result; } private LicenseRef tryGetLicenseRef(FileObject file) { if (file.isFolder()) { return null; } String licenseName = tryExtractLicenseName(file.getNameExt()); if (licenseName == null) { return null; } String displayName = getStringAttr(file, "displayName", licenseName); boolean dynamic = getBoolAttr(file, "dynamicLicense", false); return new LicenseRef(licenseName, displayName, dynamic); } private static boolean getBoolAttr(FileObject file, String attrName, boolean defaultValue) { Object resultObj = file.getAttribute(attrName); if (resultObj instanceof Boolean) { return (Boolean)resultObj; } String resultStr = resultObj != null ? resultObj.toString() : null; if (resultStr == null) { return defaultValue; } if (resultStr.equalsIgnoreCase("true")) { return true; } if (resultStr.equalsIgnoreCase("false")) { return false; } return defaultValue; } private static String getStringAttr(FileObject file, String attrName, String defaultValue) { Object resultObj = file.getAttribute(attrName); String result = resultObj != null ? resultObj.toString() : null; return result != null ? result : defaultValue; } @Override public void removeLicense(String licenseId) throws IOException { FileObject licenseRoot = tryGetLicenseRoot(); if (licenseRoot == null) { LOGGER.warning("License root does not exist."); return; } String baseFileName = toLicenseFileName(licenseId); FileObject licenseFile = licenseRoot.getFileObject(baseFileName); if (licenseFile == null) { LOGGER.log(Level.INFO, "License file does not exist: {0}", baseFileName); return; } licenseFile.delete(); } @Override public boolean containsLicense(String licenseId) { FileObject licenseRoot = tryGetLicenseRoot(); if (licenseRoot == null) { return false; } String fileName = toLicenseFileName(licenseId); return licenseRoot.getFileObject(fileName) != null; } private static String tryExtractLicenseName(String fileName) { String normName = fileName.toLowerCase(Locale.ROOT); if (normName.startsWith(LICENSE_FILE_PREFIX) && normName.endsWith(LICENSE_FILE_SUFFIX)) { return fileName.substring(LICENSE_FILE_PREFIX.length(), fileName.length() - LICENSE_FILE_SUFFIX.length()); } else { return null; } } private static String toLicenseFileName(String licenseName) { // This naming patter in required by NetBeans return LICENSE_FILE_PREFIX + licenseName + LICENSE_FILE_SUFFIX; } private static FileObject tryGetLicenseRoot() { FileObject configRoot = FileUtil.getConfigRoot(); return configRoot != null ? configRoot.getFileObject("Templates/Licenses") : null; } private static FileObject getLicenseRoot() throws IOException { FileObject configRoot = FileUtil.getConfigRoot(); if (configRoot == null) { return null; } FileObject templatesDir = FileUtil.createFolder(configRoot, "Templates"); return FileUtil.createFolder(templatesDir, "Licenses"); } }