package org.netbeans.gradle.project.properties; import java.util.ArrayList; import java.util.List; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.jtrim.utils.ExceptionHelper; import org.netbeans.spi.project.AuxiliaryProperties; import org.w3c.dom.Document; import org.w3c.dom.Element; public final class GradleAuxiliaryProperties implements AuxiliaryProperties { private final GradleAuxiliaryConfiguration config; private final Document elementFactory; private final Lock factoryLock; public GradleAuxiliaryProperties(GradleAuxiliaryConfiguration config) { ExceptionHelper.checkNotNullArgument(config, "config"); this.config = config; this.factoryLock = new ReentrantLock(); try { this.elementFactory = DocumentBuilderFactory .newInstance() .newDocumentBuilder() .newDocument(); } catch (ParserConfigurationException ex) { throw new RuntimeException(ex.getMessage(), ex); } } private Element createElement(String name) { factoryLock.lock(); try { return elementFactory.createElement(name); } finally { factoryLock.unlock(); } } @Override public String get(String key, boolean shared) { Element configNode = config.getConfigurationFragment(key, null, shared); return configNode != null ? configNode.getTextContent() : null; } @Override public void put(String key, String value, boolean shared) { if (value == null) { config.removeConfigurationFragment(key, null, shared); return; } Element configNode = createElement(key); configNode.setTextContent(value); config.putConfigurationFragment(configNode, shared); } @Override public Iterable<String> listKeys(boolean shared) { List<String> result = new ArrayList<>(); for (DomElementKey key: config.getConfigElements(shared)) { if (key.getNamespace() == null) { result.add(key.getName()); } } return result; } }