/* * The MIT License * * Copyright 2011 Sony Ericsson Mobile Communications. All rights reserved. * Copyright 2012 Sony Mobile Communications AB. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * THE SOFTWARE. */ package com.sonyericsson.hudson.plugins.metadata.model.definitions; import com.sonyericsson.hudson.plugins.metadata.Messages; import com.sonyericsson.hudson.plugins.metadata.model.TimeDetails; import com.sonyericsson.hudson.plugins.metadata.model.values.AbstractMetadataValue; import com.sonyericsson.hudson.plugins.metadata.model.values.DateMetadataValue; import hudson.Extension; import hudson.model.Descriptor; import com.sonyericsson.hudson.plugins.metadata.model.MetadataChecks; import hudson.util.FormValidation; import net.sf.json.JSONObject; import org.kohsuke.stapler.DataBoundConstructor; import java.util.Calendar; import static com.sonyericsson.hudson.plugins.metadata.Constants.DEFAULT_MONTH_ADJUSTMENT; import static com.sonyericsson.hudson.plugins.metadata.Constants.DEFAULT_TIME_DETAILS; /** * Meta data with the value of a {@link java.util.Date}. * * @author Tomas Westling <thomas.westling@sonyericsson.com> */ public class DateMetadataDefinition extends AbstractMetadataDefinition { private Calendar defaultCal; private boolean checked = false; /** * Getter for the defaultYear. * * @return the default year. */ public int getYear() { return defaultCal.get(Calendar.YEAR); } /** * Getter for the defaultMonth. * * @return the default month of the year. */ public int getMonth() { return defaultCal.get(Calendar.MONTH) + DEFAULT_MONTH_ADJUSTMENT; } /** * Getter for the defaultDay. * * @return the default day of the month. */ public int getDay() { return defaultCal.get(Calendar.DAY_OF_MONTH); } /** * Getter for the default hour. * * @return the default hour of the day.. */ public int getHour() { return defaultCal.get(Calendar.HOUR_OF_DAY); } /** * Getter for the default minute. * * @return the default minute of the hour. */ public int getMinute() { return defaultCal.get(Calendar.MINUTE); } /** * Getter for the default second. * * @return the default second. */ public int getSecond() { return defaultCal.get(Calendar.SECOND); } /** * Returns the checked value, used to decide if the time details should be visible. * * @return the checked value. */ public boolean isChecked() { return checked; } /** * Standard Constructor. * * @param name the name * @param year the default year. * @param month the default month of the year. * @param day the default day of the month. * @param description the description. * @param details the optional time details, hour/minute/second. * @param exposedToEnvironment if values of this definition should be exposed to the build as an * environment variable. */ @DataBoundConstructor public DateMetadataDefinition(String name, String description, int year, int month, int day, TimeDetails details, boolean exposedToEnvironment) { super(name, description, exposedToEnvironment); defaultCal = Calendar.getInstance(); if (details != null) { defaultCal.set(year, month - DEFAULT_MONTH_ADJUSTMENT, day, details.getHour(), details.getMinute(), details.getSecond()); checked = details.isChecked(); } else { defaultCal.set(year, month - DEFAULT_MONTH_ADJUSTMENT, day, DEFAULT_TIME_DETAILS, DEFAULT_TIME_DETAILS, DEFAULT_TIME_DETAILS); } defaultCal.set(Calendar.MILLISECOND, 0); } @Override public synchronized Calendar getDefaultValue() { return (Calendar)defaultCal.clone(); } @Override public AbstractMetadataValue createValue(Object o) throws Descriptor.FormException { boolean detailsCheck = false; DateMetadataValue dateMetadataValue; Calendar cal = Calendar.getInstance(); MetadataChecks checks = new MetadataChecks(); if (o instanceof JSONObject) { String day = ""; String month = ""; String year = ""; JSONObject jsonObject = (JSONObject)o; if (jsonObject.has("day")) { day = jsonObject.getString("day"); } if (jsonObject.has("month")) { month = jsonObject.getString("month"); } if (jsonObject.has("year")) { year = jsonObject.getString("year"); } FormValidation dateValidation = checks.doCheckDateValue(year, month, day); if (!dateValidation.equals(FormValidation.ok())) { throw new Descriptor.FormException("Wrong date format " + dateValidation.getMessage(), ""); } cal.set(Calendar.DAY_OF_MONTH, Integer.parseInt(day)); cal.set(Calendar.MONTH, Integer.parseInt(month) - DEFAULT_MONTH_ADJUSTMENT); cal.set(Calendar.YEAR, Integer.parseInt(year)); if (jsonObject.has("details")) { String hour = ""; String minute = ""; String second = ""; detailsCheck = true; JSONObject details = jsonObject.getJSONObject("details"); if (details.has("hour")) { hour = details.getString("hour"); } if (details.has("minute")) { minute = details.getString("minute"); } if (details.has("second")) { second = details.getString("second"); } FormValidation timeValidation = checks.doCheckTimeValue(hour, minute, second); if (!timeValidation.equals(FormValidation.ok())) { throw new Descriptor.FormException("Wrong time format: " + timeValidation.getMessage(), ""); } cal.set(Calendar.HOUR_OF_DAY, Integer.parseInt(hour)); cal.set(Calendar.MINUTE, Integer.parseInt(minute)); cal.set(Calendar.SECOND, Integer.parseInt(second)); } else { cal.set(Calendar.HOUR_OF_DAY, 0); cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); } cal.set(Calendar.MILLISECOND, 0); dateMetadataValue = new DateMetadataValue(getName(), getDescription(), cal, detailsCheck, isExposedToEnvironment()); } else { //maybe we should throw an exception here instead of going with default. dateMetadataValue = new DateMetadataValue(getName(), getDescription(), getDefaultValue(), detailsCheck, isExposedToEnvironment()); } return dateMetadataValue; } /** * Descriptor for {@link DateMetadataDefinition}s. */ @Extension public static class DateMetaDataDefinitionDescriptor extends AbstractMetaDataDefinitionDescriptor { @Override public String getDisplayName() { return Messages.DateMetadataDefinition_DisplayName(); } } }