/*
* 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.math.BigDecimal;
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.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 ProjectFactory {
static Logger logger = null;
/**
* the constant <code>MIN_MEMBER_PER_PROJECT</code> defines
* the minimum members number to be created per project
*/
public static final int MIN_MEMBER_PER_PROJECT = 5;
/**
* the constant <code>MAX_MEMBER_PER_PROJECT</code> defines
* the maximum members number to be created per project
*/
public static final int MAX_MEMBER_PER_PROJECT = 20;
static {
LoggerFactory lf = Monolog.initialize();
logger = lf.getLogger(DatabaseImpl.class.getName());
}
/**
* Gets some projects. 2 queries are defines
* <ul><li>Get a project by it's primary key</li>
* <li>Get projects having one of 2 selected employees</li></ul>
* @throws JDOException
* @throws Exception
*/
public void getProjects(StringBuffer outStr, PersistenceManager pm) {
int testId = Alea.rand(0, 1);
switch (testId) {
case 0 :
queryProject(outStr, pm);
break;
case 1 :
queryProjectsByMembers(outStr, pm);
break;
}
}
private void queryProject(StringBuffer outStr, PersistenceManager pm) {
long id = DatabaseImpl.getProjectIdFromPool();
logger.log(BasicLevel.DEBUG, "Query project having id :" + id);
Query query = pm.newQuery(Project.class);
query.declareParameters("long aId");
query.setFilter("(proid==aId)");
Collection col = (Collection) query.execute(new Long(id));
Iterator iter = col.iterator();
Project p = null;
try {
if (!iter.hasNext()) {
throw new RuntimeException("No project found with the id: " + id);
}
p = (Project) iter.next();
if (p.getProid() != id)
throw new RuntimeException("Bad project found (the id is different, expected: " + id + ", found:" + p.getProid());
if (iter.hasNext())
throw new RuntimeException("More than one project corresponding to the id: " + id);
} finally {
query.closeAll();
}
outStr.append("\nGet project " + id);
outStr.append(", name:").append(p.getName());
outStr.append(", budget:").append(p.getBudget());
}
private void queryProjectsByMembers(StringBuffer outStr, PersistenceManager pm) {
long id1 = DatabaseImpl.getEmployeeIdFromPool();
long id2 = DatabaseImpl.getEmployeeIdFromPool();
while (id2 == id1) {
id2 = DatabaseImpl.getEmployeeIdFromPool();
}
logger.log(BasicLevel.DEBUG,
"Query project having members :" + id1 + " and " + id2);
outStr.append("\nThe project for the employee ");
outStr.append(id1).append(" and ").append(id2);
Query query = pm.newQuery(Project.class);
query.declareParameters("long id1, long id2");
query.declareVariables("org.objectweb.speedo.j2eedo.database.Employee e");
query.setFilter("((members.contains(e)) && ((e.empid==id1) || (e.empid==id2)) )");
Collection col = (Collection) query.execute(new Long(id1), new Long(id2));
Iterator iter = col.iterator();
try {
while (iter.hasNext()) {
Project p = (Project) iter.next();
outStr.append(p.getAsString());
}
} finally {
query.closeAll();
}
}
/**
* Gets a project
* @throws JDOException
* @throws Exception
*/
public void getProject(StringBuffer outStr, PersistenceManager pm) {
long id = DatabaseImpl.getProjectIdFromPool();
logger.log(BasicLevel.DEBUG, "Get project having id :" + id);
outStr.append("\nGet the project id :").append(id);
Project p = (Project) pm.getObjectById(
pm.newObjectIdInstance(Project.class, Long.toString(id)),
false);
outStr.append(p.getAsString());
}
/**
* Deletes a project
* @throws JDOException
* @throws Exception
*/
public void deleteProject(PollsSynchronizations pollsSync,
StringBuffer outStr,
PersistenceManager pm) {
long id = DatabaseImpl.getProjectIdFromPool();
// remove id from static pool to avoid other threatment to use it
pollsSync.removeFromPool(DatabaseImpl.poolOfProjectId, id);
pm.setUserObject( pollsSync);
logger.log(BasicLevel.DEBUG, "Delete project having id :" + id);
outStr.append("\nRemove project :").append(id);
pm.deletePersistent(
(Project) pm.getObjectById(
pm.newObjectIdInstance(Project.class, Long.toString(id)),
false));
}
/**
* Selects an existing project, creates a new project and duplicates member list to
* the new project
* @throws JDOException
* @throws Exception
*/
public void splitProject(PollsSynchronizations pollsSync,
StringBuffer outStr,
PersistenceManager pm) {
long id = DatabaseImpl.getProjectIdFromPool();
logger.log(BasicLevel.DEBUG, "Split project having id :" + id);
outStr.append("\nSplit project :").append(id);
Project p = (Project) pm.getObjectById(
pm.newObjectIdInstance(
Project.class,
Long.toString(id)),
false);
Project newP = new Project(p.getName() + "-splited", p.getDepartment());
newP.setBudget(BigDecimal.valueOf(Alea.rand(1, 150000)));
newP.setMembers(p.getMembers());
pm.makePersistent(newP);
outStr.append(", new project is: ").append(newP.getProid());
pollsSync.addInPool(DatabaseImpl.poolOfProjectId, newP.getProid());
pm.setUserObject(pollsSync);
}
/**
* Selects an existing department, create a new project and affects some
* existing employees
* @throws JDOException
* @throws Exception
*/
public void newProjectWithEmployees(PollsSynchronizations pollsSync,
StringBuffer outStr,
PersistenceManager pm) {
outStr.append("\nCreate new project with its members");
Department d = (Department) pm.getObjectById(
pm.newObjectIdInstance(
Department.class,
Long.toString(
DatabaseImpl.getDepartmentIdFromPool())),
false);
Project p = new Project("Name-" + Alea.randomstring(4, 5), d);
p.setBudget(BigDecimal.valueOf(Alea.rand(1, 150000)));
pm.makePersistent(p);
logger.log(BasicLevel.DEBUG, "Create a new project id :" + p.getProid());
outStr.append("\nAdd project : ").append(p.getProid());
pollsSync.addInPool(DatabaseImpl.poolOfProjectId, p.getProid());
pm.setUserObject( pollsSync);
int nbEmployees = Alea.rand(MIN_MEMBER_PER_PROJECT, MAX_MEMBER_PER_PROJECT);
Employee e = null;
for (int i = 0; i < nbEmployees; i++) {
e = (Employee) pm.getObjectById(
pm.newObjectIdInstance(
Employee.class,
Long.toString(
DatabaseImpl.getEmployeeIdFromPool())),
false);
if (!p.addMember(e)) {
i--;
}
}
outStr.append(" with ").append(nbEmployees).append(" members");
}
}