feat: added some component properties

This commit is contained in:
Zihlu Wang
2024-05-24 21:45:59 +08:00
parent b42ab4fdbb
commit 75e858c667
55 changed files with 1089 additions and 162 deletions
@@ -17,6 +17,14 @@
package com.onixbyte.icalendar; package com.onixbyte.icalendar;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
/** /**
* CalendarUtil * CalendarUtil
* *
@@ -17,7 +17,7 @@
package com.onixbyte.icalendar.calendar.property; package com.onixbyte.icalendar.calendar.property;
public enum Method implements CalendarProperty { public enum Method implements Property {
PUBLISH("PUBLISH"), PUBLISH("PUBLISH"),
REQUEST("REQUEST"), REQUEST("REQUEST"),
@@ -22,7 +22,7 @@ package com.onixbyte.icalendar.calendar.property;
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public final class ProductIdentifier implements CalendarProperty { public final class ProductIdentifier implements Property {
private final String value; private final String value;
@@ -17,7 +17,7 @@
package com.onixbyte.icalendar.calendar.property; package com.onixbyte.icalendar.calendar.property;
import com.onixbyte.icalendar.property.CalendarResolvable; import com.onixbyte.icalendar.property.Resolvable;
public interface CalendarProperty extends CalendarResolvable { public interface Property extends Resolvable {
} }
@@ -18,11 +18,11 @@
package com.onixbyte.icalendar.calendar.property; package com.onixbyte.icalendar.calendar.property;
/** /**
* CalendarScale * Scale
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public enum CalendarScale implements CalendarProperty { public enum Scale implements Property {
GREGORIAN, GREGORIAN,
; ;
@@ -22,7 +22,7 @@ package com.onixbyte.icalendar.calendar.property;
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public enum Version implements CalendarProperty { public enum Version implements Property {
VERSION_2_0, VERSION_2_0,
; ;
@@ -17,7 +17,7 @@
package com.onixbyte.icalendar.component; package com.onixbyte.icalendar.component;
import com.onixbyte.icalendar.calendar.property.CalendarScale; import com.onixbyte.icalendar.calendar.property.Scale;
import com.onixbyte.icalendar.calendar.property.Method; import com.onixbyte.icalendar.calendar.property.Method;
import com.onixbyte.icalendar.calendar.property.ProductIdentifier; import com.onixbyte.icalendar.calendar.property.ProductIdentifier;
import com.onixbyte.icalendar.calendar.property.Version; import com.onixbyte.icalendar.calendar.property.Version;
@@ -60,7 +60,7 @@ public final class Calendar {
/** /**
* This property are OPTIONAL, but MUST NOT occur more than once. * This property are OPTIONAL, but MUST NOT occur more than once.
*/ */
private CalendarScale scale; private Scale scale;
/** /**
* This property are OPTIONAL, but MUST NOT occur more than once. * This property are OPTIONAL, but MUST NOT occur more than once.
@@ -20,6 +20,7 @@ package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.parameter.FormatType; import com.onixbyte.icalendar.property.parameter.FormatType;
import java.net.URI; import java.net.URI;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
/** /**
@@ -27,21 +28,27 @@ import java.util.Optional;
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public final class Attachment implements ComponentProperty { public record Attachment(FormatType formatType,
URI uri,
String content) implements ComponentProperty {
private FormatType formatType; private static final String PROPERTY_NAME = "ATTACH";
private URI uri;
@Override @Override
public String resolve() { public String resolve() {
final var attachmentBuilder = new StringBuilder("ATTACH"); if (Objects.isNull(uri) && (Objects.isNull(content) || content.isBlank())) {
return null;
}
final var attachmentBuilder = new StringBuilder(PROPERTY_NAME);
Optional.ofNullable(formatType) Optional.ofNullable(formatType)
.ifPresent((fmtType) -> attachmentBuilder.append(fmtType.resolve())); .ifPresent((fmtType) -> attachmentBuilder.append(";").append(fmtType.resolve()));
attachmentBuilder.append(":") Optional.ofNullable(uri).ifPresentOrElse(
.append(uri.toString()); (_uri) -> attachmentBuilder.append(":").append(_uri),
() -> attachmentBuilder.append(";ENCODING=BASE64;VALUE=BINARY:").append(content));
attachmentBuilder.append("\n");
return attachmentBuilder.toString(); return attachmentBuilder.toString();
} }
@@ -0,0 +1,30 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import java.time.Duration;
public record CalendarDuration(Duration duration) implements ComponentProperty {
private static final String PROPERTY_NAME = "DURATION";
@Override
public String resolve() {
return PROPERTY_NAME + ":" + duration.toString() + "\n";
}
}
@@ -17,5 +17,49 @@
package com.onixbyte.icalendar.component.property; package com.onixbyte.icalendar.component.property;
public class Categories { import java.util.ArrayList;
import java.util.List;
public final class Categories implements ComponentProperty {
private static final String PROPERTY_NAME = "CATEGORIES";
private final List<String> value;
private Categories(List<String> value) {
this.value = value;
}
public static class Builder {
private List<String> categories;
private Builder() {
categories = new ArrayList<>();
}
public Builder addCategory(String category) {
if (!categories.contains(category)) {
categories.add(category);
}
return this;
}
public Builder addCategories(List<String> categories) {
categories.forEach(this::addCategory);
return this;
}
public Categories build() {
return new Categories(categories);
}
}
public static Builder builder() {
return new Builder();
}
@Override
public String resolve() {
return PROPERTY_NAME + ":" + String.join(",", value) + "\n";
}
} }
@@ -17,5 +17,17 @@
package com.onixbyte.icalendar.component.property; package com.onixbyte.icalendar.component.property;
public enum Classification { public enum Classification implements ComponentProperty {
PUBLIC,
PRIVATE,
CONFIDENTIAL,
;
private static final String PROPERTY_NAME = "CLASS";
@Override
public String resolve() {
return PROPERTY_NAME + ":" + name() + "\n";
}
} }
@@ -0,0 +1,37 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.CalendarUtil;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
import java.util.Objects;
import java.util.Optional;
public record Comment(AlternateRepresentation altRep,
Language language,
String value) implements TextProperty, ComponentProperty {
private static final String PROPERTY_NAME = "COMMENT";
@Override
public String resolve() {
return composeResolution(PROPERTY_NAME, altRep, language, value);
}
}
@@ -17,7 +17,7 @@
package com.onixbyte.icalendar.component.property; package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.CalendarResolvable; import com.onixbyte.icalendar.property.Resolvable;
public interface ComponentProperty extends CalendarResolvable { public interface ComponentProperty extends Resolvable {
} }
@@ -0,0 +1,36 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.CalendarUtil;
import java.time.LocalDateTime;
import java.time.ZoneId;
public record DateTimeCompleted(LocalDateTime value) implements DateTimeProperty, ComponentProperty {
private static final String PROPERTY_NAME = "COMPLETED";
@Override
public String resolve() {
return PROPERTY_NAME + ":" + value
.atZone(ZoneId.systemDefault())
.withZoneSameInstant(ZoneId.of("UTC"))
.format(DateTimeProperty.utcDateTimeFormatter());
}
}
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.CalendarUtil;
import com.onixbyte.icalendar.property.parameter.ValueDataType;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public record DateTimeDue(ValueDataType valueDataType,
LocalDateTime localDateTime) implements DateTimeProperty, ComponentProperty {
private static final String PROPERTY_NAME = "DUE";
public DateTimeDue {
if (Objects.nonNull(valueDataType) && !SUPPORTED_VALUES.contains(valueDataType)) {
throw new IllegalArgumentException("ValueDateType only accepts DATE and DATE-TIME");
}
}
@Override
public String resolve() {
return DateTimeProperty.composeResolution(PROPERTY_NAME, valueDataType, localDateTime);
}
}
@@ -0,0 +1,41 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.parameter.ValueDataType;
import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Optional;
public record DateTimeEnd(ValueDataType valueDataType,
LocalDateTime localDateTime) implements DateTimeProperty, ComponentProperty {
private static final String PROPERTY_NAME = "DTEND";
public DateTimeEnd {
if (Objects.nonNull(valueDataType) && !SUPPORTED_VALUES.contains(valueDataType)) {
throw new IllegalArgumentException("ValueDateType only accepts DATE and DATE-TIME");
}
}
@Override
public String resolve() {
return DateTimeProperty.composeResolution(PROPERTY_NAME, valueDataType, localDateTime);
}
}
@@ -0,0 +1,69 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.CalendarUtil;
import com.onixbyte.icalendar.property.parameter.ValueDataType;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public interface DateTimeProperty {
List<ValueDataType> SUPPORTED_VALUES = List.of(
ValueDataType.DATE,
ValueDataType.DATE_TIME
);
DateTimeFormatter utcDateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMMdd'T'HHmmss'Z'");
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd");
static DateTimeFormatter utcDateTimeFormatter() {
return utcDateTimeFormatter;
}
static DateTimeFormatter dateFormatter() {
return dateFormatter;
}
static String composeResolution(String propertyName,
ValueDataType valueDataType,
LocalDateTime localDateTime) {
var dateTimeEndBuilder = new StringBuilder(propertyName);
Optional.ofNullable(valueDataType)
.filter(SUPPORTED_VALUES::contains)
.ifPresent((value) -> dateTimeEndBuilder.append(";").append(value.resolve()));
var dateTimeFormatter = switch (Optional.ofNullable(valueDataType)
.filter(SUPPORTED_VALUES::contains)
.orElse(ValueDataType.DATE_TIME)) {
case DATE -> dateFormatter;
case BINARY, UTC_OFFSET, BOOLEAN, CAL_ADDRESS, DURATION, FLOAT, INTEGER, PERIOD,
RECURRENCE_RULE, TEXT, URI, DATE_TIME -> utcDateTimeFormatter;
};
dateTimeEndBuilder.append(":").append(localDateTime.format(dateTimeFormatter)).append("\n");
return dateTimeEndBuilder.toString();
}
}
@@ -23,65 +23,34 @@ import com.onixbyte.icalendar.config.Formatters;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
* In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that specifies a "{@link * In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that
* Method Method}" property, this property specifies the date and time that * specifies a "{@link Method Method}" property, this property specifies the date and time that the
* the instance of the {@link com.onixbyte.icalendar.component.Calendar iCalendar} object was created. In the case of * instance of the {@link com.onixbyte.icalendar.component.Calendar iCalendar} object was created.
* an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that doesn't specify a "{@link * In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that doesn't
* Method Method}" property, this property specifies the date and time that * specify a "{@link Method Method}" property, this property specifies the date and time that
* the information associated with the calendar component was last revised in the calendar store. * the information associated with the calendar component was last revised in the calendar store.
* <p> * <p>
* The value MUST be specified in the UTC time format. * The value MUST be specified in the UTC time format.
* <p> * <p>
* This property is also useful to protocols such as [2447bis] that have inherent latency issues with the delivery of * This property is also useful to protocols such as [2447bis] that have inherent latency issues
* content. This property will assist in the proper sequencing of messages containing {@link * with the delivery of content. This property will assist in the proper sequencing of messages
* com.onixbyte.icalendar.component.Calendar iCalendar} objects. * containing {@link com.onixbyte.icalendar.component.Calendar iCalendar} objects.
* <p> * <p>
* In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that specifies a "{@link * In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that
* Method Method}" property, this property differs from the "{@link * specifies a "{@link Method Method}" property, this property differs from the
* DateTimeCreated CREATED}" and "{@link LastModified LAST-MODIFIED}" properties. These two properties are used to * "{@link DateTimeCreated CREATED}" and "{@link LastModified LAST-MODIFIED}" properties. These two
* specify when the particular calendar data in the calendar store was created and last modified. This is different * properties are used to specify when the particular calendar data in the calendar store was
* from when the {@link com.onixbyte.icalendar.component.Calendar iCalendar} object representation of the calendar * created and last modified. This is different from when the {@link
* com.onixbyte.icalendar.component.Calendar iCalendar} object representation of the calendar
* service information was created or last modified. * service information was created or last modified.
* <p> * <p>
* In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that specifies a "{@link * In the case of an {@link com.onixbyte.icalendar.component.Calendar iCalendar} object that
* Method METHOD}" property, this property is equivalent to the "{@link * specifies a "{@link Method METHOD}" property, this property is equivalent to the "{@link
* LastModified LAST-MODIFIED}" property. * LastModified LAST-MODIFIED}" property.
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public final class DateTimeStamp implements ComponentProperty { // public final class DateTimeStamp implements DateTimeProperty, ComponentProperty {
//
private static final String PROPERTY_NAME = "DTSTAMP"; //
// }
private LocalDateTime value;
public DateTimeStamp(LocalDateTime value) {
this.value = value;
}
public DateTimeStamp() {
this.value = LocalDateTime.now();
}
@Override
public String resolve() {
return PROPERTY_NAME + ":" + Formatters.getUtcDatetimeFormatter().format(value) + '\n';
}
public static class Builder {
private final DateTimeStamp dateTimeStamp = new DateTimeStamp();
public Builder dateTimeStamp(LocalDateTime dateTime) {
this.dateTimeStamp.value = dateTime;
return this;
}
public DateTimeStamp build() {
return dateTimeStamp;
}
}
public static Builder builder() {
return new Builder();
}
}
@@ -0,0 +1,40 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.parameter.ValueDataType;
import java.time.LocalDateTime;
import java.util.Objects;
public record DateTimeStart(ValueDataType valueDataType,
LocalDateTime localDateTime) implements DateTimeProperty, ComponentProperty {
private static final String PROPERTY_NAME = "DTSTART";
public DateTimeStart {
if (Objects.nonNull(valueDataType) && !SUPPORTED_VALUES.contains(valueDataType)) {
throw new IllegalArgumentException("ValueDateType only accepts DATE and DATE-TIME");
}
}
@Override
public String resolve() {
return DateTimeProperty.composeResolution(PROPERTY_NAME, valueDataType, localDateTime);
}
}
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.CalendarUtil;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
public record Description(AlternateRepresentation altRep,
Language language,
String value) implements TextProperty, ComponentProperty {
private static final String PROPERTY_NAME = "DESCRIPTION";
@Override
public String resolve() {
return composeResolution(PROPERTY_NAME, altRep, language, value);
}
}
@@ -0,0 +1,82 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.datatype.Period;
import com.onixbyte.icalendar.property.parameter.FreeBusyTimeType;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public final class FreeBusyTime implements ComponentProperty {
private static final String PROPERTY_NAME = "FREEBUSY";
private final FreeBusyTimeType freeBusyType;
private final List<Period> freeBusyValue;
public static class Builder {
public Builder freeBusyType(FreeBusyTimeType freeBusyType) {
this.freeBusyType = freeBusyType;
return this;
}
public Builder addFreeBusyValue(Period period) {
this.freeBusyValue.add(period);
return this;
}
public FreeBusyTime build() {
return new FreeBusyTime(freeBusyType, freeBusyValue);
}
private FreeBusyTimeType freeBusyType;
private List<Period> freeBusyValue;
private Builder() {
this.freeBusyValue = new ArrayList<>();
}
}
public static Builder builder() {
return new Builder();
}
@Override
public String resolve() {
var freeBusyBuilder = new StringBuilder(PROPERTY_NAME);
Optional.ofNullable(freeBusyType)
.ifPresent((type) -> freeBusyBuilder.append(";").append(type.resolve()));
freeBusyBuilder.append(":").append(String.join(",", freeBusyValue
.stream()
.map(Period::resolve)
.toList()));
return freeBusyBuilder.toString();
}
private FreeBusyTime(FreeBusyTimeType freeBusyType, List<Period> freeBusyValue) {
this.freeBusyType = freeBusyType;
this.freeBusyValue = freeBusyValue;
}
}
@@ -0,0 +1,42 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
public record GeoPosition(double latitude,
double longitude) implements ComponentProperty {
public GeoPosition {
if (latitude < -90 || latitude > 90) {
throw new IllegalArgumentException(
"Latitude (%f) should greater than -90 and less than 90.".formatted(latitude));
}
if (longitude < -180 || longitude > 180) {
throw new IllegalArgumentException(
"Longitude (%f) should greater than -180 and less than 180."
.formatted(longitude));
}
}
private static final String PROPERTY_NAME = "GEO";
@Override
public String resolve() {
return PROPERTY_NAME + ":" + latitude + ";" + longitude + "\n";
}
}
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.CalendarUtil;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
public record Location(AlternateRepresentation altRep,
Language language,
String value) implements TextProperty, ComponentProperty {
private static final String PROPERTY_NAME = "LOCATION";
@Override
public String resolve() {
return composeResolution(PROPERTY_NAME, altRep, language, value);
}
}
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
public record PercentComplete(int value) implements ComponentProperty {
public PercentComplete {
if (value < 0 || value > 100) {
throw new IllegalArgumentException("PercentComplete only accept value from 0 to 100, the given value %d is not acceptable."
.formatted(value));
}
}
private static final String PROPERTY_NAME = "PERCENT-COMPLETE";
@Override
public String resolve() {
return PROPERTY_NAME + ":" + value + "\n";
}
}
@@ -0,0 +1,34 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
public record Priority(int value) implements ComponentProperty {
private static final String PROPERTY_NAME = "PRIORITY";
public Priority {
if (value < 0 || value > 9) {
throw new IllegalArgumentException("Priority %d is exceeded the range of 0-9.".formatted(value));
}
}
@Override
public String resolve() {
return PROPERTY_NAME + ":" + value + "\n";
}
}
@@ -0,0 +1,86 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
import java.util.ArrayList;
import java.util.List;
public final class Resources implements TextProperty, ComponentProperty {
private static final String PROPERTY_NAME = "RESOURCES";
private final AlternateRepresentation altRep;
private final Language language;
private final List<String> value;
private Resources(AlternateRepresentation altRep, Language language, List<String> value) {
this.altRep = altRep;
this.language = language;
this.value = value;
}
public static class Builder {
private List<String> value;
private AlternateRepresentation altRep;
private Language language;
private Builder() {
this.value = new ArrayList<>();
}
public Builder altRep(AlternateRepresentation altRep) {
this.altRep = altRep;
return this;
}
public Builder language(Language language) {
this.language = language;
return this;
}
public Builder addResource(String resource) {
value.add(resource);
return this;
}
public Builder addResources(List<String> resources) {
value.addAll(resources);
return this;
}
public Resources build() {
return new Resources(altRep, language, value);
}
}
public static Builder builder() {
return new Builder();
}
@Override
public String resolve() {
return composeResolution(PROPERTY_NAME, altRep, language, () -> String.join(",", value));
}
}
@@ -0,0 +1,58 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import java.util.List;
public enum Status implements ComponentProperty {
TENTATIVE("TENTATIVE"),
CONFIRMED("CONFIRMED"),
CANCELLED("CANCELLED"),
NEEDS_ACTION("NEEDS-ACTION"),
COMPLETED("COMPLETED"),
IN_PROGRESS("IN-PROGRESS"),
DRAFT("DRAFT"),
FINAL("FINAL"),
;
private static final String PROPERTY_NAME = "STATUS";
private final String tag;
Status(String tag) {
this.tag = tag;
}
@Override
public String resolve() {
return PROPERTY_NAME + ":" + tag + "\n";
}
public static List<Status> eventStatus() {
return List.of(TENTATIVE, CONFIRMED, CANCELLED);
}
public static List<Status> todoStatus() {
return List.of(NEEDS_ACTION, COMPLETED, IN_PROGRESS, CANCELLED);
}
public static List<Status> journalStatus() {
return List.of(DRAFT, FINAL, CANCELLED);
}
}
@@ -0,0 +1,33 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
public record Summary(AlternateRepresentation altRep,
Language language,
String value) implements TextProperty, ComponentProperty {
private static final String PROPERTY_NAME = "SUMMARY";
@Override
public String resolve() {
return composeResolution(PROPERTY_NAME, altRep, language, value);
}
}
@@ -0,0 +1,59 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.component.property;
import com.onixbyte.icalendar.property.parameter.AlternateRepresentation;
import com.onixbyte.icalendar.property.parameter.Language;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Supplier;
public interface TextProperty {
default String composeResolution(String propertyName,
AlternateRepresentation altRep,
Language language,
String value) {
if (Objects.isNull(value) || value.isBlank()) {
return null;
}
var resolutionBuilder = new StringBuilder(propertyName);
Optional.ofNullable(altRep)
.ifPresent((_altRep) -> resolutionBuilder.append(";").append(_altRep.resolve()));
Optional.ofNullable(language)
.ifPresent((lang) -> resolutionBuilder.append(";").append(lang.resolve()));
resolutionBuilder.append(":")
.append(value)
.append("\n");
return resolutionBuilder.toString();
}
default String composeResolution(String propertyName,
AlternateRepresentation altRep,
Language language,
Supplier<String> valueSupplier) {
return composeResolution(propertyName, altRep, language, valueSupplier.get());
}
}
@@ -22,42 +22,7 @@ package com.onixbyte.icalendar.component.property;
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public final class UniqueIdentifier implements ComponentProperty { public record UniqueIdentifier(String value) implements ComponentProperty {
private String value;
private UniqueIdentifier() {
}
private void setValue(String value) {
this.value = value;
}
public static class Builder {
private final UniqueIdentifier uniqueIdentifier;
private Builder() {
this.uniqueIdentifier = new UniqueIdentifier();
}
public Builder uniqueIdentifier(String uniqueIdentifier) {
this.uniqueIdentifier.value = uniqueIdentifier;
return this;
}
public Builder uniqueIdentifier(String uniqueIdentifier, String domainName) {
this.uniqueIdentifier.value = uniqueIdentifier + "@" + domainName;
return this;
}
public UniqueIdentifier build() {
return uniqueIdentifier;
}
}
public static Builder builder() {
return new Builder();
}
@Override @Override
public String resolve() { public String resolve() {
@@ -17,9 +17,11 @@
package com.onixbyte.icalendar.datatype; package com.onixbyte.icalendar.datatype;
import com.onixbyte.icalendar.property.Resolvable;
import java.net.URI; import java.net.URI;
public final class CalendarUserAddress { public final class CalendarUserAddress implements Resolvable {
private URI value; private URI value;
@@ -38,6 +40,11 @@ public final class CalendarUserAddress {
this.value = uri; this.value = uri;
} }
@Override
public String resolve() {
return toString();
}
@Override @Override
public String toString() { public String toString() {
return value.toString(); return value.toString();
@@ -0,0 +1,24 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.datatype;
import com.onixbyte.icalendar.property.Resolvable;
public interface Period extends Resolvable {
}
@@ -0,0 +1,44 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.datatype;
import com.onixbyte.icalendar.component.property.DateTimeProperty;
import com.onixbyte.icalendar.property.Resolvable;
import java.time.LocalDateTime;
public final class PeriodExplicit implements Period {
private final LocalDateTime startTime;
private final LocalDateTime endTime;
public PeriodExplicit(LocalDateTime startTime, LocalDateTime endTime) {
if (startTime.isAfter(endTime)) {
throw new IllegalArgumentException("Period start must not after than period end.");
}
this.startTime = startTime;
this.endTime = endTime;
}
@Override
public String resolve() {
return startTime.format(DateTimeProperty.utcDateTimeFormatter()) + "/" +
endTime.format(DateTimeProperty.utcDateTimeFormatter());
}
}
@@ -0,0 +1,35 @@
/*
* Copyright (C) 2024-2024 OnixByte.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.onixbyte.icalendar.datatype;
import com.onixbyte.icalendar.component.property.DateTimeProperty;
import java.time.Duration;
import java.time.LocalDateTime;
public final class PeriodStart implements Period {
private LocalDateTime start;
private Duration duration;
@Override
public String resolve() {
return start.format(DateTimeProperty.utcDateTimeFormatter()) + "/" + duration;
}
}
@@ -17,7 +17,7 @@
package com.onixbyte.icalendar.property; package com.onixbyte.icalendar.property;
public interface CalendarResolvable { public interface Resolvable {
String resolve(); String resolve();
@@ -28,10 +28,10 @@ public enum AlarmTriggerRelationship implements PropertyParameter {
END END
; ;
private static final String PROPERTY_NAME = "RELATED"; private static final String PARAMETER_NAME = "RELATED";
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + name(); return PARAMETER_NAME + "=" + name();
} }
} }
@@ -17,8 +17,6 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.property.CalendarResolvable;
import java.net.URI; import java.net.URI;
/** /**
@@ -35,7 +33,7 @@ import java.net.URI;
*/ */
public final class AlternateRepresentation implements PropertyParameter { public final class AlternateRepresentation implements PropertyParameter {
private static final String PROPERTY_NAME = "ALTREP"; private static final String PARAMETER_NAME = "ALTREP";
private final URI value; private final URI value;
@@ -45,7 +43,7 @@ public final class AlternateRepresentation implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=\"" + value.toString() + "\""; return PARAMETER_NAME + "=\"" + value.toString() + "\"";
} }
public static class Builder { public static class Builder {
@@ -17,8 +17,6 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.property.CalendarResolvable;
/** /**
* Common Name can be specified on properties with a CAL-ADDRESS value type. The parameter * Common Name can be specified on properties with a CAL-ADDRESS value type. The parameter
* specifies the common name to be associated with the calendar user specified by the property. * specifies the common name to be associated with the calendar user specified by the property.
@@ -29,7 +27,7 @@ import com.onixbyte.icalendar.property.CalendarResolvable;
*/ */
public final class CommonName implements PropertyParameter { public final class CommonName implements PropertyParameter {
private static final String PROPERTY_NAME = "CN"; private static final String PARAMETER_NAME = "CN";
private final String value; private final String value;
@@ -59,6 +57,6 @@ public final class CommonName implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=\"" + this.value + "\""; return PARAMETER_NAME + "=\"" + this.value + "\"";
} }
} }
@@ -31,7 +31,7 @@ import java.util.function.Supplier;
*/ */
public final class Delegatee implements PropertyParameter { public final class Delegatee implements PropertyParameter {
private static final String PROPERTY_NAME = "DELEGATED-TO"; private static final String PARAMETER_NAME = "DELEGATED-TO";
private final List<CalendarUserAddress> value; private final List<CalendarUserAddress> value;
@@ -82,7 +82,7 @@ public final class Delegatee implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + String.join(",", value.stream() return PARAMETER_NAME + "=" + String.join(",", value.stream()
.map((_value) -> "\"" + _value + "\"") .map((_value) -> "\"" + _value + "\"")
.toList()); .toList());
} }
@@ -18,7 +18,6 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.datatype.CalendarUserAddress; import com.onixbyte.icalendar.datatype.CalendarUserAddress;
import com.onixbyte.icalendar.property.CalendarResolvable;
import java.net.URI; import java.net.URI;
import java.util.ArrayList; import java.util.ArrayList;
@@ -32,7 +31,7 @@ import java.util.function.Supplier;
*/ */
public final class Delegator implements PropertyParameter { public final class Delegator implements PropertyParameter {
private static final String PROPERTY_NAME = "DELEGATED-FROM"; private static final String PARAMETER_NAME = "DELEGATED-FROM";
private List<CalendarUserAddress> value; private List<CalendarUserAddress> value;
@@ -83,7 +82,7 @@ public final class Delegator implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=\"" + String.join(",", value.stream() return PARAMETER_NAME + "=\"" + String.join(",", value.stream()
.map((_value) -> "\"" + _value + "\"") .map((_value) -> "\"" + _value + "\"")
.toList()) + "\""; .toList()) + "\"";
} }
@@ -26,7 +26,7 @@ import java.net.URI;
*/ */
public final class DirectoryEntryReference implements PropertyParameter { public final class DirectoryEntryReference implements PropertyParameter {
private static final String PROPERTY_NAME = "DIR"; private static final String PARAMETER_NAME = "DIR";
private final URI value; private final URI value;
@@ -61,6 +61,6 @@ public final class DirectoryEntryReference implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=\"" + value + "\""; return PARAMETER_NAME + "=\"" + value + "\"";
} }
} }
@@ -17,8 +17,6 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.property.CalendarResolvable;
/** /**
* FormatType * FormatType
* *
@@ -30,7 +28,7 @@ public enum FormatType implements PropertyParameter {
; ;
private static final String PROPERTY_NAME = "FMTTYPE"; private static final String PARAMETER_NAME = "FMTTYPE";
private final String ianaRegistry; private final String ianaRegistry;
@@ -40,6 +38,6 @@ public enum FormatType implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + this.ianaRegistry; return PARAMETER_NAME + "=" + this.ianaRegistry;
} }
} }
@@ -30,7 +30,7 @@ public enum FreeBusyTimeType implements PropertyParameter {
BUSY_TENTATIVE("BUSY-TENTATIVE") BUSY_TENTATIVE("BUSY-TENTATIVE")
; ;
private static final String PROPERTY_NAME = "FBTYPE"; private static final String PARAMETER_NAME = "FBTYPE";
private final String tag; private final String tag;
@@ -40,6 +40,6 @@ public enum FreeBusyTimeType implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + tag; return PARAMETER_NAME + "=" + tag;
} }
} }
@@ -31,7 +31,7 @@ import java.util.function.Supplier;
*/ */
public final class GroupOrListMembership implements PropertyParameter { public final class GroupOrListMembership implements PropertyParameter {
private static final String PROPERTY_NAME = "MEMBER"; private static final String PARAMETER_NAME = "MEMBER";
private final List<CalendarUserAddress> value; private final List<CalendarUserAddress> value;
@@ -82,7 +82,7 @@ public final class GroupOrListMembership implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + String.join(",", value.stream() return PARAMETER_NAME + "=" + String.join(",", value.stream()
.map((_value) -> "\"" + _value + "\"") .map((_value) -> "\"" + _value + "\"")
.toList()); .toList());
} }
@@ -35,10 +35,10 @@ public enum InlineEncoding implements PropertyParameter {
this.tag = tag; this.tag = tag;
} }
private static final String PROPERTY_NAME = "ENCODING"; private static final String PARAMETER_NAME = "ENCODING";
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + tag; return PARAMETER_NAME + "=" + tag;
} }
} }
@@ -17,8 +17,6 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.property.CalendarResolvable;
/** /**
* Language * Language
* *
@@ -260,7 +258,7 @@ public enum Language implements PropertyParameter {
SOUTH_AFRICA_ZULU("zu-ZA") SOUTH_AFRICA_ZULU("zu-ZA")
; ;
private static final String PROPERTY_NAME = "LANGUAGE"; private static final String PARAMETER_NAME = "LANGUAGE";
private final String value; private final String value;
@@ -270,6 +268,6 @@ public enum Language implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + value; return PARAMETER_NAME + "=" + value;
} }
} }
@@ -30,7 +30,7 @@ public enum ParticipationRole implements PropertyParameter {
NON_PARTICIPANT("NON-PARTICIPANT"), NON_PARTICIPANT("NON-PARTICIPANT"),
; ;
private static final String PROPERTY_NAME = "ROLE"; private static final String PARAMETER_NAME = "ROLE";
private final String tag; private final String tag;
@@ -40,6 +40,6 @@ public enum ParticipationRole implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + tag; return PARAMETER_NAME + "=" + tag;
} }
} }
@@ -47,7 +47,7 @@ public enum ParticipationStatus implements PropertyParameter {
return List.of(NEEDS_ACTION, ACCEPTED, DECLINED); return List.of(NEEDS_ACTION, ACCEPTED, DECLINED);
} }
private static final String PROPERTY_NAME = "PARTSTAT"; private static final String PARAMETER_NAME = "PARTSTAT";
private final String tag; private final String tag;
@@ -57,6 +57,6 @@ public enum ParticipationStatus implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + tag; return PARAMETER_NAME + "=" + tag;
} }
} }
@@ -17,7 +17,7 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.property.CalendarResolvable; import com.onixbyte.icalendar.property.Resolvable;
public interface PropertyParameter extends CalendarResolvable { public interface PropertyParameter extends Resolvable {
} }
@@ -27,7 +27,7 @@ public enum RecurrenceIdentifierRange implements PropertyParameter {
THIS_AND_FUTURE("THISANDFUTURE") THIS_AND_FUTURE("THISANDFUTURE")
; ;
private static final String PROPERTY_NAME = "RANGE"; private static final String PARAMETER_NAME = "RANGE";
private final String tag; private final String tag;
@@ -37,6 +37,6 @@ public enum RecurrenceIdentifierRange implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + tag; return PARAMETER_NAME + "=" + tag;
} }
} }
@@ -39,7 +39,7 @@ public enum RelationshipType implements PropertyParameter {
START_TO_START("STARTTOSTART") START_TO_START("STARTTOSTART")
; ;
private static final String PROPERTY_NAME = "RELTYPE"; private static final String PARAMETER_NAME = "RELTYPE";
private final String tag; private final String tag;
@@ -49,6 +49,6 @@ public enum RelationshipType implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + tag; return PARAMETER_NAME + "=" + tag;
} }
} }
@@ -24,7 +24,7 @@ package com.onixbyte.icalendar.property.parameter;
*/ */
public final class RsvpExpectation implements PropertyParameter { public final class RsvpExpectation implements PropertyParameter {
private static final String PROPERTY_NAME = "RSVP"; private static final String PARAMETER_NAME = "RSVP";
private final boolean value; private final boolean value;
@@ -34,6 +34,6 @@ public final class RsvpExpectation implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + String.valueOf(value).toUpperCase(); return PARAMETER_NAME + "=" + String.valueOf(value).toUpperCase();
} }
} }
@@ -28,7 +28,7 @@ import java.net.URI;
*/ */
public final class SentBy implements PropertyParameter { public final class SentBy implements PropertyParameter {
private static final String PROPERTY_NAME = "SENT-BY"; private static final String PARAMETER_NAME = "SENT-BY";
private final CalendarUserAddress value; private final CalendarUserAddress value;
@@ -68,6 +68,6 @@ public final class SentBy implements PropertyParameter {
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=\"" + value + "\""; return PARAMETER_NAME + "=\"" + value + "\"";
} }
} }
@@ -17,14 +17,12 @@
package com.onixbyte.icalendar.property.parameter; package com.onixbyte.icalendar.property.parameter;
import com.onixbyte.icalendar.property.CalendarResolvable;
/** /**
* CalendarUserType * UserType
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public enum CalendarUserType implements PropertyParameter { public enum UserType implements PropertyParameter {
/** /**
* An individual. * An individual.
@@ -52,10 +50,10 @@ public enum CalendarUserType implements PropertyParameter {
UNKNOWN, UNKNOWN,
; ;
private static final String PROPERTY_NAME = "CUTYPE"; private static final String PARAMETER_NAME = "CUTYPE";
@Override @Override
public String resolve() { public String resolve() {
return PROPERTY_NAME + "=" + this.name(); return PARAMETER_NAME + "=" + this.name();
} }
} }
@@ -22,5 +22,33 @@ package com.onixbyte.icalendar.property.parameter;
* *
* @author Zihlu WANG * @author Zihlu WANG
*/ */
public class ValueDataType { public enum ValueDataType implements PropertyParameter {
BINARY("BINARY"),
BOOLEAN("BOOLEAN"),
CAL_ADDRESS("CAL-ADDRESS"),
DATE("DATE"),
DATE_TIME("DATE-TIME"),
DURATION("DURATION"),
FLOAT("FLOAT"),
INTEGER("INTEGER"),
PERIOD("PERIOD"),
RECURRENCE_RULE("RECUR"),
TEXT("TEXT"),
URI("URI"),
UTC_OFFSET("UTC-OFFSET"),
;
private static final String PARAMETER_NAME = "VALUE";
private final String tag;
ValueDataType(String tag) {
this.tag = tag;
}
@Override
public String resolve() {
return PARAMETER_NAME + "=" + tag;
}
} }