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

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

The newest version!
package jfxtras.icalendarfx.properties;

import java.net.URI;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.Period;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAccessor;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import jfxtras.icalendarfx.VElement;
import jfxtras.icalendarfx.properties.component.recurrence.rrule.RecurrenceRuleValue;
import jfxtras.icalendarfx.utilities.DateTimeUtilities;
import jfxtras.icalendarfx.utilities.DefaultStringConverter;
import jfxtras.icalendarfx.utilities.DoubleStringConverter;
import jfxtras.icalendarfx.utilities.IntegerStringConverter;
import jfxtras.icalendarfx.utilities.StringConverter;
import jfxtras.icalendarfx.utilities.StringConverters;

/**
 * Allowed value types for calendar properties' value
 * 
 * @author David Bal
 *
 */
public enum ValueType
{
    BINARY ("BINARY", Arrays.asList(String.class)) {
        @Override
        public  StringConverter getConverter()
        {
            return (StringConverter) new DefaultStringConverter();
        }
    },
    BOOLEAN ("BOOLEAN", Arrays.asList(Boolean.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    return object.toString().toUpperCase();
                }

                @Override
                public T fromString(String string)
                {
                     return (T) (Boolean) Boolean.parseBoolean(string);            
                }
            };
        }
    }, 
    CALENDAR_USER_ADDRESS ("CAL-ADDRESS", Arrays.asList(URI.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return (StringConverter) StringConverters.uriConverterNoQuotes();
        }
    },
    DATE ("DATE", Arrays.asList(LocalDate.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    return DateTimeUtilities.temporalToString((LocalDate) object);
                }

                @Override
                public T fromString(String string)
                {
                     return (T) LocalDate.parse(string, DateTimeUtilities.LOCAL_DATE_FORMATTER);
                }
            };
        }
    },
    DATE_TIME ("DATE-TIME", Arrays.asList(LocalDateTime.class, ZonedDateTime.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    return DateTimeUtilities.temporalToString((Temporal) object);
                }

                @Override
                public T fromString(String string)
                {
                    return (T) DateTimeUtilities.temporalFromString(string);
                }
            };
        }
    },
    DURATION ("DURATION", Arrays.asList(Duration.class, Period.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    String s = object.toString();
                    // move minus sign to front
                    if (s.contains("-"))
                    {
                        s = "-" + s.replaceFirst("-", "");
                    }
                    return s;
                }

                @Override
                public T fromString(String string)
                {
                    if (string.contains("T"))
                    {
                        return (T) Duration.parse(string);
                    } else
                    {
                        return (T) Period.parse(string);            
                    }
                }
            };
        }
    }, // Based on ISO.8601.2004 (but Y and M for years and months is not supported by iCalendar)
    FLOAT ("FLOAT", Arrays.asList(Double.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return (StringConverter) new DoubleStringConverter();
        }
    },
    INTEGER ("INTEGER", Arrays.asList(Integer.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return (StringConverter) new IntegerStringConverter();
        }
    },
    PERIOD ("PERIOD", Arrays.asList(List.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    return object.toString();
                }

                @Override
                public T fromString(String string)
                {
                    throw new RuntimeException("not implemented");
//                    return (T) string;
                }
            };
        }
    },
    RECURRENCE_RULE ("RECUR", Arrays.asList(RecurrenceRuleValue.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    return ((VElement) object).toString();
                }

                @Override
                public T fromString(String string)
                {
                    return (T) RecurrenceRuleValue.parse(string);
                }
            };
        }
        
        @Override
        public  List createErrorList(T value)
        {
            if (value != null)
            {
                return ((RecurrenceRuleValue) value).errors();
            } else
            {
                return Collections.emptyList();
            }
        }
    },
    /* Note: This string converter is only acceptable for values converted to Stings
     * without any additional processing.  For properties with TEXT value that is stored
     * as any type other than String, this converter MUST be replaced. (Use setConverter in
     * Property).
     * For example, the value type for TimeZoneIdentifier is TEXT, but the Java object is
     * ZoneId.  A different converter is required to make the conversion to ZoneId.
    */
    TEXT ("TEXT", Arrays.asList(String.class, ZoneId.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    if (object == null) return "";
                    // Add escape characters
                    String line = object.toString();
                    StringBuilder builder = new StringBuilder(line.length()+20); 
                    for (int i=0; i StringConverter getConverter()
        {
            throw new RuntimeException("not implemented");
        }
    },
    UNIFORM_RESOURCE_IDENTIFIER ("URI", Arrays.asList(URI.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return (StringConverter) StringConverters.uriConverterNoQuotes();
        }
    },
    UTC_OFFSET ("UTC-OFFSET", Arrays.asList(ZoneOffset.class))
    {
        @Override
        public  StringConverter getConverter()
        {
            return new StringConverter()
            {
                @Override
                public String toString(T object)
                {
                    return ZONE_OFFSET_FORMATTER.format((TemporalAccessor) object);
                }

                @Override
                public T fromString(String string)
                {
                    return (T) ZoneOffset.of(string);
                }
            };
        }
    },
    UNKNOWN ("UNKNOWN", Arrays.asList(Object.class)) {
        @Override
        public  StringConverter getConverter()
        {
            return (StringConverter) new DefaultStringConverter();
        }
    }
    ;
    
	final private static boolean IS_WINDOWS = System.getProperty("os.name").equals("Windows");
    final private static char[] SPECIAL_CHARACTERS = new char[] {',' , ';' , '\\' , 'n', 'N' };
    final private static char[] REPLACEMENT_CHARACTERS = new char[] {',' , ';' , '\\' , '\n', '\n'};

    private final static DateTimeFormatter ZONE_OFFSET_FORMATTER = new DateTimeFormatterBuilder()
            .appendOffset("+HHMMss", "+0000")
            .toFormatter();
    
    private static Map enumFromNameMap = makeEnumFromNameMap();
    private static Map makeEnumFromNameMap()
    {
        Map map = new HashMap<>();
        ValueType[] values = ValueType.values();
        for (int i=0; i> allowedClasses;
    public List> allowedClasses() { return allowedClasses; }
    ValueType(String name, List> allowedClasses)
    {
        this.name = name;
        this.allowedClasses = allowedClasses;
    }

    /** return default String converter associated with property value type */
    abstract public  StringConverter getConverter();

    public  List createErrorList(T value)
    {
        // most values are valid by default, which is denoted by an empty list.  RRULE is an exception and needs to call its errors() method.
        return null;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy