package no.java.incogito.application; import fj.F; import fj.F2; import static fj.Function.compose; import static fj.Function.curry; import static fj.Function.flip; import fj.P2; import fj.data.Either; import static fj.data.Either.left; import static fj.data.Either.right; import fj.data.List; import static fj.data.List.iterableList; import fj.data.Option; import static fj.data.Option.fromNull; import static fj.data.Option.fromString; import static fj.data.Option.somes; import fj.pre.Show; import no.java.incogito.Enums; import no.java.incogito.Functions; import no.java.incogito.application.IncogitoConfiguration.DayConfiguration; import no.java.incogito.application.IncogitoConfiguration.EventConfiguration; import no.java.incogito.domain.Comment; import no.java.incogito.domain.Event; import no.java.incogito.domain.Event.EventId; import no.java.incogito.domain.Label; import no.java.incogito.domain.Level; import no.java.incogito.domain.Level.LevelId; import no.java.incogito.domain.Room; import no.java.incogito.domain.Session; import no.java.incogito.domain.SessionId; import no.java.incogito.domain.Speaker; import no.java.incogito.domain.WikiString; import org.joda.time.Interval; import org.joda.time.LocalDate; /** * Functions from EMS domain objects to Incogito domain objects. * * @author <a href="mailto:trygve.laugstol@arktekk.no">Trygve Laugstøl</a> * @version $Id$ */ public class EmsFunctions { public static F<no.java.ems.domain.Event, EventId> eventIdFromEms = new F<no.java.ems.domain.Event, EventId>() { public EventId f(no.java.ems.domain.Event event) { return EventId.eventId(event.getId()); } }; public static F<IncogitoConfiguration, F<no.java.ems.domain.Event, Either<String, Event>>> eventFromEms = curry(new F2<IncogitoConfiguration, no.java.ems.domain.Event, Either<String, Event>>() { public Either<String, Event> f(IncogitoConfiguration configuration, final no.java.ems.domain.Event event) { final EventId eventId = eventIdFromEms.f(event); return configuration.eventConfigurations. find(compose(Functions.equals.f(event.getName()), EventConfiguration.name_)). toEither("Could not find configured event '" + eventId + "'.").right(). map(new F<EventConfiguration, Event>() { public Event f(EventConfiguration eventConfiguration) { F<P2<LocalDate, DayConfiguration>, List<Room>> roomMap = new F<P2<LocalDate, DayConfiguration>, List<Room>>() { public List<Room> f(P2<LocalDate, DayConfiguration> p2) { return p2._2().rooms; } }; F<P2<LocalDate, DayConfiguration>, List<Interval>> timeslotMap = new F<P2<LocalDate, DayConfiguration>, List<Interval>>() { public List<Interval> f(P2<LocalDate, DayConfiguration> p2) { return p2._2().timeslots; } }; return new Event(eventId, event.getName(), eventConfiguration.blurb, eventConfiguration.presentationRooms, eventConfiguration.dayConfigurations.map(P2.<LocalDate, DayConfiguration>__1()), eventConfiguration.dayConfigurations.map(roomMap), eventConfiguration.dayConfigurations.map(timeslotMap), eventConfiguration.levels, eventConfiguration.labels, eventConfiguration.labelMap); } }); } }); public static F<no.java.ems.domain.Speaker, Speaker> speakerFromEms = new F<no.java.ems.domain.Speaker, Speaker>() { public Speaker f(no.java.ems.domain.Speaker speaker) { return new Speaker(speaker.getName(), speaker.getPersonId(), fromString(speaker.getDescription()).map(WikiString.constructor)); } }; public static F<Event, F<no.java.ems.domain.Session, Either<String, Session>>> sessionFromEms = curry(new F2<Event, no.java.ems.domain.Session, Either<String, Session>>() { public Either<String, Session> f(Event event, no.java.ems.domain.Session session) { if (session.getTitle() == null) { return left("Not a valid session, title is missing."); } // Hack for now until ';' is encoded in url properly if (session.getTitle().indexOf(';') > 0) { return left("Not a valid session, title has invalid character ';'."); } Option<LevelId> levelId = fromNull(session.getLevel()). bind(Functions.compose(LevelId.valueOf, Enums.<no.java.ems.domain.Session.Level>name_())); F<LevelId, Option<Level>> getLevel = flip(Functions.<LevelId, Level>TreeMap_get()).f(event.levels); F<String, Option<Label>> getLabel = flip(Functions.<String, Label>TreeMap_get()).f(event.emsIndexedLabels); F<Interval, Interval> setEndTo60MinutesAfterStart = new F<Interval, Interval>() { public Interval f(Interval interval) { return interval.withEnd(interval.getStart().plusHours(1)); } }; F<Interval, Interval> setEndTo15MinutesAfterStart = new F<Interval, Interval>() { public Interval f(Interval interval) { return interval.withEnd(interval.getStart().plusMinutes(15)); } }; Session.Format format = fromNull(session.getFormat()).bind(compose(Session.Format.valueOf_, Show.<no.java.ems.domain.Session.Format>anyShow().showS_())).orSome(Session.Format.Presentation); return right(new Session(new SessionId(session.getId()), format, session.getTitle(), fromString(session.getBody()).map(WikiString.constructor), levelId.bind(getLevel), fromNull(session.getTimeslot()).map(format == Session.Format.Presentation ? setEndTo60MinutesAfterStart : setEndTo15MinutesAfterStart), fromNull(session.getRoom()).map(no.java.incogito.ems.client.EmsFunctions.roomName), somes(iterableList(session.getKeywords()).map(getLabel)), iterableList(session.getSpeakers()).map(speakerFromEms), List.<Comment>nil())); } }); }