All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.manydesigns.portofino.actions.admin.appwizard.CalendarPage.groovy Maven / Gradle / Ivy

The newest version!
import com.manydesigns.elements.reflection.ClassAccessor
import com.manydesigns.elements.util.Util
import com.manydesigns.portofino.di.Inject
import com.manydesigns.portofino.model.database.DatabaseLogic
import com.manydesigns.portofino.model.database.Table
import com.manydesigns.portofino.modules.DatabaseModule
import com.manydesigns.portofino.pageactions.calendar.Calendar
import com.manydesigns.portofino.pageactions.calendar.CalendarAction
import com.manydesigns.portofino.pageactions.calendar.Event
import com.manydesigns.portofino.persistence.Persistence
import com.manydesigns.portofino.reflection.TableAccessor
import com.manydesigns.portofino.security.AccessLevel
import com.manydesigns.portofino.security.RequiresPermissions
import com.manydesigns.portofino.util.ShortNameUtils
import org.hibernate.Criteria
import org.hibernate.Session
import org.hibernate.criterion.Order
import org.hibernate.criterion.Restrictions
import org.joda.time.DateMidnight
import org.joda.time.DateTime
import org.joda.time.DateTimeZone
import org.joda.time.Interval

@RequiresPermissions(level = AccessLevel.VIEW)
class CalendarPage extends CalendarAction {

    @Inject(DatabaseModule.PERSISTENCE)
    public Persistence persistence;

    def calDefs = $calendarDefinitions; //Es. [["Cal 1", "db1.schema1.table1", ["column1", "column2"], Color.RED], ["Cal 2", "db1.schema1.table2", ["column1", "column2"], Color.BLUE]]

    @Override
    void loadObjects(Interval interval) {
        for(cal in calDefs) {
            def qname = DatabaseLogic.splitQualifiedTableName((cal[1]))
            Table table = DatabaseLogic.findTableByName(persistence.model, qname[0], qname[1], qname[2])
            Session session = persistence.getSession(table.schema.databaseName)
            def objects = []
            for(col in cal[2]) {
                Criteria criteria = session.createCriteria(table.actualEntityName)
                criteria.add(Restrictions.ge(col, interval.start.toDate()))
                criteria.add(Restrictions.lt(col, interval.end.toDate()))
                objects.add([col, criteria.list()])
            }
            addCalendar(cal, table, objects)
        }
    }

    protected def addCalendar(calDef, Table table, List data) {
        Calendar calendar = new Calendar(calDef[1], calDef[0], calDef[3])
        ClassAccessor classAccessor = new TableAccessor(table)
        for(tuple in data) {
            String property = tuple[0]
            def objects = tuple[1]
            for (object in objects) {
                addEvent(classAccessor, object, property, calendar);
            }
        }
        calendars.add(calendar)
    }

    protected def addEvent(TableAccessor classAccessor, object, String property, Calendar calendar) {
        def name = ShortNameUtils.getName(classAccessor, object)
        def evtInterval
        if(object[property] instanceof java.sql.Date) {
            def eventStart = new DateMidnight(object[property], DateTimeZone.UTC)
            evtInterval = new Interval(eventStart, eventStart.plusDays(1));
        } else {
            def eventStart = new DateTime(object[property], DateTimeZone.UTC)
            evtInterval = new Interval(eventStart, eventStart);
        }
        def prettyProperty = Util.guessToWords(property);
        def event = new Event(
                calendar, object.id + "_" + property + "_" + events.size(),
                name + " - " + prettyProperty,
                evtInterval, null, null);
        events.add(event)
    }

    @Override
    void loadObjects(DateTime instant, int maxEvents) {
        //TODO andrebbero ordinati per giorni....
        def allObjects = []
        for(cal in calDefs) {
            Calendar calendar = new Calendar(cal[1], cal[0], cal[3])
            calendars.add(calendar)
            def qname = DatabaseLogic.splitQualifiedTableName(cal[1]);
            Table table = DatabaseLogic.findTableByName(persistence.model, qname[0], qname[1], qname[2])
            Session session = persistence.getSession(table.schema.databaseName)
            for(col in cal[2]) {
                Criteria criteria = session.createCriteria(table.actualEntityName)
                criteria.add(Restrictions.ge(col, instant.toDate()))
                criteria.setMaxResults(maxEvents)
                criteria.addOrder(Order.asc(col))
                def objects = criteria.list()
                if(!objects.isEmpty()) {
                    allObjects.add([col, calendar, table, objects])
                }
            }
        }
        for(int i = 0; i < maxEvents && !allObjects.isEmpty(); i++) {
            int index = (int) (i % allObjects.size())
            def ccto = allObjects[index]
            def col = ccto[0]
            def calendar = ccto[1]
            def table = ccto[2]
            def objects = ccto[3]
            if(objects.isEmpty()) {
                allObjects.remove(index)
                i--;
            } else {
                ClassAccessor classAccessor = new TableAccessor(table)
                addEvent(classAccessor, objects.remove(0), col, calendar)
            }
        }
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy