Package org.jboss.seam.cron.spi.scheduling.trigger

Source Code of org.jboss.seam.cron.spi.scheduling.trigger.TriggerSupport

/**
* JBoss, Home of Professional Open Source
* Copyright 2011, Red Hat, Inc. and/or its affiliates, and individual
* contributors by the @authors tag. See the copyright.txt in the
* distribution for a full listing of individual contributors.
*
* 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.jboss.seam.cron.spi.scheduling.trigger;

import java.lang.annotation.Annotation;
import java.util.Date;
import java.util.GregorianCalendar;

import org.jboss.seam.cron.api.scheduling.Every;
import org.jboss.seam.cron.api.scheduling.Scheduled;
import org.jboss.seam.cron.api.scheduling.Trigger;
import org.jboss.seam.cron.spi.scheduling.CronSchedulingProvider;
import org.jboss.seam.cron.util.CdiUtils;
import org.jboss.solder.logging.Logger;

/**
* <p>
* Base class allowing scheduling providers to easily fire the
* appropriate CDI event when required. Simply provide the necessary
* objects (represented by #{@link TriggerSupplies} to the constructor when the
* schedule is first registered (see #{@link CronSchedulingProvider}). Then call
* #{@literal fireTrigger()} at the scheduled time(s).
* </p>
* <p>
* If the scheduling provider does not allow context to be passed directly to
* a new worker instance, but instead requires it to be passed via some
* other context, you will need to use #{@link ProviderContextTriggerSupport}
* instead.
* </p>
*
* @author Peter Royle
*
* @see ProviderContextTriggerSupport
*/
public abstract class TriggerSupport {

    protected int value = 0;
    protected final GregorianCalendar gc = new GregorianCalendar();
    protected TriggerSupplies supplies = null;
    private final Logger log = Logger.getLogger(TriggerSupport.class);

    protected TriggerSupport() {
    }

    public TriggerSupport(final TriggerSupplies supplies) {
        this.supplies = supplies;
    }

    /**
     * Fires the appropriate trigger payload with the appropriate qualifier
     * (to in turn execute the application-specific code that observes those events).
     *
     */
    public void fireTrigger() {

        gc.setTime(new Date());

        if (log.isTraceEnabled()) {
            log.trace("Firing scheduled trigger with these supplies: " + (supplies != null ? supplies.toString() : supplies));
        }
       
        Trigger eventPayload = null;
        final Scheduled schedQualifier = (Scheduled) CdiUtils.getQualifier(supplies.getQualifier(), Scheduled.class);
        if (schedQualifier != null) {
            eventPayload = createScheduledEventPayload();
        } else {
            final Every everyQualifier = (Every) CdiUtils.getQualifier(supplies.getQualifier(), Every.class);
            if (everyQualifier != null) {
                switch (everyQualifier.value()) {
                    case SECOND:
                        eventPayload = createSecondEventPayload();
                        break;
                    case MINUTE:
                        eventPayload = createMinuteEventPayload();
                        break;
                    case HOUR:
                        eventPayload = createHourEventPayload();
                        break;
                }
            }
        }
        log.trace("Firing time event for " + eventPayload + " with qualifier " + supplies.getQualifiers());
        supplies.getBeanManager().fireEvent(eventPayload, supplies.getQualifiers().toArray(new Annotation[] {}));
    }

    /**
     * Create an instance of the Event payload using the current system time.
     *
     * @return an instance of Event.
     */
    protected Trigger createScheduledEventPayload() {
        return new Trigger(System.currentTimeMillis());
    }

    protected Trigger createSecondEventPayload() {
        return new Trigger(System.currentTimeMillis(),
                gc.get(GregorianCalendar.SECOND));
    }

    protected Trigger createMinuteEventPayload() {
        return new Trigger(System.currentTimeMillis(),
                gc.get(GregorianCalendar.MINUTE));
    }

    protected Trigger createHourEventPayload() {
        return new Trigger(System.currentTimeMillis(),
                gc.get(GregorianCalendar.HOUR_OF_DAY));
    }
}
TOP

Related Classes of org.jboss.seam.cron.spi.scheduling.trigger.TriggerSupport

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.