summaryrefslogtreecommitdiff
path: root/orktrack
diff options
context:
space:
mode:
authorHenri Herscher <henri@oreka.org>2005-11-29 20:23:49 +0000
committerHenri Herscher <henri@oreka.org>2005-11-29 20:23:49 +0000
commit9a5cc6f01a6bfe640f2e92e3f9ad0ea831d1b667 (patch)
tree1d876b7e1cf97fc7ab941fd2c56261bedae4a01e /orktrack
parent9a9aef0d06617b19b7d480b5ead949250f69605a (diff)
Program schedule now works
git-svn-id: https://oreka.svn.sourceforge.net/svnroot/oreka/trunk@77 09dcff7a-b715-0410-9601-b79a96267cd0
Diffstat (limited to 'orktrack')
-rw-r--r--orktrack/src/net/sf/oreka/orktrack/ProgramManager.java82
-rw-r--r--orktrack/src/net/sf/oreka/orktrack/test/ProgramTest.java57
2 files changed, 127 insertions, 12 deletions
diff --git a/orktrack/src/net/sf/oreka/orktrack/ProgramManager.java b/orktrack/src/net/sf/oreka/orktrack/ProgramManager.java
index e95a238..d87de99 100644
--- a/orktrack/src/net/sf/oreka/orktrack/ProgramManager.java
+++ b/orktrack/src/net/sf/oreka/orktrack/ProgramManager.java
@@ -14,27 +14,27 @@
package net.sf.oreka.orktrack;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
+import net.sf.oreka.Cycle;
import net.sf.oreka.Direction;
import net.sf.oreka.HibernateManager;
import net.sf.oreka.persistent.RecProgram;
import net.sf.oreka.persistent.RecSegment;
import org.apache.log4j.Logger;
-import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;
public class ProgramManager {
-
- private Logger log = null;
+
+ static Logger logger = Logger.getLogger(ProgramManager.class);
private static ProgramManager programManager = null;
private ArrayList<RecProgram> recPrograms = new ArrayList<RecProgram>();
private ProgramManager() {
- log = LogManager.getInstance().getPortLogger();;
}
public static ProgramManager instance() {
@@ -64,7 +64,7 @@ public class ProgramManager {
tx.commit();
}
catch (Exception e) {
- log.error("Could not load programs", e);
+ logger.error("Could not load programs", e);
}
finally {
hbnSession.close();
@@ -99,66 +99,128 @@ public class ProgramManager {
boolean drop = false;
boolean result = false;
+ String dropReason = "";
if ( prog.getDirection() != Direction.ALL &&
seg.getDirection() != prog.getDirection()) {
+ dropReason = "Dir.";
drop = true;
}
if ( !drop && prog.getMaxDuration() > 0 &&
(seg.getDuration() > (prog.getMaxDuration()*1000))) {
+ dropReason = "Max Dur.";
drop = true;
}
if ( !drop && prog.getMinDuration() > 0 &&
(seg.getDuration() < (prog.getMinDuration()*1000))) {
+ dropReason = "Min Dur.";
drop = true;
}
if (!drop && prog.getRandomPercent() != 0.0) {
double randomNumber = java.lang.Math.random();
if (randomNumber > prog.getRandomPercent()) {
+ dropReason = "Random percent";
drop = true;
}
}
if ( !drop && prog.getLocalParty().length() > 0 &&
(!seg.getLocalParty().equals(prog.getLocalParty())) ) {
+ dropReason = "LocalParty";
drop = true;
}
if ( !drop && prog.getRemoteParty().length() > 0 &&
(!seg.getRemoteParty().equals(prog.getRemoteParty())) ) {
+ dropReason = "RemoteParty";
drop = true;
}
if ( !drop &&
(prog.getTargetUser() != null) &&
(seg.getUser().getId() != prog.getTargetUser().getId()) ) {
+ dropReason = "Target User";
drop = true;
}
if ( !drop &&
(prog.getTargetPort() != null) &&
(seg.getPort().getId() != prog.getTargetPort().getId()) ) {
+ dropReason = "Target Port";
drop = true;
}
if ( !drop &&
- prog.getRecordedSoFar() < prog.getRecPerCycle() )
+ prog.getRecPerCycle() != 0 &&
+ prog.getRecordedSoFar() > prog.getRecPerCycle() ) {
+ dropReason = "Enough recordings for this Cycle";
+ drop = true;
+ }
+
+ if ( !drop &&
+ filterSegmentAgainstProgramSchedule(seg, prog) == false ) {
+ dropReason = "Schedule";
drop = true;
+ }
if(drop == false) {
// All criteria have passed, the segment is accepted by the program
prog.setRecordedSoFar(prog.getRecordedSoFar() + 1);
- hbnSession.update(prog);
- seg.getRecPrograms().add(prog);
+ if(hbnSession != null) {
+ hbnSession.update(prog);
+ seg.getRecPrograms().add(prog);
+ }
result = true;
}
+ else {
+ logger.debug("Contact dropped, reason: " + dropReason);
+ }
return result;
}
- public void filterTime() {
- ;
+ public boolean filterSegmentAgainstProgramSchedule(RecSegment seg, RecProgram prog) {
+
+ if(prog.getCycle() == Cycle.PERMANENT) {
+ return true;
+ }
+ else {
+ long startPrgMillis = prog.getStartTime().getTime();
+ long stopPrgMillis = prog.getStopTime().getTime();
+ long startSegMillis = seg.getTimestamp().getTime();
+ Date startOfDay = seg.getTimestamp();
+ startOfDay.setHours(0);
+ startOfDay.setMinutes(0);
+ startOfDay.setSeconds(0);
+ long startOfDayMillis = startOfDay.getTime();
+ long startSegInDayMillis = startSegMillis - startOfDayMillis;
+ logger.debug("Hour: Seg start:" + startSegInDayMillis + " Prg start:" + startPrgMillis + " Prg stop:" + stopPrgMillis);
+
+ if(prog.getCycle() == Cycle.DAILY) {
+ if(startSegInDayMillis >= startPrgMillis && startSegInDayMillis <= stopPrgMillis) {
+ return true;
+ }
+ }
+ else if(prog.getCycle() == Cycle.WEEKLY) {
+ // Determine the day that the call has been made
+ int startDay = seg.getTimestamp().getDay();
+ startDay--; // in java.util.Date, {Sunday ... Saturday} = {0 ... 6}. In net.sf.oreka.Day {monday ... sunday} = {0 ... 6}
+ if(startDay == -1) {
+ startDay = 6; // sunday is = 0 in java.util.Date but = 6 in net.sf.oreka.Day
+ }
+ logger.debug("Day: Seg start:" + startDay + " Prg start:" + prog.getStartDay().ordinal() + " Prg stop:" + prog.getStopDay().ordinal());
+ if(startDay >= prog.getStartDay().ordinal() && startDay <= prog.getStopDay().ordinal()) {
+ if(startSegInDayMillis >= startPrgMillis && startSegInDayMillis <= stopPrgMillis) {
+ return true;
+ }
+ }
+ }
+ else {
+ logger.warn("Cycle not yet implemented:" + prog.getCycle().name());
+ }
+ }
+ return false;
}
}
diff --git a/orktrack/src/net/sf/oreka/orktrack/test/ProgramTest.java b/orktrack/src/net/sf/oreka/orktrack/test/ProgramTest.java
index 8195398..2ea1c31 100644
--- a/orktrack/src/net/sf/oreka/orktrack/test/ProgramTest.java
+++ b/orktrack/src/net/sf/oreka/orktrack/test/ProgramTest.java
@@ -13,11 +13,15 @@
package net.sf.oreka.orktrack.test;
+import java.text.SimpleDateFormat;
+import java.util.Date;
import java.util.Iterator;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
+import net.sf.oreka.Cycle;
+import net.sf.oreka.Day;
import net.sf.oreka.Direction;
import net.sf.oreka.HibernateManager;
import net.sf.oreka.orktrack.OrkTrack;
@@ -36,7 +40,7 @@ public class ProgramTest extends TestCase {
junit.textui.TestRunner.run (suite());
}
protected void setUp() throws Exception {
- OrkTrack.initialize("C:/oreka/log4j.properties", "C:/oreka/mysql.hbm.xml", "C:/oreka/orktrack.config.xml");
+ OrkTrack.initialize("C:/oreka/orktrack/log4j.properties", "C:/oreka/orktrack/hsqldb.hbm.xml", "C:/oreka/orktrack/orktrack.config.xml");
}
public static Test suite() {
return new TestSuite(ProgramTest.class);
@@ -68,6 +72,7 @@ public class ProgramTest extends TestCase {
ProgramManager.instance().load();
+ // segment 1: should pass
RecSegment seg = new RecSegment();
seg.setDirection(Direction.IN);
seg.setUser(user);
@@ -79,8 +84,8 @@ public class ProgramTest extends TestCase {
}
tx.commit();
hbnSession.close();
-
// verify result
+
hbnSession = HibernateManager.getSession();
tx = hbnSession.beginTransaction();
RecProgram prog = (RecProgram)hbnSession.load(RecProgram.class, prog1.getId());
@@ -91,6 +96,54 @@ public class ProgramTest extends TestCase {
hbnSession.close();
}
+ public void testSchedule() throws Exception {
+
+ // create a "daily" program
+ RecProgram progDaily = new RecProgram();
+ progDaily.setDirection(Direction.ALL);
+ progDaily.setCycle(Cycle.DAILY);
+ progDaily.setStartTime(new Date(10*3600*1000)); // 10:00 am
+ progDaily.setStopTime(new Date(11*3600*1000)); // 11:00 am
+
+ // create a "weekly" program
+ RecProgram progWeekly = new RecProgram();
+ progWeekly.setDirection(Direction.ALL);
+ progWeekly.setCycle(Cycle.WEEKLY);
+ progWeekly.setStartDay(Day.TUESDAY);
+ progWeekly.setStopDay(Day.THURSDAY);
+ progWeekly.setStartTime(new Date(22*3600*1000)); // 10:00 pm
+ progWeekly.setStopTime(new Date(23*3600*1000)); // 11:00 pm
+
+
+ // segment 1: should pass
+ RecSegment seg = new RecSegment();
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date segTimestamp = sdf.parse("2005-11-29 10:30:00");
+ seg.setTimestamp(segTimestamp); // 10:30
+ assertTrue(ProgramManager.instance().filterSegmentAgainstProgram(seg, progDaily, null));
+
+ // segment 2: should be rejected
+ seg.setTimestamp(sdf.parse("2005-11-29 11:00:01"));
+ assertFalse(ProgramManager.instance().filterSegmentAgainstProgram(seg, progDaily, null));
+
+ // segment 3: should pass
+ seg.setTimestamp(sdf.parse("2005-11-29 22:45:01")); // tuesday
+ //int dateDay = seg.getTimestamp().getDay();
+ //GregorianCalendar cal = new GregorianCalendar();
+ //cal.setTimeInMillis(seg.getTimestamp().getTime());
+ //int calDay = cal.get(Calendar.DAY_OF_WEEK);
+ //int todayDay = new Date().getDay();
+ assertTrue(ProgramManager.instance().filterSegmentAgainstProgram(seg, progWeekly, null));
+
+ // segment 4: should pass
+ seg.setTimestamp(sdf.parse("2005-12-01 22:45:01")); // thursday
+ assertTrue(ProgramManager.instance().filterSegmentAgainstProgram(seg, progWeekly, null));
+
+ // segment 5: should be rejected
+ seg.setTimestamp(sdf.parse("2005-11-27 22:45:01")); // sunday
+ assertFalse(ProgramManager.instance().filterSegmentAgainstProgram(seg, progWeekly, null));
+ }
+
// public void testManyToMany() throws Exception {
//
// Session hbnSession = HibernateManager.getSession();