1   package org.daisy.pipeline.tts.config;
2   
3   import java.net.URI;
4   import java.util.HashMap;
5   import java.util.Map;
6   
7   import net.sf.saxon.s9api.QName;
8   import net.sf.saxon.s9api.XdmNode;
9   
10  import org.daisy.common.properties.Properties;
11  import org.daisy.pipeline.tts.config.ConfigReader;
12  
13  import org.slf4j.Logger;
14  import org.slf4j.LoggerFactory;
15  
16  public class DynamicPropertiesExtension implements ConfigReader.Extension {
17  
18  	private static final Logger logger = LoggerFactory.getLogger(VoiceConfigExtension.class);
19  	private static final String HOST_PROTECTION_PROPERTY = Properties.getProperty("org.daisy.pipeline.tts.host.protection", "true");
20  
21  	private Map<String,String> props = new HashMap<>();
22  
23  	@Override
24  	public boolean parseNode(XdmNode node, URI documentURI, ConfigReader parent) {
25  		String name = node.getNodeName().getLocalName();
26  		String key = node.getAttributeValue(new QName(null, "key"));
27  		if ("property".equalsIgnoreCase(name)) {
28  			if (HOST_PROTECTION_PROPERTY.equalsIgnoreCase("false")) {
29  					logger.warn("'" + HOST_PROTECTION_PROPERTY + "' setting is deprecated. " +
30  					            "It may become unavailable in future version of DAISY Pipeline.");
31  				if (key == null) {
32  					logger.warn("Missing key for config's property " + node.toString());
33  				} else {
34  					String value = node.getAttributeValue(new QName(null, "value"));
35  					if (value == null) {
36  						logger.warn("Missing value for config's property " + node.toString());
37  					} else {
38  						if (!key.startsWith("org.daisy.pipeline.tts."))
39  							key = "org.daisy.pipeline.tts." + key;
40  						props.put(key, value);
41  					}
42  				}
43  			} else {
44  				if (key != null) {
45  					logger.warn("Ignoring property " + key
46  					            + " inside TTS config file.\nPlease use a"
47  					            + " system property or environment variable instead.");
48  				}
49  			}
50  			return true;
51  		} else {
52  			return false;
53  		}
54  	}
55  
56  	public Map<String,String> getDynamicProperties() {
57  		return props;
58  	}
59  }