diff --git a/src/main/kotlin/at/bitfire/dav4jvm/Property.kt b/src/main/kotlin/at/bitfire/dav4jvm/Property.kt index 8d1aba5..e03a503 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/Property.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/Property.kt @@ -7,17 +7,20 @@ package at.bitfire.dav4jvm import at.bitfire.dav4jvm.exception.InvalidPropertyException -import org.xmlpull.v1.XmlPullParser import java.io.Serializable import java.util.LinkedList import java.util.logging.Level import java.util.logging.Logger +import org.xmlpull.v1.XmlPullParser /** * Represents a WebDAV property. * * Every [Property] must define a static field (use `@JvmStatic`) called `NAME` of type [Property.Name], * which will be accessed by reflection. + * + * Every [Property] should be a data class in order to be able to compare it against others, and convert to a useful + * string for debugging. */ interface Property { diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarHomeSet.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarHomeSet.kt index 5b77982..ee9b609 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarHomeSet.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarHomeSet.kt @@ -10,11 +10,15 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.property.webdav.HrefListProperty import org.xmlpull.v1.XmlPullParser -class CalendarHomeSet: HrefListProperty() { +data class CalendarHomeSet( + override val hrefs: List = emptyList() +): HrefListProperty(hrefs) { companion object { + @JvmField val NAME = Property.Name(NS_CALDAV, "calendar-home-set") + } @@ -22,7 +26,7 @@ class CalendarHomeSet: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, CalendarHomeSet()) + override fun create(parser: XmlPullParser) = create(parser, ::CalendarHomeSet) } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyReadFor.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyReadFor.kt index 5af9305..5a33c5c 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyReadFor.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyReadFor.kt @@ -10,7 +10,9 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.property.webdav.HrefListProperty import org.xmlpull.v1.XmlPullParser -class CalendarProxyReadFor: HrefListProperty() { +data class CalendarProxyReadFor( + override val hrefs: List = emptyList() +): HrefListProperty(hrefs) { companion object { @JvmField @@ -22,7 +24,7 @@ class CalendarProxyReadFor: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, CalendarProxyReadFor()) + override fun create(parser: XmlPullParser) = create(parser, ::CalendarProxyReadFor) } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyWriteFor.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyWriteFor.kt index b100460..cc0beb7 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyWriteFor.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarProxyWriteFor.kt @@ -10,7 +10,9 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.property.webdav.HrefListProperty import org.xmlpull.v1.XmlPullParser -class CalendarProxyWriteFor: HrefListProperty() { +data class CalendarProxyWriteFor( + override val hrefs: List = emptyList() +): HrefListProperty(hrefs) { companion object { @JvmField @@ -22,7 +24,7 @@ class CalendarProxyWriteFor: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, CalendarProxyWriteFor()) + override fun create(parser: XmlPullParser) = create(parser, ::CalendarProxyWriteFor) } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarTimezoneId.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarTimezoneId.kt index 79de3e3..327ec0d 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarTimezoneId.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarTimezoneId.kt @@ -11,7 +11,7 @@ import at.bitfire.dav4jvm.PropertyFactory import at.bitfire.dav4jvm.XmlReader import org.xmlpull.v1.XmlPullParser -class CalendarTimezoneId( +data class CalendarTimezoneId( val identifier: String? ): Property { diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarUserAddressSet.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarUserAddressSet.kt index b82e488..7a34e6f 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarUserAddressSet.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/CalendarUserAddressSet.kt @@ -10,7 +10,9 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.property.webdav.HrefListProperty import org.xmlpull.v1.XmlPullParser -class CalendarUserAddressSet: HrefListProperty() { +data class CalendarUserAddressSet( + override val hrefs: List = emptyList() +): HrefListProperty(hrefs) { companion object { @JvmField @@ -22,7 +24,7 @@ class CalendarUserAddressSet: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, CalendarUserAddressSet()) + override fun create(parser: XmlPullParser) = create(parser, ::CalendarUserAddressSet) } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/ScheduleTag.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/ScheduleTag.kt index 0e82b95..e1a254f 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/ScheduleTag.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/ScheduleTag.kt @@ -13,16 +13,18 @@ import at.bitfire.dav4jvm.XmlReader import okhttp3.Response import org.xmlpull.v1.XmlPullParser -class ScheduleTag( - rawScheduleTag: String? +data class ScheduleTag( + val rawScheduleTag: String? ): Property { companion object { + @JvmField val NAME = Property.Name(NS_CALDAV, "schedule-tag") fun fromResponse(response: Response) = response.header("Schedule-Tag")?.let { ScheduleTag(it) } + } /* Value: opaque-tag diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/Source.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/Source.kt index 4e06355..f7620df 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/Source.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/Source.kt @@ -10,11 +10,15 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.property.webdav.HrefListProperty import org.xmlpull.v1.XmlPullParser -class Source: HrefListProperty() { +class Source( + override val hrefs: List = emptyList() +): HrefListProperty(hrefs) { companion object { + @JvmField val NAME = Property.Name(NS_CALENDARSERVER, "source") + } @@ -22,8 +26,8 @@ class Source: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, Source()) + override fun create(parser: XmlPullParser) = create(parser, ::Source) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarComponentSet.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarComponentSet.kt index f350877..c906007 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarComponentSet.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarComponentSet.kt @@ -12,9 +12,9 @@ import at.bitfire.dav4jvm.XmlUtils.propertyName import org.xmlpull.v1.XmlPullParser data class SupportedCalendarComponentSet( - var supportsEvents: Boolean, - var supportsTasks: Boolean, - var supportsJournal: Boolean + val supportsEvents: Boolean, + val supportsTasks: Boolean, + val supportsJournal: Boolean ): Property { companion object { @@ -37,7 +37,11 @@ data class SupportedCalendarComponentSet( */ - val components = SupportedCalendarComponentSet(false, false, false) + var components = SupportedCalendarComponentSet( + supportsEvents = false, + supportsTasks = false, + supportsJournal = false + ) val depth = parser.depth var eventType = parser.eventType @@ -45,15 +49,17 @@ data class SupportedCalendarComponentSet( if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) { when (parser.propertyName()) { ALLCOMP -> { - components.supportsEvents = true - components.supportsTasks = true - components.supportsJournal = true + components = SupportedCalendarComponentSet( + supportsEvents = true, + supportsTasks = true, + supportsJournal = true + ) } COMP -> when (parser.getAttributeValue(null, "name")?.uppercase()) { - "VEVENT" -> components.supportsEvents = true - "VTODO" -> components.supportsTasks = true - "VJOURNAL" -> components.supportsJournal = true + "VEVENT" -> components = components.copy(supportsEvents = true) + "VTODO" -> components = components.copy(supportsTasks = true) + "VJOURNAL" -> components = components.copy(supportsJournal = true) } } } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarData.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarData.kt index 29ea169..7b1e821 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarData.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/caldav/SupportedCalendarData.kt @@ -12,7 +12,9 @@ import at.bitfire.dav4jvm.XmlReader import okhttp3.MediaType import org.xmlpull.v1.XmlPullParser -class SupportedCalendarData: Property { +data class SupportedCalendarData( + val types: Set = emptySet() +): Property { companion object { @@ -25,23 +27,19 @@ class SupportedCalendarData: Property { } - val types = mutableSetOf() - fun hasJCal() = types.any { "application".equals(it.type, true) && "calendar+json".equals(it.subtype, true) } - override fun toString() = "[${types.joinToString(", ")}]" - object Factory: PropertyFactory { override fun getName() = NAME override fun create(parser: XmlPullParser): SupportedCalendarData { - val supported = SupportedCalendarData() + val supportedTypes = mutableSetOf() - XmlReader(parser).readContentTypes(CALENDAR_DATA_TYPE, supported.types::add) + XmlReader(parser).readContentTypes(CALENDAR_DATA_TYPE, supportedTypes::add) - return supported + return SupportedCalendarData(supportedTypes) } } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressData.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressData.kt index ebad666..7cc7789 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressData.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressData.kt @@ -12,16 +12,18 @@ import at.bitfire.dav4jvm.XmlReader import org.xmlpull.v1.XmlPullParser data class AddressData( - val card: String? + val card: String? ): Property { companion object { + @JvmField val NAME = Property.Name(NS_CARDDAV, "address-data") // attributes const val CONTENT_TYPE = "content-type" const val VERSION = "version" + } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookDescription.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookDescription.kt index 7f95e7b..a575358 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookDescription.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookDescription.kt @@ -12,7 +12,7 @@ import at.bitfire.dav4jvm.XmlReader import org.xmlpull.v1.XmlPullParser data class AddressbookDescription( - var description: String? = null + val description: String? = null ): Property { companion object { diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookHomeSet.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookHomeSet.kt index 380252c..c7be0bd 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookHomeSet.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/AddressbookHomeSet.kt @@ -10,11 +10,15 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.property.webdav.HrefListProperty import org.xmlpull.v1.XmlPullParser -class AddressbookHomeSet: HrefListProperty() { +class AddressbookHomeSet( + override val hrefs: List = emptyList() +): HrefListProperty(hrefs) { companion object { + @JvmField val NAME = Property.Name(NS_CARDDAV, "addressbook-home-set") + } @@ -22,7 +26,7 @@ class AddressbookHomeSet: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, AddressbookHomeSet()) + override fun create(parser: XmlPullParser) = create(parser, ::AddressbookHomeSet) } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/MaxResourceSize.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/MaxResourceSize.kt index a812f13..53e51c2 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/MaxResourceSize.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/MaxResourceSize.kt @@ -14,15 +14,21 @@ import org.xmlpull.v1.XmlPullParser data class MaxResourceSize( val maxSize: Long? ) : Property { + companion object { + @JvmField val NAME = Property.Name(NS_CARDDAV, "max-resource-size") + } object Factory: PropertyFactory { + override fun getName() = NAME override fun create(parser: XmlPullParser) = MaxResourceSize(XmlReader(parser).readLong()) + } -} \ No newline at end of file + +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/SupportedAddressData.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/SupportedAddressData.kt index 77092a6..78b79de 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/SupportedAddressData.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/carddav/SupportedAddressData.kt @@ -12,7 +12,9 @@ import at.bitfire.dav4jvm.XmlReader import okhttp3.MediaType import org.xmlpull.v1.XmlPullParser -class SupportedAddressData: Property { +class SupportedAddressData( + val types: Set = emptySet() +): Property { companion object { @@ -25,8 +27,6 @@ class SupportedAddressData: Property { } - val types = mutableSetOf() - fun hasVCard4() = types.any { "text/vcard; version=4.0".equals(it.toString(), true) } fun hasJCard() = types.any { "application".equals(it.type, true) && "vcard+json".equals(it.subtype, true) } @@ -38,11 +38,11 @@ class SupportedAddressData: Property { override fun getName() = NAME override fun create(parser: XmlPullParser): SupportedAddressData { - val supported = SupportedAddressData() + val supportedTypes = mutableSetOf() - XmlReader(parser).readContentTypes(ADDRESS_DATA_TYPE, supported.types::add) + XmlReader(parser).readContentTypes(ADDRESS_DATA_TYPE, supportedTypes::add) - return supported + return SupportedAddressData(supportedTypes) } } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/AddMember.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/AddMember.kt index 2be5370..34eaeb2 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/AddMember.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/AddMember.kt @@ -18,14 +18,20 @@ import org.xmlpull.v1.XmlPullParser data class AddMember( val href: String? ): Property { + companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "add-member") + } object Factory: PropertyFactory { + override fun getName() = NAME override fun create(parser: XmlPullParser) = AddMember(XmlReader(parser).readTextProperty(DavResource.HREF)) + } -} \ No newline at end of file + +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CreationDate.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CreationDate.kt index 6695471..f7ed594 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CreationDate.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CreationDate.kt @@ -14,15 +14,21 @@ import org.xmlpull.v1.XmlPullParser data class CreationDate( var creationDate: String? ): Property { + companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "creationdate") + } object Factory: PropertyFactory { + override fun getName() = NAME override fun create(parser: XmlPullParser) = CreationDate(XmlReader(parser).readText()) + } -} \ No newline at end of file + +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrincipal.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrincipal.kt index 0b5700a..4b44870 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrincipal.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrincipal.kt @@ -19,8 +19,10 @@ data class CurrentUserPrincipal( ): Property { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "current-user-principal") + } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrivilegeSet.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrivilegeSet.kt index ce3ee57..b5e8349 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrivilegeSet.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/CurrentUserPrivilegeSet.kt @@ -15,11 +15,11 @@ import org.xmlpull.v1.XmlPullParser data class CurrentUserPrivilegeSet( // not all privileges from RFC 3744 are implemented by now // feel free to add more if you need them for your project - var mayRead: Boolean = false, - var mayWriteProperties: Boolean = false, - var mayWriteContent: Boolean = false, - var mayBind: Boolean = false, - var mayUnbind: Boolean = false + val mayRead: Boolean = false, + val mayWriteProperties: Boolean = false, + val mayWriteContent: Boolean = false, + val mayBind: Boolean = false, + val mayUnbind: Boolean = false ): Property { companion object { @@ -46,7 +46,7 @@ data class CurrentUserPrivilegeSet( override fun create(parser: XmlPullParser): CurrentUserPrivilegeSet { // // - val privs = CurrentUserPrivilegeSet() + var privs = CurrentUserPrivilegeSet() XmlReader(parser).processTag(PRIVILEGE) { val depth = parser.depth @@ -55,27 +55,31 @@ data class CurrentUserPrivilegeSet( if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) when (parser.propertyName()) { READ -> - privs.mayRead = true + privs = privs.copy(mayRead = true) WRITE -> { - privs.mayBind = true - privs.mayUnbind = true - privs.mayWriteProperties = true - privs.mayWriteContent = true + privs = privs.copy( + mayBind = true, + mayUnbind = true, + mayWriteProperties = true, + mayWriteContent = true + ) } WRITE_PROPERTIES -> - privs.mayWriteProperties = true + privs = privs.copy(mayWriteProperties = true) WRITE_CONTENT -> - privs.mayWriteContent = true + privs = privs.copy(mayWriteContent = true) BIND -> - privs.mayBind = true + privs = privs.copy(mayBind = true) UNBIND -> - privs.mayUnbind = true + privs = privs.copy(mayUnbind = true) ALL -> { - privs.mayRead = true - privs.mayBind = true - privs.mayUnbind = true - privs.mayWriteProperties = true - privs.mayWriteContent = true + privs = privs.copy( + mayRead = true, + mayBind = true, + mayUnbind = true, + mayWriteProperties = true, + mayWriteContent = true + ) } } eventType = parser.next() @@ -84,5 +88,7 @@ data class CurrentUserPrivilegeSet( return privs } + } + } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/DisplayName.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/DisplayName.kt index 4e020b5..d067cfe 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/DisplayName.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/DisplayName.kt @@ -16,8 +16,10 @@ data class DisplayName( ): Property { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "displayname") + } @@ -30,4 +32,5 @@ data class DisplayName( DisplayName(XmlReader(parser).readText()) } + } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentLength.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentLength.kt index 075d120..2cb599a 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentLength.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentLength.kt @@ -14,15 +14,21 @@ import org.xmlpull.v1.XmlPullParser data class GetContentLength( val contentLength: Long? ) : Property { + companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "getcontentlength") + } object Factory: PropertyFactory { + override fun getName() = NAME override fun create(parser: XmlPullParser) = GetContentLength(XmlReader(parser).readLong()) + } -} \ No newline at end of file + +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentType.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentType.kt index 0ad80de..62c3433 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentType.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetContentType.kt @@ -18,8 +18,10 @@ data class GetContentType( ): Property { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "getcontenttype") + } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetETag.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetETag.kt index 1f507f1..fca84e7 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetETag.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetETag.kt @@ -19,8 +19,8 @@ import org.xmlpull.v1.XmlPullParser * Can also be used to parse ETags from HTTP responses – just pass the raw ETag * header value to the constructor and then use [eTag] and [weak]. */ -class GetETag( - rawETag: String? +data class GetETag( + val rawETag: String? ): Property { companion object { @@ -65,8 +65,6 @@ class GetETag( } } - override fun toString() = "ETag(weak=${weak}, tag=$eTag)" - override fun equals(other: Any?): Boolean { if (other !is GetETag) return false diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetLastModified.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetLastModified.kt index bd0db2c..abd22eb 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetLastModified.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetLastModified.kt @@ -9,16 +9,18 @@ package at.bitfire.dav4jvm.property.webdav import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.PropertyFactory import at.bitfire.dav4jvm.XmlReader -import org.xmlpull.v1.XmlPullParser import java.time.Instant +import org.xmlpull.v1.XmlPullParser data class GetLastModified( - var lastModified: Instant? + val lastModified: Instant? ): Property { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "getlastmodified") + } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GroupMembership.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GroupMembership.kt index 90f434f..7e36bfb 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GroupMembership.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GroupMembership.kt @@ -9,11 +9,15 @@ package at.bitfire.dav4jvm.property.webdav import at.bitfire.dav4jvm.Property import org.xmlpull.v1.XmlPullParser -class GroupMembership: HrefListProperty() { +class GroupMembership( + override val hrefs: List +): HrefListProperty(hrefs) { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "group-membership") + } @@ -21,7 +25,7 @@ class GroupMembership: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, GroupMembership()) + override fun create(parser: XmlPullParser) = create(parser, ::GroupMembership) } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/HrefListProperty.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/HrefListProperty.kt index 4bfb3a4..d0048af 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/HrefListProperty.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/HrefListProperty.kt @@ -11,25 +11,37 @@ import at.bitfire.dav4jvm.Property import at.bitfire.dav4jvm.PropertyFactory import at.bitfire.dav4jvm.XmlReader import org.xmlpull.v1.XmlPullParser -import java.util.* -abstract class HrefListProperty: Property { - - val hrefs = LinkedList() - - val href - get() = hrefs.firstOrNull() +/** + * Represents a list of hrefs. + * + * Every [HrefListProperty] must be a data class. + */ +abstract class HrefListProperty( + open val hrefs: List +): Property { - override fun toString() = "href=[" + hrefs.joinToString(", ") + "]" + val href get() = hrefs.firstOrNull() abstract class Factory : PropertyFactory { + @Deprecated("hrefs is no longer mutable.", level = DeprecationLevel.ERROR) fun create(parser: XmlPullParser, list: HrefListProperty): HrefListProperty { - XmlReader(parser).readTextPropertyList(DavResource.HREF, list.hrefs) + val hrefs = list.hrefs.toMutableList() + XmlReader(parser).readTextPropertyList(DavResource.HREF, hrefs) return list } + fun create( + parser: XmlPullParser, + constructor: (hrefs: List + ) -> PropertyType): PropertyType { + val hrefs = mutableListOf() + XmlReader(parser).readTextPropertyList(DavResource.HREF, hrefs) + return constructor(hrefs) + } + } -} \ No newline at end of file +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/Owner.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/Owner.kt index 851b861..e7ada5e 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/Owner.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/Owner.kt @@ -9,11 +9,15 @@ package at.bitfire.dav4jvm.property.webdav import at.bitfire.dav4jvm.Property import org.xmlpull.v1.XmlPullParser -class Owner: HrefListProperty() { +data class Owner( + override val hrefs: List +): HrefListProperty(hrefs) { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "owner") + } @@ -21,8 +25,8 @@ class Owner: HrefListProperty() { override fun getName() = NAME - override fun create(parser: XmlPullParser) = create(parser, Owner()) + override fun create(parser: XmlPullParser) = create(parser, ::Owner) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaAvailableBytes.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaAvailableBytes.kt index b39bb25..e8184bb 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaAvailableBytes.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaAvailableBytes.kt @@ -14,15 +14,21 @@ import org.xmlpull.v1.XmlPullParser data class QuotaAvailableBytes( val quotaAvailableBytes: Long? ) : Property { + companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "quota-available-bytes") + } object Factory: PropertyFactory { + override fun getName() = NAME override fun create(parser: XmlPullParser) = QuotaAvailableBytes(XmlReader(parser).readLong()) + } -} \ No newline at end of file + +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaUsedBytes.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaUsedBytes.kt index 221687c..603192b 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaUsedBytes.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/QuotaUsedBytes.kt @@ -14,15 +14,21 @@ import org.xmlpull.v1.XmlPullParser data class QuotaUsedBytes( val quotaUsedBytes: Long? ) : Property { + companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "quota-used-bytes") + } object Factory: PropertyFactory { + override fun getName() = NAME override fun create(parser: XmlPullParser) = QuotaUsedBytes(XmlReader(parser).readLong()) + } -} \ No newline at end of file + +} diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/ResourceType.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/ResourceType.kt index a052bdc..e41bdc6 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/ResourceType.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/ResourceType.kt @@ -13,9 +13,12 @@ import at.bitfire.dav4jvm.property.caldav.NS_CALENDARSERVER import at.bitfire.dav4jvm.property.carddav.NS_CARDDAV import org.xmlpull.v1.XmlPullParser -class ResourceType: Property { +class ResourceType( + val types: Set = emptySet() +): Property { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "resourcetype") @@ -28,11 +31,8 @@ class ResourceType: Property { val CALENDAR_PROXY_READ = Property.Name(NS_CALENDARSERVER, "calendar-proxy-read") // CalDAV Proxy val CALENDAR_PROXY_WRITE = Property.Name(NS_CALENDARSERVER, "calendar-proxy-write") // CalDAV Proxy val SUBSCRIBED = Property.Name(NS_CALENDARSERVER, "subscribed") - } - val types = mutableSetOf() - - override fun toString() = "[${types.joinToString(", ")}]" + } object Factory: PropertyFactory { @@ -40,7 +40,7 @@ class ResourceType: Property { override fun getName() = NAME override fun create(parser: XmlPullParser): ResourceType { - val type = ResourceType() + val types = mutableSetOf() val depth = parser.depth var eventType = parser.eventType @@ -57,13 +57,13 @@ class ResourceType: Property { CALENDAR_PROXY_WRITE -> typeName = CALENDAR_PROXY_WRITE SUBSCRIBED -> typeName = SUBSCRIBED } - type.types.add(typeName) + types.add(typeName) } eventType = parser.next() } assert(parser.depth == depth) - return type + return ResourceType(types) } } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SupportedReportSet.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SupportedReportSet.kt index d2c5548..cf390c0 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SupportedReportSet.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SupportedReportSet.kt @@ -11,7 +11,9 @@ import at.bitfire.dav4jvm.PropertyFactory import at.bitfire.dav4jvm.XmlReader import org.xmlpull.v1.XmlPullParser -class SupportedReportSet: Property { +data class SupportedReportSet( + val reports: Set = emptySet() +): Property { companion object { @@ -25,10 +27,6 @@ class SupportedReportSet: Property { } - val reports = mutableSetOf() - - override fun toString() = "[${reports.joinToString(", ")}]" - object Factory: PropertyFactory { @@ -40,17 +38,17 @@ class SupportedReportSet: Property { */ - val supported = SupportedReportSet() + val reports = mutableSetOf() XmlReader(parser).processTag(SUPPORTED_REPORT) { processTag(REPORT) { parser.nextTag() if (parser.eventType == XmlPullParser.TEXT) - supported.reports += parser.text + reports += parser.text else if (parser.eventType == XmlPullParser.START_TAG) - supported.reports += "${parser.namespace}${parser.name}" + reports += "${parser.namespace}${parser.name}" } } - return supported + return SupportedReportSet(reports) } } diff --git a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SyncToken.kt b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SyncToken.kt index 03057cd..0138ecb 100644 --- a/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SyncToken.kt +++ b/src/main/kotlin/at/bitfire/dav4jvm/property/webdav/SyncToken.kt @@ -16,8 +16,10 @@ data class SyncToken( ): Property { companion object { + @JvmField val NAME = Property.Name(NS_WEBDAV, "sync-token") + } @@ -30,4 +32,5 @@ data class SyncToken( SyncToken(XmlReader(parser).readText()) } + }