1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.neo4j.server.configuration;
21
22 import java.io.File;
23 import java.io.FilenameFilter;
24 import java.net.URI;
25 import java.net.URISyntaxException;
26 import java.util.HashMap;
27 import java.util.HashSet;
28 import java.util.Map;
29 import java.util.Properties;
30 import java.util.Set;
31
32 import org.apache.commons.configuration.CompositeConfiguration;
33 import org.apache.commons.configuration.Configuration;
34 import org.apache.commons.configuration.ConfigurationException;
35 import org.apache.commons.configuration.PropertiesConfiguration;
36 import org.apache.commons.configuration.SystemConfiguration;
37 import org.neo4j.kernel.EmbeddedGraphDatabase;
38 import org.neo4j.server.configuration.validation.Validator;
39 import org.neo4j.server.logging.Logger;
40
41 public class PropertyFileConfigurator implements Configurator {
42
43 private static final String NEO4J_PROPERTIES_FILENAME = "neo4j.properties";
44
45 public static Logger log = Logger.getLogger(PropertyFileConfigurator.class);
46
47 private CompositeConfiguration serverConfiguration = new CompositeConfiguration();
48 private File propertyFileDirectory;
49
50 private Validator validator = new Validator();
51 private Map<String, String> databaseTuningProperties = null;
52 private HashSet<ThirdPartyJaxRsPackage> thirdPartyPackages;
53
54 public PropertyFileConfigurator(File propertiesFile) {
55 this(null, propertiesFile);
56 }
57
58 public PropertyFileConfigurator(Validator v) {
59 this(v, null);
60 }
61
62 public PropertyFileConfigurator(Validator v, File propertiesFile) {
63 if (propertiesFile == null) {
64 propertiesFile = new File(System.getProperty(Configurator.NEO_SERVER_CONFIG_FILE_KEY));
65 }
66
67 try {
68 propertyFileDirectory = propertiesFile.getParentFile();
69 loadPropertiesConfig(propertiesFile);
70 loadDatabaseTuningProperties(propertiesFile);
71 normalizeUris();
72 if (v != null) {
73 v.validate(this.configuration());
74 }
75 } catch (ConfigurationException ce) {
76 log.warn(ce);
77 }
78
79 }
80
81 @Override
82 public Configuration configuration() {
83 return serverConfiguration == null ? new SystemConfiguration() : serverConfiguration;
84 }
85
86 private void loadDatabaseTuningProperties(File configFile) throws ConfigurationException {
87 String databaseTuningPropertyFileLocation = serverConfiguration.getString(DB_TUNING_PROPERTY_FILE_KEY);
88
89 if (databaseTuningPropertyFileLocation == null) {
90 if(propertyFileDirectoryContainsDBTuningFile()) {
91 databaseTuningPropertyFileLocation = new File (propertyFileDirectory, NEO4J_PROPERTIES_FILENAME).getAbsolutePath();
92 log.info("No database tuning file explicitly set, defaulting to [%s]", databaseTuningPropertyFileLocation);
93 } else {
94 log.info("No database tuning properties (org.neo4j.server.db.tuning.properties) found in [%s], using defaults.", databaseTuningPropertyFileLocation);
95 return;
96 }
97 }
98
99 File databaseTuningPropertyFile = new File(databaseTuningPropertyFileLocation);
100
101 if (!databaseTuningPropertyFile.exists()) {
102 log.warn("The specified file for database performance tuning properties [%s] does not exist.", databaseTuningPropertyFileLocation);
103 return;
104 }
105
106 databaseTuningProperties = EmbeddedGraphDatabase.loadConfigurations(databaseTuningPropertyFileLocation);
107
108 }
109
110
111
112
113 private void loadPropertiesConfig(File configFile) throws ConfigurationException {
114 PropertiesConfiguration propertiesConfig = new PropertiesConfiguration(configFile);
115 if (validator.validate(propertiesConfig)) {
116 serverConfiguration.addConfiguration(propertiesConfig);
117 } else {
118 String failed = String.format("Error processing [%s], configuration file has failed validation.", configFile.getAbsolutePath());
119 log.fatal(failed);
120 throw new InvalidServerConfigurationException(failed);
121 }
122 }
123
124 private void normalizeUris() {
125 try {
126 for (String key : new String[] { MANAGEMENT_PATH_PROPERTY_KEY, DATA_API_PATH_PROPERTY_KEY }) {
127 if (configuration().containsKey(key)) {
128 URI normalizedUri = new URI((String) configuration().getProperty(key)).normalize();
129 configuration().clearProperty(key);
130 configuration().addProperty(key, normalizedUri.toString());
131 }
132 }
133
134 } catch (URISyntaxException e) {
135 throw new RuntimeException(e);
136 }
137
138 }
139
140 private boolean propertyFileDirectoryContainsDBTuningFile() {
141 File[] neo4jPropertyFiles = propertyFileDirectory.listFiles(new FilenameFilter() {
142
143 @Override
144 public boolean accept(File dir, String name) {
145 return name.toLowerCase().equals(NEO4J_PROPERTIES_FILENAME);
146 }
147 });
148 return neo4jPropertyFiles != null && neo4jPropertyFiles.length == 1;
149 }
150
151 @Override
152 public Map<String, String> getDatabaseTuningProperties() {
153 return databaseTuningProperties == null ? new HashMap<String, String>() : databaseTuningProperties;
154 }
155
156 @Override
157 public Set<ThirdPartyJaxRsPackage> getThirdpartyJaxRsClasses() {
158 thirdPartyPackages = new HashSet<ThirdPartyJaxRsPackage>();
159 Properties properties = this.configuration().getProperties(THIRD_PARTY_PACKAGES_KEY);
160 for (Object key : properties.keySet()) {
161 thirdPartyPackages.add(new ThirdPartyJaxRsPackage(key.toString(), properties.getProperty(key.toString())));
162 }
163 return thirdPartyPackages;
164 }
165 }