diff --git a/src/org/zlibrary/core/options/ZLOption.java b/src/org/zlibrary/core/options/ZLOption.java index ebf912954..b6093efb5 100644 --- a/src/org/zlibrary/core/options/ZLOption.java +++ b/src/org/zlibrary/core/options/ZLOption.java @@ -1,6 +1,6 @@ package org.zlibrary.core.options; -import org.zlibrary.core.options.config.ZLConfig; +import org.zlibrary.core.options.config.ZLSimpleConfig; import org.zlibrary.core.options.config.ZLConfigInstance; public abstract class ZLOption { @@ -8,7 +8,7 @@ public abstract class ZLOption { public static final String CONFIG_CATEGORY = "options"; public static final String STATE_CATEGORY = "state"; - protected ZLConfig myConfig = ZLConfigInstance.getInstance(); + protected ZLSimpleConfig myConfig = ZLConfigInstance.getInstance(); protected String myCategory; protected String myGroup; protected String myOptionName; diff --git a/src/org/zlibrary/core/options/config/ZLConfigImpl.java b/src/org/zlibrary/core/options/config/ZLConfigImpl.java index 0e89533d9..71543a6d4 100644 --- a/src/org/zlibrary/core/options/config/ZLConfigImpl.java +++ b/src/org/zlibrary/core/options/config/ZLConfigImpl.java @@ -1,69 +1,65 @@ package org.zlibrary.core.options.config; -import java.util.*; +import java.util.Map; -/** - * класс Конфиг. это своеобразная структура опций. - * основное поле myData содержит список групп, которым - * в качестве ключей сопоставляются их имена. - * @author Администратор - * - */ /*package*/ class ZLConfigImpl implements ZLConfig { - // public abstract void unsetValue(String group, String name); + private final ZLSimpleConfigImpl myMainConfig; + private final ZLDeltaConfig myDeltaConfig; - // public abstract boolean isAutoSavingSupported() const = 0; - // public abstract void startAutoSave(int seconds) = 0; - private Map myData; - - public ZLConfigImpl (){ - myData = new LinkedHashMap(); - } - - public Map getGroups(){ - return Collections.unmodifiableMap(myData); - } - - public ZLConfigImpl (Map map){ - myData = map; - } - - public void removeGroup(String group){ - if (myData.get(group) != null){ - myData.remove(group); - } + public ZLConfigImpl() { + myMainConfig = new ZLSimpleConfigImpl(); + myDeltaConfig = new ZLDeltaConfig(); } - public String getValue(String group, String name, String defaultValue){ - if (myData.get(group) != null){ - return myData.get(group).getValue(name, defaultValue); - } else{ - return defaultValue; - } + public Map getGroups() { + return myMainConfig.getGroups(); } - - public void setValue(String group, String name, String value, String category){ - if (myData.get(group) != null){ - myData.get(group).setValue(name, value, category); + + public String getValue(String group, String name, String defaultValue) { + String value = myDeltaConfig.getValue(group, name, defaultValue); + if (value == null) { + return myMainConfig.getValue(group, name, defaultValue); } else { - ZLGroup newGroup = new ZLGroup(); - newGroup.setValue(name, value, category); - myData.put(group, newGroup); + return value; } } - - public void unsetValue(String group, String name){ - myData.get(group).unsetValue(name); + + public void removeGroup(String name) { + myDeltaConfig.removeGroup(name); + } + + public void setValue(String group, String name, String value, String category) { + myDeltaConfig.setValue(group, name, value, category); + } + + public void unsetValue(String group, String name) { + myDeltaConfig.unsetValue(group, name); } - /** - * метод вывода в строку - */ - public String toString(){ - StringBuffer sb = new StringBuffer(); - for (String categoryName : myData.keySet()){ - sb.append("" + categoryName + "\n\n" + myData.get(categoryName) + "\n"); + public void clearDelta() { + myDeltaConfig.clear(); + } + + public void applyDelta() { + for (String deletedGroup : myDeltaConfig.getDeletedGroups()) { + myMainConfig.removeGroup(deletedGroup); } - return sb.toString(); - } + + Map deletedValues = myDeltaConfig.getDeletedValues(); + for (String group : deletedValues.keySet()) { + myMainConfig.unsetValue(group, deletedValues.get(group)); + } + + ZLSimpleConfigImpl setValues = myDeltaConfig.getSetValues(); + Map groups = setValues.getGroups(); + for (String group : groups.keySet()) { + for (ZLOptionValue value : groups.get(group).getValues()) { + myMainConfig.setValue(group, value.getName(), + value.getValue(), value.getCategory()); + } + } + myDeltaConfig.clear(); + } + + } diff --git a/src/org/zlibrary/core/options/config/ZLConfigInstance.java b/src/org/zlibrary/core/options/config/ZLConfigInstance.java index 0becebc11..5b20f7d11 100644 --- a/src/org/zlibrary/core/options/config/ZLConfigInstance.java +++ b/src/org/zlibrary/core/options/config/ZLConfigInstance.java @@ -2,7 +2,7 @@ package org.zlibrary.core.options.config; public class ZLConfigInstance { - private static final ZLConfigImpl myConfig = new ZLConfigImpl(); + private static final ZLConfig myConfig = new ZLConfigImpl(); public static ZLConfig getInstance(){ return myConfig; diff --git a/src/org/zlibrary/core/options/config/ZLDeltaConfig.java b/src/org/zlibrary/core/options/config/ZLDeltaConfig.java new file mode 100644 index 000000000..e3ab5bdad --- /dev/null +++ b/src/org/zlibrary/core/options/config/ZLDeltaConfig.java @@ -0,0 +1,49 @@ +package org.zlibrary.core.options.config; + +import java.util.*; + +/*package*/ final class ZLDeltaConfig { + + private Map myDeletedValues = new HashMap(); + private Set myDeletedGroups = new HashSet(); + private ZLSimpleConfigImpl mySetValues = new ZLSimpleConfigImpl(); + + public ZLDeltaConfig() { + } + + public Set getDeletedGroups() { + return Collections.unmodifiableSet(myDeletedGroups); + } + + public Map getDeletedValues() { + return Collections.unmodifiableMap(myDeletedValues); + } + + public ZLSimpleConfigImpl getSetValues() { + return mySetValues; + } + + public String getValue(String group, String name, String defaultValue) { + return mySetValues.getValue(group, name, defaultValue); + } + + public void setValue(String group, String name, String value, String category) { + mySetValues.setValue(group, name, value, category); + } + + public void unsetValue(String group, String name) { + myDeletedValues.put(group, name); + mySetValues.unsetValue(group, name); + } + + public void removeGroup(String group) { + myDeletedGroups.add(group); + mySetValues.removeGroup(group); + } + + public void clear() { + myDeletedValues.clear(); + myDeletedGroups.clear(); + mySetValues.clear(); + } +} diff --git a/src/org/zlibrary/core/options/config/ZLGroup.java b/src/org/zlibrary/core/options/config/ZLGroup.java index e94626f4a..dded67a18 100644 --- a/src/org/zlibrary/core/options/config/ZLGroup.java +++ b/src/org/zlibrary/core/options/config/ZLGroup.java @@ -2,7 +2,7 @@ package org.zlibrary.core.options.config; import java.util.*; -public class ZLGroup { +public final class ZLGroup { private Map myData; public ZLGroup (){ @@ -13,12 +13,12 @@ public class ZLGroup { return Collections.unmodifiableCollection(myData.values()); } - public String getValue(String name, String defaultValue){ + public String getValue(String name){ ZLOptionValue temp = myData.get(name); if (temp != null){ return temp.getValue(); } else { - return defaultValue; + return null; } } diff --git a/src/org/zlibrary/core/options/config/ZLOptionValue.java b/src/org/zlibrary/core/options/config/ZLOptionValue.java index f176b24a4..412e61309 100644 --- a/src/org/zlibrary/core/options/config/ZLOptionValue.java +++ b/src/org/zlibrary/core/options/config/ZLOptionValue.java @@ -19,6 +19,10 @@ public class ZLOptionValue { return myValue; } + public String getName() { + return myName; + } + public String getCategory() { return myCategory; } diff --git a/src/org/zlibrary/core/options/config/ZLConfig.java b/src/org/zlibrary/core/options/config/ZLSimpleConfig.java similarity index 88% rename from src/org/zlibrary/core/options/config/ZLConfig.java rename to src/org/zlibrary/core/options/config/ZLSimpleConfig.java index 251c39c07..8bc5567a4 100644 --- a/src/org/zlibrary/core/options/config/ZLConfig.java +++ b/src/org/zlibrary/core/options/config/ZLSimpleConfig.java @@ -2,7 +2,7 @@ package org.zlibrary.core.options.config; import java.util.Map; -public interface ZLConfig { +public interface ZLSimpleConfig { public void removeGroup(String name); diff --git a/src/org/zlibrary/core/options/config/ZLSimpleConfigImpl.java b/src/org/zlibrary/core/options/config/ZLSimpleConfigImpl.java new file mode 100644 index 000000000..2786008aa --- /dev/null +++ b/src/org/zlibrary/core/options/config/ZLSimpleConfigImpl.java @@ -0,0 +1,69 @@ +package org.zlibrary.core.options.config; + +import java.util.*; + +/** + * класс Конфиг. это своеобразная структура опций. + * основное поле myData содержит список групп, которым + * в качестве ключей сопоставляются их имена. + * @author Администратор + * + */ +/*package*/ class ZLSimpleConfigImpl implements ZLSimpleConfig { + // public abstract void unsetValue(String group, String name); + + // public abstract boolean isAutoSavingSupported() const = 0; + // public abstract void startAutoSave(int seconds) = 0; + private Map myData; + + public ZLSimpleConfigImpl() { + myData = new LinkedHashMap(); + } + + protected void clear() { + myData.clear(); + } + + public Map getGroups() { + return Collections.unmodifiableMap(myData); + } + + public void removeGroup(String group) { + if (myData.get(group) != null){ + myData.remove(group); + } + } + + public String getValue(String group, String name, String defaultValue) { + if (myData.get(group) != null){ + return myData.get(group).getValue(name); + } else{ + return defaultValue; + } + } + + public void setValue(String group, String name, String value, String category) { + if (myData.get(group) != null){ + myData.get(group).setValue(name, value, category); + } else { + ZLGroup newGroup = new ZLGroup(); + newGroup.setValue(name, value, category); + myData.put(group, newGroup); + } + } + + public void unsetValue(String group, String name) { + myData.get(group).unsetValue(name); + } + + /** + * метод вывода в строку + */ + public String toString() { + StringBuffer sb = new StringBuffer(); + for (String categoryName : myData.keySet()){ + sb.append("" + categoryName + "\n\n" + myData.get(categoryName) + "\n"); + } + return sb.toString(); + } +} diff --git a/src/org/zlibrary/core/options/config/reader/ZLConfigReader.java b/src/org/zlibrary/core/options/config/reader/ZLConfigReader.java index 0b37aa015..9fd8b7a85 100644 --- a/src/org/zlibrary/core/options/config/reader/ZLConfigReader.java +++ b/src/org/zlibrary/core/options/config/reader/ZLConfigReader.java @@ -51,6 +51,7 @@ import org.zlibrary.core.options.config.*; } public void endDocument() { + myConfig.applyDelta(); } } diff --git a/src/org/zlibrary/core/options/config/writer/ZLConfigWriter.java b/src/org/zlibrary/core/options/config/writer/ZLConfigWriter.java index 938529191..271768593 100644 --- a/src/org/zlibrary/core/options/config/writer/ZLConfigWriter.java +++ b/src/org/zlibrary/core/options/config/writer/ZLConfigWriter.java @@ -7,7 +7,7 @@ import org.zlibrary.core.options.config.*; /*package*/ class ZLConfigWriter implements ZLWriter { - private ZLConfig myConfig = ZLConfigInstance.getInstance(); + private ZLSimpleConfig myConfig = ZLConfigInstance.getInstance(); private File myDestinationDirectory; public ZLConfigWriter(String path){ @@ -34,6 +34,10 @@ import org.zlibrary.core.options.config.*; } } + public void writeDelta() { + //TODO ДОПИСАТЬ, ИСПОЛЬЗУЯ СТРОЕНИЕ ФАЙЛА ДЕЛЬТЫ ИЗ СИШНОГО КОДА + } + public void write() { Map data = myConfig.getGroups(); // ключ - имя категории, значение - содержимое соответствующего файла