Java tutorial
/* * Copyright 2016 Jrg Rade * * Licensed under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package org.isisaddons.wicket.timeline.cpt.ui; import java.util.Collection; import java.util.List; import java.util.Map; import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.collect.Collections2; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import org.joda.time.DateTime; import org.joda.time.Interval; import org.apache.isis.core.metamodel.adapter.ObjectAdapter; import org.apache.isis.core.metamodel.runtimecontext.ServicesInjector; import org.apache.isis.core.runtime.system.context.IsisContext; import org.apache.isis.core.runtime.system.persistence.PersistenceSession; import org.apache.isis.core.runtime.system.session.IsisSessionFactory; import org.apache.isis.viewer.wicket.model.models.EntityCollectionModel; import org.isisaddons.wicket.timeline.cpt.applib.TimelineEvent; import org.isisaddons.wicket.timeline.cpt.applib.TimelineableDereferencingService; import net.ftlines.wicket.fullcalendar.Event; import net.ftlines.wicket.fullcalendar.EventNotFoundException; import net.ftlines.wicket.fullcalendar.EventProvider; public abstract class EventProviderAbstract implements EventProvider { private static final long serialVersionUID = 1L; private final Map<String, Event> eventById = Maps.newLinkedHashMap(); // ////////////////////////////////////// public EventProviderAbstract(final EntityCollectionModel collectionModel, final String TimelineName) { createEvents(collectionModel, TimelineName); } private void createEvents(final EntityCollectionModel model, final String TimelineName) { final Collection<ObjectAdapter> entityList = model.getObject(); final Iterable<Event> events = Iterables.filter(Iterables.transform(entityList, newEvent(TimelineName)), NOT_NULL); for (final Event event : events) { eventById.put(event.getId(), event); } } private Object dereference(final Object domainObject) { final List<TimelineableDereferencingService> TimelineableDereferencingServices = getServicesInjector() .lookupServices(TimelineableDereferencingService.class); for (final TimelineableDereferencingService dereferencingService : TimelineableDereferencingServices) { final Object dereferencedObject = dereferencingService.dereference(domainObject); if (dereferencedObject != domainObject) { return dereferencedObject; } } return domainObject; } protected abstract TimelineEvent TimelineEventFor(final Object domainObject, final String TimelineName); private Function<ObjectAdapter, Event> newEvent(final String TimelineName) { return new Function<ObjectAdapter, Event>() { public Event apply(final ObjectAdapter input) { final Object domainObject = input.getObject(); final TimelineEvent TimelineEvent = TimelineEventFor(domainObject, TimelineName); if (TimelineEvent == null) { return null; } final Event event = new Event(); final DateTime start = TimelineEvent.getDateTime(); final DateTime end = start; event.setStart(start); event.setEnd(end); event.setAllDay(true); final Object dereferencedObject = dereference(domainObject); final ObjectAdapter dereferencedAdapter = getPersistenceSession().adapterFor(dereferencedObject); final String oidStr = dereferencedAdapter.getOid().enString(IsisContext.getOidMarshaller()); event.setId(oidStr + "-" + TimelineName); event.setClassName("Timeline-event-" + TimelineName); event.setEditable(false); event.setPayload(oidStr); event.setTitle(TimelineEvent.getTitle()); //event.setBackgroundColor(backgroundColor) //event.setBorderColor(borderColor) //event.setColor(color) //event.setTextColor(textColor) //event.setUrl(url) return event; } }; } final static Predicate<Event> NOT_NULL = new Predicate<Event>() { public boolean apply(Event input) { return input != null; } }; // ////////////////////////////////////// public Collection<Event> getEvents(final DateTime start, final DateTime end) { final Interval interval = new Interval(start, end); final Predicate<Event> withinInterval = new Predicate<Event>() { public boolean apply(Event input) { return interval.contains(input.getStart()); } }; final Collection<Event> values = eventById.values(); return Collections2.filter(values, withinInterval); } public Event getEventForId(String id) throws EventNotFoundException { return eventById.get(id); } PersistenceSession getPersistenceSession() { return IsisContext.getPersistenceSession(); } ServicesInjector getServicesInjector() { return getSessionFactory().getServicesInjector(); } IsisSessionFactory getSessionFactory() { return IsisContext.getSessionFactory(); } }