/******************************************************************************* * Copyright 2011 Alex 'Ript' Malyshev <alexript@gmail.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package net.autosauler.ballance.server.model; import java.util.HashMap; import java.util.Iterator; import java.util.Set; import net.autosauler.ballance.server.mongodb.Database; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; /** * The Class GlobalSettings. * * @author alexript */ public class GlobalSettings { /** The Constant SETTINGSTABLE. */ private static final String SETTINGSTABLE = "globalsettings"; /** * Creates the default records. * * @param db * the db */ public static void createDefaultRecords(DB db) { if (db != null) { DBCollection coll = db.getCollection(SETTINGSTABLE); if (coll.getCount() < 1) { BasicDBObject rec = new BasicDBObject(); rec.put("name", "default.record"); rec.put("val", "default.value"); coll.insert(rec); BasicDBObject i = new BasicDBObject(); i.put("domain", 1); i.put("name", 1); coll.createIndex(i); } } } private String domain = "127.0.0.1"; /** The values. */ private HashMap<String, String> values = null; /** The changed. */ private boolean changed; /** * Instantiates a new global settings. * * @param isloadfromdatabase * the isloadfromdatabase */ public GlobalSettings(boolean isloadfromdatabase, String domain) { this.domain = domain; values = new HashMap<String, String>(); if (isloadfromdatabase) { loadFromDatabase(); } } /** * Instantiates a new global settings. */ public GlobalSettings(String domain) { this.domain = domain; values = new HashMap<String, String>(); loadFromDatabase(); } /** * Dump. * * @return the string */ public String dump() { StringBuilder sb = new StringBuilder(); sb.append("<settings>\n"); Set<String> names = values.keySet(); Iterator<String> i = names.iterator(); while (i.hasNext()) { String name = i.next(); String val = values.get(name); sb.append("<value name=\"" + name + "\" val=\"" + val + "\"/>\n"); } sb.append("</settings>\n"); return sb.toString(); } /** * Gets the Integer value. * * @param name * the name * @param defval * the defval * @return the int */ public int get(String name, Integer defval) { String v = get(name, defval.toString()).trim(); return Integer.parseInt(v); } /** * Gets the String value. * * @param name * the name * @param defval * the defval * @return the string */ public String get(String name, String defval) { if (!values.containsKey(name)) { set(name, defval); } return values.get(name); } /** * Gets the all setting records. * * @return the all */ public HashMap<String, String> getAll() { return values; } /** * Load from database. */ private void loadFromDatabase() { Database.retain(); DB db = Database.get(domain); if (db != null) { DBCollection coll = db.getCollection(SETTINGSTABLE); BasicDBObject w = new BasicDBObject(); BasicDBObject q = new BasicDBObject(); q.put("domain", domain); w.put("$query", q); DBCursor cur = coll.find(w); if (cur != null) { while (cur.hasNext()) { DBObject myDoc = cur.next(); values.put((String) myDoc.get("name"), (String) myDoc.get("val")); } } } Database.release(); changed = false; } /** * Restore. * * @param val * the val */ public void restore(Element vals) { NodeList nodes = vals.getElementsByTagName("value"); for (int i = 0; i < nodes.getLength(); i++) { Element val = (Element) nodes.item(i); String name = val.getAttribute("name"); String v = val.getAttribute("val"); set(name, v); } save(); } /** * Save changed values. */ public void save() { if (changed) { DBObject myDoc = null; Database.retain(); DB db = Database.get(domain); if (db != null) { DBCollection coll = db.getCollection(SETTINGSTABLE); Set<String> keys = values.keySet(); Iterator<String> i = keys.iterator(); while (i.hasNext()) { String name = i.next(); String val = values.get(name); BasicDBObject query = new BasicDBObject(); query.put("name", name); query.put("domain", domain); myDoc = coll.findOne(query); if (myDoc != null) { if (!val.equals(myDoc.get("val"))) { myDoc.put("val", val); coll.save(myDoc); } } else { myDoc = new BasicDBObject(); myDoc.put("name", name); myDoc.put("domain", domain); myDoc.put("val", val); coll.insert(myDoc); } } changed = false; } Database.release(); } } /** * Sets the values hash. * * @param newvalues * the newvalues */ public void set(HashMap<String, String> newvalues) { Set<String> keys = newvalues.keySet(); Iterator<String> i = keys.iterator(); while (i.hasNext()) { String name = i.next(); set(name, newvalues.get(name)); } } /** * Sets the new value. * * @param name * the name * @param value * the value */ private void set(String name, String value) { name = name.trim().toLowerCase(); value = value.trim(); if (values.containsKey(name)) { String oldval = values.get(name); if (!oldval.equals(value)) { changed = true; } } else { changed = true; } values.put(name, value); } }