Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Make all properties data classes #62

Merged
merged 8 commits into from
Dec 5, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion src/main/kotlin/at/bitfire/dav4jvm/Property.kt
Original file line number Diff line number Diff line change
@@ -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 {

Original file line number Diff line number Diff line change
@@ -10,19 +10,23 @@ 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<String> = emptyList()
): HrefListProperty(hrefs) {

companion object {

@JvmField
val NAME = Property.Name(NS_CALDAV, "calendar-home-set")

}


object Factory: HrefListProperty.Factory() {

override fun getName() = NAME

override fun create(parser: XmlPullParser) = create(parser, CalendarHomeSet())
override fun create(parser: XmlPullParser) = create(parser, ::CalendarHomeSet)

}

Original file line number Diff line number Diff line change
@@ -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<String> = 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)

}

Original file line number Diff line number Diff line change
@@ -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<String> = 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)

}

Original file line number Diff line number Diff line change
@@ -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 {

Original file line number Diff line number Diff line change
@@ -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<String> = 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)

}

Original file line number Diff line number Diff line change
@@ -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
10 changes: 7 additions & 3 deletions src/main/kotlin/at/bitfire/dav4jvm/property/caldav/Source.kt
Original file line number Diff line number Diff line change
@@ -10,20 +10,24 @@ 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<String> = emptyList()
): HrefListProperty(hrefs) {

companion object {

@JvmField
val NAME = Property.Name(NS_CALENDARSERVER, "source")

}


object Factory: HrefListProperty.Factory() {

override fun getName() = NAME

override fun create(parser: XmlPullParser) = create(parser, Source())
override fun create(parser: XmlPullParser) = create(parser, ::Source)

}

}
}
Original file line number Diff line number Diff line change
@@ -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,23 +37,29 @@ data class SupportedCalendarComponentSet(
<!ELEMENT comp ((allprop | prop*), (allcomp | comp*))>
<!ATTLIST comp name CDATA #REQUIRED>
*/
val components = SupportedCalendarComponentSet(false, false, false)
var components = SupportedCalendarComponentSet(
supportsEvents = false,
supportsTasks = false,
supportsJournal = false
)

val depth = parser.depth
var eventType = parser.eventType
while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) {
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)
}
}
}
Original file line number Diff line number Diff line change
@@ -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<MediaType> = emptySet()
): Property {

companion object {

@@ -25,23 +27,19 @@ class SupportedCalendarData: Property {

}

val types = mutableSetOf<MediaType>()

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<MediaType>()

XmlReader(parser).readContentTypes(CALENDAR_DATA_TYPE, supported.types::add)
XmlReader(parser).readContentTypes(CALENDAR_DATA_TYPE, supportedTypes::add)

return supported
return SupportedCalendarData(supportedTypes)
}

}
Original file line number Diff line number Diff line change
@@ -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"

}


Original file line number Diff line number Diff line change
@@ -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 {
Original file line number Diff line number Diff line change
@@ -10,19 +10,23 @@ 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<String> = emptyList()
): HrefListProperty(hrefs) {

companion object {

@JvmField
val NAME = Property.Name(NS_CARDDAV, "addressbook-home-set")

}


object Factory: HrefListProperty.Factory() {

override fun getName() = NAME

override fun create(parser: XmlPullParser) = create(parser, AddressbookHomeSet())
override fun create(parser: XmlPullParser) = create(parser, ::AddressbookHomeSet)

}

Original file line number Diff line number Diff line change
@@ -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())

}
}

}
Original file line number Diff line number Diff line change
@@ -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<MediaType> = emptySet()
): Property {

companion object {

@@ -25,8 +27,6 @@ class SupportedAddressData: Property {

}

val types = mutableSetOf<MediaType>()

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<MediaType>()

XmlReader(parser).readContentTypes(ADDRESS_DATA_TYPE, supported.types::add)
XmlReader(parser).readContentTypes(ADDRESS_DATA_TYPE, supportedTypes::add)

return supported
return SupportedAddressData(supportedTypes)
}

}
Original file line number Diff line number Diff line change
@@ -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))

}
}

}
Original file line number Diff line number Diff line change
@@ -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())

}
}

}
Original file line number Diff line number Diff line change
@@ -19,8 +19,10 @@ data class CurrentUserPrincipal(
): Property {

companion object {

@JvmField
val NAME = Property.Name(NS_WEBDAV, "current-user-principal")

}


Original file line number Diff line number Diff line change
@@ -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 {
// <!ELEMENT current-user-privilege-set (privilege*)>
// <!ELEMENT privilege ANY>
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
}

}

}
Original file line number Diff line number Diff line change
@@ -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())

}

}
Original file line number Diff line number Diff line change
@@ -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())

}
}

}
Original file line number Diff line number Diff line change
@@ -18,8 +18,10 @@ data class GetContentType(
): Property {

companion object {

@JvmField
val NAME = Property.Name(NS_WEBDAV, "getcontenttype")

}


6 changes: 2 additions & 4 deletions src/main/kotlin/at/bitfire/dav4jvm/property/webdav/GetETag.kt
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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")

}


