blob: 285842eb5fd8efb4900160c8f1bf33bab2a40bcd [file] [log] [blame]
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.gwt.sample.expenses.server;
import com.google.apphosting.api.DeadlineExceededException;
import com.google.gwt.sample.expenses.client.DataGenerationService;
import com.google.gwt.sample.expenses.server.domain.Employee;
import com.google.gwt.sample.expenses.server.domain.EntityCounter;
import com.google.gwt.sample.expenses.server.domain.Expense;
import com.google.gwt.sample.expenses.server.domain.Report;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
/**
* Server-side implementation.
*/
@SuppressWarnings("serial")
public class DataGenerationServiceImpl extends RemoteServiceServlet implements
DataGenerationService {
private static final Logger log = Logger.getLogger(DataGenerationServiceImpl.class.getName());
// private long endTime;
private ReportGenerator reportGenerator;
public long countEmployees() {
return EntityCounter.updateEmployeeCount();
}
public long countExpenses() {
return EntityCounter.updateExpenseCount();
}
public long countReports() {
return EntityCounter.updateReportCount();
}
public void delete() {
try {
log.info("Expenses before: " + Expense.countExpenses());
List<Expense> expenses = Expense.findAllExpenses();
log.info("ids from " + expenses.get(0).getId() + " to " +
expenses.get(expenses.size() - 1).getId());
for (Expense e : expenses) {
log.info("Deleting expense " + e.getId());
e.remove();
}
for (Report r : Report.findAllReports()) {
log.info("Deleting report " + r.getId());
r.remove();
}
for (Employee e : Employee.findAllEmployees()) {
log.info("Deleting employee " + e.getId());
e.remove();
}
} catch (DeadlineExceededException e) {
log.info("Expenses after: " + Expense.countExpenses());
return;
}
}
public void generate(final int amount) {
long startTime = System.currentTimeMillis();
// endTime = startTime + amount;
final int startEmployees = (int) Employee.countEmployees();
final int startReports = (int) Report.countReports();
final int startExpenses = (int) Expense.countExpenses();
int numEmployees;
synchronized (DataGenerationServiceImpl.class) {
if (reportGenerator == null) {
reportGenerator = new ReportGenerator() {
@Override
public boolean shouldContinue() {
// return System.currentTimeMillis() < endTime;
int numReports = getNumReports();
return numReports <= amount;
}
@Override
public long storeEmployee(EmployeeDTO employee) {
Employee e = new Employee();
e.setDepartment(employee.department);
e.setDisplayName(employee.displayName);
e.setPassword(employee.password);
e.setSupervisorKey(employee.supervisorKey);
e.setUserName(employee.userName);
e.persist();
return e.getId();
}
@Override
public long storeExpense(ExpenseDTO expense) {
Expense e = new Expense();
e.setReportId(expense.reportId);
e.setDescription(expense.description);
e.setCreated(expense.created);
e.setAmount(expense.amount);
e.setCategory(expense.category);
e.setApproval(expense.approval);
e.setReasonDenied(expense.reasonDenied);
e.persist();
return e.getId();
}
@Override
public long storeReport(ReportDTO report) {
Report r = new Report();
r.setApprovedSupervisorKey(report.approvedSupervisorKey);
r.setCreated(report.created);
r.setDepartment(report.department);
r.setNotes(report.notes);
r.setPurpose(report.purpose);
r.setReporterKey(report.reporterKey);
r.persist();
return r.getId();
}
};
}
try {
reportGenerator.init("dist.all.last.txt", "dist.female.first.txt", "dist.male.first.txt");
} catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
}
reportGenerator.reset();
// Use same manager for everyone
long supervisorId = 1;
while (reportGenerator.shouldContinue()) {
int department = reportGenerator.getDepartment();
reportGenerator.makeEmployee(department, supervisorId);
}
numEmployees = (int) Employee.countEmployees();
int numReports = (int) Report.countReports();
int numExpenses = (int) Expense.countExpenses();
int reportsCreated = numReports - startReports;
int employeesCreated = numEmployees - startEmployees;
int expensesCreated = numExpenses - startExpenses;
log.info("Generated " + employeesCreated + " employees, " +
reportsCreated + " reports, and " + expensesCreated + " expenses in " +
(System.currentTimeMillis() - startTime) + " milliseconds");
}
public List<Integer> getCounts() {
synchronized (DataGenerationServiceImpl.class) {
List<Integer> counts = new ArrayList<Integer>(3);
counts.add((int) Employee.countEmployees());
counts.add((int) Report.countReports());
counts.add((int) Expense.countExpenses());
return counts;
}
}
public void resetCounters() {
EntityCounter.reset();
}
}