You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2015/04/17 18:08:49 UTC
[37/50] [abbrv] zest-qi4j git commit: Replaced Joda Time with Java 8
Time API.
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 <ni...@hedhman.org>
Authored: Sat Oct 4 13:49:30 2014 +0800
Committer: Niclas Hedhman <ni...@hedhman.org>
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,