Original file line number Diff line number Diff line change
@@ -9,19 +9,23 @@ 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<String>
): HrefListProperty(hrefs) {

companion object {

@JvmField
val NAME = Property.Name(NS_WEBDAV, "group-membership")

}


object Factory: HrefListProperty.Factory() {

override fun getName() = NAME

override fun create(parser: XmlPullParser) = create(parser, GroupMembership())
override fun create(parser: XmlPullParser) = create(parser, ::GroupMembership)

}

Original file line number Diff line number Diff line change
@@ -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<String>()

val href
get() = hrefs.firstOrNull()
/**
* Represents a list of hrefs.
*
* Every [HrefListProperty] must be a data class.
*/
abstract class HrefListProperty(
open val hrefs: List<String>
): 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 <PropertyType> create(
parser: XmlPullParser,
constructor: (hrefs: List<String>
) -> PropertyType): PropertyType {
val hrefs = mutableListOf<String>()
XmlReader(parser).readTextPropertyList(DavResource.HREF, hrefs)
return constructor(hrefs)
}

}

}
}
10 changes: 7 additions & 3 deletions src/main/kotlin/at/bitfire/dav4jvm/property/webdav/Owner.kt
Original file line number Diff line number Diff line change
@@ -9,20 +9,24 @@ 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<String>
): HrefListProperty(hrefs) {

companion object {

@JvmField
val NAME = Property.Name(NS_WEBDAV, "owner")

}


object Factory: HrefListProperty.Factory() {

override fun getName() = NAME

override fun create(parser: XmlPullParser) = create(parser, Owner())
override fun create(parser: XmlPullParser) = create(parser, ::Owner)

}

}
}
Original file line number Diff line number Diff line change
@@ -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())

}
}

}
Original file line number Diff line number Diff line change
@@ -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())

}
}

}
Original file line number Diff line number Diff line change
@@ -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<Property.Name> = emptySet()
): Property {

companion object {

@JvmField
val NAME = Property.Name(NS_WEBDAV, "resourcetype")

@@ -28,19 +31,16 @@ 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<Property.Name>()

override fun toString() = "[${types.joinToString(", ")}]"
}


object Factory: PropertyFactory {

override fun getName() = NAME

override fun create(parser: XmlPullParser): ResourceType {
val type = ResourceType()
val types = mutableSetOf<Property.Name>()

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)
}

}
Original file line number Diff line number Diff line change
@@ -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<String> = emptySet()
): Property {

companion object {

@@ -25,10 +27,6 @@ class SupportedReportSet: Property {

}

val reports = mutableSetOf<String>()

override fun toString() = "[${reports.joinToString(", ")}]"


object Factory: PropertyFactory {

@@ -40,17 +38,17 @@ class SupportedReportSet: Property {
<!ELEMENT report ANY>
*/

val supported = SupportedReportSet()
val reports = mutableSetOf<String>()
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)
}

}
Original file line number Diff line number Diff line change
@@ -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())

}

}