/*
* Speedo: an implementation of JDO compliant personality on top of JORM generic
* I/O sub-system.
* Copyright (C) 2001-2004 France Telecom R&D
*
* This library 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 2 of the License, or (at your option) any later version.
*
* This library 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 this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
*/
package org.objectweb.speedo.j2eedo.bo;
import java.util.Calendar;
import java.util.Collection;
import java.util.Iterator;
import javax.jdo.JDOException;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import org.objectweb.speedo.Alea;
import org.objectweb.speedo.j2eedo.database.Address;
import org.objectweb.speedo.j2eedo.database.Department;
import org.objectweb.speedo.j2eedo.database.Employee;
import org.objectweb.speedo.j2eedo.database.Project;
import org.objectweb.util.monolog.Monolog;
import org.objectweb.util.monolog.api.BasicLevel;
import org.objectweb.util.monolog.api.Logger;
import org.objectweb.util.monolog.api.LoggerFactory;
/**
* This class define the Java class to methods used to handle employee
* @author fmillevi@yahoo.com
*
*/
public class EmployeeFactory {
static Logger logger = Monolog.initialize().getLogger(DatabaseImpl.class.getName());
/**
* Creates a new employee in one of the existing department
* @throws JDOException
* @throws Exception
*/
public void newEmployee(PollsSynchronizations pollsSync,
StringBuffer outStr,
PersistenceManager pm) {
long id = DatabaseImpl.getDepartmentIdFromPool();
Department d = (Department) pm.getObjectById(
pm.newObjectIdInstance(Department.class, Long.toString(id)),
false);
Calendar cal = Calendar.getInstance();
cal.set(Alea.rand(1900, 2004), Alea.rand(1, 12), Alea.rand(1, 28));
Employee e =
new Employee(
"First-" + Alea.randomstring(4, 5),
"Last-" + Alea.randomstring(8, 10),
cal.getTime(),
d);
e.setSalary(Alea.rand(5000, 45000));
Address a = new Address();
a.setCity("City-" + Alea.randomstring(4, 5));
a.setStreet("Street-" + Alea.randomstring(4, 5));
a.setState("StateItf-" + Alea.randomstring(4, 5));
a.setZipcode("ZIP-" + Alea.randomstring(2, 3));
e.setAddress(a);
pm.makePersistent(e);
outStr.append("\nCreate a new employee:").append(e.getAsString());
logger.log(BasicLevel.DEBUG, "Create a new employee having id=" + e.getEmpid());
pollsSync.addInPool(DatabaseImpl.poolOfEmployeeId, e.getEmpid());
pm.setUserObject(pollsSync);
}
/**
* Deletes an existing employee
* @throws JDOException
* @throws Exception
*/
public void deleteEmployee(PollsSynchronizations pollsSync,
StringBuffer outStr,
PersistenceManager pm) {
long id = DatabaseImpl.getEmployeeIdFromPool();
// remove id from static pool to avoid other threatment to use it
pollsSync.removeFromPool(DatabaseImpl.poolOfEmployeeId, id);
pm.setUserObject( pollsSync);
outStr.append("\nRemove the employee ").append(id);
logger.log(BasicLevel.DEBUG, "Delete employee having id=" + id);
Employee e =
(Employee) pm.getObjectById(
pm.newObjectIdInstance(Employee.class, Long.toString(id)),
false);
Address a = e.getAddress();
pm.deletePersistent(a);
pm.deletePersistent(e);
}
/**
* Gets employee's data
* @throws JDOException
* @throws Exception
*/
public void getEmployee(StringBuffer outStr,
PersistenceManager pm) {
long id = DatabaseImpl.getEmployeeIdFromPool();
outStr.append("\nGet the employe id ").append(id);
logger.log(BasicLevel.DEBUG, "Get employee having id=" + id);
Employee e = (Employee) (Employee) pm.getObjectById(
pm.newObjectIdInstance(Employee.class, Long.toString(id)),
false);
outStr.append(e.getAsString());
}
/**
* Gets some employees. 4 queries are defines
* <ul><li>Get an employee by it's primary key</li>
* <li>Get employees having it's id between two values</li>
* <li>Get employees having the same manager</li>
* <li>Get employees member of one of 2 selected projects</li></ul>
* @throws JDOException
* @throws Exception
*/
public void getEmployees(StringBuffer outStr, PersistenceManager pm) {
int testId = Alea.rand(0, 3);
switch (testId) {
case 0 :
queryEmployee(outStr, pm);
break;
case 1 :
queryEmployeeArrayParameters(outStr, pm);
break;
case 2 :
queryEmployeeByManager(outStr, pm);
break;
case 3 :
queryEmployeeOrderHiredateByProject(outStr, pm);
break;
}
}
/**
* Increases an employee' salary
* @throws JDOException
* @throws Exception
*/
public void increaseSalary(StringBuffer outStr, PersistenceManager pm) {
long id = DatabaseImpl.getEmployeeIdFromPool();
outStr.append("\nIncrease salary for the employe ").append(id);
logger.log(BasicLevel.DEBUG, "Increase the salary for the employee having id=" + id);
Employee e = (Employee) pm.getObjectById(
pm.newObjectIdInstance(Employee.class, Long.toString(id)),
false);
e.setSalary(e.getSalary() + 1);
}
private void queryEmployee(StringBuffer outStr, PersistenceManager pm) {
long id = DatabaseImpl.getEmployeeIdFromPool();
logger.log(BasicLevel.DEBUG, "Query employee having id=" + id);
Query query = pm.newQuery(Employee.class);
query.declareParameters("long aId");
query.setFilter("(empid==aId)");
try {
Collection col = (Collection) query.execute(new Long(id));
Iterator iter = col.iterator();
if (!iter.hasNext())
throw new RuntimeException("TestInheritanceBasic query on employee does not return any row");
Employee e = (Employee) iter.next();
if (e.getEmpid() != id)
throw new RuntimeException("TestInheritanceBasic query on employee returns an other row");
if (iter.hasNext())
throw new RuntimeException("TestInheritanceBasic query on a employee returns to many rows");
outStr.append("\nGet Employee").append(id);
outStr.append(", full name ").append(e.getFirstname());
outStr.append(" ").append(e.getLastname());
} finally {
query.closeAll();
}
}
private void queryEmployeeOrderHiredateByProject(StringBuffer outStr,
PersistenceManager pm) {
Project p = (Project) pm.getObjectById(
pm.newObjectIdInstance(Project.class,
Long.toString(DatabaseImpl.getProjectIdFromPool())),
false);
outStr.append("\nLook for members of the project ");
outStr.append(p.getName());
logger.log(BasicLevel.DEBUG,
"Query employee member of the project=" + p.getName());
Query query = pm.newQuery(Employee.class);
query.declareParameters("org.objectweb.speedo.j2eedo.database.Project p");
query.setFilter("(projects.contains(p))");
query.setOrdering("hiredate ascending, salary descending");
try {
Collection col = (Collection) query.execute(p);
Iterator iter = col.iterator();
if (!iter.hasNext())
throw new RuntimeException("Query on employee does not return any row");
Employee e = null;
while (iter.hasNext()) {
e = (Employee) iter.next();
outStr.append("\n\tEmployee name:");
outStr.append(e.getFirstname());
outStr.append(" ");
outStr.append(e.getLastname());
}
} finally {
query.closeAll();
}
}
private void queryEmployeeArrayParameters(StringBuffer outStr, PersistenceManager pm) {
long idMin = DatabaseImpl.getEmployeeIdFromPool();
long idMax = DatabaseImpl.getEmployeeIdFromPool();
while (idMin == idMax) {
idMax = DatabaseImpl.getEmployeeIdFromPool();
}
if (idMin > idMax) {
// max < min ! inverse boundaries
long dummy = idMax;
idMax = idMin;
idMin = dummy;
}
outStr.append("\nLook for employees having id between ");
outStr.append(idMin);
outStr.append(" and ");
outStr.append(idMax);
logger.log(BasicLevel.DEBUG,
"Query employee having id between " + idMin + " and " + idMax);
Long param[] = new Long[] { new Long(idMin), new Long(idMax)};
Query query = pm.newQuery(Employee.class);
query.declareParameters("long idMin, long idMax");
query.setFilter("((empid>=idMin) && (empid<=idMax))");
query.setOrdering("empid descending");
try {
Collection col = (Collection) query.executeWithArray(param);
Iterator iter = col.iterator();
if (!iter.hasNext())
throw new RuntimeException("Query on employee does not return any row");
Employee e = (Employee) iter.next();
outStr.append("\n\tEmployee name (").append(e.getEmpid());
outStr.append("): ").append(e.getFirstname()).append(" ");
outStr.append(e.getLastname());
if (false && e.getEmpid() != idMax) {
throw new RuntimeException("Query on employee returns an other first row than expecting");
}
while (iter.hasNext()) {
e = (Employee) iter.next();
outStr.append("\n\tEmployee name (").append(e.getEmpid());
outStr.append("): ").append(e.getFirstname()).append(" ");
outStr.append(e.getLastname());
}
if (false && e.getEmpid() != idMin)
throw new RuntimeException("Query on employee returns an other last row than expecting");
} finally {
query.closeAll();
}
}
private void queryEmployeeByManager(StringBuffer outStr, PersistenceManager pm) {
Employee e = (Employee) pm.getObjectById(
pm.newObjectIdInstance( Employee.class,
Long.toString(DatabaseImpl.getEmployeeIdFromPool())),
false);
Employee boss = e.getManager();
outStr.append("\nLook for employees having the same manager : ");
if (null != boss) {
outStr.append(boss.getLastname());
} else {
outStr.append("NULL");
}
logger.log(BasicLevel.DEBUG, "Query employee having the same manager :"
+((null==boss)? "null" : boss.getLastname()));
Query query = pm.newQuery(Employee.class);
query.declareParameters("org.objectweb.speedo.j2eedo.database.Employee e");
query.setFilter("(manager==e)");
try {
Collection col = (Collection) query.execute(boss);
for (Iterator iter = col.iterator(); iter.hasNext();) {
e = (Employee) iter.next();
outStr.append("\n\tEmployee name:");
outStr.append(e.getFirstname()).append(" ");
outStr.append(e.getLastname());
}
} finally {
query.closeAll();
}
}
}