/*
* @author: Christoph Plutte
*/
package org.bbaw.pdr.ae.db.basex711;
import java.io.OutputStream;
import javax.xml.xquery.XQConnection;
import javax.xml.xquery.XQDataSource;
import javax.xml.xquery.XQException;
import org.basex.core.BaseXException;
import org.basex.core.Context;
import org.basex.core.cmd.Add;
import org.basex.core.cmd.Close;
import org.basex.core.cmd.CreateDB;
import org.basex.core.cmd.Delete;
import org.basex.core.cmd.Export;
import org.basex.core.cmd.InfoDB;
import org.basex.core.cmd.Open;
import org.basex.core.cmd.Optimize;
import org.basex.core.cmd.Set;
/**
* The Class DBConnector.
* @author Christoph Plutte
*/
public final class DBConnector
{
private boolean aspectOptimizationRequired;
private boolean personOptimizationRequired;
private boolean referenceOptimizationRequired;
/** The sigleton instance. */
private static volatile DBConnector _sigletonInstance;
/** The CONTEXT. */
private static Context CONTEXT = new Context();
/** The Constant OUT. */
static final OutputStream OUT = System.out;
/** Database driver. */
private static final String DRIVER = "org.basex.api.xqj.BXQDataSource";
/**
* Closes the specified connection.
* @param xqc connection to be closed
* @throws XQException connection exception
*/
static void close(final XQConnection xqc) throws XQException
{
xqc.close();
}
/**
* Creates the empty.
* @param col the col
* @throws BaseXException the base x exception
*/
public static void createEmpty(final String col) throws BaseXException
{
boolean chop = !((col.equals("refTemplate")) || (col.equals("aspect")));
new Set("intparse", chop).execute(CONTEXT);
new Set("dtd", true).execute(CONTEXT);
// new Set("entity", true).execute(CONTEXT);
new Set("chop", chop).execute(CONTEXT);
new Set("TEXTINDEX", true).execute(CONTEXT);
new Set("ATTRINDEX", true).execute(CONTEXT);
new Set("PATHINDEX", true).execute(CONTEXT);
new Set("FTINDEX", true).execute(CONTEXT);
new Set("WILDCARDS", true).execute(CONTEXT);
new Set("STEMMING", true).execute(CONTEXT);
new Set("CASESENS", false).execute(CONTEXT);
new Set("DIACRITICS", true).execute(CONTEXT);
new CreateDB(col).execute(CONTEXT);
new Close().execute(CONTEXT);
}
/**
* Db exists.
* @param col the col
* @return true, if successful
*/
public static boolean dbExists(final String col)
{
try
{
new Open(col).execute(CONTEXT);
new Close().execute(CONTEXT);
}
catch (Exception e)
{
e.printStackTrace();
return false;
}
return true;
}
/**
* Gets the single instance of DBConnector.
* @return single instance of DBConnector
*/
public static DBConnector getInstance()
{
if (_sigletonInstance == null)
{
synchronized (DBConnector.class)
{
if (_sigletonInstance == null)
{
_sigletonInstance = new DBConnector();
}
}
verifyOrCreateDBS();
}
return _sigletonInstance;
}
/**
* Verify or create dbs.
*/
private static void verifyOrCreateDBS()
{
if (!dbExists("person"))
{
try
{
createEmpty("person");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!dbExists("aspect"))
{
try
{
createEmpty("aspect");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!dbExists("reference"))
{
try
{
createEmpty("reference");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!dbExists("users"))
{
try
{
createEmpty("users");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!dbExists("management"))
{
try
{
createEmpty("management");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!dbExists("refTemplate"))
{
try
{
createEmpty("refTemplate");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (!dbExists("config"))
{
try
{
createEmpty("config");
}
catch (BaseXException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/**
* Instantiates a new dB connector.
*/
private DBConnector()
{
}
/**
* Close db.
* @param col the col
*/
public void closeDB(final String col)
{
try
{
new Open(col).execute(CONTEXT);
new Close().execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
}
/**
* Creates the db from dir.
* @param col the col
* @param dir the dir
*/
public void createDBFromDir(final String col, final String dir)
{
boolean chop = !((col.equals("refTemplate")) || (col.equals("aspect")));
try
{
new Set("intparse", chop).execute(CONTEXT);
new Set("dtd", true).execute(CONTEXT);
// new Set("entity", true).execute(CONTEXT);
new Set("chop", chop).execute(CONTEXT);
new Set("TEXTINDEX", true).execute(CONTEXT);
new Set("ATTRINDEX", true).execute(CONTEXT);
new Set("PATHINDEX", true).execute(CONTEXT);
new Set("FTINDEX", true).execute(CONTEXT);
new Set("WILDCARDS", true).execute(CONTEXT);
new Set("STEMMING", true).execute(CONTEXT);
new Set("CASESENS", false).execute(CONTEXT);
new Set("DIACRITICS", true).execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
try
{
new CreateDB(col, dir).execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
try
{
new Close().execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
}
/**
* Db is empty.
* @param col the col
* @return true, if successful
*/
public boolean dbIsEmpty(final String col)
{
// XXX plutte muss angepasst werden
try
{
new Open(col).execute(CONTEXT);
InfoDB info = new InfoDB();
info.execute(CONTEXT);
System.out.println(info);
// System.out.println("number of nodes " + info.getNumberOfNodes());
// if (info.getNumberOfDocs() <= 2 && info.getNumberOfNodes() <= 2)
// {
// // System.out.println("db empty " + col + " true");
// return true;
// }
// else
// {
// return false;
// }
}
catch (BaseXException e2)
{
e2.printStackTrace();
return false;
}
return false;
}
/**
* Delete.
* @param name the name
* @param col the col
*/
public void delete(String name, final String col)
{
try
{
new Open(col).execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
if (!name.endsWith("xml"))
{
name += ".xml";
}
try
{
new Delete(name).execute(CONTEXT);
}
catch (BaseXException e1)
{
e1.printStackTrace();
}
try
{
new Close().execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
}
/**
* Gets the connection.
* @return the connection
* @throws XQException the xQ exception
* @throws ClassNotFoundException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public XQConnection getConnection() throws Exception
{
// Create a connection
XQConnection con = ((XQDataSource) Class.forName(DRIVER).newInstance()).getConnection();
return con;
}
/**
* Gets the dB info.
* @param col the col
*/
public void getDBInfo(final String col)
{
// try
// {
// new Open(col).execute(CONTEXT);
// String info = new InfoDB().execute(CONTEXT);
// // System.out.println(info);
// }
// catch (BaseXException e2)
// {
// e2.printStackTrace();
// }
}
/**
* Gets the dB number of docs.
* @param col the col
* @return the dB number of docs
*/
public int getDBNumberOfDocs(final String col)
{
// XXX plutte muss angepasst werden
try
{
new Open(col).execute(CONTEXT);
InfoDB info = new InfoDB();
info.execute(CONTEXT);
// return info.getNumberOfNodes();
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
return 0;
}
/**
* Open collection.
* @param col the col
*/
public void openCollection(final String col)
{
try
{
new Open(col).execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
}
/**
* Optimize.
* @param col the col
*/
public void optimize(final String col)
{
try
{
new Open(col).execute(CONTEXT);
new Optimize().execute(CONTEXT);
new Close().execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
}
/**
* Store2 db.
* @param xml the xml
* @param col the col
* @param name the name
* @param optimize the optimize
*/
public void store2DB(final String xml, final String col, String name, final boolean optimize)
{
if (!name.endsWith(".xml"))
{
name += ".xml";
}
try
{
new Open(col).execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
try
{
new Delete(name).execute(CONTEXT);
}
catch (BaseXException e1)
{
e1.printStackTrace();
}
if (col.equals("aspect") && !aspectOptimizationRequired)
{
aspectOptimizationRequired = true;
}
else if (col.equals("person") && !personOptimizationRequired)
{
personOptimizationRequired = true;
}
else if (col.equals("reference") && !referenceOptimizationRequired)
{
referenceOptimizationRequired = true;
}
try
{
boolean chop = !((col.equals("refTemplate")) || (col.equals("aspect")));
new Set("intparse", chop).execute(CONTEXT);
new Set("dtd", true).execute(CONTEXT);
// new Set("entity", true).execute(CONTEXT);
new Set("chop", chop).execute(CONTEXT);
new Set("TEXTINDEX", true).execute(CONTEXT);
new Set("ATTRINDEX", true).execute(CONTEXT);
new Set("PATHINDEX", true).execute(CONTEXT);
new Set("FTINDEX", true).execute(CONTEXT);
new Set("WILDCARDS", true).execute(CONTEXT);
new Set("STEMMING", true).execute(CONTEXT);
new Set("CASESENS", false).execute(CONTEXT);
new Set("DIACRITICS", true).execute(CONTEXT);
new Add(name, xml).execute(CONTEXT);
if (optimize)
{
new Optimize().execute(CONTEXT);
}
new Close().execute(CONTEXT);
}
catch (BaseXException e)
{
e.printStackTrace();
}
}
public boolean isAspectOptimizationRequired()
{
return aspectOptimizationRequired;
}
public boolean isPersonOptimizationRequired()
{
return personOptimizationRequired;
}
public boolean isReferenceOptimizationRequired()
{
return referenceOptimizationRequired;
}
/**
* Store quick2 db.
* @param xml the xml
* @param col the col
* @param name the name
*/
public void storeQuick2DB(final String xml, final String col, String name)
{
if (!name.endsWith(".xml"))
{
name += ".xml";
}
if (col.equals("aspect") && !aspectOptimizationRequired)
{
aspectOptimizationRequired = true;
}
else if (col.equals("person") && !personOptimizationRequired)
{
personOptimizationRequired = true;
}
else if (col.equals("reference") && !referenceOptimizationRequired)
{
referenceOptimizationRequired = true;
}
// try
// {
// new Delete(name).execute(CONTEXT);
// }
// catch (BaseXException e1)
// {
// e1.printStackTrace();
// }
try
{
new Add(name, xml).execute(CONTEXT);
}
catch (BaseXException e2)
{
e2.printStackTrace();
}
}
/**
* Write col to xml.
* @param col the col
* @param pDir the dir
* @throws BaseXException the base x exception
*/
public void writeColToXML(final String col, final String pDir) throws BaseXException
{
// System.out.println("write local backup col " + col);
// new Set("indent", false).execute(CONTEXT);
new Open(col).execute(CONTEXT);
new Export(pDir).execute(CONTEXT);
new Close().execute(CONTEXT);
}
}