blob: 7b6468dc96e037dc4221c3d8c26e4a73f3fdda53 [file] [log] [blame]
/*
* Copyright (c) 2010-2012, 2015 Eike Stepper (Berlin, Germany) and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Ibrahim Sallam - initial API and implementation
*/
package org.eclipse.emf.cdo.server.internal.objectivity.db;
import org.eclipse.emf.cdo.server.internal.objectivity.bundle.OM;
import org.eclipse.net4j.util.io.TMPUtil;
import org.eclipse.net4j.util.om.trace.ContextTracer;
import com.objy.db.app.Session;
import com.objy.db.app.oo;
import com.objy.db.app.ooContObj;
import com.objy.db.app.ooDBObj;
import org.w3c.dom.Element;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class FdManager
{
private static final ContextTracer TRACER_DEBUG = new ContextTracer(OM.DEBUG, FdManager.class);
private static final ContextTracer TRACER_INFO = new ContextTracer(OM.INFO, FdManager.class);
private static final String DEFAULT_VALUE = "_DEFAULT_";
private String fdName = "test";
private String fdFileHost = DEFAULT_VALUE;
private String fdDirPath = null;
private String lockServerHost = DEFAULT_VALUE;
private String fdNumber = "12345";
private String pageSize = DEFAULT_VALUE;
private String fdFilePath = null;
private String bootFilePath = null;
private boolean initialized = false;
private String logDirPath = null;
protected void initialize(boolean reset)
{
if (fdDirPath == null)
{
File dataFolder = TMPUtil.createTempFolder("Objy", "data");
fdDirPath = dataFolder.getAbsolutePath();
}
if (noDefaultValueSet(logDirPath))
{
logDirPath = fdDirPath;
}
if (fdFilePath == null)
{
fdFilePath = fdDirPath + File.separator + fdName + ".fdb";
}
if (bootFilePath == null)
{
bootFilePath = fdDirPath + File.separator + fdName + ".boot";
}
if (!initialized)
{
if (reset)
{
initialized = resetFD();
}
else if (!fdExists())
{
initialized = createFD();
}
else
{
// FD is ready, just use it.
initialized = true;
}
}
}
public String getFd()
{
return bootFilePath;
}
public boolean resetFD()
{
return deleteDBs();
}
public boolean resetFD_OLD()
{
boolean bRet = true;
// TBD: we need to add code to delete all DBs.
// also we need to delete the schema.
// It might be easier to just delete the FD, then create another one.
if (fdExists())
{
bRet = deleteFD();
}
if (bRet)
{
bRet = createFD();
}
return bRet;
}
private boolean createFD()
{
boolean bRet = false;
Process proc = null;
StringBuilder command = new StringBuilder(256);
command.append("oonewfd");
// command.append(" -fdfilehost ").append(getFdFileHost());
command.append(" -fdfilepath ").append(fdFilePath);
command.append(" -lockserver ").append(getLockServerHost());
command.append(" -fdnumber ").append(fdNumber);
command.append(" -pagesize ").append(getPageSize());
// command.append(" -jnldirpath ").append(jrnlDirPath);
// command.append(" -licensefile ").append(licenseFilePath);
// if (standAlone) command.append(" -standalone ");
command.append(' ').append(bootFilePath);
TRACER_INFO.trace("Createing FD: '" + bootFilePath + "'.");
try
{
proc = Runtime.getRuntime().exec(command.toString());
if (proc.waitFor() != 0)
{
dumpStream(proc.getErrorStream());
throw new RuntimeException("Error creating FD...");
}
dumpStream(proc.getInputStream());
bRet = true;
// loadSchema();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return bRet;
}
// TODO - we made it public to allow wiping out the whole FD, there is close
// package names and classes in the test suite.
public boolean deleteFD()
{
boolean bRet = false;
Process proc = null;
File file = new File(bootFilePath);
if (!file.exists())
{
return true;
}
String command = "oodeletefd" + " -force " + bootFilePath;
TRACER_INFO.trace("Deleting FD: '" + bootFilePath + "'.");
try
{
proc = Runtime.getRuntime().exec(command);
if (proc.waitFor() != 0)
{
dumpStream(proc.getErrorStream());
throw new RuntimeException("Error deleting FD...");
}
dumpStream(proc.getInputStream());
bRet = true;
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return bRet;
}
private boolean deleteDBs()
{
boolean bRet = false;
Process proc = null;
String command = "oodeletedb" + " -all " + " -force " + bootFilePath;
// command += " ; del *.DB";
TRACER_INFO.trace("Deleting all DBs from : '" + bootFilePath + "'.");
try
{
proc = Runtime.getRuntime().exec(command);
if (proc.waitFor() != 0)
{
dumpStream(proc.getErrorStream());
throw new RuntimeException("Error deleting DBs...");
}
dumpStream(proc.getInputStream());
bRet = true;
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return bRet;
}
@SuppressWarnings("unused")
private boolean deleteDBs_cl()
{
boolean bRet = false;
Process proc = null;
String command = "oodeletedb" + " -all " + " -force " + bootFilePath;
// command += " ; del *.DB";
TRACER_INFO.trace("Deleting all DBs from : '" + bootFilePath + "'.");
try
{
proc = Runtime.getRuntime().exec(command);
if (proc.waitFor() != 0)
{
dumpStream(proc.getErrorStream());
throw new RuntimeException("Error deleting DBs...");
}
dumpStream(proc.getInputStream());
bRet = true;
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return bRet;
}
private boolean fdExists()
{
boolean bRet = false;
File file = new File(bootFilePath);
bRet = file.exists();
// Process proc = null;
//
// String command = "oochange" + " -notitle " + bootFilePath;
// TRACER_DEBUG.trace("Checking if FD: '" + bootFilePath + "' exists.");
//
// try
// {
// proc = Runtime.getRuntime().exec(command);
// if (proc.waitFor() != 0)
// {
// dumpStream(proc.getErrorStream());
// }
// else
// {
// dumpStream(proc.getInputStream());
// bRet = true;
// }
// }
// catch (IOException e)
// {
// e.printStackTrace();
// }
// catch (InterruptedException e)
// {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
return bRet;
}
// This is a temp solution to avoid unloaded schema.
// We'll explicitly load the schema after creating the FD
@SuppressWarnings("unused")
private boolean loadSchema()
{
boolean bRet = false;
Process proc = null;
String command = "ooschemaupgrade" + " -infile config" + File.separator + "schema.txt " + bootFilePath;
TRACER_DEBUG.trace("Loading schema to FD: '" + bootFilePath + "'.");
try
{
proc = Runtime.getRuntime().exec(command);
if (proc.waitFor() != 0)
{
dumpStream(proc.getErrorStream());
}
else
{
dumpStream(proc.getInputStream());
bRet = true;
}
}
catch (IOException e)
{
e.printStackTrace();
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return bRet;
}
public String getFdFileHost()
{
if (noDefaultValueSet(fdFileHost))
{
// get local host
try
{
InetAddress address = InetAddress.getLocalHost();
fdFileHost = address.getHostName();
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return fdFileHost;
}
public void setFdFileHost(String fdFileHost)
{
this.fdFileHost = fdFileHost;
}
public String getFdDirPath()
{
return fdDirPath;
}
public void setFdDirPath(String fdDirPath)
{
this.fdDirPath = fdDirPath;
}
public String getLockServerHost()
{
if (noDefaultValueSet(lockServerHost))
{
// get local host
try
{
InetAddress address = InetAddress.getLocalHost();
lockServerHost = address.getHostName();
}
catch (UnknownHostException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return lockServerHost;
}
public void setLockServerHost(String lockServerHost)
{
this.lockServerHost = lockServerHost;
}
public String getFdNumber()
{
return fdNumber;
}
public void setFdNumber(String fdNumber)
{
this.fdNumber = fdNumber;
}
public String getPageSize()
{
if (noDefaultValueSet(pageSize))
{
pageSize = "8192";
}
return pageSize;
}
public void setPageSize(String pageSize)
{
this.pageSize = pageSize;
}
public String getFdName()
{
return fdName;
}
public void setFdName(String fdName)
{
this.fdName = fdName;
}
private void dumpStream(InputStream inStream)
{
BufferedInputStream inBuffStream = new BufferedInputStream(inStream);
try
{
byte[] buffer = new byte[1024];
int bytesRead = 0;
while ((bytesRead = inBuffStream.read(buffer)) != -1)
{
String chunk = new String(buffer, 0, bytesRead);
TRACER_DEBUG.trace(chunk);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
public void configure()
{
initialize(false);
}
/**
* TODO
*
* @param storeConfig
*/
public void configure(Element storeConfig)
{
// TODO Auto-generated method stub
}
public void configure(String name)
{
fdDirPath = fdDirPath + File.separator + name;
// insure that path exist.
File dir = new File(fdDirPath);
if (!dir.exists())
{
// create the directory.
dir.mkdirs();
}
Integer number = Math.abs(new Random().nextInt() % 65000);
fdNumber = number.toString();
initialize(false);
}
/**
* Data cleanup code, that's mostly used by the test applications. This code will not remove schema.
*/
public void removeData()
{
// ObjyConnection.INSTANCE.disconnect();
// fdManager.resetFD();
Session session = new Session();
session.setIndexMode(oo.EXPLICIT_UPDATE);
session.begin();
Iterator<?> itr = session.getFD().containedDBs();
ooDBObj dbObj = null;
List<ooDBObj> dbList = new ArrayList<ooDBObj>();
List<ooContObj> contList = new ArrayList<ooContObj>();
while (itr.hasNext())
{
dbObj = (ooDBObj)itr.next();
dbList.add(dbObj);
{
Iterator<?> contItr = dbObj.contains();
while (contItr.hasNext())
{
contList.add((ooContObj)contItr.next());
}
}
}
for (ooContObj cont : contList)
{
cont.delete();
}
// for (ooDBObj db : dbList)
// {
// System.out.println("restFD() - deleting DB(" + db.getOid().getStoreString() + "):" + db.getName());
// db.delete();
// }
session.commit();
session.terminate();
}
boolean noDefaultValueSet(String value)
{
return value == null || value.length() == 0 || value.equals(DEFAULT_VALUE);
}
public void setlogDirPath(String logDirPath)
{
this.logDirPath = logDirPath;
}
public String getLogPath()
{
return logDirPath;
}
}