/*
* RapidMiner
*
* Copyright (C) 2001-2014 by RapidMiner and the contributors
*
* Complete list of developers available at our web site:
*
* http://rapidminer.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see http://www.gnu.org/licenses/.
*/
package com.rapidminer.parameter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.w3c.dom.Element;
import com.michaelbaranov.microba.calendar.DatePicker;
import com.rapidminer.operator.Operator;
import com.rapidminer.operator.UserError;
import com.rapidminer.tools.XMLException;
/**
* A parameter type for Dates. It is represented by a {@link DatePicker} element in the GUI.
* The date is internally stored as string. To get a {@link Date} object use {@link ParameterTypeDate#getParameterAsDate(String, Operator)}.
*
* @author Nils Woehler
*
*/
public class ParameterTypeDate extends ParameterTypeSingle {
private static final long serialVersionUID = 1L;
private Date defaultValue = null;
public static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss Z");
/**
* @param element
* @throws XMLException
*/
public ParameterTypeDate(Element element) throws XMLException {
super(element);
}
public ParameterTypeDate(String key, String description) {
super(key, description);
}
public ParameterTypeDate(String key, String description, Date defaultValue) {
super(key, description);
setDefaultValue(defaultValue);
}
public ParameterTypeDate(String key, String description, boolean optional, boolean expert) {
super(key, description);
setOptional(optional);
setExpert(expert);
setDefaultValue(null);
}
public ParameterTypeDate(String key, String description, Date defaultValue, boolean optional, boolean expert) {
super(key, description);
setOptional(optional);
setExpert(expert);
setDefaultValue(defaultValue);
}
@Override
public String getRange() {
return null; // no range here as showRange() returns null
}
@Override
public Object getDefaultValue() {
return defaultValue;
}
@Override
public void setDefaultValue(Object defaultValue) {
this.defaultValue = (Date) defaultValue;
}
@Override
public boolean isNumerical() {
return false;
}
@Override
public boolean showRange() {
return false;
}
@Override
public String toString(Object value) {
if (value == null) {
return "";
}
String ret = null;
if (value instanceof Date) {
ret = DATE_FORMAT.format(value);
} else {
ret = String.valueOf(value);
}
return ret;
}
@Override
public String toXMLString(Object value) {
if (value == null) {
return "";
}
String ret = null;
if (value instanceof Date) {
ret = DATE_FORMAT.format(value);
} else {
ret = String.valueOf(value);
}
return ret;
}
public static Date getParameterAsDate(String key, Operator operator) throws UndefinedParameterError, UserError {
String value = operator.getParameter(key);
if (value == null || value.trim().isEmpty()) {
throw new UndefinedParameterError(key, operator);
}
try {
return ParameterTypeDate.DATE_FORMAT.parse(value);
} catch (ParseException e) {
throw new UserError(operator, "wrong_date_format", value, key.replace('_', ' '));
}
}
/**
* Can be used to check whether the current string is a valid date string for this parameter type.
*/
public static boolean isValidDate(String dateString) {
try {
return dateString != null && DATE_FORMAT.parse(dateString) != null;
} catch (ParseException e) {
return false;
}
}
}