diff options
-rw-r--r-- | orktrack/src/net/sf/oreka/orktrack/ProgramManager.java | 82 | ||||
-rw-r--r-- | orktrack/src/net/sf/oreka/orktrack/test/ProgramTest.java | 57 |
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(); |