// Path: app/src/main/java/de/codecentric/dao/TimeslotDao.java
// public interface TimeslotDao {
// 
//     List<Timeslot> getTimeslots(String day);
// 
//     List<Day> getConferenceDays();
// }
// 
// Path: app/src/main/java/de/codecentric/dao/impl/JsonTimeslotDao.java
// @Repository
// public class JsonTimeslotDao implements TimeslotDao {
// 
//     private static final Logger LOGGER = Logger.getLogger(JsonTimeslotDao.class);
// 
//     @Autowired
//     private ObjectMapper jsonMapper;
// 
//     private static List<Day> days;
// 
//     @Value("default.file.path.days.and.timeslots:json/daysAndTimeslots.json")
//     private String filePath;
// 
//     public JsonTimeslotDao() {
//     }
// 
//     public JsonTimeslotDao(ObjectMapper mapper, String filePath) {
//         this.filePath = filePath;
//         this.jsonMapper = mapper;
//     }
// 
//     public List<Timeslot> getTimeslots(String dayName) {
//         loadDaysSafely();
//         for (Day day : days) {
//             if (day.getShortName().equals(dayName))
//                 return day.getTimeslots();
//         }
//         return new ArrayList<Timeslot>();
//     }
// 
//     public List<Day> getConferenceDays() {
//         loadDaysSafely();
//         return days;
//     }
// 
//     private synchronized void loadDaysSafely() {
//         if (days == null)
//             loadDays();
//     }
// 
//     private void loadDays() {
// 
//         days = new ArrayList<Day>();
// 
//         try {
//             InputStream jsonStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
//             if (jsonStream != null) {
//                 days = jsonMapper.readValue(jsonStream, new TypeReference<List<Day>>() {
//                 });
//             }
//         } catch (JsonParseException e) {
//             LOGGER.error("JsonParseException", e);
//         } catch (IOException e) {
//             LOGGER.error("IOException", e);
//         }
//     }
// }
// 
// Path: app/src/main/java/de/codecentric/domain/Day.java
// public class Day {
// 
//     private String shortName;
//     private List<Timeslot> timeslots;
// 
//     @JsonCreator
//     public Day(@JsonProperty("shortName") String shortName, @JsonProperty("timeslots") List<Timeslot> timeslots) {
//         this.shortName = shortName;
//         this.timeslots = timeslots;
//     }
// 
//     public String getShortName() {
//         return shortName;
//     }
// 
//     public List<Timeslot> getTimeslots() {
//         return timeslots;
//     }
// 
//     public String getShortNameWithoutDots() {
//         return shortName.replace(".", "");
//     }
// 
//     @Override
//     public String toString() {
//         return "Day [shortName=" + shortName + ", timeslots=" + timeslots + "]";
//     }
// 
// }
// 
// Path: app/src/main/java/de/codecentric/domain/Timeslot.java
// public class Timeslot {
// 
//     private String start;
//     private String end;
// 
//     @JsonCreator
//     public Timeslot(@JsonProperty("start") String start, @JsonProperty("end") String end) {
//         this(start);
//         this.end = end;
//     }
// 
//     public Timeslot(String start) {
//         this.start = start;
//     }
// 
//     public String getStart() {
//         return start;
//     }
// 
//     public String getEnd() {
//         return end;
//     }
// 
//     @Override
//     public String toString() {
//         String endToConcatenate = end != null ? " - " + end : "";
//         return start + endToConcatenate;
//     }
// }


import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Test;
import de.codecentric.dao.TimeslotDao;
import de.codecentric.dao.impl.JsonTimeslotDao;
import de.codecentric.domain.Day;
import de.codecentric.domain.Timeslot;

package de.codecentric.domain;





public class TimeSlotDaoTest {

    @Test
    public void wrongTimeslotNameShouldReturnEmptyList() {
        final TimeslotDao dao = getDaoInstance();

        final List<Timeslot> timeslots = dao.getTimeslots("Err");

        assertNotNull(timeslots);
        assertEquals(0, timeslots.size());

    }

