/** * This file is part of Archiv-Editor. * * The software Archiv-Editor serves as a client user interface for working with * the Person Data Repository. See: pdr.bbaw.de * * The software Archiv-Editor was developed at the Berlin-Brandenburg Academy * of Sciences and Humanities, Jägerstr. 22/23, D-10117 Berlin. * www.bbaw.de * * Copyright (C) 2010-2013 Berlin-Brandenburg Academy * of Sciences and Humanities * * The software Archiv-Editor was developed by @author: Christoph Plutte. * * Archiv-Editor is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Archiv-Editor is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Archiv-Editor. * If not, see <http://www.gnu.org/licenses/lgpl-3.0.html>. */ /* * @author: Christoph Plutte */ package org.bbaw.pdr.ae.control.datahandling.xqj.internal; import java.io.File; import java.text.SimpleDateFormat; import java.util.HashMap; import javax.xml.stream.XMLStreamException; import javax.xml.xquery.XQConnection; import javax.xml.xquery.XQException; import javax.xml.xquery.XQPreparedExpression; import javax.xml.xquery.XQResultSequence; import org.basex.core.BaseXException; import org.basex.core.Context; import org.bbaw.pdr.ae.common.AEConstants; import org.bbaw.pdr.ae.common.CommonActivator; import org.bbaw.pdr.ae.control.core.XMLProcessor; import org.bbaw.pdr.ae.control.facade.Facade; import org.bbaw.pdr.ae.control.interfaces.IDBManager; import org.bbaw.pdr.ae.db.basex711.DBConnector; import org.bbaw.pdr.ae.metamodel.PdrId; import org.bbaw.pdr.ae.model.Aspect; import org.bbaw.pdr.ae.model.PdrObject; import org.bbaw.pdr.ae.model.Person; import org.bbaw.pdr.ae.model.ReferenceMods; import org.bbaw.pdr.ae.model.ReferenceModsTemplate; import org.eclipse.core.runtime.ILog; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; /** * The Class DBManager. * @author Christoph Plutte */ public class DBManager implements IDBManager { /** The Constant CONTEXT. */ static final Context CONTEXT = new Context(); /** The db connector. */ private DBConnector _dbConnector = DBConnector.getInstance(); /** Logger. */ private static ILog iLogger = AEConstants.ILOGGER; /** status. */ private IStatus _log; @Override public final void createDBFromDir(final String col, final String subDir) { synchronized (_dbConnector) { _dbConnector.createDBFromDir(col, subDir); } } @Override public final void createEmptyDB(final String col) throws BaseXException { synchronized (_dbConnector) { DBConnector.createEmpty(col); } } @Override public final boolean dbIsEmpty() { if (!testCollectionIsEmpty("aspect")) { return false; } if (!testCollectionIsEmpty("person")) { return false; } if (!testCollectionIsEmpty("reference")) { return false; } return true; } private boolean testCollectionIsEmpty(String col) { String query = ""; if (col.equals("person")) { query = "declare namespace podl=\"http://pdr.bbaw.de/namespaces/podl/\";\n" + "for $x in collection(\"person\")//podl:person\n" + "return string($x/@id)"; } else if (col.equals("aspect")) { query = "declare namespace aodl=\"http://pdr.bbaw.de/namespaces/aodl/\";\n" + "for $x in collection(\"aspect\")//aodl:aspect\n" + "return string($x/@id)"; } else if (col.equals("reference")) { query = "declare namespace mods=\"http://www.loc.gov/mods/v3\";\n" + "for $x in collection(\"reference\")//mods:mods\n" + "return string($x/@ID)"; } _log = new Status(IStatus.INFO, CommonActivator.PLUGIN_ID, "testCollectionEmpty: " + query); iLogger.log(_log); XQResultSequence xqs; XQPreparedExpression xqp; XQConnection con; try { con = _dbConnector.getConnection(); synchronized (_dbConnector) { xqp = con.prepareExpression(query); xqs = xqp.executeQuery(); while (xqs.next()) { return false; } return true; } } catch (Exception e) { e.printStackTrace(); return false; } } @Override public final void delete(final PdrId pdrId, final String col) throws Exception { synchronized (_dbConnector) { _dbConnector.delete(pdrId.toString() + ".xml", col); } PdrIdService idService = new PdrIdService(); idService.insertIdDeletedObject(pdrId); } @Override public final void delete(final String fileName, final String col) throws XQException { synchronized (_dbConnector) { _dbConnector.delete(fileName, col); } } @Override public final void loadLocalBackup(String dir, IProgressMonitor monitor) { dir = dir + AEConstants.FS; // person String col = "person"; String subDir = dir + AEConstants.FS + col; monitor.subTask("Loading " + col); monitor.worked(25); subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.createDBFromDir(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager load local backup col: " + col); iLogger.log(_log); // //aspects col = "aspect"; subDir = dir + col; monitor.subTask("Loading " + col); monitor.worked(25); subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.createDBFromDir(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager load local backup col: " + col); iLogger.log(_log); // // //reference col = "reference"; subDir = dir + col; monitor.subTask("Loading " + col); monitor.worked(25); subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.createDBFromDir(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager load local backup col: " + col); iLogger.log(_log); // // //reference col = "refTemplate"; subDir = dir + col; monitor.subTask("Loading " + col); monitor.worked(25); subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.createDBFromDir(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager load local backup col: " + col); iLogger.log(_log); checkAndUpgradeLineBreaksInAspectCollection(); } private void checkAndUpgradeLineBreaksInAspectCollection() { if(isLineBreaksInAspectCollection()) { removeLineBreaksInAspectCollection(); } } private void removeLineBreaksInAspectCollection() { synchronized (_dbConnector) { XQConnection con; try { con = _dbConnector.getConnection(); XQPreparedExpression xqp; String query = "declare namespace aodl=\"http://pdr.bbaw.de/namespaces/aodl/\";\n" + "for $x in collection(\"aspect\")//aodl:aspect/aodl:notification/text()\n"+ "return replace value of node $x with fn:replace($x, '\\n\\s*', ' ')"; xqp = con.prepareExpression(query); XQResultSequence xqs = xqp.executeQuery(); xqs.close(); con.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } private boolean isLineBreaksInAspectCollection() { boolean isLB = true; synchronized (_dbConnector) { XQConnection con; try { con = _dbConnector.getConnection(); XQPreparedExpression xqp; String query = "declare namespace aodl=\"http://pdr.bbaw.de/namespaces/aodl/\";\n" + "let $r := fn:exists(collection(\"aspect\")//aodl:aspect/aodl:notification/text()[(matches(., '\\n\\s*'))])\n"+ "return $r"; xqp = con.prepareExpression(query); XQResultSequence xqs = xqp.executeQuery(); String r = xqs.getSequenceAsString(null); isLB = r.equals("true"); xqs.close(); con.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } return isLB; } @Override public final void loadLocalConfigBackup(String dir) { dir = dir + AEConstants.FS; // person String col = "config"; String subDir = dir + col; subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.createDBFromDir(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager load local config backup col: " + col); iLogger.log(_log); } @Override public final void saveReferenceTemplateToDB(final HashMap<String, ReferenceModsTemplate> templates) throws XMLStreamException { for (ReferenceModsTemplate template : templates.values()) { String xml = new XMLProcessor().writeToXML(template); synchronized (_dbConnector) { _dbConnector.store2DB(xml, "refTemplate", template.getValue() + ".xml", true); } } } private final void saveToDB(final Aspect a, boolean noteChange) throws Exception { String xml = new XMLProcessor().writeToXML(a); // System.out.println(xml); synchronized (_dbConnector) { _dbConnector.store2DB(xml, "aspect", a.getPdrId().toString() + ".xml", false); } PdrIdService idService = new PdrIdService(); if (a.getPdrId().getId() >= 100000000) { idService.insertIdNewObject(a.getPdrId()); } else if (noteChange) { idService.insertIdModifiedObject(a.getPdrId()); } } @Override public final void saveToDB(final PdrObject object) throws Exception { if (object instanceof Person) { saveToDB((Person) object, true); } if (object instanceof Aspect) { saveToDB((Aspect) object, true); } if (object instanceof ReferenceMods) { saveToDB((ReferenceMods) object, true); } } private final void saveToDB(final Person p, boolean noteChange) throws Exception { String xml = new XMLProcessor().writeToXML(p); synchronized (_dbConnector) { _dbConnector.store2DB(xml, "person", p.getPdrId().toString() + ".xml", false); } PdrIdService idService = new PdrIdService(); if (p.getPdrId().getId() >= 100000000) { idService.insertIdNewObject(p.getPdrId()); } else if (noteChange) { idService.insertIdModifiedObject(p.getPdrId()); } } private final void saveToDB(final ReferenceMods r, boolean noteChange) throws Exception { String xml = new XMLProcessor().writeToXML(r); synchronized (_dbConnector) { _dbConnector.store2DB(xml, "reference", r.getPdrId().toString() + ".xml", false); } PdrIdService idService = new PdrIdService(); if (r.getPdrId().getId() >= 100000000) { idService.insertIdNewObject(r.getPdrId()); } else if (noteChange) { idService.insertIdModifiedObject(r.getPdrId()); } } @Override public final void writeToLocalBackup(String dir) throws Exception { SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); dir = dir + AEConstants.FS + "AEBackup-" + dateFormate.format(Facade.getInstanz().getCurrentDate()); File f; f = new File(dir); f.mkdir(); dir += AEConstants.FS; // person String subDir = dir + "person"; String col = "person"; // if (!new File(subDir).exists()) // { // f = new File(subDir); // f.mkdir(); // } f = new File(subDir); f.mkdir(); subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.writeColToXML(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager write local backup col: " + col); iLogger.log(_log); // reference col = "reference"; subDir = dir + col; if (!new File(subDir).exists()) { f = new File(subDir); f.mkdir(); } subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.writeColToXML(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager write local backup col: " + col); iLogger.log(_log); // reference col = "refTemplate"; subDir = dir + col; if (!new File(subDir).exists()) { f = new File(subDir); f.mkdir(); } subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.writeColToXML(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager write local backup col: " + col); iLogger.log(_log); // aspects subDir = dir + "aspect"; col = "aspect"; if (!new File(subDir).exists()) { f = new File(subDir); f.mkdir(); } subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.writeColToXML(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager write local backup col: " + col); iLogger.log(_log); } @Override public final void writeToLocalConfigBackup(String dir) throws BaseXException { // config SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); dir = dir + AEConstants.FS + "AEConfig-" + dateFormate.format(Facade.getInstanz().getCurrentDate()); File f; f = new File(dir); f.mkdir(); dir += AEConstants.FS; String subDir = dir + AEConstants.FS + "config"; String col = "config"; if (!new File(subDir).exists()) { f = new File(subDir); f.mkdir(); } subDir = subDir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.writeColToXML(col, subDir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager write local config backup col: " + col); iLogger.log(_log); } @Override public final void writeToLocalReferenceTemplateBackup(String dir) throws BaseXException { SimpleDateFormat dateFormate = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss"); dir = dir + AEConstants.FS + "AEReferenceTemplate-" + dateFormate.format(Facade.getInstanz().getCurrentDate()); File f; f = new File(dir); f.mkdir(); String col = "refTemplate"; dir = dir + AEConstants.FS; synchronized (_dbConnector) { _dbConnector.writeColToXML(col, dir); } _log = new Status(IStatus.INFO, Activator.PLUGIN_ID, "DBManager write local refTemplate backup col: " + col); iLogger.log(_log); } @Override public boolean isOptimizationRequired() { return _dbConnector.isAspectOptimizationRequired() || _dbConnector.isPersonOptimizationRequired() || _dbConnector.isReferenceOptimizationRequired(); } @Override public void optimizeAll(IProgressMonitor monitor) { if (monitor != null) { monitor.beginTask("Optimize Database Indexes", 6); } if (_dbConnector.isAspectOptimizationRequired()) { _dbConnector.optimize("aspect"); } if (monitor != null) { monitor.worked(1); } if (_dbConnector.isPersonOptimizationRequired()) { _dbConnector.optimize("person"); } if (monitor != null) { monitor.worked(1); } if (_dbConnector.isReferenceOptimizationRequired()) { _dbConnector.optimize("reference"); } if (monitor != null) { monitor.worked(1); } _dbConnector.optimize("users"); if (monitor != null) { monitor.worked(1); } _dbConnector.optimize("config"); if (monitor != null) { monitor.worked(1); } _dbConnector.optimize("management"); if (monitor != null) { monitor.worked(1); } } @Override public void saveToDB(PdrObject object, boolean noteChange) throws Exception { if (object instanceof Person) { saveToDB((Person) object, noteChange); } if (object instanceof Aspect) { saveToDB((Aspect) object, noteChange); } if (object instanceof ReferenceMods) { saveToDB((ReferenceMods) object, noteChange); } } }