Skip to content

Commit 486c896

Browse files
ArnyminerZrfc2822
andauthored
Latest elements from WebDAV-Push (#64)
* Added `property-update` * Added `content-update` * Added `depth` * Updated `push-message` contents Signed-off-by: Arnau Mora <[email protected]> * Added `supported-triggers` Signed-off-by: Arnau Mora <[email protected]> * Added `sync-level` Signed-off-by: Arnau Mora <[email protected]> * Changed namespace of SyncLevel and Depth Signed-off-by: Arnau Mora <[email protected]> * Added trigger Signed-off-by: Arnau Mora <[email protected]> * Initialization changes Signed-off-by: Arnau Mora <[email protected]> * Fixed tests Signed-off-by: Arnau Mora <[email protected]> * Got rid of unused function Signed-off-by: Arnau Mora <[email protected]> * Fixed namespaces Signed-off-by: Arnau Mora <[email protected]> * Update content-update and depth --------- Signed-off-by: Arnau Mora <[email protected]> Co-authored-by: Ricki Hirner <[email protected]>
1 parent a4f4068 commit 486c896

File tree

9 files changed

+331
-44
lines changed

9 files changed

+331
-44
lines changed
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package at.bitfire.dav4jvm.property.push
2+
3+
import at.bitfire.dav4jvm.Property
4+
import at.bitfire.dav4jvm.PropertyFactory
5+
import at.bitfire.dav4jvm.XmlUtils.propertyName
6+
import at.bitfire.dav4jvm.property.webdav.Depth
7+
import at.bitfire.dav4jvm.property.webdav.SyncLevel
8+
import at.bitfire.dav4jvm.property.webdav.SyncToken
9+
import org.xmlpull.v1.XmlPullParser
10+
11+
/**
12+
* Represents a [NS_WEBDAV_PUSH]`:content-update` property.
13+
*
14+
* Experimental! See https://github.com/bitfireAT/webdav-push/
15+
*/
16+
data class ContentUpdate(
17+
val depth: Depth? = null,
18+
val syncToken: SyncToken? = null
19+
): Property {
20+
21+
companion object {
22+
23+
@JvmField
24+
val NAME = Property.Name(NS_WEBDAV_PUSH, "content-update")
25+
26+
}
27+
28+
29+
object Factory: PropertyFactory {
30+
31+
override fun getName() = NAME
32+
33+
override fun create(parser: XmlPullParser): ContentUpdate {
34+
var contentUpdate = ContentUpdate()
35+
36+
val depth = parser.depth
37+
var eventType = parser.eventType
38+
while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) {
39+
if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) {
40+
when (parser.propertyName()) {
41+
SyncLevel.NAME -> contentUpdate = contentUpdate.copy(
42+
depth = Depth.Factory.create(parser)
43+
)
44+
SyncToken.NAME -> contentUpdate = contentUpdate.copy(
45+
syncToken = SyncToken.Factory.create(parser)
46+
)
47+
}
48+
}
49+
eventType = parser.next()
50+
}
51+
52+
return contentUpdate
53+
}
54+
55+
}
56+
57+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package at.bitfire.dav4jvm.property.push
2+
3+
import at.bitfire.dav4jvm.Property
4+
import at.bitfire.dav4jvm.PropertyFactory
5+
import at.bitfire.dav4jvm.XmlUtils.propertyName
6+
import at.bitfire.dav4jvm.property.webdav.SyncLevel
7+
import org.xmlpull.v1.XmlPullParser
8+
9+
/**
10+
* Represents a [NS_WEBDAV_PUSH]`:property-update` property.
11+
*
12+
* Experimental! See https://github.com/bitfireAT/webdav-push/
13+
*/
14+
data class PropertyUpdate(
15+
val syncLevel: SyncLevel? = null,
16+
): Property {
17+
18+
companion object {
19+
20+
@JvmField
21+
val NAME = Property.Name(NS_WEBDAV_PUSH, "property-update")
22+
23+
}
24+
25+
26+
object Factory: PropertyFactory {
27+
28+
override fun getName() = NAME
29+
30+
override fun create(parser: XmlPullParser): PropertyUpdate {
31+
var propertyUpdate = PropertyUpdate()
32+
33+
val depth = parser.depth
34+
var eventType = parser.eventType
35+
while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) {
36+
if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) {
37+
when (parser.propertyName()) {
38+
SyncLevel.NAME -> propertyUpdate = propertyUpdate.copy(
39+
syncLevel = SyncLevel.Factory.create(parser)
40+
)
41+
}
42+
}
43+
eventType = parser.next()
44+
}
45+
return propertyUpdate
46+
}
47+
48+
}
49+
50+
}

src/main/kotlin/at/bitfire/dav4jvm/property/push/PushMessage.kt

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,9 @@
66

77
package at.bitfire.dav4jvm.property.push
88

9-
import at.bitfire.dav4jvm.PropStat
109
import at.bitfire.dav4jvm.Property
1110
import at.bitfire.dav4jvm.PropertyFactory
12-
import at.bitfire.dav4jvm.XmlReader
11+
import at.bitfire.dav4jvm.XmlUtils.propertyName
1312
import org.xmlpull.v1.XmlPullParser
1413

1514
/**
@@ -18,7 +17,9 @@ import org.xmlpull.v1.XmlPullParser
1817
* Experimental! See https://github.com/bitfireAT/webdav-push/
1918
*/
2019
data class PushMessage(
21-
val propStat: PropStat? = null
20+
val topic: Topic? = null,
21+
val contentUpdate: ContentUpdate? = null,
22+
val propertyUpdate: PropertyUpdate? = null
2223
): Property {
2324

2425
companion object {
@@ -34,13 +35,28 @@ data class PushMessage(
3435
override fun getName() = NAME
3536

3637
override fun create(parser: XmlPullParser): PushMessage {
37-
var propStat: PropStat? = null
38+
var message = PushMessage()
3839

39-
XmlReader(parser).processTag(PropStat.NAME) {
40-
propStat = PropStat.parse(parser)
40+
val depth = parser.depth
41+
var eventType = parser.eventType
42+
while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) {
43+
if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) {
44+
when (parser.propertyName()) {
45+
Topic.NAME -> message = message.copy(
46+
topic = Topic.Factory.create(parser)
47+
)
48+
ContentUpdate.NAME -> message = message.copy(
49+
contentUpdate = ContentUpdate.Factory.create(parser)
50+
)
51+
PropertyUpdate.NAME -> message = message.copy(
52+
propertyUpdate = PropertyUpdate.Factory.create(parser)
53+
)
54+
}
55+
}
56+
eventType = parser.next()
4157
}
4258

43-
return PushMessage(propStat)
59+
return message
4460
}
4561

4662
}

src/main/kotlin/at/bitfire/dav4jvm/property/push/PushRegister.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ import org.xmlpull.v1.XmlPullParser
2121
*/
2222
data class PushRegister(
2323
val expires: Instant? = null,
24-
val subscription: Subscription? = null
24+
val subscription: Subscription? = null,
25+
val trigger: Trigger? = null
2526
): Property {
2627

2728
companion object {
@@ -56,6 +57,10 @@ data class PushRegister(
5657
register = register.copy(
5758
subscription = Subscription.Factory.create(parser)
5859
)
60+
Trigger.NAME ->
61+
register = register.copy(
62+
trigger = Trigger.Factory.create(parser)
63+
)
5964
}
6065
eventType = parser.next()
6166
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package at.bitfire.dav4jvm.property.push
2+
3+
import at.bitfire.dav4jvm.Property
4+
import at.bitfire.dav4jvm.PropertyFactory
5+
import at.bitfire.dav4jvm.XmlUtils.propertyName
6+
import org.xmlpull.v1.XmlPullParser
7+
8+
/**
9+
* Represents a [NS_WEBDAV_PUSH]`:content-update` property.
10+
*
11+
* Experimental! See https://github.com/bitfireAT/webdav-push/
12+
*/
13+
data class SupportedTriggers(
14+
val contentUpdate: ContentUpdate? = null,
15+
val propertyUpdate: PropertyUpdate? = null
16+
): Property {
17+
18+
companion object {
19+
20+
@JvmField
21+
val NAME = Property.Name(NS_WEBDAV_PUSH, "supported-triggers")
22+
23+
}
24+
25+
26+
object Factory: PropertyFactory {
27+
28+
override fun getName() = NAME
29+
30+
override fun create(parser: XmlPullParser): SupportedTriggers {
31+
var supportedTriggers = SupportedTriggers()
32+
33+
val depth = parser.depth
34+
var eventType = parser.eventType
35+
while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) {
36+
if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) {
37+
when (parser.propertyName()) {
38+
ContentUpdate.NAME -> supportedTriggers = supportedTriggers.copy(
39+
contentUpdate = ContentUpdate.Factory.create(parser)
40+
)
41+
PropertyUpdate.NAME -> supportedTriggers = supportedTriggers.copy(
42+
propertyUpdate = PropertyUpdate.Factory.create(parser)
43+
)
44+
}
45+
}
46+
eventType = parser.next()
47+
}
48+
49+
return supportedTriggers
50+
}
51+
52+
}
53+
54+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package at.bitfire.dav4jvm.property.push
2+
3+
import at.bitfire.dav4jvm.Property
4+
import at.bitfire.dav4jvm.PropertyFactory
5+
import at.bitfire.dav4jvm.XmlUtils.propertyName
6+
import org.xmlpull.v1.XmlPullParser
7+
8+
data class Trigger(
9+
val contentUpdate: ContentUpdate? = null,
10+
val propertyUpdate: PropertyUpdate? = null
11+
) : Property {
12+
13+
companion object {
14+
15+
@JvmField
16+
val NAME = Property.Name(NS_WEBDAV_PUSH, "trigger")
17+
18+
}
19+
20+
21+
object Factory : PropertyFactory {
22+
23+
override fun getName() = NAME
24+
25+
override fun create(parser: XmlPullParser): Trigger {
26+
var trigger = Trigger()
27+
28+
val depth = parser.depth
29+
var eventType = parser.eventType
30+
while (!(eventType == XmlPullParser.END_TAG && parser.depth == depth)) {
31+
if (eventType == XmlPullParser.START_TAG && parser.depth == depth + 1) {
32+
when (parser.propertyName()) {
33+
ContentUpdate.NAME -> trigger = trigger.copy(
34+
contentUpdate = ContentUpdate.Factory.create(parser)
35+
)
36+
PropertyUpdate.NAME -> trigger = trigger.copy(
37+
propertyUpdate = PropertyUpdate.Factory.create(parser)
38+
)
39+
}
40+
}
41+
eventType = parser.next()
42+
}
43+
44+
return trigger
45+
}
46+
47+
}
48+
49+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package at.bitfire.dav4jvm.property.webdav
2+
3+
import at.bitfire.dav4jvm.Property
4+
import at.bitfire.dav4jvm.PropertyFactory
5+
import at.bitfire.dav4jvm.XmlReader
6+
import org.xmlpull.v1.XmlPullParser
7+
8+
/**
9+
* Represents a [NS_WEBDAV]`:depth` property.
10+
*/
11+
data class Depth(
12+
/** May be `0`, `1` or [Int.MAX_VALUE] (infinite). */
13+
val depth: Int? = null
14+
): Property {
15+
16+
companion object {
17+
18+
@JvmField
19+
val NAME = Property.Name(NS_WEBDAV, "depth")
20+
21+
const val INFINITY = Int.MAX_VALUE
22+
23+
}
24+
25+
26+
object Factory: PropertyFactory {
27+
28+
override fun getName() = NAME
29+
30+
override fun create(parser: XmlPullParser): Depth {
31+
val text = XmlReader(parser).readText()
32+
val level = if (text.equals("infinity", true))
33+
INFINITY
34+
else
35+
text?.toIntOrNull()
36+
return Depth(level)
37+
}
38+
39+
}
40+
41+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package at.bitfire.dav4jvm.property.webdav
2+
3+
import at.bitfire.dav4jvm.Property
4+
import at.bitfire.dav4jvm.PropertyFactory
5+
import at.bitfire.dav4jvm.XmlReader
6+
import org.xmlpull.v1.XmlPullParser
7+
8+
/**
9+
* Represents a [NS_WEBDAV]`:sync-level` property.
10+
*/
11+
data class SyncLevel(
12+
/** May be `0`, `1` or [Int.MAX_VALUE] (infinite). */
13+
val level: Int? = null
14+
): Property {
15+
16+
companion object {
17+
18+
@JvmField
19+
val NAME = Property.Name(NS_WEBDAV, "sync-level")
20+
21+
}
22+
23+
24+
object Factory: PropertyFactory {
25+
26+
override fun getName() = NAME
27+
28+
override fun create(parser: XmlPullParser): SyncLevel {
29+
val text = XmlReader(parser).readText()
30+
val level = if (text == "infinite") Int.MAX_VALUE else text?.toIntOrNull()
31+
return SyncLevel(level)
32+
}
33+
34+
}
35+
36+
}

0 commit comments

Comments
 (0)