diff --git a/src/main/java/net/fortuna/ical4j/model/Calendar.java b/src/main/java/net/fortuna/ical4j/model/Calendar.java index 713d5fae1..039604fcc 100644 --- a/src/main/java/net/fortuna/ical4j/model/Calendar.java +++ b/src/main/java/net/fortuna/ical4j/model/Calendar.java @@ -225,7 +225,12 @@ public final ComponentList getComponents(final * @return the first matching component in the component list with the specified name */ public final Optional getComponent(final String name) { - return (Optional) getComponents().getComponent(name); + return getComponents().getComponent(name); + } + + public final T getRequiredComponent(String name) throws ConstraintViolationException { + Optional component = getComponent(name); + return component.orElseThrow(() -> new ConstraintViolationException(String.format("Missing %s component", name))); } /** @@ -253,6 +258,11 @@ public final Optional getProperty(final String name) { return getProperties().getProperty(name); } + public final T getRequiredProperty(String name) throws ConstraintViolationException { + Optional property = getProperty(name); + return property.orElseThrow(() -> new ConstraintViolationException(String.format("Missing %s property", name))); + } + /** * Perform validation on the calendar, its properties and its components in its current state. * @throws ValidationException where the calendar is not in a valid state diff --git a/src/main/java/net/fortuna/ical4j/model/Component.java b/src/main/java/net/fortuna/ical4j/model/Component.java index 24b12ea72..0cfba96c8 100644 --- a/src/main/java/net/fortuna/ical4j/model/Component.java +++ b/src/main/java/net/fortuna/ical4j/model/Component.java @@ -198,9 +198,9 @@ public Optional getProperty(final String name) { * @return the first matching property in the property list with the specified name * @throws ConstraintViolationException when a property is not found */ - protected final T getRequiredProperty(String name) throws ConstraintViolationException { - return (T) getProperties().getProperty(name).orElseThrow(() -> - new ConstraintViolationException(String.format("Missing %s property", name))); + public final T getRequiredProperty(String name) throws ConstraintViolationException { + Optional property = getProperty(name); + return property.orElseThrow(() -> new ConstraintViolationException(String.format("Missing %s property", name))); } /** diff --git a/src/main/java/net/fortuna/ical4j/model/ComponentList.java b/src/main/java/net/fortuna/ical4j/model/ComponentList.java index 82e94b256..7b59e66f9 100644 --- a/src/main/java/net/fortuna/ical4j/model/ComponentList.java +++ b/src/main/java/net/fortuna/ical4j/model/ComponentList.java @@ -95,10 +95,10 @@ public final String toString() { * @param aName name of component to return * @return a component or null if no matching component found */ - public final Optional getComponent(final String aName) { + public final Optional getComponent(final String aName) { for (final T c : this) { if (c.getName().equals(aName)) { - return Optional.of(c); + return Optional.of((R) c); } } return Optional.empty(); diff --git a/src/test/java/net/fortuna/ical4j/model/property/ExDateTest.java b/src/test/java/net/fortuna/ical4j/model/property/ExDateTest.java index 0b2e81aa2..3cd930f21 100644 --- a/src/test/java/net/fortuna/ical4j/model/property/ExDateTest.java +++ b/src/test/java/net/fortuna/ical4j/model/property/ExDateTest.java @@ -83,8 +83,8 @@ public void testTimeZones() throws Exception { CalendarBuilder builder = new CalendarBuilder(); Calendar calendar = builder.build(getClass().getResourceAsStream("/samples/valid/EXDATE.ics")); - Optional event = calendar.getComponent(Component.VEVENT); - List exdates = event.get().getProperties(Property.EXDATE); + VEvent event = calendar.getRequiredComponent(Component.VEVENT); + List exdates = event.getProperties(Property.EXDATE); for (Property exDate : exdates) { assertTrue("This EXDATE should have a timezone", exDate.getParameter(Parameter.TZID).isPresent()); } @@ -94,25 +94,25 @@ public void testDstOnlyVTimeZones() throws Exception { CalendarBuilder builder = new CalendarBuilder(); Calendar ical = builder.build(getClass().getResourceAsStream("/samples/valid/dst-only-vtimezone.ics")); - Optional vTZ = ical.getComponent(VTimeZone.VTIMEZONE); + VTimeZone vTZ = ical.getRequiredComponent(VTimeZone.VTIMEZONE); - String id = vTZ.get().getProperty(Property.TZID).get().getValue(); + String id = vTZ.getRequiredProperty(Property.TZID).getValue(); assertEquals("Europe/Berlin", id); - assertEquals(vTZ.get().getObservances().get(0), vTZ.get().getApplicableObservance(TemporalAdapter.parse("20180403").getTemporal())); + assertEquals(vTZ.getObservances().get(0), vTZ.getApplicableObservance(TemporalAdapter.parse("20180403").getTemporal())); - Optional vEvent = ical.getComponent(VEvent.VEVENT); - Optional> start = vEvent.get().getStartDate(); - Optional startTzId = start.get().getParameter(Parameter.TZID); - assertTrue(startTzId.equals(vTZ.get().getTimeZoneId().get().getParameter(Parameter.TZID))); - assertEquals(1522738800000L, Instant.from(start.get().getDate()).toEpochMilli()); + VEvent vEvent = ical.getRequiredComponent(VEvent.VEVENT); + DtStart start = vEvent.getRequiredProperty("DTSTART"); + Optional startTzId = start.getParameter(Parameter.TZID); + assertEquals(startTzId, vTZ.getRequiredProperty("TZID").getParameter(Parameter.TZID)); + assertEquals(1522738800000L, Instant.from(start.getDate()).toEpochMilli()); } public void testShouldPreserveUtcTimezoneForExDate() throws Exception { CalendarBuilder builder = new CalendarBuilder(); Calendar calendar = builder.build(getClass().getResourceAsStream("/samples/valid/EXDATE-IN-UTC.ics")); - Optional event = calendar.getComponent(Component.VEVENT); - List exdates = event.get().getProperties(Property.EXDATE); + VEvent event = calendar.getRequiredComponent(Component.VEVENT); + List exdates = event.getProperties(Property.EXDATE); for (Property exDate : exdates) { for (Instant dateEx : ((ExDate) exDate).getDates().getDates()) { assertNotNull(dateEx); @@ -125,7 +125,7 @@ public void testShouldPreserveUtcTimezoneForExDate() throws Exception { */ public void testRelaxedParsing() throws DateTimeParseException { try { - new ExDate(new ArrayList<>(), "20080315"); + new ExDate(new ArrayList<>(), "20080315"); fail("Should throw DateTimeParseException"); } catch (DateTimeParseException pe) { LOG.trace("Caught exception: " + pe.getMessage());