Java tutorial
/** * Copyright (c) 2010 arago AG, http://www.arago.de/ * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package de.arago.rike.zombie; import de.arago.rike.commons.data.DataHelperRike; import de.arago.rike.commons.data.Milestone; import de.arago.rike.commons.data.Task; import de.arago.rike.commons.util.ViewHelper; import java.util.ArrayList; import java.util.Calendar; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.List; import java.util.Map; import net.minidev.json.JSONArray; import org.apache.commons.lang.StringEscapeUtils; import org.hibernate.Criteria; import org.hibernate.criterion.Order; import org.hibernate.criterion.Restrictions; /** * */ public class ZombieHelper { public static List<OverdueMilestone> getOverdueMilestones(boolean getAll) { DataHelperRike<Milestone> helper = new DataHelperRike<Milestone>(Milestone.class); String str = "select " + "(select sum(size_estimated) from tasks t where t.milestone_id = m.id and t.task_status != 'done') as hours_left, " + "(select sum(size_estimated) from tasks t where t.milestone_id = m.id and t.task_status = 'in_progress') as hours_in_progress, " + "(select sum(size_estimated) from tasks t where t.milestone_id = m.id and t.task_status = 'done') as hours_done, " + "id " + " from milestones m where m.due_date is not null and m.performance > 0 group by m.id having hours_left > 0;"; List<OverdueMilestone> ret = new ArrayList<OverdueMilestone>(); List<Object> list = helper.list(helper.createSQLQuery(str)); for (final Object o : list) { Object[] a = (Object[]) o; OverdueMilestone ms = new OverdueMilestone(ViewHelper.asInt(a[0]), ViewHelper.asInt(a[1]), ViewHelper.asInt(a[2]), helper.find(a[3].toString())); if (ms.getLate() > 0 || getAll) ret.add(ms); } return ret; } public static List<OverdueMilestone> getOverdueMilestones() { List<OverdueMilestone> ret = getOverdueMilestones(false); Collections.sort(ret, new EtaSorter()); return ret; } public static List<Task> getOverdueTasks() { DataHelperRike<Task> helper = new DataHelperRike<Task>(Task.class); Criteria crit = helper.filter().add(Restrictions.isNotNull("dueDate")) .add(Restrictions.lt("dueDate", new Date())) .add(Restrictions.ne("status", Task.Status.DONE.toString().toLowerCase())) .addOrder(Order.asc("dueDate")); return helper.list(crit); } static String toPrettyJSON(List ticks) { List<OverdueMilestone> milestones = getOverdueMilestones(true); Collections.sort(milestones, new DoneSorter()); final List data = new ArrayList(); final Map open = new HashMap(); final Map in_progress = new HashMap(); final Map done = new HashMap(); data.add(open); data.add(in_progress); data.add(done); open.put("Label", "open"); open.put("color", "red"); in_progress.put("Label", "in_progress"); in_progress.put("color", "yellow"); done.put("Label", "done"); done.put("color", "green"); List openData = new ArrayList(); List in_progressData = new ArrayList(); List doneData = new ArrayList(); open.put("data", openData); in_progress.put("data", in_progressData); done.put("data", doneData); long now = new Date().getTime(); int i = 1; for (OverdueMilestone o : milestones) { Milestone stone = o.getMilestone(); ticks.add("<a href='/web/guest/rike/-/show/milestone/" + stone.getId() + "'>" + StringEscapeUtils.escapeHtml(stone.getTitle()) + "</a>"); GregorianCalendar c = new GregorianCalendar(); c.setTime(stone.getDueDate()); c.add(Calendar.HOUR_OF_DAY, -((o.getWorkLeftInHours() - o.getWorkInProgressInHours()) * 7 * 24) / stone.getPerformance()); long time1 = c.getTimeInMillis(); c.add(Calendar.HOUR_OF_DAY, -(o.getWorkInProgressInHours() * 7 * 24) / stone.getPerformance()); long time2 = c.getTimeInMillis(); c.add(Calendar.HOUR_OF_DAY, -(o.getWorkDoneInHours() * 7 * 24) / stone.getPerformance()); long time3 = c.getTimeInMillis(); List item = new ArrayList(); item.add(time1); item.add(i); item.add(stone.getDueDate().getTime()); item.add(""); openData.add(item); item = new ArrayList(); item.add(time2); item.add(i); item.add(time1); item.add(""); in_progressData.add(item); item = new ArrayList(); item.add(time3); item.add(i); item.add(time2); item.add(""); doneData.add(item); ++i; } return JSONArray.toJSONString(data); } private static class EtaSorter implements Comparator<OverdueMilestone> { @Override public int compare(OverdueMilestone t, OverdueMilestone t1) { return t1.getLate() - t.getLate(); } } private static class DoneSorter implements Comparator<OverdueMilestone> { @Override public int compare(OverdueMilestone t, OverdueMilestone t1) { return t1.getMilestone().getDueDate().compareTo(t.getMilestone().getDueDate()); } } }