Replaced Joda Time with Java 8 Time API.
Project: http://git-wip-us.apache.org/repos/asf/zest-qi4j/repo Commit: http://git-wip-us.apache.org/repos/asf/zest-qi4j/commit/b71c878d Tree: http://git-wip-us.apache.org/repos/asf/zest-qi4j/tree/b71c878d Diff: http://git-wip-us.apache.org/repos/asf/zest-qi4j/diff/b71c878d Branch: refs/heads/3.0 Commit: b71c878d306d478e279b692254dd728a431f100b Parents: 9479a63 Author: Niclas Hedhman <[email protected]> Authored: Sat Oct 4 13:49:30 2014 +0800 Committer: Niclas Hedhman <[email protected]> Committed: Sat Oct 4 13:49:30 2014 +0800 ---------------------------------------------------------------------- core/api/build.gradle | 1 - core/api/src/docs/valuecomposite.txt | 3 - .../org/qi4j/api/composite/PropertyMapper.java | 13 - .../main/java/org/qi4j/api/type/ValueType.java | 2 +- .../org/qi4j/api/unitofwork/UnitOfWork.java | 3 +- .../qi4j/api/unitofwork/UnitOfWorkFactory.java | 5 +- .../src/main/java/org/qi4j/api/util/Dates.java | 102 ---- .../org/qi4j/api/value/ValueDeserializer.java | 3 - .../org/qi4j/api/value/ValueSerializer.java | 3 - .../provider/ThisInjectionProviderFactory.java | 1 + .../qi4j/runtime/structure/ModuleInstance.java | 7 +- .../runtime/structure/ModuleUnitOfWork.java | 17 +- .../runtime/unitofwork/BuilderEntityState.java | 5 +- .../runtime/unitofwork/UnitOfWorkInstance.java | 7 +- .../org/qi4j/regression/qi377/IssueTest.java | 48 +- .../runtime/property/PropertyEqualityTest.java | 74 ++- .../org/qi4j/runtime/query/model/Person.java | 4 +- .../java/org/qi4j/spi/entity/EntityState.java | 4 +- .../ConcurrentModificationCheckConcern.java | 9 +- .../DefaultEntityStoreUnitOfWork.java | 7 +- .../spi/entitystore/EntityStateVersions.java | 5 +- .../org/qi4j/spi/entitystore/EntityStore.java | 3 +- .../spi/entitystore/EntityStoreUnitOfWork.java | 3 +- .../entitystore/helpers/DefaultEntityState.java | 7 +- .../entitystore/helpers/JSONEntityState.java | 18 +- .../helpers/JSONMapEntityStoreMixin.java | 14 +- .../helpers/MapEntityStoreMixin.java | 11 +- .../spi/value/ValueDeserializerAdapter.java | 126 ++++- .../qi4j/spi/value/ValueSerializerAdapter.java | 201 +++++--- .../helpers/JSONManyAssociationStateTest.java | 7 +- .../test/entity/AbstractEntityStoreTest.java | 30 +- .../qi4j/test/indexing/AbstractQueryTest.java | 48 +- .../java/org/qi4j/test/indexing/TestData.java | 24 +- .../org/qi4j/test/indexing/model/Person.java | 12 +- .../test/value/AbstractJsonDateFormatTest.java | 26 +- .../AbstractPlainValueSerializationTest.java | 43 +- ...AbstractValueCompositeSerializationTest.java | 20 +- .../qi4j/entitystore/gae/GaeEntityState.java | 12 +- .../entitystore/gae/GaeEntityStoreMixin.java | 5 +- .../gae/GaeEntityStoreUnitOfWork.java | 7 +- .../qi4j/entitystore/neo4j/NeoEntityState.java | 19 +- .../entitystore/neo4j/NeoEntityStoreMixin.java | 5 +- .../neo4j/NeoEntityStoreUnitOfWork.java | 9 +- .../neo4j/test/SimpleNeoStoreTest.java | 4 - .../prefs/PreferencesEntityStoreMixin.java | 11 +- .../entitystore/sql/SQLEntityStoreMixin.java | 9 +- .../sql/internal/DatabaseSQLService.java | 5 +- .../DatabaseSQLServiceStatementsMixin.java | 9 +- .../sql/internal/SQLEntityState.java | 3 +- .../elasticsearch/ElasticSearchIndexer.java | 3 +- .../index/rdf/query/RdfQueryParserFactory.java | 6 +- .../rdf/query/internal/RdfQueryParserImpl.java | 31 +- .../solr/internal/SolrEntityIndexerMixin.java | 2 +- .../index/sql/support/common/QNameInfo.java | 14 +- .../postgresql/PostgreSQLTypeHelper.java | 45 +- .../support/skeletons/AbstractSQLIndexing.java | 4 +- .../support/skeletons/AbstractSQLStartup.java | 36 +- .../skeletons/SQLCompatEntityStateWrapper.java | 3 +- libraries.gradle | 2 - .../java/org/qi4j/library/alarm/AlarmEvent.java | 4 +- .../org/qi4j/library/alarm/AlarmStatus.java | 6 +- .../org/qi4j/library/alarm/AlarmSystem.java | 4 +- .../alarm/ExtendedAlarmModelService.java | 6 +- .../library/alarm/SimpleAlarmModelService.java | 6 +- .../alarm/StandardAlarmModelService.java | 6 +- .../library/alarm/ExtendedAlarmModelTest.java | 4 +- .../library/alarm/SimpleAlarmModelTest.java | 4 +- .../library/alarm/StandardAlarmModelTest.java | 4 +- .../qi4j/library/appbrowser/AppBrowserTest.java | 6 +- .../library/circuitbreaker/CircuitBreaker.java | 26 +- .../circuitbreaker/jmx/CircuitBreakerJMX.java | 189 ++++---- .../conversion/values/EntityToValueTest.java | 33 +- .../qi4j/library/cxf/divs/DividendsTest.java | 10 +- .../library/cxf/divs/ProjectedDividends.java | 8 +- .../rest/server/DomainEventSourceResource.java | 4 +- .../application/api/ApplicationEvent.java | 6 +- .../factory/ApplicationEventFactoryService.java | 4 +- .../replay/ApplicationEventPlayerService.java | 61 ++- .../source/helper/ApplicationEvents.java | 10 +- .../domain/api/UnitOfWorkDomainEventsValue.java | 4 +- .../factory/UnitOfWorkNotificationConcern.java | 3 +- .../domain/replay/DomainEventPlayerService.java | 163 +++++-- .../domain/source/helper/Events.java | 48 +- .../domain/source/helper/EventRouterTest.java | 5 +- .../domain/source/helper/EventsTest.java | 5 +- .../source/helper/UnitOfWorkRouterTest.java | 5 +- .../rdf/entity/EntityTypeSerializer.java | 18 +- .../rdf/entity/EntitySerializerTest.java | 3 +- .../qi4j/library/rest/client/ClientCache.java | 220 +++++---- .../responsereader/TableResponseReader.java | 138 +++--- .../library/rest/common/table/TableBuilder.java | 427 +++++++++-------- .../rest/server/api/ResourceValidity.java | 6 +- .../requestreader/DefaultRequestReader.java | 27 +- .../responsewriter/TableResponseWriter.java | 8 +- .../qi4j/library/rest/admin/EntityResource.java | 11 +- .../org/qi4j/library/scheduler/Scheduler.java | 6 +- .../qi4j/library/scheduler/SchedulerMixin.java | 35 +- .../library/scheduler/schedule/Schedule.java | 6 +- .../scheduler/schedule/ScheduleFactory.java | 18 +- .../scheduler/schedule/ScheduleTime.java | 27 +- .../scheduler/schedule/cron/CronSchedule.java | 14 +- .../scheduler/schedule/once/OnceSchedule.java | 10 +- .../library/scheduler/timeline/Timeline.java | 15 +- .../timeline/TimelineForScheduleConcern.java | 3 +- .../scheduler/timeline/TimelineRecord.java | 3 +- .../timeline/TimelineScheduleMixin.java | 32 +- .../timeline/TimelineSchedulerServiceMixin.java | 21 +- .../qi4j/library/scheduler/SchedulerTest.java | 21 +- .../manual/recipes/createEntity/Accident.java | 6 +- .../dcicargo/pathfinder_a/api/TransitEdge.java | 14 +- .../internal/GraphTraversalServiceImpl.java | 12 +- .../bootstrap/DCISampleApplication_a.java | 4 - .../sample_a/bootstrap/sampledata/BaseData.java | 20 +- .../bootstrap/sampledata/BaseDataService.java | 104 ++-- .../bootstrap/sampledata/SampleDataService.java | 27 +- .../query/dto/HandlingEventDTO.java | 4 +- .../web/booking/BookNewCargoPage.java | 10 +- .../web/booking/CargoDetailsPage.java | 5 +- .../web/booking/CargoListPage.java | 9 +- .../communication/web/booking/RoutePanel.java | 6 +- .../web/handling/RegisterHandlingEventPage.java | 9 +- .../web/tracking/HandlingHistoryPanel.java | 4 +- .../web/tracking/TrackCargoPage.java | 8 +- .../context/shipping/booking/BookNewCargo.java | 25 +- .../shipping/booking/BuildDeliverySnapshot.java | 28 +- .../handling/RegisterHandlingEvent.java | 10 +- .../context/support/ApplicationEvents.java | 9 +- .../context/support/FoundNoRoutesException.java | 12 +- .../RegisterHandlingEventAttemptDTO.java | 6 +- .../context/support/RoutingService.java | 3 +- .../data/shipping/cargo/RouteSpecification.java | 6 +- .../data/shipping/delivery/Delivery.java | 7 +- .../delivery/ExpectedHandlingEvent.java | 4 +- .../data/shipping/handling/HandlingEvent.java | 6 +- .../data/shipping/handling/HandlingEvents.java | 12 +- .../data/shipping/itinerary/Itinerary.java | 22 +- .../sample_a/data/shipping/itinerary/Leg.java | 6 +- .../data/shipping/voyage/CarrierMovement.java | 6 +- .../wicket/form/DateTextFieldWithPicker.java | 32 +- .../shipping/booking/BookNewCargoTest.java | 32 +- .../booking/BuildDeliverySnapshotTest.java | 474 ++++++++++--------- .../handling/RegisterHandlingEventTest.java | 139 +++--- .../pathfinder_b/api/GraphTraversalService.java | 5 +- .../dcicargo/pathfinder_b/api/TransitEdge.java | 15 +- .../pathfinder_b/internal/GraphDAO.java | 15 +- .../internal/GraphTraversalServiceImpl.java | 12 +- .../bootstrap/DCISampleApplication_b.java | 4 - .../sample_b/bootstrap/sampledata/BaseData.java | 27 +- .../bootstrap/sampledata/SampleDataService.java | 23 +- .../query/dto/HandlingEventDTO.java | 4 +- .../web/booking/BookNewCargoPage.java | 8 +- .../web/booking/CargoDetailsPage.java | 6 +- .../web/booking/CargoListPage.java | 2 +- .../communication/web/booking/RoutePanel.java | 6 +- .../IncidentLoggingApplicationMockupPage.java | 12 +- .../web/tracking/HandlingHistoryPanel.java | 5 +- .../web/tracking/TrackCargoPage.java | 8 +- .../interaction/booking/BookNewCargo.java | 14 +- .../booking/routing/AssignCargoToRoute.java | 28 +- .../DeriveUpdatedRouteSpecification.java | 6 +- .../inspection/event/InspectArrivedCargo.java | 5 +- .../inspection/event/InspectCargoInCustoms.java | 5 +- .../inspection/event/InspectClaimedCargo.java | 6 +- .../inspection/event/InspectLoadedCargo.java | 19 +- .../inspection/event/InspectReceivedCargo.java | 6 +- .../inspection/event/InspectUnhandledCargo.java | 6 +- .../inspection/event/InspectUnloadedCargo.java | 5 +- .../parsing/ParseHandlingEventData.java | 26 +- .../parsing/dto/ParsedHandlingEventData.java | 6 +- .../CannotRegisterHandlingEventException.java | 9 +- .../exception/ChronologicalException.java | 6 +- .../context/service/routing/RoutingService.java | 8 +- .../exception/FoundNoRoutesException.java | 13 +- .../data/factory/HandlingEventFactory.java | 10 +- .../RouteSpecificationFactoryService.java | 16 +- .../structure/cargo/RouteSpecification.java | 32 +- .../data/structure/delivery/Delivery.java | 7 +- .../structure/delivery/NextHandlingEvent.java | 4 +- .../data/structure/handling/HandlingEvent.java | 15 +- .../data/structure/itinerary/Itinerary.java | 20 +- .../sample_b/data/structure/itinerary/Leg.java | 7 +- .../data/structure/voyage/CarrierMovement.java | 6 +- .../wicket/form/DateTextFieldWithPicker.java | 21 +- .../bootstrap/test/TestApplication.java | 202 ++++---- .../context/test/booking/BookNewCargoTest.java | 4 +- .../booking/routing/AssignCargoToRouteTest.java | 12 +- .../routing/RegisterNewDestinationTest.java | 10 +- .../DeriveUpdatedRouteSpecTest.java | 4 +- .../event/InspectArrivedCargoTest.java | 12 +- .../event/InspectCargoInCustomsTest.java | 12 +- .../event/InspectClaimedCargoTest.java | 14 +- .../event/InspectLoadedCargoTest.java | 38 +- .../event/InspectReceivedCargoTest.java | 20 +- .../event/InspectUnhandledCargoTest.java | 12 +- .../event/InspectUnloadedCargoTest.java | 26 +- .../parsing/ParseHandlingEventDataTest.java | 12 +- .../registration/RegisterHandlingEventTest.java | 6 +- .../samples/forum/context/view/ViewPost.java | 4 +- .../qi4j/samples/forum/data/entity/Post.java | 4 +- .../forum/domainevent/DomainEventValue.java | 3 +- .../org/qi4j/sample/rental/domain/Booking.java | 6 +- .../java/org/qi4j/sample/rental/domain/Car.java | 6 +- .../org/qi4j/sample/rental/domain/Period.java | 6 +- .../qi4j/sample/rental/domain/RentalShop.java | 18 +- .../sample/rental/domain/dev/InitialData.java | 59 +-- .../example/actions/HelloWorldAction.java | 9 +- .../struts2/example/actions/IndexAction.java | 11 +- .../example/converters/DateConverter.java | 17 +- .../demo/thirtyminutes/ThirtyMinutesDocs.java | 15 +- 209 files changed, 2648 insertions(+), 2296 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/build.gradle ---------------------------------------------------------------------- diff --git a/core/api/build.gradle b/core/api/build.gradle index ccaa0f2..0ad2cd6 100644 --- a/core/api/build.gradle +++ b/core/api/build.gradle @@ -3,7 +3,6 @@ jar { manifest { name = "Qi4j Core API"}} dependencies { compile project( ':org.qi4j.core:org.qi4j.core.io' ) - compile libraries.jodatime testCompile project( ':org.qi4j.core:org.qi4j.core.testsupport' ) testCompile project( ':org.qi4j.libraries:org.qi4j.library.constraints' ) http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/docs/valuecomposite.txt ---------------------------------------------------------------------- diff --git a/core/api/src/docs/valuecomposite.txt b/core/api/src/docs/valuecomposite.txt index cc7166e..4a1e5b8 100644 --- a/core/api/src/docs/valuecomposite.txt +++ b/core/api/src/docs/valuecomposite.txt @@ -63,9 +63,6 @@ Plain Values can be one of : * BigInteger, * BigDecimal, * Date, - * DateTime (JodaTime), - * LocalDateTime (JodaTime), - * LocalDate (JodaTime). TIP: Serialization behaviour can be tuned with options. Every +ValueSerializer+ methods can take a +ValueSerializer.Options+ object that contains flags to change how some http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java b/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java index a47db83..87352a1 100644 --- a/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java +++ b/core/api/src/main/java/org/qi4j/api/composite/PropertyMapper.java @@ -11,7 +11,6 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; import java.util.Collection; -import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -22,7 +21,6 @@ import org.qi4j.api.Qi4j; import org.qi4j.api.property.GenericPropertyInfo; import org.qi4j.api.property.Property; import org.qi4j.api.util.Classes; -import org.qi4j.api.util.Dates; import org.qi4j.api.value.ValueComposite; /** @@ -44,7 +42,6 @@ public final class PropertyMapper STRATEGY.put( Character.class, new CharMapper() ); STRATEGY.put( Float.class, new FloatMapper() ); STRATEGY.put( Double.class, new DoubleMapper() ); - STRATEGY.put( Date.class, new DateMapper() ); STRATEGY.put( Boolean.class, new BooleanMapper() ); STRATEGY.put( BigDecimal.class, new BigDecimalMapper() ); STRATEGY.put( BigInteger.class, new BigIntegerMapper() ); @@ -427,16 +424,6 @@ public final class PropertyMapper } } - private static class DateMapper - implements MappingStrategy - { - @Override - public Object map( Composite composite, Type type, String value ) - { - return Dates.fromString( value.trim() ); - } - } - private static class ValueCompositeMapper implements MappingStrategy { http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/type/ValueType.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/type/ValueType.java b/core/api/src/main/java/org/qi4j/api/type/ValueType.java index 5cb4db4..2fe6697 100644 --- a/core/api/src/main/java/org/qi4j/api/type/ValueType.java +++ b/core/api/src/main/java/org/qi4j/api/type/ValueType.java @@ -40,7 +40,7 @@ public class ValueType * counterparts are considered as Primitive Value Types. * </p> * <p> - * Date, BigInteger, BigDecimal and JodaTime types are not considered as Primitive Value Types. + * Date, BigInteger, BigDecimal types are not considered as Primitive Value Types. * </p> * * @return true if object is a primitive value or an array of primitive values http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java index 8af1db2..0a9f095 100644 --- a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java +++ b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWork.java @@ -15,6 +15,7 @@ */ package org.qi4j.api.unitofwork; +import java.time.Instant; import org.qi4j.api.entity.EntityBuilder; import org.qi4j.api.entity.LifecycleException; import org.qi4j.api.query.Query; @@ -85,7 +86,7 @@ public interface UnitOfWork extends MetaInfoHolder, AutoCloseable */ UnitOfWorkFactory unitOfWorkFactory(); - long currentTime(); + Instant currentTime(); /** * Get the Usecase for this UnitOfWork http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkFactory.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkFactory.java b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkFactory.java index a8755d4..4e9f166 100644 --- a/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkFactory.java +++ b/core/api/src/main/java/org/qi4j/api/unitofwork/UnitOfWorkFactory.java @@ -14,6 +14,7 @@ */ package org.qi4j.api.unitofwork; +import java.time.Instant; import org.qi4j.api.entity.EntityComposite; import org.qi4j.api.usecase.Usecase; @@ -41,7 +42,7 @@ public interface UnitOfWorkFactory * </p> * @return a new UnitOfWork */ - UnitOfWork newUnitOfWork( long currentTime ); + UnitOfWork newUnitOfWork( Instant currentTime ); /** * Create a new UnitOfWork for the given Usecase and associate it with the current thread. @@ -61,7 +62,7 @@ public interface UnitOfWorkFactory * * @return a new UnitOfWork */ - UnitOfWork newUnitOfWork( Usecase usecase, long currentTime ); + UnitOfWork newUnitOfWork( Usecase usecase, Instant currentTime ); /** * @return true if there is an active UnitOfWork associated with the executing thread http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/util/Dates.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/util/Dates.java b/core/api/src/main/java/org/qi4j/api/util/Dates.java deleted file mode 100644 index 3324df2..0000000 --- a/core/api/src/main/java/org/qi4j/api/util/Dates.java +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright 2009 Niclas Hedhman. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - * implied. - * - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.qi4j.api.util; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.Date; -import java.util.TimeZone; - -/** - * Useful methods for handling Dates. - */ -public final class Dates -{ - // Formatters are not thread-safe. Create one per thread - private static final ThreadLocal<DateFormat> ISO8601 = new ThreadLocal<DateFormat>() - { - @Override - protected DateFormat initialValue() - { - return new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSSZ" ); - } - }; - - private static final ThreadLocal<DateFormat> ISO8601_UTC = new ThreadLocal<DateFormat>() - { - @Override - protected DateFormat initialValue() - { - SimpleDateFormat dateFormat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'" ); - dateFormat.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); - return dateFormat; - } - }; - - /** - * @param stringDate a string representing a date as either ISO8601, @millis@ or /Date() formats - * @return a Date - */ - public static Date fromString( String stringDate ) - { - try - { - Date date = ISO8601_UTC.get().parse( stringDate ); - return date; - } - catch( ParseException e ) - { - try - { - Date date = ISO8601.get().parse( stringDate ); - return date; - } - catch( ParseException e1 ) - { - // @millis@ format - if( stringDate.startsWith( "@" ) && stringDate.endsWith( "@" ) ) - { - long time = Long.parseLong( stringDate.substring( 1, stringDate.length() - 1 ) ); - Date date = new Date( time ); - return date; - } - else if( stringDate.startsWith( "/Date(" ) && stringDate.endsWith( ")/" ) ) // Microsoft format - { - long time = Long.parseLong( stringDate.substring( 6, stringDate.length() - 2 ) ); - Date date = new Date( time ); - return date; - } - throw new IllegalStateException( "Illegal date:" + stringDate ); - } - } - } - - /** - * @param date a Date - * @return String representation in ISO8601 UTC - */ - public static String toUtcString( Date date ) - { - return ISO8601_UTC.get().format( date ); - } - - private Dates() - { - } -} http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java b/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java index 48e1203..a6ca6a6 100644 --- a/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java +++ b/core/api/src/main/java/org/qi4j/api/value/ValueDeserializer.java @@ -53,9 +53,6 @@ import org.qi4j.api.type.ValueType; * <li>BigInteger,</li> * <li>BigDecimal,</li> * <li>Date,</li> - * <li>DateTime (JodaTime),</li> - * <li>LocalDateTime (JodaTime),</li> - * <li>LocalDate (JodaTime).</li> * </ul> * <p> * Values of unknown types and all arrays are considered as {@link java.io.Serializable} and by so are deserialized http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java index 06e8599..d9c8f74 100644 --- a/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java +++ b/core/api/src/main/java/org/qi4j/api/value/ValueSerializer.java @@ -54,9 +54,6 @@ import org.qi4j.api.composite.AmbiguousTypeException; * <li>BigInteger,</li> * <li>BigDecimal,</li> * <li>Date,</li> - * <li>DateTime (JodaTime),</li> - * <li>LocalDateTime (JodaTime),</li> - * <li>LocalDate (JodaTime).</li> * </ul> * <p> * Values of unknown types and all arrays are considered as {@link java.io.Serializable} and by so are serialized to http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java index c927b65..267a7d6 100644 --- a/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java +++ b/core/runtime/src/main/java/org/qi4j/runtime/injection/provider/ThisInjectionProviderFactory.java @@ -91,6 +91,7 @@ public final class ThisInjectionProviderFactory } proxyConstructor = proxyClass.getConstructor( InvocationHandler.class ); + proxyConstructor.setAccessible( true ); } catch( Exception e ) { http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java index cfbbb41..efad2f5 100644 --- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java +++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleInstance.java @@ -17,6 +17,7 @@ package org.qi4j.runtime.structure; import java.lang.reflect.AccessibleObject; import java.lang.reflect.Type; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; @@ -509,7 +510,7 @@ public class ModuleInstance } @Override - public UnitOfWork newUnitOfWork( long currentTime ) + public UnitOfWork newUnitOfWork( Instant currentTime ) { return newUnitOfWork( Usecase.DEFAULT, currentTime ); } @@ -517,11 +518,11 @@ public class ModuleInstance @Override public UnitOfWork newUnitOfWork( Usecase usecase ) { - return newUnitOfWork( usecase == null ? Usecase.DEFAULT : usecase, System.currentTimeMillis() ); + return newUnitOfWork( usecase == null ? Usecase.DEFAULT : usecase, Instant.now() ); } @Override - public UnitOfWork newUnitOfWork( Usecase usecase, long currentTime ) + public UnitOfWork newUnitOfWork( Usecase usecase, Instant currentTime ) { UnitOfWorkInstance unitOfWorkInstance = new UnitOfWorkInstance( usecase, currentTime, metricsProvider() ); return new ModuleUnitOfWork( ModuleInstance.this, unitOfWorkInstance ); http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java index 2a333c7..b4486de 100644 --- a/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java +++ b/core/runtime/src/main/java/org/qi4j/runtime/structure/ModuleUnitOfWork.java @@ -15,6 +15,7 @@ */ package org.qi4j.runtime.structure; +import java.time.Instant; import java.util.Collections; import java.util.Iterator; import java.util.Map; @@ -59,20 +60,6 @@ import static org.qi4j.functional.Iterables.first; public class ModuleUnitOfWork implements UnitOfWork { -// private static final QualifiedName IDENTITY_STATE_NAME; -// -// static -// { -// try -// { -// IDENTITY_STATE_NAME = QualifiedName.fromAccessor( Identity.class.getMethod( "identity" ) ); -// } -// catch( NoSuchMethodException e ) -// { -// throw new InternalError( "Qi4j Core Runtime codebase is corrupted. Contact Qi4j team: ModuleUnitOfWork" ); -// } -// } -// private final UnitOfWorkInstance uow; private final ModuleInstance moduleInstance; @@ -99,7 +86,7 @@ public class ModuleUnitOfWork } @Override - public long currentTime() + public Instant currentTime() { return uow.currentTime(); } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/BuilderEntityState.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/BuilderEntityState.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/BuilderEntityState.java index fc2302d..7ab1be4 100644 --- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/BuilderEntityState.java +++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/BuilderEntityState.java @@ -19,6 +19,7 @@ */ package org.qi4j.runtime.unitofwork; +import java.time.Instant; import java.util.HashMap; import java.util.Map; import org.qi4j.api.common.QualifiedName; @@ -62,9 +63,9 @@ public final class BuilderEntityState } @Override - public long lastModified() + public Instant lastModified() { - return 0; + return Instant.MIN; } @Override http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java index 4919860..0311c46 100644 --- a/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java +++ b/core/runtime/src/main/java/org/qi4j/runtime/unitofwork/UnitOfWorkInstance.java @@ -17,6 +17,7 @@ */ package org.qi4j.runtime.unitofwork; +import java.time.Instant; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; @@ -74,7 +75,7 @@ public final class UnitOfWorkInstance return current.get(); } - private long currentTime; + private Instant currentTime; private MetricsProvider metrics; final HashMap<EntityReference, EntityInstance> instanceCache; final HashMap<EntityStore, EntityStoreUnitOfWork> storeUnitOfWork; @@ -92,7 +93,7 @@ public final class UnitOfWorkInstance private List<UnitOfWorkCallback> callbacks; - public UnitOfWorkInstance( Usecase usecase, long currentTime, MetricsProvider metrics ) + public UnitOfWorkInstance( Usecase usecase, Instant currentTime, MetricsProvider metrics ) { this.currentTime = currentTime; this.open = true; @@ -104,7 +105,7 @@ public final class UnitOfWorkInstance startCapture( metrics ); } - public long currentTime() + public Instant currentTime() { return currentTime; } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/test/java/org/qi4j/regression/qi377/IssueTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/qi4j/regression/qi377/IssueTest.java b/core/runtime/src/test/java/org/qi4j/regression/qi377/IssueTest.java index e0a0cba..1bbbf99 100644 --- a/core/runtime/src/test/java/org/qi4j/regression/qi377/IssueTest.java +++ b/core/runtime/src/test/java/org/qi4j/regression/qi377/IssueTest.java @@ -19,6 +19,9 @@ package org.qi4j.regression.qi377; import org.junit.Test; import org.qi4j.api.common.UseDefaults; +import org.qi4j.api.composite.TransientBuilder; +import org.qi4j.api.injection.scope.This; +import org.qi4j.api.mixin.Mixins; import org.qi4j.api.property.Property; import org.qi4j.bootstrap.AssemblyException; import org.qi4j.bootstrap.ModuleAssembly; @@ -35,7 +38,7 @@ public class IssueTest public void assemble( ModuleAssembly module ) throws AssemblyException { - module.transients( TeamMember.class ); + module.transients( TeamMember.class, Company.class ); } @Test @@ -53,6 +56,20 @@ public class IssueTest assertThat( p.name().get(), equalTo( "Paul" ) ); } + @Test + public void propertyPrivateMixinIsolationShouldWork() + { + TransientBuilder<Company> builder = module.newTransientBuilder( Company.class ); + Person ceo = builder.prototypeFor( Person.class ); + ceo.name().set( "Niclas" ); + Employee secretary = builder.prototypeFor( Employee.class ); + secretary.name().set( "Babe" ); + Company company = builder.newInstance(); + + assertThat( company.secretaryName(), equalTo( "Babe" ) ); + assertThat( company.ceoName(), equalTo( "Niclas" ) ); + } + public interface Person { @UseDefaults @@ -70,4 +87,33 @@ public class IssueTest { } + @Mixins( Company.Impl.class ) + public interface Company + { + String ceoName(); + + String secretaryName(); + + public abstract class Impl + implements Company + { + @This + Person ceo; + + @This + Employee sectretary; + + @Override + public String ceoName() + { + return ceo.name().get(); + } + + @Override + public String secretaryName() + { + return sectretary.name().get(); + } + } + } } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/test/java/org/qi4j/runtime/property/PropertyEqualityTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/qi4j/runtime/property/PropertyEqualityTest.java b/core/runtime/src/test/java/org/qi4j/runtime/property/PropertyEqualityTest.java index 22de796..61b7763 100644 --- a/core/runtime/src/test/java/org/qi4j/runtime/property/PropertyEqualityTest.java +++ b/core/runtime/src/test/java/org/qi4j/runtime/property/PropertyEqualityTest.java @@ -18,10 +18,20 @@ package org.qi4j.runtime.property; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Date; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.LocalDateTime; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Period; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; import org.junit.Test; import org.qi4j.api.common.Optional; import org.qi4j.api.property.Property; @@ -36,7 +46,6 @@ import org.qi4j.test.AbstractQi4jTest; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.not; -import static org.joda.time.DateTimeZone.UTC; import static org.junit.Assert.assertThat; /** @@ -97,13 +106,24 @@ public class PropertyEqualityTest Property<BigDecimal> bigDecimalProperty(); - Property<Date> dateProperty(); + Property<OffsetDateTime> offsetDateTimeProperty(); + Property<OffsetTime> offsetTimeProperty(); - Property<DateTime> dateTimeProperty(); + Property<ZonedDateTime> zonedDateTimeProperty(); Property<LocalDate> localDateProperty(); - Property<LocalDateTime> localDateTimeProperty(); + Property<LocalTime> localTimeProperty(); + + Property<Instant> timeInstantProperty(); + Property<Period> timePeriodProperty(); + Property<Duration> timeDurationProperty(); + + Property<MonthDay> monthDayProperty(); + Property<YearMonth> yearMonthProperty(); + Property<Year> yearProperty(); + Property<ZoneId> zoneIdProperty(); + Property<ZoneOffset> zoneOffsetProperty(); } public interface AnotherSome @@ -330,10 +350,7 @@ public class PropertyEqualityTest builder.prototype().enumProperty().set( AnEnum.BAZAR ); builder.prototype().bigIntegerProperty().set( new BigInteger( "42" ) ); builder.prototype().bigDecimalProperty().set( new BigDecimal( "42.23" ) ); - builder.prototype().dateProperty().set( new DateTime( "2020-03-04T13:24:35", UTC ).toDate() ); - builder.prototype().dateTimeProperty().set( new DateTime( "2020-03-04T13:24:35", UTC ) ); - builder.prototype().localDateProperty().set( new LocalDate( "2020-03-04" ) ); - builder.prototype().localDateTimeProperty().set( new LocalDateTime( "2020-03-04T13:23:00", UTC ) ); + establihDateTimes( builder ); some = builder.newInstance(); } return some; @@ -356,10 +373,7 @@ public class PropertyEqualityTest builder.prototype().enumProperty().set( AnEnum.CATHEDRAL ); builder.prototype().bigIntegerProperty().set( new BigInteger( "23" ) ); builder.prototype().bigDecimalProperty().set( new BigDecimal( "23.42" ) ); - builder.prototype().dateProperty().set( new DateTime( "2030-02-08T09:09:09", UTC ).toDate() ); - builder.prototype().dateTimeProperty().set( new DateTime( "2030-02-08T09:09:09", UTC ) ); - builder.prototype().localDateProperty().set( new LocalDate( "2030-02-08" ) ); - builder.prototype().localDateTimeProperty().set( new LocalDateTime( "2030-02-08T09:09:09", UTC ) ); + establihDateTimes( builder ); some = builder.newInstance(); } return some; @@ -382,10 +396,7 @@ public class PropertyEqualityTest builder.prototype().enumProperty().set( AnEnum.BAZAR ); builder.prototype().bigIntegerProperty().set( new BigInteger( "42" ) ); builder.prototype().bigDecimalProperty().set( new BigDecimal( "42.23" ) ); - builder.prototype().dateProperty().set( new DateTime( "2020-03-04T13:24:35", UTC ).toDate() ); - builder.prototype().dateTimeProperty().set( new DateTime( "2020-03-04T13:24:35", UTC ) ); - builder.prototype().localDateProperty().set( new LocalDate( "2020-03-04" ) ); - builder.prototype().localDateTimeProperty().set( new LocalDateTime( "2020-03-04T13:23:00", UTC ) ); + establihDateTimes( builder ); anotherSome = builder.newInstance(); } return anotherSome; @@ -408,10 +419,7 @@ public class PropertyEqualityTest builder.prototype().enumProperty().set( AnEnum.CATHEDRAL ); builder.prototype().bigIntegerProperty().set( new BigInteger( "23" ) ); builder.prototype().bigDecimalProperty().set( new BigDecimal( "23.42" ) ); - builder.prototype().dateProperty().set( new DateTime( "2030-02-08T09:09:09", UTC ).toDate() ); - builder.prototype().dateTimeProperty().set( new DateTime( "2030-02-08T09:09:09", UTC ) ); - builder.prototype().localDateProperty().set( new LocalDate( "2030-02-08" ) ); - builder.prototype().localDateTimeProperty().set( new LocalDateTime( "2030-02-08T09:09:09", UTC ) ); + establihDateTimes( builder ); anotherSome = builder.newInstance(); } return anotherSome; @@ -427,4 +435,22 @@ public class PropertyEqualityTest } return other; } + + private static void establihDateTimes( ValueBuilder<? extends Some> builder ) + { + builder.prototype().offsetDateTimeProperty().set( OffsetDateTime.parse( "2020-03-04T13:24:35+01:00" ) ); + builder.prototype().offsetTimeProperty().set( OffsetTime.parse( "13:24:35+01:00" ) ); + builder.prototype().zonedDateTimeProperty().set( ZonedDateTime.parse( "2020-03-04T13:24:35Z" ) ); + builder.prototype().localDateProperty().set( LocalDate.parse( "2020-03-04" ) ); + builder.prototype().localDateTimeProperty().set( LocalDateTime.parse( "2020-03-04T13:23:00" ) ); + builder.prototype().localTimeProperty().set( LocalTime.parse( "13:23:00" ) ); + builder.prototype().yearProperty().set( Year.parse( "2020" ) ); + builder.prototype().yearMonthProperty().set( YearMonth.parse( "2020-03" ) ); + builder.prototype().monthDayProperty().set( MonthDay.parse( "--03-04" ) ); + builder.prototype().zoneIdProperty().set( ZoneId.of( "Asia/Kuala_Lumpur" ) ); + builder.prototype().zoneOffsetProperty().set( ZoneOffset.of( "+02:00" ) ); + builder.prototype().timePeriodProperty().set( Period.parse( "P3y4w" ) ); + builder.prototype().timeInstantProperty().set( Instant.parse( "2020-03-04T13:24:35Z" ) ); + builder.prototype().timeDurationProperty().set( Duration.parse( "P3DT4H" ) ); + } } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/runtime/src/test/java/org/qi4j/runtime/query/model/Person.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/qi4j/runtime/query/model/Person.java b/core/runtime/src/test/java/org/qi4j/runtime/query/model/Person.java index d8dab13..418a7ce 100644 --- a/core/runtime/src/test/java/org/qi4j/runtime/query/model/Person.java +++ b/core/runtime/src/test/java/org/qi4j/runtime/query/model/Person.java @@ -17,7 +17,7 @@ */ package org.qi4j.runtime.query.model; -import java.util.Date; +import java.time.LocalDate; import java.util.List; import java.util.Map; import org.qi4j.api.association.Association; @@ -48,7 +48,7 @@ public interface Person Property<String> email(); @Optional - Property<Map<Date, String>> datesToRemember(); + Property<Map<LocalDate, String>> datesToRemember(); @Optional Property<List<String>> tags(); http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entity/EntityState.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entity/EntityState.java b/core/spi/src/main/java/org/qi4j/spi/entity/EntityState.java index 2e149ca..052359b 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entity/EntityState.java +++ b/core/spi/src/main/java/org/qi4j/spi/entity/EntityState.java @@ -19,6 +19,8 @@ */ package org.qi4j.spi.entity; +import java.time.Instant; +import java.time.ZonedDateTime; import org.qi4j.api.common.QualifiedName; import org.qi4j.api.entity.EntityDescriptor; import org.qi4j.api.entity.EntityReference; @@ -53,7 +55,7 @@ public interface EntityState * </p> * @return last modified timestamp of the entity, as defined by System.currentTimeMillis() */ - long lastModified(); + Instant lastModified(); /** * Remove the entity represented by this EntityState when the unit of work is completed. http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java index cfeead6..35a66dd 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/ConcurrentModificationCheckConcern.java @@ -14,6 +14,7 @@ package org.qi4j.spi.entitystore; +import java.time.Instant; import org.qi4j.api.Qi4j; import org.qi4j.api.concern.ConcernOf; import org.qi4j.api.entity.EntityDescriptor; @@ -48,7 +49,7 @@ public abstract class ConcurrentModificationCheckConcern private Qi4j api; @Override - public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime ) + public EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, Instant currentTime ) { final EntityStoreUnitOfWork uow = next.newUnitOfWork( usecase, module, currentTime ); return new ConcurrentCheckingEntityStoreUnitOfWork( uow, api.dereference( versions ), module, currentTime ); @@ -60,7 +61,7 @@ public abstract class ConcurrentModificationCheckConcern private final EntityStoreUnitOfWork uow; private EntityStateVersions versions; private Module module; - private long currentTime; + private Instant currentTime; private List<EntityState> loaded = new ArrayList<EntityState>(); @@ -69,7 +70,7 @@ public abstract class ConcurrentModificationCheckConcern public ConcurrentCheckingEntityStoreUnitOfWork( EntityStoreUnitOfWork uow, EntityStateVersions versions, Module module, - long currentTime + Instant currentTime ) { this.uow = uow; @@ -85,7 +86,7 @@ public abstract class ConcurrentModificationCheckConcern } @Override - public long currentTime() + public Instant currentTime() { return uow.currentTime(); } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java index cc93430..5e8c1aa 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/DefaultEntityStoreUnitOfWork.java @@ -14,6 +14,7 @@ package org.qi4j.spi.entitystore; +import java.time.Instant; import java.util.HashMap; import org.qi4j.api.entity.EntityDescriptor; import org.qi4j.api.entity.EntityReference; @@ -32,13 +33,13 @@ public final class DefaultEntityStoreUnitOfWork private Module module; private HashMap<EntityReference, EntityState> states = new HashMap<>(); private Usecase usecase; - private long currentTime; + private Instant currentTime; public DefaultEntityStoreUnitOfWork( EntityStoreSPI entityStoreSPI, String identity, Module module, Usecase usecase, - long currentTime + Instant currentTime ) { this.entityStoreSPI = entityStoreSPI; @@ -60,7 +61,7 @@ public final class DefaultEntityStoreUnitOfWork } @Override - public long currentTime() + public Instant currentTime() { return currentTime; } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java index ddf1758..9a6e5bc 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStateVersions.java @@ -14,6 +14,7 @@ package org.qi4j.spi.entitystore; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -36,7 +37,7 @@ public interface EntityStateVersions void rememberVersion( EntityReference identity, String version ); - void checkForConcurrentModification( Iterable<EntityState> loaded, Module module, long currentTime ) + void checkForConcurrentModification( Iterable<EntityState> loaded, Module module, Instant currentTime ) throws ConcurrentEntityStateModificationException; /** @@ -68,7 +69,7 @@ public interface EntityStateVersions @Override public synchronized void checkForConcurrentModification( Iterable<EntityState> loaded, Module module, - long currentTime + Instant currentTime ) throws ConcurrentEntityStateModificationException { http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java index fa5ac1b..8da92d0 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStore.java @@ -16,6 +16,7 @@ */ package org.qi4j.spi.entitystore; +import java.time.Instant; import org.qi4j.api.structure.Module; import org.qi4j.api.usecase.Usecase; import org.qi4j.io.Input; @@ -26,7 +27,7 @@ import org.qi4j.spi.entity.EntityState; */ public interface EntityStore { - EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, long currentTime ); + EntityStoreUnitOfWork newUnitOfWork( Usecase usecase, Module module, Instant currentTime ); Input<EntityState, EntityStoreException> entityStates( Module module ); } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java index 21655cd..3685721 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/EntityStoreUnitOfWork.java @@ -14,6 +14,7 @@ package org.qi4j.spi.entitystore; +import java.time.Instant; import org.qi4j.api.entity.EntityDescriptor; import org.qi4j.api.entity.EntityReference; import org.qi4j.spi.entity.EntityState; @@ -25,7 +26,7 @@ public interface EntityStoreUnitOfWork { String identity(); - long currentTime(); + Instant currentTime(); /** * Create new EntityState for a given identity. http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java index 178ecc6..2b710a1 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/DefaultEntityState.java @@ -19,6 +19,7 @@ */ package org.qi4j.spi.entitystore.helpers; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -45,7 +46,7 @@ public final class DefaultEntityState private EntityStatus status; private String version; - private long lastModified; + private Instant lastModified; private final EntityReference identity; private final EntityDescriptor entityDescriptor; @@ -72,7 +73,7 @@ public final class DefaultEntityState public DefaultEntityState( DefaultEntityStoreUnitOfWork unitOfWork, String version, - long lastModified, + Instant lastModified, EntityReference identity, EntityStatus status, EntityDescriptor entityDescriptor, @@ -102,7 +103,7 @@ public final class DefaultEntityState } @Override - public long lastModified() + public Instant lastModified() { return lastModified; } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java index bef6229..dd72cc5 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONEntityState.java @@ -19,6 +19,7 @@ */ package org.qi4j.spi.entitystore.helpers; +import java.time.Instant; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; @@ -52,14 +53,13 @@ public final class JSONEntityState JSONKeys.MODIFIED }; - private final DefaultEntityStoreUnitOfWork unitOfWork; private final ValueSerialization valueSerialization; private final String version; private final EntityReference identity; private final EntityDescriptor entityDescriptor; private EntityStatus status; - private long lastModified; + private Instant lastModified; private JSONObject state; /* package */ JSONEntityState( DefaultEntityStoreUnitOfWork unitOfWork, @@ -68,8 +68,7 @@ public final class JSONEntityState EntityDescriptor entityDescriptor, JSONObject initialState ) { - this( unitOfWork, - valueSerialization, + this( valueSerialization, "", unitOfWork.currentTime(), identity, @@ -78,17 +77,15 @@ public final class JSONEntityState initialState ); } - /* package */ JSONEntityState( DefaultEntityStoreUnitOfWork unitOfWork, - ValueSerialization valueSerialization, + /* package */ JSONEntityState( ValueSerialization valueSerialization, String version, - long lastModified, + Instant lastModified, EntityReference identity, EntityStatus status, EntityDescriptor entityDescriptor, JSONObject state ) { - this.unitOfWork = unitOfWork; this.valueSerialization = valueSerialization; this.version = version; this.lastModified = lastModified; @@ -106,7 +103,7 @@ public final class JSONEntityState } @Override - public long lastModified() + public Instant lastModified() { return lastModified; } @@ -201,10 +198,9 @@ public final class JSONEntityState return null; } - EntityReference value = jsonValue == JSONObject.NULL + return jsonValue == JSONObject.NULL ? null : EntityReference.parseEntityReference( (String) jsonValue ); - return value; } catch( JSONException e ) { http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java index d64617a..e36e9be 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/JSONMapEntityStoreMixin.java @@ -25,6 +25,7 @@ import java.io.ObjectInput; import java.io.ObjectOutput; import java.io.Reader; import java.io.Writer; +import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -143,7 +144,7 @@ public class JSONMapEntityStoreMixin // EntityStore @Override - public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, long currentTime ) + public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, Instant currentTime ) { return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecaseMetaInfo, currentTime ); } @@ -292,7 +293,7 @@ public class JSONMapEntityStoreMixin newUnitOfWorkId(), module, usecase, - System.currentTimeMillis() ); + Instant.now() ); final List<EntityState> migrated = new ArrayList<>(); @@ -376,14 +377,14 @@ public class JSONMapEntityStoreMixin return uuid + Integer.toHexString( count++ ); } - protected void writeEntityState( JSONEntityState state, Writer writer, String identity, long lastModified ) + protected void writeEntityState( JSONEntityState state, Writer writer, String identity, Instant lastModified ) throws EntityStoreException { try { JSONObject jsonState = state.state(); jsonState.put( JSONKeys.VERSION, identity ); - jsonState.put( JSONKeys.MODIFIED, lastModified ); + jsonState.put( JSONKeys.MODIFIED, lastModified.toEpochMilli() ); writer.append( jsonState.toString() ); } catch( JSONException | IOException e ) @@ -441,10 +442,9 @@ public class JSONMapEntityStoreMixin throw new EntityTypeNotFoundException( type ); } - return new JSONEntityState( unitOfWork, - valueSerialization, + return new JSONEntityState( valueSerialization, version, - modified, + Instant.ofEpochMilli(modified), EntityReference.parseEntityReference( identity ), status, entityDescriptor, http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java index b4abf53..8c4c64c 100644 --- a/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java +++ b/core/spi/src/main/java/org/qi4j/spi/entitystore/helpers/MapEntityStoreMixin.java @@ -22,6 +22,7 @@ package org.qi4j.spi.entitystore.helpers; import java.io.IOException; import java.io.Reader; import java.io.Writer; +import java.time.Instant; import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashMap; @@ -117,7 +118,7 @@ public class MapEntityStoreMixin // EntityStore @Override - public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, long currentTime ) + public EntityStoreUnitOfWork newUnitOfWork( Usecase usecaseMetaInfo, Module module, Instant currentTime ) { return new DefaultEntityStoreUnitOfWork( entityStoreSpi, newUnitOfWorkId(), module, usecaseMetaInfo, currentTime ); } @@ -221,7 +222,7 @@ public class MapEntityStoreMixin newUnitOfWorkId(), module, usecase, - System.currentTimeMillis() ); + Instant.now() ); final List<EntityState> migrated = new ArrayList<>(); @@ -305,7 +306,7 @@ public class MapEntityStoreMixin return uuid + Integer.toHexString( count++ ); } - protected void writeEntityState( DefaultEntityState state, Writer writer, String version, long lastModified ) + protected void writeEntityState( DefaultEntityState state, Writer writer, String version, Instant lastModified ) throws EntityStoreException { try @@ -316,7 +317,7 @@ public class MapEntityStoreMixin key( JSONKeys.APPLICATION_VERSION ).value( application.version() ). key( JSONKeys.TYPE ).value( first( state.entityDescriptor().types() ).getName() ). key( JSONKeys.VERSION ).value( version ). - key( JSONKeys.MODIFIED ).value( lastModified ). + key( JSONKeys.MODIFIED ).value( lastModified.toEpochMilli() ). key( JSONKeys.PROPERTIES ).object(); EntityDescriptor entityType = state.entityDescriptor(); for( PropertyDescriptor persistentProperty : entityType.state().properties() ) @@ -392,7 +393,7 @@ public class MapEntityStoreMixin EntityStatus status = EntityStatus.LOADED; String version = jsonObject.getString( JSONKeys.VERSION ); - long modified = jsonObject.getLong( JSONKeys.MODIFIED ); + Instant modified = Instant.ofEpochMilli( jsonObject.getLong( JSONKeys.MODIFIED ) ); String identity = jsonObject.getString( JSONKeys.IDENTITY ); // Check if version is correct http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java index ce01787..4993654 100644 --- a/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java +++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueDeserializerAdapter.java @@ -22,10 +22,23 @@ import java.io.InputStream; import java.io.ObjectInputStream; import java.math.BigDecimal; import java.math.BigInteger; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Period; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; @@ -34,9 +47,6 @@ import java.util.Scanner; import java.util.Set; import java.util.function.BiFunction; import java.util.function.Function; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.LocalDateTime; import org.qi4j.api.association.AssociationDescriptor; import org.qi4j.api.entity.EntityReference; import org.qi4j.api.injection.scope.Service; @@ -51,7 +61,6 @@ import org.qi4j.api.type.MapType; import org.qi4j.api.type.ValueCompositeType; import org.qi4j.api.type.ValueType; import org.qi4j.api.util.Base64Encoder; -import org.qi4j.api.util.Dates; import org.qi4j.api.value.ValueBuilder; import org.qi4j.api.value.ValueDescriptor; import org.qi4j.api.value.ValueDeserializer; @@ -86,9 +95,6 @@ import static org.qi4j.functional.Iterables.first; * <ul> * <li>BigInteger and BigDecimal depends on {@link org.qi4j.api.value.ValueSerializer.Options};</li> * <li>Date as String in ISO-8601, {@literal @millis@} or {@literal /Date(..)} Microsoft format;</li> - * <li>DateTime (JodaTime) as a ISO-8601 String with optional timezone offset;</li> - * <li>LocalDateTime (JodaTime) as whatever {@link LocalDateTime#LocalDateTime(java.lang.Object)} accept as {@literal instant};</li> - * <li>LocalDate (JodaTime) as whatever {@link LocalDate#LocalDate(java.lang.Object)} accept as {@literal instant};</li> * </ul> * * @param <InputType> Implementor pull-parser type @@ -260,21 +266,28 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType> } } ); - // Date types - registerDeserializer( Date.class, new Function<Object, Date>() + registerDeserializer( ZonedDateTime.class, new Function<Object, ZonedDateTime>() { @Override - public Date apply( Object input ) + public ZonedDateTime apply( Object input ) { - return Dates.fromString( input.toString() ); + return ZonedDateTime.parse( input.toString() ); } } ); - registerDeserializer( DateTime.class, new Function<Object, DateTime>() + registerDeserializer( OffsetDateTime.class, new Function<Object, OffsetDateTime>() { @Override - public DateTime apply( Object input ) + public OffsetDateTime apply( Object input ) { - return DateTime.parse( input.toString() ); + return OffsetDateTime.parse( input.toString() ); + } + } ); + registerDeserializer( OffsetTime.class, new Function<Object, OffsetTime>() + { + @Override + public OffsetTime apply( Object input ) + { + return OffsetTime.parse( input.toString() ); } } ); registerDeserializer( LocalDateTime.class, new Function<Object, LocalDateTime>() @@ -282,7 +295,15 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType> @Override public LocalDateTime apply( Object input ) { - return new LocalDateTime( input ); + return LocalDateTime.parse( input.toString() ); + } + } ); + registerDeserializer( LocalTime.class, new Function<Object, LocalTime>() + { + @Override + public LocalTime apply( Object input ) + { + return LocalTime.parse( input.toString() ); } } ); registerDeserializer( LocalDate.class, new Function<Object, LocalDate>() @@ -290,7 +311,71 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType> @Override public LocalDate apply( Object input ) { - return new LocalDate( input ); + return LocalDate.parse( input.toString() ); + } + } ); + registerDeserializer( Duration.class, new Function<Object, Duration>() + { + @Override + public Duration apply( Object input ) + { + return Duration.parse( input.toString() ); + } + } ); + registerDeserializer( Instant.class, new Function<Object, Instant>() + { + @Override + public Instant apply( Object input ) + { + return Instant.parse( input.toString() ); + } + } ); + registerDeserializer( MonthDay.class, new Function<Object, MonthDay>() + { + @Override + public MonthDay apply( Object input ) + { + return MonthDay.parse( input.toString() ); + } + } ); + registerDeserializer( Period.class, new Function<Object, Period>() + { + @Override + public Period apply( Object input ) + { + return Period.parse( input.toString() ); + } + } ); + registerDeserializer( Year.class, new Function<Object, Year>() + { + @Override + public Year apply( Object input ) + { + return Year.parse( input.toString() ); + } + } ); + registerDeserializer( YearMonth.class, new Function<Object, YearMonth>() + { + @Override + public YearMonth apply( Object input ) + { + return YearMonth.parse( input.toString() ); + } + } ); + registerDeserializer( ZoneId.class, new Function<Object, ZoneId>() + { + @Override + public ZoneId apply( Object input ) + { + return ZoneId.of( input.toString() ); + } + } ); + registerDeserializer( ZoneOffset.class, new Function<Object, ZoneOffset>() + { + @Override + public ZoneOffset apply( Object input ) + { + return ZoneOffset.of( input.toString() ); } } ); @@ -483,8 +568,13 @@ public abstract class ValueDeserializerAdapter<InputType, InputNodeType> private <T> T doDeserialize( ValueType valueType, InputType input ) throws Exception { - final Class<?> type = first( valueType.types() ); + Class<?> type = first( valueType.types() ); // Registered deserializers + if( ( !type.equals( ZoneOffset.class ) ) && ZoneId.class.isAssignableFrom( type ) ) + { + type = ZoneId.class; + } + if( deserializers.get( type ) != null ) { Object value = readPlainValue( input ); http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java index 5a1cfea..ce2bc6a 100644 --- a/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java +++ b/core/spi/src/main/java/org/qi4j/spi/value/ValueSerializerAdapter.java @@ -22,14 +22,24 @@ import java.io.ObjectOutputStream; import java.io.OutputStream; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.Date; +import java.time.Duration; +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.MonthDay; +import java.time.OffsetDateTime; +import java.time.OffsetTime; +import java.time.Period; +import java.time.Year; +import java.time.YearMonth; +import java.time.ZoneId; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; import java.util.HashMap; import java.util.Map; import java.util.function.BiFunction; import java.util.function.Function; -import org.joda.time.DateTime; -import org.joda.time.LocalDate; -import org.joda.time.LocalDateTime; import org.qi4j.api.Qi4j; import org.qi4j.api.association.Association; import org.qi4j.api.association.AssociationDescriptor; @@ -43,7 +53,6 @@ import org.qi4j.api.entity.Identity; import org.qi4j.api.property.Property; import org.qi4j.api.property.PropertyDescriptor; import org.qi4j.api.util.Base64Encoder; -import org.qi4j.api.util.Dates; import org.qi4j.api.value.ValueComposite; import org.qi4j.api.value.ValueDescriptor; import org.qi4j.api.value.ValueSerializationException; @@ -57,29 +66,26 @@ import static org.qi4j.functional.Iterables.first; * Adapter for pull-parsing capable ValueSerializers. * * <p> - * Among Plain values (see {@link ValueSerializer}) some are considered primitives to underlying serialization - * mechanisms and by so handed/come without conversion to/from implementations. Primitive values can be one of: + * Among Plain values (see {@link ValueSerializer}) some are considered primitives to underlying serialization + * mechanisms and by so handed/come without conversion to/from implementations. Primitive values can be one of: * </p> * <ul> - * <li>String,</li> - * <li>Character or char,</li> - * <li>Boolean or boolean,</li> - * <li>Integer or int,</li> - * <li>Long or long,</li> - * <li>Short or short,</li> - * <li>Byte or byte,</li> - * <li>Float or float,</li> - * <li>Double or double.</li> + * <li>String,</li> + * <li>Character or char,</li> + * <li>Boolean or boolean,</li> + * <li>Integer or int,</li> + * <li>Long or long,</li> + * <li>Short or short,</li> + * <li>Byte or byte,</li> + * <li>Float or float,</li> + * <li>Double or double.</li> * </ul> * <p> - * Some other Plain values are transformed before being handed to implementations: + * Some other Plain values are transformed before being handed to implementations: * </p> * <ul> - * <li>BigInteger and BigDecimal depends on ValueSerializer.{@link Options};</li> - * <li>Date as a ISO-8601 UTC String;</li> - * <li>DateTime (JodaTime) as a ISO-8601 String with timezone offset or Z for UTC;</li> - * <li>LocalDateTime (JodaTime) as a ISO-8601 String with no timezone offset;</li> - * <li>LocalDate (JodaTime) as a ISO-8601 String with no time info;</li> + * <li>BigInteger and BigDecimal depends on ValueSerializer.{@link Options};</li> + * <li>Date as a ISO-8601 UTC String;</li> * </ul> * * @param <OutputType> Implementor output type @@ -115,11 +121,11 @@ public abstract class ValueSerializerAdapter<OutputType> /** * Register a Plain Value type serialization Function. * - * @param <T> Plain Value parametrized Type - * @param type Plain Value Type + * @param <T> Plain Value parametrized Type + * @param type Plain Value Type * @param serializer Serialization Function */ - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") protected final <T> void registerSerializer( Class<T> type, BiFunction<Options, T, Object> serializer ) { serializers.put( type, (BiFunction<Options, Object, Object>) serializer ); @@ -128,11 +134,11 @@ public abstract class ValueSerializerAdapter<OutputType> /** * Register a Complex Value type serialization Function. * - * @param <T> Complex Value parametrized Type - * @param type Complex Value Type + * @param <T> Complex Value parametrized Type + * @param type Complex Value Type * @param serializer Serialization Function */ - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") protected final <T> void registerComplexSerializer( Class<T> type, ComplexSerializer<T, OutputType> serializer ) { complexSerializers.put( type, (ComplexSerializer<Object, OutputType>) serializer ); @@ -170,28 +176,28 @@ public abstract class ValueSerializerAdapter<OutputType> } ); // Date types - registerSerializer( Date.class, new BiFunction<Options, Date, Object>() + registerSerializer( ZonedDateTime.class, new BiFunction<Options, ZonedDateTime, Object>() { @Override - public Object apply( Options options, Date date ) + public Object apply( Options options, ZonedDateTime dateTime ) { - return Dates.toUtcString( date ); + return dateTime.toString(); } } ); - registerSerializer( DateTime.class, new BiFunction<Options, DateTime, Object>() + registerSerializer( LocalDateTime.class, new BiFunction<Options, LocalDateTime, Object>() { @Override - public Object apply( Options options, DateTime date ) + public Object apply( Options options, LocalDateTime dateTime ) { - return date.toString(); + return dateTime.toString(); } } ); - registerSerializer( LocalDateTime.class, new BiFunction<Options, LocalDateTime, Object>() + registerSerializer( LocalTime.class, new BiFunction<Options, LocalTime, Object>() { @Override - public Object apply( Options options, LocalDateTime date ) + public Object apply( Options options, LocalTime time ) { - return date.toString(); + return time.toString(); } } ); registerSerializer( LocalDate.class, new BiFunction<Options, LocalDate, Object>() @@ -202,6 +208,86 @@ public abstract class ValueSerializerAdapter<OutputType> return date.toString(); } } ); + registerSerializer( OffsetDateTime.class, new BiFunction<Options, OffsetDateTime, Object>() + { + @Override + public Object apply( Options options, OffsetDateTime time ) + { + return time.toString(); + } + } ); + registerSerializer( OffsetTime.class, new BiFunction<Options, OffsetTime, Object>() + { + @Override + public Object apply( Options options, OffsetTime time ) + { + return time.toString(); + } + } ); + registerSerializer( Duration.class, new BiFunction<Options, Duration, Object>() + { + @Override + public Object apply( Options options, Duration time ) + { + return time.toString(); + } + } ); + registerSerializer( Period.class, new BiFunction<Options, Period, Object>() + { + @Override + public Object apply( Options options, Period time ) + { + return time.toString(); + } + } ); + registerSerializer( Instant.class, new BiFunction<Options, Instant, Object>() + { + @Override + public Object apply( Options options, Instant time ) + { + return time.toString(); + } + } ); + registerSerializer( MonthDay.class, new BiFunction<Options, MonthDay, Object>() + { + @Override + public Object apply( Options options, MonthDay monthDay ) + { + return monthDay.toString(); + } + } ); + registerSerializer( Year.class, new BiFunction<Options, Year, Object>() + { + @Override + public Object apply( Options options, Year year ) + { + return year.toString(); + } + } ); + registerSerializer( YearMonth.class, new BiFunction<Options, YearMonth, Object>() + { + @Override + public Object apply( Options options, YearMonth yearMonth ) + { + return yearMonth.toString(); + } + } ); + registerSerializer( ZoneId.class, new BiFunction<Options, ZoneId, Object>() + { + @Override + public Object apply( Options options, ZoneId id ) + { + return id.toString(); + } + } ); + registerSerializer( ZoneOffset.class, new BiFunction<Options, ZoneOffset, Object>() + { + @Override + public Object apply( Options options, ZoneOffset offset ) + { + return offset.toString(); + } + } ); // Other supported types registerSerializer( EntityReference.class, new BiFunction<Options, EntityReference, Object>() @@ -361,54 +447,53 @@ public abstract class ValueSerializerAdapter<OutputType> private void doSerialize( Options options, Object object, OutputType output, boolean rootPass ) throws Exception { - // Null if( object == null ) { LOG.trace( "Null object -> onValue( null )" ); onValue( output, null ); + return; + } + + Class<?> type = object.getClass(); + if( ( !type.equals( ZoneOffset.class ) ) && ZoneId.class.isAssignableFrom( type ) ) + { + type = ZoneId.class; } - else // Registered serializer - if( serializers.get( object.getClass() ) != null ) + if( serializers.get( type ) != null ) { LOG.trace( "Registered serializer matches -> onValue( serialized )" ); - onValue( output, serializers.get( object.getClass() ).apply( options, object ) ); + onValue( output, serializers.get( type ).apply( options, object ) ); } - else if( complexSerializers.get( object.getClass() ) != null ) + else if( complexSerializers.get( type ) != null ) { - complexSerializers.get( object.getClass() ).serialize( options, object, output ); + complexSerializers.get( type ).serialize( options, object, output ); } - else // ValueComposite - if( ValueComposite.class.isAssignableFrom( object.getClass() ) ) + else if( ValueComposite.class.isAssignableFrom( type ) ) { LOG.trace( "ValueComposite assignable -> serializeValueComposite( object )" ); serializeValueComposite( options, object, output, rootPass ); } - else // EntityComposite - if( EntityComposite.class.isAssignableFrom( object.getClass() ) ) + else if( EntityComposite.class.isAssignableFrom( type ) ) { LOG.trace( "EntityComposite assignable -> serializeEntityComposite( object )" ); serializeEntityComposite( object, output ); } - else // Collection - Iterable - if( Iterable.class.isAssignableFrom( object.getClass() ) ) + else if( Iterable.class.isAssignableFrom( type ) ) { LOG.trace( "Iterable assignable -> serializeIterable( object )" ); serializeIterable( options, object, output ); } - else // Array - QUID Remove this and use java serialization for arrays? - if( object.getClass().isArray() ) + else if( type.isArray() ) { LOG.trace( "Object isArray -> serializeBase64Serializable( object )" ); serializeBase64Serializable( object, output ); } - else // Map - if( Map.class.isAssignableFrom( object.getClass() ) ) + else if( Map.class.isAssignableFrom( type ) ) { LOG.trace( "Map assignable -> serializeMap( object )" ); serializeMap( options, object, output ); } - else // Enum - if( object.getClass().isEnum() ) + else if( type.isEnum() ) { LOG.trace( "Object is an enum -> onValue( object.toString() )" ); onValue( output, object.toString() ); @@ -511,7 +596,7 @@ public abstract class ValueSerializerAdapter<OutputType> private void serializeIterable( Options options, Object object, OutputType output ) throws Exception { - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") Iterable<Object> collection = (Iterable<Object>) object; onArrayStart( output ); for( Object item : collection ) @@ -526,7 +611,7 @@ public abstract class ValueSerializerAdapter<OutputType> private void serializeMap( Options options, Object object, OutputType output ) throws Exception { - @SuppressWarnings( "unchecked" ) + @SuppressWarnings("unchecked") Map<Object, Object> map = (Map<Object, Object>) object; onArrayStart( output ); for( Map.Entry<Object, Object> entry : map.entrySet() ) @@ -560,7 +645,7 @@ public abstract class ValueSerializerAdapter<OutputType> throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); - try( ObjectOutputStream out = new ObjectOutputStream( bout ) ) + try (ObjectOutputStream out = new ObjectOutputStream( bout )) { out.writeUnshared( object ); } http://git-wip-us.apache.org/repos/asf/zest-qi4j/blob/b71c878d/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java ---------------------------------------------------------------------- diff --git a/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java b/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java index 1fd4613..ebb4bad 100644 --- a/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java +++ b/core/spi/src/test/java/org/qi4j/spi/entitystore/helpers/JSONManyAssociationStateTest.java @@ -15,6 +15,7 @@ */ package org.qi4j.spi.entitystore.helpers; +import java.time.Instant; import java.util.List; import java.util.function.Function; import org.json.JSONArray; @@ -45,9 +46,8 @@ public class JSONManyAssociationStateTest state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() ); state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() ); JSONEntityState entityState = new JSONEntityState( null, - null, "0", - System.currentTimeMillis(), + Instant.now(), EntityReference.parseEntityReference( "123" ), EntityStatus.NEW, null, @@ -71,9 +71,8 @@ public class JSONManyAssociationStateTest state.put( JSONKeys.MANY_ASSOCIATIONS, new JSONObject() ); state.put( JSONKeys.NAMED_ASSOCIATIONS, new JSONObject() ); JSONEntityState entityState = new JSONEntityState( null, - null, "0", - System.currentTimeMillis(), + Instant.now(), EntityReference.parseEntityReference( "123" ), EntityStatus.NEW, null,
