package net.autosauler.ballance.server.model; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Set; import net.autosauler.ballance.server.mongodb.Database; import net.autosauler.ballance.server.util.Base64; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import com.allen_sauer.gwt.log.client.Log; import com.mongodb.BasicDBObject; import com.mongodb.DB; import com.mongodb.DBCollection; import com.mongodb.DBCursor; import com.mongodb.DBObject; public class Helps { /** The Constant TABLENAME. */ private final static String TABLENAME = "structhelps"; /** * Dump. * * @param domain * the domain * @return the string */ public static String dump(String domain) { StringBuilder sb = new StringBuilder(); sb.append("<helps>\n"); DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(TABLENAME); BasicDBObject q = new BasicDBObject(); q.put("domain", domain); DBCursor cur = coll.find(q); while (cur.hasNext()) { DBObject myDoc = cur.next(); String txt; try { txt = Base64.encodeBytes(((String) myDoc.get("text")) .getBytes("UTF-8")); sb.append("<help name=\""); sb.append((String) myDoc.get("name")); sb.append("\" "); sb.append("locale=\""); sb.append((String) myDoc.get("loc")); sb.append("\">"); sb.append(txt); sb.append("</help>\n"); } catch (IOException e) { Log.error(e.getMessage()); } } Database.release(); } sb.append("</helps>\n"); return sb.toString(); } public static List<String> getNames(String domain) { List<String> names = new ArrayList<String>(); DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(TABLENAME); BasicDBObject q = new BasicDBObject(); q.put("domain", domain); DBCursor cur = coll.find(q); while (cur.hasNext()) { DBObject myDoc = cur.next(); String name = (String) myDoc.get("name"); if (!names.contains(name)) { names.add(name); } } Database.release(); } return names; } public static void updateHelps(String domain, String name, HashMap<String, String> texts) { DBObject doc = null; DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(TABLENAME); Set<String> locales = texts.keySet(); for (String locale : locales) { String text = texts.get(locale); BasicDBObject query = new BasicDBObject(); query.put("domain", domain); query.put("name", name); query.put("loc", locale); doc = coll.findOne(query); if (doc != null) { doc.put("text", text); coll.save(doc); } else { doc = new BasicDBObject(); doc.put("domain", domain); doc.put("name", name); doc.put("loc", locale); doc.put("text", text); coll.insert(doc); } } Database.release(); } } /** The domain. */ private final String domain; private final String locale; public Helps(String domain, String locale) { this.domain = domain; this.locale = locale; initStruct(); } private String generateTemplate(String name) { StringBuilder sb = new StringBuilder(); sb.append( "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">") .append('\n'); sb.append("<html>").append('\n'); sb.append("<head>").append('\n'); sb.append( "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">") .append('\n'); sb.append("<title>").append(name).append("</title>").append('\n'); sb.append("</head>").append('\n'); sb.append("<body>").append('\n'); sb.append("Unaviable for ").append(name).append(" now").append('\n'); sb.append("</body>").append('\n'); sb.append("</html>"); String result = sb.toString().trim(); if (!name.isEmpty()) { save(name, result); } return result; } public String get(String name) { String txt = ""; DBObject doc = null; DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(TABLENAME); BasicDBObject query = new BasicDBObject(); query.put("domain", domain); query.put("name", name); query.put("loc", locale); doc = coll.findOne(query); Database.release(); if (doc != null) { txt = (String) doc.get("text"); } } if (txt.trim().isEmpty()) { txt = generateTemplate(name); } return txt; } /** * Inits the struct. */ private void initStruct() { DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(TABLENAME); List<DBObject> indexes = coll.getIndexInfo(); if (indexes.size() < 1) { BasicDBObject i = new BasicDBObject(); i.put("domain", 1); coll.createIndex(i); i.put("loc", 1); coll.createIndex(i); i.put("name", 1); coll.createIndex(i); } Database.release(); } } /** * Restore. * * @param vals * the vals */ public void restore(Element vals) { NodeList nodes = vals.getElementsByTagName("help"); for (int i = 0; i < nodes.getLength(); i++) { Element val = (Element) nodes.item(i); String name = val.getAttribute("name"); String loc = val.getAttribute("locale"); String b64 = val.getTextContent(); try { String text = new String(Base64.decode(b64), "UTF-8"); save(loc, name, text); } catch (IOException e) { Log.error(e.getMessage()); } } } public void save(String name, String txt) { save(locale, name, txt); } /** * Sets the text. * * @param txt * the txt * @param andstore * the andstore */ public void save(String locale, String name, String txt) { DBObject doc = null; DB db = Database.get(domain); if (db != null) { Database.retain(); DBCollection coll = db.getCollection(TABLENAME); BasicDBObject query = new BasicDBObject(); query.put("domain", domain); query.put("name", name); query.put("loc", locale); doc = coll.findOne(query); if (doc != null) { doc.put("text", txt); coll.save(doc); } else { doc = new BasicDBObject(); doc.put("domain", domain); doc.put("name", name); doc.put("loc", locale); doc.put("text", txt); coll.insert(doc); } Database.release(); } } }