001 /*
002 * Copyright 2005,2009 Ivan SZKIBA
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.ini4j;
017
018 import java.io.InputStream;
019
020 import java.net.URI;
021 import java.net.URL;
022
023 import java.util.Properties;
024 import java.util.prefs.Preferences;
025 import java.util.prefs.PreferencesFactory;
026
027 public class IniPreferencesFactory implements PreferencesFactory
028 {
029 public static final String PROPERTIES = "ini4j.properties";
030 public static final String KEY_USER = "org.ini4j.prefs.user";
031 public static final String KEY_SYSTEM = "org.ini4j.prefs.system";
032 private Preferences _system;
033 private Preferences _user;
034
035 @Override public synchronized Preferences systemRoot()
036 {
037 if (_system == null)
038 {
039 _system = newIniPreferences(KEY_SYSTEM);
040 }
041
042 return _system;
043 }
044
045 @Override public synchronized Preferences userRoot()
046 {
047 if (_user == null)
048 {
049 _user = newIniPreferences(KEY_USER);
050 }
051
052 return _user;
053 }
054
055 protected String getIniLocation(String key)
056 {
057 String location = System.getProperty(key);
058
059 if (location == null)
060 {
061 try
062 {
063 Properties props = new Properties();
064
065 props.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(PROPERTIES));
066 location = props.getProperty(key);
067 }
068 catch (Exception x)
069 {
070 assert true;
071 }
072 }
073
074 return location;
075 }
076
077 protected URL getResource(String location) throws IllegalArgumentException
078 {
079 try
080 {
081 URI uri = new URI(location);
082 URL url;
083
084 if (uri.getScheme() == null)
085 {
086 url = Thread.currentThread().getContextClassLoader().getResource(location);
087 }
088 else
089 {
090 url = uri.toURL();
091 }
092
093 return url;
094 }
095 catch (Exception x)
096 {
097 throw (IllegalArgumentException) new IllegalArgumentException().initCause(x);
098 }
099 }
100
101 protected InputStream getResourceAsStream(String location) throws IllegalArgumentException
102 {
103 try
104 {
105 return getResource(location).openStream();
106 }
107 catch (Exception x)
108 {
109 throw (IllegalArgumentException) new IllegalArgumentException().initCause(x);
110 }
111 }
112
113 protected Preferences newIniPreferences(String key)
114 {
115 Ini ini = new Ini();
116 String location = getIniLocation(key);
117
118 if (location != null)
119 {
120 try
121 {
122 ini.load(getResourceAsStream(location));
123 }
124 catch (Exception x)
125 {
126 throw (IllegalArgumentException) new IllegalArgumentException().initCause(x);
127 }
128 }
129
130 return new IniPreferences(ini);
131 }
132 }