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

jfxtras.icalendarfx.properties.PropBaseDateTime Maven / Gradle / Ivy

There is a newer version: 17-r1
Show newest version
package jfxtras.icalendarfx.properties;

import java.time.DateTimeException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.Temporal;
import java.util.Collection;
import java.util.List;

import jfxtras.icalendarfx.parameters.TimeZoneIdentifierParameter;
import jfxtras.icalendarfx.parameters.VParameterElement;
import jfxtras.icalendarfx.parameters.ValueParameter;
import jfxtras.icalendarfx.properties.PropBaseDateTime;
import jfxtras.icalendarfx.properties.PropDateTime;
import jfxtras.icalendarfx.properties.VPropertyBase;
import jfxtras.icalendarfx.properties.ValueType;
import jfxtras.icalendarfx.properties.component.relationship.RecurrenceId;
import jfxtras.icalendarfx.properties.component.time.DateTimeEnd;
import jfxtras.icalendarfx.properties.component.time.DateTimeStart;

/**
 * Abstract class for all non-UTC date-time classes
 * Contains the time zone identifier parameter
 * 
 * @author David Bal
 *
 * @param  - implementation class
 * @see DateTimeStart
 * @see DateTimeEnd
 * @see RecurrenceId
 */
public abstract class PropBaseDateTime extends VPropertyBase implements PropDateTime
{
    // reference to property value if T is not instance of Collection, or an element if T is a Collection
    private Object myElement;
    
    /**
     * TZID
     * Time Zone Identifier
     * To specify the identifier for the time zone definition for
     * a time component in the property value.
     * 
     * Examples:
     * DTSTART;TZID=America/New_York:19980119T020000
     */
    @Override
    public TimeZoneIdentifierParameter getTimeZoneIdentifier() { return timeZoneIdentifier; }
    private TimeZoneIdentifierParameter timeZoneIdentifier;
    @Override
    public void setTimeZoneIdentifier(TimeZoneIdentifierParameter timeZoneIdentifier)
    {
        if ((myElement == null) || (myElement instanceof ZonedDateTime))
        {
        	orderChild(this.timeZoneIdentifier, timeZoneIdentifier);
            this.timeZoneIdentifier = timeZoneIdentifier;
        } else
        {
            throw new DateTimeException(VParameterElement.TIME_ZONE_IDENTIFIER.name() + " can't be set for date-time of type " + getValue().getClass().getSimpleName());
        }
    }
    public void setTimeZoneIdentifier(String value)
    {
    	setTimeZoneIdentifier(TimeZoneIdentifierParameter.parse(value));
	}
    public void setTimeZoneIdentifier(ZoneId zone)
    {
    	setTimeZoneIdentifier(new TimeZoneIdentifierParameter(zone));
	}
    public U withTimeZoneIdentifier(TimeZoneIdentifierParameter timeZoneIdentifier)
    {
    	setTimeZoneIdentifier(timeZoneIdentifier);
    	return (U) this;
	}
    public U withTimeZoneIdentifier(ZoneId zone)
    {
    	setTimeZoneIdentifier(zone);
    	return (U) this;
	}
    public U withTimeZoneIdentifier(String content)
    {
    	setTimeZoneIdentifier(content);
    	return (U) this;
	}        
    
    /*
     * CONSTRUCTORS
     */
    protected PropBaseDateTime()
    {
        super();
    }
    
    public PropBaseDateTime(T temporal)
    {
        super(temporal);
    }
    
    public PropBaseDateTime(PropBaseDateTime source)
    {
        super(source);
    }
    
    /**
     * append time zone to front of time for parsing in DATE_ZONED_DATE_TIME parse method
     * @see ValueType
     */
    @Override
	protected String modifiedValue()
    {
        String timeZone = (getTimeZoneIdentifier() != null) ? "[" + getTimeZoneIdentifier().getValue().toString() + "]" : "";
    	String modifiedValue = super.modifiedValue();
		return (modifiedValue != null) ? timeZone + modifiedValue : null;
	}

    @Override
    public void setValue(T value)
    {
        super.setValue(value);
        if (value instanceof Collection)
        {
            Collection collection = (Collection) value;
            myElement = (collection.isEmpty()) ? null : collection.iterator().next();
        } else if (value instanceof Temporal)
        {
            myElement = value;
        } else
        {
            throw new DateTimeException("Unsupported type:" + value.getClass().getSimpleName());            
        }

        if (myElement != null)
        {
            if (myElement instanceof ZonedDateTime)
            {
                ZoneId zone = ((ZonedDateTime) myElement).getZone();
                if (! zone.equals(ZoneId.of("Z")))
                {
                    if (getValueType() != null && getValueType().getValue() == ValueType.DATE)
                	{
                    	setValueType((ValueParameter) null); // reset value type if previously set to DATE
                	}
                    if (getTimeZoneIdentifier() == null)
                    {
                    	setTimeZoneIdentifier(new TimeZoneIdentifierParameter(zone));
                    }
                }
            } else if ((myElement instanceof LocalDateTime) || (myElement instanceof LocalDate))
            {
                if (getTimeZoneIdentifier() != null)
                {
                    throw new DateTimeException("Only ZonedDateTime is permitted when specifying a Time Zone Identifier (" + myElement.getClass().getSimpleName() + ")");                            
                }
                if (getValueType() == null)
                {
	                if (myElement instanceof LocalDate)
	                {
	                    setValueType(ValueType.DATE); // must set value parameter to force output of VALUE=DATE
	                } else
	                {
	                    if (getValueType() != null && getValueType().getValue() == ValueType.DATE) setValueType((ValueParameter) null); // reset value type if previously set to DATE
	                }
                }
            } else
            {
                throw new DateTimeException("Unsupported Temporal type:" + value.getClass().getSimpleName());            
            }
        }
    }
    
    @Override
    public List errors()
    {
        List errors = super.errors();
        if (getValue() != null && getValueType() != null)
        {
            if (getValue() instanceof LocalDate)
            {
                if (getValueType().getValue() != ValueType.DATE)
                {
                    errors.add(name() + "'s value (" + getValue() + ") doesn't match its value type (" + getValueType().getValue()
                            + ").  For that value, the required value type is " + ValueType.DATE);
                }
            } else if (getValue() instanceof LocalDateTime || getValue() instanceof ZonedDateTime)
            {
                if (getValueType().getValue() != ValueType.DATE_TIME)
                {
                    errors.add(name() + "'s value (" + getValue() + ") doesn't match its value type (" + getValueType().getValue()
                            + ").  For that value, the required value type is " + ValueType.DATE_TIME);
                }                
            }
        }
        return errors;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy