Skip to content
This repository was archived by the owner on Jun 9, 2025. It is now read-only.

Commit d077602

Browse files
authored
Remove unnecssary contextClassLoader checks (#199)
* Remove thread context class loader checks and remove Ical4Android class * Add test for ical4j ServiceLoader without per-thread context class loader
1 parent ef907cf commit d077602

File tree

8 files changed

+79
-31
lines changed

8 files changed

+79
-31
lines changed

lib/src/main/kotlin/at/bitfire/ical4android/Event.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -243,8 +243,6 @@ data class Event(
243243

244244

245245
fun write(os: OutputStream) {
246-
Ical4Android.checkThreadContextClassLoader()
247-
248246
val ical = Calendar()
249247
ical.properties += Version.VERSION_2_0
250248
ical.properties += prodId()

lib/src/main/kotlin/at/bitfire/ical4android/ICalendar.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
package at.bitfire.ical4android
66

7+
import at.bitfire.ical4android.ICalendar.Companion.CALENDAR_NAME
78
import at.bitfire.ical4android.validation.ICalPreprocessor
89
import net.fortuna.ical4j.data.CalendarBuilder
910
import net.fortuna.ical4j.data.CalendarParserFactory
@@ -80,7 +81,6 @@ open class ICalendar {
8081
* @throws IllegalArgumentException when the iCalendar resource contains an invalid value
8182
*/
8283
fun fromReader(reader: Reader, properties: MutableMap<String, String>? = null): Calendar {
83-
Ical4Android.checkThreadContextClassLoader()
8484
logger.fine("Parsing iCalendar stream")
8585

8686
// preprocess stream to work around some problems that can't be fixed later
@@ -229,7 +229,6 @@ open class ICalendar {
229229
* @return time zone id (TZID) if VTIMEZONE contains a TZID, null otherwise
230230
*/
231231
fun timezoneDefToTzId(timezoneDef: String): String? {
232-
Ical4Android.checkThreadContextClassLoader()
233232
try {
234233
val builder = CalendarBuilder()
235234
val cal = builder.build(StringReader(timezoneDef))

lib/src/main/kotlin/at/bitfire/ical4android/Ical4Android.kt renamed to lib/src/main/kotlin/at/bitfire/ical4android/Ical4jVersion.kt

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,15 +4,8 @@
44

55
package at.bitfire.ical4android
66

7+
/**
8+
* The used version of ical4j.
9+
*/
710
@Suppress("unused")
8-
object Ical4Android {
9-
10-
const val ical4jVersion = BuildConfig.version_ical4j
11-
12-
13-
fun checkThreadContextClassLoader() {
14-
if (Thread.currentThread().contextClassLoader == null)
15-
throw IllegalStateException("Thread.currentThread().contextClassLoader must be set for java.util.ServiceLoader (used by ical4j)")
16-
}
17-
18-
}
11+
const val ical4jVersion = BuildConfig.version_ical4j

lib/src/main/kotlin/at/bitfire/ical4android/JtxICalObject.kt

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,42 @@ import net.fortuna.ical4j.model.parameter.Rsvp
4747
import net.fortuna.ical4j.model.parameter.SentBy
4848
import net.fortuna.ical4j.model.parameter.Value
4949
import net.fortuna.ical4j.model.parameter.XParameter
50-
import net.fortuna.ical4j.model.property.*
50+
import net.fortuna.ical4j.model.property.Action
51+
import net.fortuna.ical4j.model.property.Attach
52+
import net.fortuna.ical4j.model.property.Categories
53+
import net.fortuna.ical4j.model.property.Clazz
54+
import net.fortuna.ical4j.model.property.Color
55+
import net.fortuna.ical4j.model.property.Comment
56+
import net.fortuna.ical4j.model.property.Completed
57+
import net.fortuna.ical4j.model.property.Contact
58+
import net.fortuna.ical4j.model.property.Created
59+
import net.fortuna.ical4j.model.property.Description
60+
import net.fortuna.ical4j.model.property.DtEnd
61+
import net.fortuna.ical4j.model.property.DtStamp
62+
import net.fortuna.ical4j.model.property.DtStart
63+
import net.fortuna.ical4j.model.property.Due
64+
import net.fortuna.ical4j.model.property.Duration
65+
import net.fortuna.ical4j.model.property.ExDate
66+
import net.fortuna.ical4j.model.property.Geo
67+
import net.fortuna.ical4j.model.property.LastModified
68+
import net.fortuna.ical4j.model.property.Location
69+
import net.fortuna.ical4j.model.property.PercentComplete
70+
import net.fortuna.ical4j.model.property.Priority
71+
import net.fortuna.ical4j.model.property.ProdId
72+
import net.fortuna.ical4j.model.property.RDate
73+
import net.fortuna.ical4j.model.property.RRule
74+
import net.fortuna.ical4j.model.property.RecurrenceId
75+
import net.fortuna.ical4j.model.property.RelatedTo
76+
import net.fortuna.ical4j.model.property.Repeat
77+
import net.fortuna.ical4j.model.property.Resources
78+
import net.fortuna.ical4j.model.property.Sequence
79+
import net.fortuna.ical4j.model.property.Status
80+
import net.fortuna.ical4j.model.property.Summary
81+
import net.fortuna.ical4j.model.property.Trigger
82+
import net.fortuna.ical4j.model.property.Uid
83+
import net.fortuna.ical4j.model.property.Url
84+
import net.fortuna.ical4j.model.property.Version
85+
import net.fortuna.ical4j.model.property.XProperty
5186
import java.io.FileNotFoundException
5287
import java.io.IOException
5388
import java.io.OutputStream
@@ -593,8 +628,6 @@ open class JtxICalObject(
593628
* @return The current JtxICalObject transformed into a ical4j Calendar
594629
*/
595630
fun getICalendarFormat(): Calendar? {
596-
Ical4Android.checkThreadContextClassLoader()
597-
598631
val ical = Calendar()
599632
ical.properties += Version.VERSION_2_0
600633
ical.properties += ICalendar.prodId(listOf(TaskProvider.ProviderName.JtxBoard.packageName))
@@ -697,7 +730,6 @@ open class JtxICalObject(
697730
* @param [os] OutputStream where iCalendar should be written to
698731
*/
699732
fun write(os: OutputStream) {
700-
Ical4Android.checkThreadContextClassLoader()
701733
CalendarOutputter(false).output(this.getICalendarFormat(), os)
702734
}
703735

lib/src/main/kotlin/at/bitfire/ical4android/Task.kt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,6 @@ data class Task(
193193

194194

195195
fun write(os: OutputStream) {
196-
Ical4Android.checkThreadContextClassLoader()
197-
198196
val ical = Calendar()
199197
ical.properties += Version.VERSION_2_0
200198
ical.properties += prodId()

lib/src/main/kotlin/at/bitfire/ical4android/util/AndroidTimeUtils.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,14 @@
77
package at.bitfire.ical4android.util
88

99
import android.text.format.Time
10-
import at.bitfire.ical4android.Ical4Android
10+
import at.bitfire.ical4android.util.AndroidTimeUtils.androidifyTimeZone
11+
import at.bitfire.ical4android.util.AndroidTimeUtils.storageTzId
1112
import at.bitfire.ical4android.util.TimeApiExtensions.toLocalDate
1213
import at.bitfire.ical4android.util.TimeApiExtensions.toZonedDateTime
13-
import net.fortuna.ical4j.model.*
1414
import net.fortuna.ical4j.model.Date
15+
import net.fortuna.ical4j.model.DateList
16+
import net.fortuna.ical4j.model.DateTime
17+
import net.fortuna.ical4j.model.TemporalAmountAdapter
1518
import net.fortuna.ical4j.model.TimeZone
1619
import net.fortuna.ical4j.model.parameter.Value
1720
import net.fortuna.ical4j.model.property.DateListProperty
@@ -27,7 +30,8 @@ import java.time.ZoneOffset
2730
import java.time.ZonedDateTime
2831
import java.time.format.DateTimeFormatter
2932
import java.time.temporal.TemporalAmount
30-
import java.util.*
33+
import java.util.LinkedList
34+
import java.util.Locale
3135
import java.util.logging.Logger
3236

3337
object AndroidTimeUtils {

lib/src/main/kotlin/at/bitfire/ical4android/util/DateUtils.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
package at.bitfire.ical4android.util
66

7-
import at.bitfire.ical4android.Ical4Android
87
import net.fortuna.ical4j.data.CalendarBuilder
98
import net.fortuna.ical4j.model.Date
109
import net.fortuna.ical4j.model.DateTime
@@ -24,10 +23,6 @@ import java.util.logging.Logger
2423
*/
2524
object DateUtils {
2625

27-
init {
28-
Ical4Android.checkThreadContextClassLoader()
29-
}
30-
3126
private val logger
3227
get() = Logger.getLogger(javaClass.name)
3328

@@ -130,8 +125,6 @@ object DateUtils {
130125
* @return parsed [VTimeZone], or `null` when the timezone definition can't be parsed
131126
*/
132127
fun parseVTimeZone(timezoneDef: String): VTimeZone? {
133-
Ical4Android.checkThreadContextClassLoader()
134-
135128
val builder = CalendarBuilder(tzRegistry)
136129
try {
137130
val cal = builder.build(StringReader(timezoneDef))
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package at.bitfire.ical4android
2+
3+
import net.fortuna.ical4j.data.CalendarBuilder
4+
import net.fortuna.ical4j.model.Component
5+
import net.fortuna.ical4j.model.component.VEvent
6+
import org.junit.Assert.assertEquals
7+
import org.junit.Test
8+
import java.io.StringReader
9+
10+
class Ical4jServiceLoaderTest {
11+
12+
@Test
13+
fun Ical4j_ServiceLoader_DoesntNeedContextClassLoader() {
14+
Thread.currentThread().contextClassLoader = null
15+
16+
val iCal = "BEGIN:VCALENDAR\n" +
17+
"PRODID:-//xyz Corp//NONSGML PDA Calendar Version 1.0//EN\n" +
18+
"VERSION:2.0\n" +
19+
"BEGIN:VEVENT\n" +
20+
21+
"DTSTART:19960918T143000Z\n" +
22+
"DTEND:19960920T220000Z\n" +
23+
"SUMMARY:Networld+Interop Conference\n" +
24+
"END:VEVENT\n" +
25+
"END:VCALENDAR\n"
26+
val result = CalendarBuilder().build(StringReader(iCal))
27+
val vEvent = result.getComponent<VEvent>(Component.VEVENT)
28+
assertEquals("Networld+Interop Conference", vEvent.summary.value)
29+
}
30+
31+
}

0 commit comments

Comments
 (0)