    @Test
    public void shouldReturnWednesdayTimeSlot() {
        final TimeslotDao dao = getDaoInstance();

        final List<Timeslot> timeslots = dao.getTimeslots("20.08.2014");

        assertEquals(3, timeslots.size());
        assertEquals("16:15", timeslots.get(1).getStart());
    }


// Path: app/src/main/java/de/codecentric/dao/TimeslotDao.java
// public interface TimeslotDao {
// 
//     List<Timeslot> getTimeslots(String day);
// 
//     List<Day> getConferenceDays();
// }
// 
// Path: app/src/main/java/de/codecentric/dao/impl/JsonTimeslotDao.java
// @Repository
// public class JsonTimeslotDao implements TimeslotDao {
// 
//     private static final Logger LOGGER = Logger.getLogger(JsonTimeslotDao.class);
// 
//     @Autowired
//     private ObjectMapper jsonMapper;
// 
//     private static List<Day> days;
// 
//     @Value("default.file.path.days.and.timeslots:json/daysAndTimeslots.json")
//     private String filePath;
// 
//     public JsonTimeslotDao() {
//     }
// 
//     public JsonTimeslotDao(ObjectMapper mapper, String filePath) {
//         this.filePath = filePath;
//         this.jsonMapper = mapper;
//     }
// 
//     public List<Timeslot> getTimeslots(String dayName) {
//         loadDaysSafely();
//         for (Day day : days) {
//             if (day.getShortName().equals(dayName))
//                 return day.getTimeslots();
//         }
//         return new ArrayList<Timeslot>();
//     }
// 
//     public List<Day> getConferenceDays() {
//         loadDaysSafely();
//         return days;
//     }
// 
//     private synchronized void loadDaysSafely() {
//         if (days == null)
//             loadDays();
//     }
// 
//     private void loadDays() {
// 
//         days = new ArrayList<Day>();
// 
//         try {
//             InputStream jsonStream = this.getClass().getClassLoader().getResourceAsStream(filePath);
//             if (jsonStream != null) {
//                 days = jsonMapper.readValue(jsonStream, new TypeReference<List<Day>>() {
//                 });
//             }
//         } catch (JsonParseException e) {
//             LOGGER.error("JsonParseException", e);
//         } catch (IOException e) {
//             LOGGER.error("IOException", e);
//         }
//     }
// }
// 
// Path: app/src/main/java/de/codecentric/domain/Day.java
// public class Day {
// 
//     private String shortName;
//     private List<Timeslot> timeslots;
// 
//     @JsonCreator
//     public Day(@JsonProperty("shortName") String shortName, @JsonProperty("timeslots") List<Timeslot> timeslots) {
//         this.shortName = shortName;
//         this.timeslots = timeslots;
//     }
// 
//     public String getShortName() {
//         return shortName;
//     }
// 
//     public List<Timeslot> getTimeslots() {
//         return timeslots;
//     }
// 
//     public String getShortNameWithoutDots() {
//         return shortName.replace(".", "");
//     }
// 
//     @Override
//     public String toString() {
//         return "Day [shortName=" + shortName + ", timeslots=" + timeslots + "]";
//     }
// 
// }
// 
// Path: app/src/main/java/de/codecentric/domain/Timeslot.java
// public class Timeslot {
// 
//     private String start;
//     private String end;
// 
//     @JsonCreator
//     public Timeslot(@JsonProperty("start") String start, @JsonProperty("end") String end) {
//         this(start);
//         this.end = end;
//     }
// 
//     public Timeslot(String start) {
//         this.start = start;
//     }
// 
//     public String getStart() {
//         return start;
//     }
// 
//     public String getEnd() {
//         return end;
//     }
// 
//     @Override
//     public String toString() {
//         String endToConcatenate = end != null ? " - " + end : "";
//         return start + endToConcatenate;
//     }
// }


// Path: app/src/test/java/de/codecentric/domain/TimeSlotDaoTest.java
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import org.codehaus.jackson.map.ObjectMapper;
import org.junit.Test;
import de.codecentric.dao.TimeslotDao;
import de.codecentric.dao.impl.JsonTimeslotDao;
import de.codecentric.domain.Day;
import de.codecentric.domain.Timeslot;

package de.codecentric.domain;





public class TimeSlotDaoTest {

    @Test
    public void wrongTimeslotNameShouldReturnEmptyList() {
        final TimeslotDao dao = getDaoInstance();

        final List<Timeslot> timeslots = dao.getTimeslots("Err");

        assertNotNull(timeslots);
        assertEquals(0, timeslots.size());

    }

    @Test
    public void shouldReturnWednesdayTimeSlot() {
        final TimeslotDao dao = getDaoInstance();

        final List<Timeslot> timeslots = dao.getTimeslots("20.08.2014");

        assertEquals(3, timeslots.size());
        assertEquals("16:15", timeslots.get(1).getStart());
    }


    private JsonTimeslotDao getDaoInstance() {
