/*
* JBoss, Home of Professional Open Source
* Copyright 2010, Red Hat Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.as.ejb3.deployment.processors.annotation;
import javax.ejb.Schedule;
import javax.ejb.Schedules;
import org.jboss.as.ee.metadata.ClassAnnotationInformationFactory;
import org.jboss.as.ejb3.logging.EjbLogger;
import org.jboss.as.ejb3.timerservice.AutoTimer;
import org.jboss.jandex.AnnotationInstance;
import org.jboss.jandex.AnnotationValue;
import org.jboss.metadata.property.PropertyReplacer;
/**
* {@link org.jboss.as.ee.metadata.ClassAnnotationInformation} for Schedule annotation
*
* @author Stuart Douglas
*/
public class ScheduleAnnotationInformationFactory extends ClassAnnotationInformationFactory<Schedule, AutoTimer> {
public ScheduleAnnotationInformationFactory() {
super(Schedule.class, Schedules.class);
}
@Override
protected AutoTimer fromAnnotation(final AnnotationInstance annotationInstance, final PropertyReplacer propertyReplacer) {
final AutoTimer timer = new AutoTimer();
for (ScheduleValues schedulePart : ScheduleValues.values()) {
schedulePart.set(timer, annotationInstance, propertyReplacer);
}
return timer;
}
enum ScheduleValues {
DAY_OF_MONTH("dayOfMonth", "*") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().dayOfMonth(value);
}
},
DAY_OF_WEEK("dayOfWeek", "*") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().dayOfWeek(value);
}
},
HOUR("hour", "0") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().hour(value);
}
},
INFO("info", null) {
protected void setString(final AutoTimer timer, final String value) {
timer.getTimerConfig().setInfo(value);
}
},
MINUTE("minute", "0") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().minute(value);
}
},
MONTH("month", "*") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().month(value);
}
},
PERSISTENT("persistent", true) {
protected void setBoolean(final AutoTimer timer, final boolean value) {
timer.getTimerConfig().setPersistent(value);
}
},
SECOND("second", "0") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().second(value);
}
},
TIMEZONE("timezone", "") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().timezone(value);
}
},
YEAR("year", "*") {
protected void setString(final AutoTimer timer, final String value) {
timer.getScheduleExpression().year(value);
}
},;
private final String name;
private final String defaultStringValue;
private final boolean defaultBooleanValue;
private final boolean booleanValue;
ScheduleValues(final String name, final String defaultStringValue) {
this.name = name;
this.defaultStringValue = defaultStringValue;
this.defaultBooleanValue = false;
this.booleanValue = false;
}
ScheduleValues(final String name, final boolean defaultBooleanValue) {
this.name = name;
this.defaultStringValue = null;
this.defaultBooleanValue = defaultBooleanValue;
this.booleanValue = true;
}
public void set(final AutoTimer timer, final AnnotationInstance annotationInstance, final PropertyReplacer propertyReplacer) {
final AnnotationValue value = annotationInstance.value(name);
if (booleanValue) {
if (value == null) {
setBoolean(timer, defaultBooleanValue);
} else {
setBoolean(timer, value.asBoolean());
}
} else {
if (value == null) {
setString(timer, defaultStringValue);
} else {
setString(timer, propertyReplacer.replaceProperties(value.asString()));
}
}
}
protected void setString(final AutoTimer expression, final String value) {
throw EjbLogger.ROOT_LOGGER.shouldBeOverridden();
}
protected void setBoolean(final AutoTimer expression, final boolean value) {
throw EjbLogger.ROOT_LOGGER.shouldBeOverridden();
}
}
}