package no.java.incogito.web.resources; import fj.F; import fj.F2; import fj.F3; import fj.P2; import static fj.Function.curry; import fj.data.List; import no.java.incogito.Enums; import static no.java.incogito.Functions.compose; import no.java.incogito.domain.Event; import no.java.incogito.domain.IncogitoUri; import no.java.incogito.domain.IncogitoUri.IncogitoEventsUri.IncogitoEventUri; import no.java.incogito.domain.IncogitoUri.IncogitoRestEventsUri.IncogitoRestEventUri; import no.java.incogito.domain.IncogitoUri.IncogitoRestEventsUri.IncogitoRestEventUri.IncogitoLabelsIconUri; import no.java.incogito.domain.IncogitoUri.IncogitoRestEventsUri.IncogitoRestEventUri.IncogitoLevelsIconUri; import no.java.incogito.domain.IncogitoUri.IncogitoRestEventsUri.IncogitoRestEventUri.IncogitoRestSessionUri; import no.java.incogito.domain.Label; import no.java.incogito.domain.Level; import no.java.incogito.domain.Schedule; import no.java.incogito.domain.Session; import no.java.incogito.domain.SessionRating; import no.java.incogito.domain.Speaker; import no.java.incogito.domain.UserSessionAssociation; import no.java.incogito.domain.WikiString; import no.java.incogito.dto.EventXml; import no.java.incogito.dto.InterestLevelXml; import no.java.incogito.dto.LabelXml; import no.java.incogito.dto.LevelXml; import no.java.incogito.dto.ScheduleXml; import no.java.incogito.dto.SessionRatingXml; import no.java.incogito.dto.SessionXml; import no.java.incogito.dto.SpeakerXml; import no.java.incogito.dto.UserSessionAssociationXml; import org.joda.time.DateTime; import org.joda.time.Interval; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; /** * @author <a href="mailto:trygvis@java.no">Trygve Laugstøl</a> * @version $Id$ */ public class XmlFunctions { private static final DatatypeFactory datatypeFactory; static { try { datatypeFactory = DatatypeFactory.newInstance(); } catch (DatatypeConfigurationException e) { throw new RuntimeException(e); } } public static F<Interval, DateTime> Interval_start = new F<Interval, DateTime>() { public DateTime f(Interval interval) { return interval.getStart(); } }; public static F<Interval, DateTime> Interval_end = new F<Interval, DateTime>() { public DateTime f(Interval interval) { return interval.getEnd(); } }; private static F<DateTime, XMLGregorianCalendar> toXmlGregorianCalendar = new F<DateTime, XMLGregorianCalendar>() { public XMLGregorianCalendar f(DateTime dateTime) { XMLGregorianCalendar gregorianCalendar = datatypeFactory.newXMLGregorianCalendar(); gregorianCalendar.setTime(dateTime.getHourOfDay(), dateTime.getMinuteOfHour(), dateTime.getSecondOfMinute()); gregorianCalendar.setYear(dateTime.getYear()); gregorianCalendar.setMonth(dateTime.getMonthOfYear()); gregorianCalendar.setDay(dateTime.getDayOfMonth()); return gregorianCalendar; } }; private static F<IncogitoRestSessionUri, F<P2<Speaker, Integer>, SpeakerXml>> speakerToXml = curry(new F2<IncogitoRestSessionUri, P2<Speaker, Integer>, SpeakerXml>() { public SpeakerXml f(IncogitoRestSessionUri incogitoRestSessionUri, P2<Speaker, Integer> item) { Speaker speaker = item._1(); return new SpeakerXml(speaker.name, speaker.bio.map(WikiString.toHtml), incogitoRestSessionUri.speakerPhoto(item._2())); } }); private static F<IncogitoLabelsIconUri, F<Label, LabelXml>> labelToXml = curry(new F2<IncogitoLabelsIconUri, Label, LabelXml>() { public LabelXml f(IncogitoLabelsIconUri incogitoLabelsIconUri, Label label) { return new LabelXml(label.id, label.displayName, incogitoLabelsIconUri.png(label)); } }); private static F<IncogitoLevelsIconUri, F<Level, LevelXml>> levelToXml = curry(new F2<IncogitoLevelsIconUri, Level, LevelXml>() { public LevelXml f(IncogitoLevelsIconUri levelsIconUri, Level level) { return new LevelXml(level.id.name(), level.displayName, levelsIconUri.png(level)); } }); public static final F<IncogitoRestEventUri, F<IncogitoEventUri, F<Session, SessionXml>>> sessionToXml = curry(new F3<IncogitoRestEventUri, IncogitoEventUri, Session, SessionXml>() { public SessionXml f(IncogitoRestEventUri restEventUri, IncogitoEventUri eventUri, Session session) { IncogitoRestSessionUri restSessionUri = restEventUri.session(session); return new SessionXml(restSessionUri.toString(), eventUri.session(session), SessionXml.FormatXml.valueOf(session.format.name()), session.id.value, session.title, session.body.map(WikiString.toHtml), session.level.map(levelToXml.f(restEventUri.levelsIcon())), session.room, session.timeslot.map(compose(toXmlGregorianCalendar, Interval_start)), session.timeslot.map(compose(toXmlGregorianCalendar, Interval_end)), session.speakers.zipIndex().map(speakerToXml.f(restSessionUri)), session.labels.map(labelToXml.f(restEventUri.labelsIcon()))); } }); public static final F<UserSessionAssociation, UserSessionAssociationXml> sessionAssociationToXml = new F<UserSessionAssociation, UserSessionAssociationXml>() { public UserSessionAssociationXml f(UserSessionAssociation userSessionAssociation) { return new UserSessionAssociationXml(userSessionAssociation.sessionId.value, userSessionAssociation.rating.map(Enums.<SessionRating>toString_()).bind(SessionRatingXml.valueOf_).orSome(SessionRatingXml.NOT_SET), userSessionAssociation.ratingComment, InterestLevelXml.valueOf(userSessionAssociation.interestLevel.name())); } }; public static final F<IncogitoRestEventUri, F<IncogitoEventUri, F<Schedule, ScheduleXml>>> scheduleToXml = curry(new F3<IncogitoRestEventUri, IncogitoEventUri, Schedule, ScheduleXml>() { public ScheduleXml f(IncogitoRestEventUri restEventUri, IncogitoEventUri eventUri, Schedule schedule) { return new ScheduleXml(schedule.sessions.map(sessionToXml.f(restEventUri).f(eventUri)), schedule.sessionAssociations.values().map(sessionAssociationToXml)); } }); public static final F<IncogitoUri, F<Event, EventXml>> eventToXml = curry(new F2<IncogitoUri, Event, EventXml>() { public EventXml f(IncogitoUri incogitoUri, final Event event) { IncogitoRestEventUri restEventUri = incogitoUri.restEvents().eventUri(event.name); IncogitoEventUri eventUri = incogitoUri.events().eventUri(event.name); return new EventXml(restEventUri.toString(), event.id.toString(), event.name, event.blurb, eventUri.toString(), eventUri.sessionListHtml(), eventUri.calendarHtml(), event.labels.map(labelToXml.f(restEventUri.labelsIcon())), event.levels.values().map(levelToXml.f(restEventUri.levelsIcon()))); } }); public static final F<IncogitoUri, F<List<Event>, List<EventXml>>> eventListToXml = new F<IncogitoUri, F<List<Event>, List<EventXml>>>() { public F<List<Event>, List<EventXml>> f(IncogitoUri incogitoUri) { return List.<Event, EventXml>map_().f(XmlFunctions.eventToXml.f(incogitoUri)); } }; }