You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by pa...@apache.org on 2017/03/13 15:28:30 UTC
[07/48] polygene-java git commit: Introduce serialization converters
in API
Introduce serialization converters in API
Converters are \u201cformat agnostic\u201d and convert instances to String and the
other way around. Built-in converters for base types supported by the
Polygene Runtime (Identity, EntityReference, big numbers, date types).
POLYGENE-231
Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/ea178b90
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/ea178b90
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/ea178b90
Branch: refs/heads/serialization-3.0
Commit: ea178b90ead4da05b5c1d946c1c179d1ecb77346
Parents: 65b53d9
Author: Paul Merlin <pa...@apache.org>
Authored: Mon Mar 13 09:28:42 2017 +0100
Committer: Paul Merlin <pa...@apache.org>
Committed: Mon Mar 13 16:27:47 2017 +0100
----------------------------------------------------------------------
.../polygene/api/serialization/Converter.java | 49 ++++
.../polygene/api/serialization/Converters.java | 131 +++++++++++
.../javaxjson/JavaxJsonDeserializer.java | 15 +-
.../JavaxJsonSerializationService.java | 223 ++----------------
.../javaxjson/JavaxJsonSerializer.java | 15 +-
.../spi/serialization/BuiltInConverters.java | 235 +++++++++++++++++++
.../javaxxml/JavaxXmlDeserializer.java | 10 +
.../javaxxml/JavaxXmlSerializationService.java | 195 ++-------------
.../javaxxml/JavaxXmlSerializer.java | 10 +
.../msgpack/MessagePackDeserializer.java | 10 +
.../MessagePackSerializationService.java | 195 ++-------------
.../msgpack/MessagePackSerializer.java | 10 +
12 files changed, 535 insertions(+), 563 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/core/api/src/main/java/org/apache/polygene/api/serialization/Converter.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/serialization/Converter.java b/core/api/src/main/java/org/apache/polygene/api/serialization/Converter.java
new file mode 100644
index 0000000..b411ad3
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/serialization/Converter.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.polygene.api.serialization;
+
+/**
+ * Converter for (de)serialization.
+ *
+ * Convert instances of {@link T} to String and the other way around.
+ *
+ * @param <T> the converted type
+ */
+public interface Converter<T>
+{
+ /**
+ * @return the converted type
+ */
+ Class<T> type();
+
+ /**
+ * Convert.
+ *
+ * @param object the {@link T} to convert to String, never null
+ * @return the String representation of the given object
+ */
+ String toString( T object );
+
+ /**
+ * Revert.
+ *
+ * @param string the String to convert back to {@link T}
+ * @return the {@link T}
+ */
+ T fromString( String string );
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/core/api/src/main/java/org/apache/polygene/api/serialization/Converters.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/serialization/Converters.java b/core/api/src/main/java/org/apache/polygene/api/serialization/Converters.java
new file mode 100644
index 0000000..6b8cbef
--- /dev/null
+++ b/core/api/src/main/java/org/apache/polygene/api/serialization/Converters.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.polygene.api.serialization;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.type.HasTypes;
+import org.apache.polygene.api.type.ValueType;
+
+import static org.apache.polygene.api.type.HasTypesCollectors.closestType;
+
+/**
+ * Serialization Converters.
+ */
+@Mixins( Converters.Mixin.class )
+public interface Converters
+{
+ /**
+ * Register a converter for a value type.
+ *
+ * @param valueType the value type
+ * @param converter the converter
+ */
+ void registerConverter( ValueType valueType, Converter<?> converter );
+
+ /**
+ * Find a matching converter amongst registered ones.
+ *
+ * See {@link org.apache.polygene.api.type.HasTypesCollectors#closestType(HasTypes)}.
+ *
+ * @param valueType the value type
+ * @param <T> the converted type
+ * @return the closest matching registered converter, or {@literal null} if none
+ */
+ <T> Converter<T> converterFor( ValueType valueType );
+
+ default <T> Converter<T> converterFor( Class<? extends T> type )
+ {
+ return converterFor( ValueType.of( type ) );
+ }
+
+ /**
+ * Serialization Converters default Mixin.
+ */
+ class Mixin implements Converters
+ {
+ private final Map<ValueType, Converter<?>> converters = new LinkedHashMap<>();
+
+ @Override
+ public void registerConverter( ValueType valueType, Converter<?> converter )
+ {
+ converters.put( valueType, converter );
+ }
+
+ @Override
+ public <T> Converter<T> converterFor( ValueType valueType )
+ {
+ Converter<T> converter = castConverter( converters.keySet().stream()
+ .collect( closestType( valueType ) )
+ .map( converters::get )
+ .orElse( null ) );
+ if( converter != null )
+ {
+ return converter;
+ }
+ if( valueType.primaryType().isEnum() )
+ {
+ return new EnumConverter( valueType.primaryType() );
+ }
+ return null;
+ }
+
+ @SuppressWarnings( "unchecked" )
+ private <T> Converter<T> castConverter( Converter<?> converter )
+ {
+ return (Converter<T>) converter;
+ }
+
+ private static class EnumConverter<E extends Enum<E>> implements Converter<E>
+ {
+ private final Class<E> enumType;
+ private final Map<String, E> values;
+
+ private EnumConverter( final Class<E> enumType )
+ {
+ this.enumType = enumType;
+ E[] enumValues = enumType.getEnumConstants();
+ this.values = new HashMap<>( enumValues.length );
+ for( E enumValue : enumValues )
+ {
+ values.put( enumValue.name(), enumValue );
+ }
+ }
+
+ @Override
+ public Class<E> type()
+ {
+ return enumType;
+ }
+
+ @Override
+ public String toString( E object )
+ {
+ return object.name();
+ }
+
+ @Override
+ public E fromString( String string )
+ {
+ return values.get( string );
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonDeserializer.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonDeserializer.java b/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonDeserializer.java
index b9d9e94..a1e5d75 100644
--- a/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonDeserializer.java
+++ b/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonDeserializer.java
@@ -41,12 +41,13 @@ import org.apache.polygene.api.entity.EntityReference;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
import org.apache.polygene.api.property.PropertyDescriptor;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.serialization.SerializationException;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.structure.ModuleDescriptor;
import org.apache.polygene.api.type.ArrayType;
import org.apache.polygene.api.type.CollectionType;
-import org.apache.polygene.api.type.EnumType;
import org.apache.polygene.api.type.MapType;
import org.apache.polygene.api.type.ValueCompositeType;
import org.apache.polygene.api.type.ValueType;
@@ -69,6 +70,9 @@ import static org.apache.polygene.serialization.javaxjson.JavaxJson.requireJsonS
public class JavaxJsonDeserializer extends AbstractTextDeserializer implements JsonDeserializer
{
@This
+ private Converters converters;
+
+ @This
private JavaxJsonAdapters adapters;
@Uses
@@ -87,16 +91,17 @@ public class JavaxJsonDeserializer extends AbstractTextDeserializer implements J
{
return null;
}
+ Converter<Object> converter = converters.converterFor( valueType );
+ if( converter != null )
+ {
+ return (T) converter.fromString( doDeserialize( module, ValueType.STRING, json ).toString() );
+ }
JavaxJsonAdapter<?> adapter = adapters.adapterFor( valueType );
if( adapter != null )
{
return (T) adapter.deserialize( json, ( jsonValue, type ) -> doDeserialize( module, type, jsonValue ) );
}
Class<? extends ValueType> valueTypeClass = valueType.getClass();
- if( EnumType.class.isAssignableFrom( valueTypeClass ) )
- {
- return (T) Enum.valueOf( (Class) valueType.primaryType(), asString( json ) );
- }
if( ArrayType.class.isAssignableFrom( valueTypeClass ) )
{
return (T) deserializeArray( module, (ArrayType) valueType, json );
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializationService.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializationService.java b/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializationService.java
index 2b662ea..2618db7 100644
--- a/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializationService.java
+++ b/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializationService.java
@@ -17,32 +17,21 @@
*/
package org.apache.polygene.serialization.javaxjson;
-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.OffsetDateTime;
-import java.time.Period;
-import java.time.ZonedDateTime;
import java.util.function.BiFunction;
import java.util.function.Function;
import javax.json.Json;
import javax.json.JsonNumber;
import javax.json.JsonString;
import javax.json.JsonValue;
-import org.apache.polygene.api.entity.EntityReference;
-import org.apache.polygene.api.identity.Identity;
-import org.apache.polygene.api.identity.StringIdentity;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.serialization.SerializationException;
import org.apache.polygene.api.service.ServiceActivation;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.type.ValueType;
+import org.apache.polygene.spi.serialization.BuiltInConverters;
// TODO Move into JavaxJsonSerialization
// TODO Do the same on XML & MessagePack
@@ -55,6 +44,12 @@ public interface JavaxJsonSerializationService extends JavaxJsonSerialization, S
private ServiceDescriptor descriptor;
@This
+ private BuiltInConverters builtInConverters;
+
+ @This
+ private Converters converters;
+
+ @This
private JavaxJsonAdapters adapters;
private boolean registrationDone = false;
@@ -64,6 +59,8 @@ public interface JavaxJsonSerializationService extends JavaxJsonSerialization, S
{
if( !registrationDone )
{
+ registerCustomConverters();
+ registerBuiltInConverters();
registerCustomAdapters();
registerBaseAdapters();
registrationDone = true;
@@ -73,6 +70,16 @@ public interface JavaxJsonSerializationService extends JavaxJsonSerialization, S
@Override
public void passivateService() {}
+ private void registerCustomConverters()
+ {
+ // TODO register custom converters
+ }
+
+ private void registerBuiltInConverters()
+ {
+ builtInConverters.registerBuiltInConverters( converters );
+ }
+
private void registerCustomAdapters()
{
JavaxJsonSettings.orDefault( descriptor.metaInfo( JavaxJsonSettings.class ) )
@@ -92,24 +99,6 @@ public interface JavaxJsonSerializationService extends JavaxJsonSerialization, S
adapters.registerAdapter( ValueType.BYTE, new ByteAdapter() );
adapters.registerAdapter( ValueType.FLOAT, new FloatAdapter() );
adapters.registerAdapter( ValueType.DOUBLE, new DoubleAdapter() );
-
- // Number types
- adapters.registerAdapter( ValueType.BIG_DECIMAL, new BigDecimalAdapter() );
- adapters.registerAdapter( ValueType.BIG_INTEGER, new BigIntegerAdapter() );
-
- // Date types
- adapters.registerAdapter( ValueType.INSTANT, new InstantAdapter() );
- adapters.registerAdapter( ValueType.ZONED_DATE_TIME, new ZonedDateTimeAdapter() );
- adapters.registerAdapter( ValueType.OFFSET_DATE_TIME, new OffsetDateTimeAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_DATE_TIME, new LocalDateTimeAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_DATE, new LocalDateAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_TIME, new LocalTimeAdapter() );
- adapters.registerAdapter( ValueType.DURATION, new DurationAdapter() );
- adapters.registerAdapter( ValueType.PERIOD, new PeriodAdapter() );
-
- // Other supported types
- adapters.registerAdapter( ValueType.IDENTITY, new IdentityAdapter() );
- adapters.registerAdapter( ValueType.ENTITY_REFERENCE, new EntityReferenceAdapter() );
}
private static abstract class ToJsonStringAdapter<T> implements JavaxJsonAdapter<T>
@@ -357,177 +346,5 @@ public interface JavaxJsonSerializationService extends JavaxJsonSerialization, S
}
}
}
-
- private static class BigDecimalAdapter extends ToJsonStringAdapter<BigDecimal>
- {
- @Override
- public Class<BigDecimal> type() { return BigDecimal.class; }
-
- @Override
- public BigDecimal deserialize( JsonValue json,
- BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- switch( json.getValueType() )
- {
- case NULL:
- return null;
- case NUMBER:
- return new BigDecimal( json.toString() );
- case STRING:
- return new BigDecimal( ( (JsonString) json ).getString() );
- default:
- throw new SerializationException(
- "Don't know how to deserialize BigDecimal from " + json );
- }
- }
- }
-
- private static class BigIntegerAdapter extends ToJsonStringAdapter<BigInteger>
- {
- @Override
- public Class<BigInteger> type() { return BigInteger.class; }
-
- @Override
- public BigInteger deserialize( JsonValue json,
- BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- switch( json.getValueType() )
- {
- case NULL:
- return null;
- case NUMBER:
- return new BigInteger( json.toString() );
- case STRING:
- return new BigInteger( ( (JsonString) json ).getString() );
- default:
- throw new SerializationException(
- "Don't know how to deserialize BigInteger from " + json );
- }
- }
- }
-
- private static class PeriodAdapter extends ToJsonStringAdapter<Period>
- {
- @Override
- public Class<Period> type() { return Period.class; }
-
- @Override
- public Period deserialize( JsonValue json, BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return Period.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class DurationAdapter extends ToJsonStringAdapter<Duration>
- {
- @Override
- public Class<Duration> type() { return Duration.class; }
-
- @Override
- public Duration deserialize( JsonValue json, BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return Duration.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class LocalTimeAdapter extends ToJsonStringAdapter<LocalTime>
- {
- @Override
- public Class<LocalTime> type() { return LocalTime.class; }
-
- @Override
- public LocalTime deserialize( JsonValue json, BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return LocalTime.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class LocalDateAdapter extends ToJsonStringAdapter<LocalDate>
- {
- @Override
- public Class<LocalDate> type() { return LocalDate.class; }
-
- @Override
- public LocalDate deserialize( JsonValue json, BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return LocalDate.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class LocalDateTimeAdapter extends ToJsonStringAdapter<LocalDateTime>
- {
- @Override
- public Class<LocalDateTime> type() { return LocalDateTime.class; }
-
- @Override
- public LocalDateTime deserialize( JsonValue json,
- BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return LocalDateTime.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class OffsetDateTimeAdapter extends ToJsonStringAdapter<OffsetDateTime>
- {
- @Override
- public Class<OffsetDateTime> type() { return OffsetDateTime.class; }
-
- @Override
- public OffsetDateTime deserialize( JsonValue json,
- BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return OffsetDateTime.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class ZonedDateTimeAdapter extends ToJsonStringAdapter<ZonedDateTime>
- {
- @Override
- public Class<ZonedDateTime> type() { return ZonedDateTime.class; }
-
- @Override
- public ZonedDateTime deserialize( JsonValue json,
- BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return ZonedDateTime.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class InstantAdapter extends ToJsonStringAdapter<Instant>
- {
- @Override
- public Class<Instant> type() { return Instant.class; }
-
- @Override
- public Instant deserialize( JsonValue json, BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return Instant.parse( JavaxJson.asString( json ) );
- }
- }
-
- private static class IdentityAdapter extends ToJsonStringAdapter<Identity>
- {
- @Override
- public Class<Identity> type() { return Identity.class; }
-
- @Override
- public Identity deserialize( JsonValue json, BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return StringIdentity.fromString( JavaxJson.asString( json ) );
- }
- }
-
- private static class EntityReferenceAdapter extends ToJsonStringAdapter<EntityReference>
- {
- @Override
- public Class<EntityReference> type() { return EntityReference.class; }
-
- @Override
- public EntityReference deserialize( JsonValue json,
- BiFunction<JsonValue, ValueType, Object> deserializeFunction )
- {
- return EntityReference.parseEntityReference( JavaxJson.asString( json ) );
- }
- }
}
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializer.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializer.java b/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializer.java
index c93c822..07294a9 100644
--- a/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializer.java
+++ b/core/spi/src/main/java/org/apache/polygene/serialization/javaxjson/JavaxJsonSerializer.java
@@ -39,9 +39,10 @@ import org.apache.polygene.api.association.AssociationStateHolder;
import org.apache.polygene.api.composite.CompositeInstance;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.type.ArrayType;
-import org.apache.polygene.api.type.EnumType;
import org.apache.polygene.api.type.MapType;
import org.apache.polygene.api.type.ValueCompositeType;
import org.apache.polygene.api.type.ValueType;
@@ -58,6 +59,9 @@ import static org.apache.polygene.api.util.Collectors.toMap;
public class JavaxJsonSerializer extends AbstractTextSerializer implements JsonSerializer
{
@This
+ private Converters converters;
+
+ @This
private JavaxJsonAdapters adapters;
@Uses
@@ -76,15 +80,16 @@ public class JavaxJsonSerializer extends AbstractTextSerializer implements JsonS
return JsonValue.NULL;
}
Class<?> objectClass = object.getClass();
+ Converter<Object> converter = converters.converterFor( objectClass );
+ if( converter != null )
+ {
+ return doSerialize( options, converter.toString( object ), false );
+ }
JavaxJsonAdapter<?> adapter = adapters.adapterFor( objectClass );
if( adapter != null )
{
return adapter.serialize( object, obj -> doSerialize( options, obj, false ) );
}
- if( EnumType.isEnum( objectClass ) )
- {
- return JavaxJson.toJsonString( object.toString() );
- }
if( ValueCompositeType.isValueComposite( objectClass ) )
{
return serializeValueComposite( options, object, root );
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/core/spi/src/main/java/org/apache/polygene/spi/serialization/BuiltInConverters.java
----------------------------------------------------------------------
diff --git a/core/spi/src/main/java/org/apache/polygene/spi/serialization/BuiltInConverters.java b/core/spi/src/main/java/org/apache/polygene/spi/serialization/BuiltInConverters.java
new file mode 100644
index 0000000..a6392ff
--- /dev/null
+++ b/core/spi/src/main/java/org/apache/polygene/spi/serialization/BuiltInConverters.java
@@ -0,0 +1,235 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you 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.apache.polygene.spi.serialization;
+
+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.OffsetDateTime;
+import java.time.Period;
+import java.time.ZonedDateTime;
+import org.apache.polygene.api.entity.EntityReference;
+import org.apache.polygene.api.identity.Identity;
+import org.apache.polygene.api.identity.StringIdentity;
+import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
+import org.apache.polygene.api.type.ValueType;
+
+/**
+ * Built-in serialization converters.
+ */
+@Mixins( BuiltInConverters.Mixin.class )
+public interface BuiltInConverters
+{
+ void registerBuiltInConverters( Converters converters );
+
+ class Mixin implements BuiltInConverters
+ {
+ @Override
+ public void registerBuiltInConverters( Converters converters )
+ {
+ // Polygene types
+ converters.registerConverter( ValueType.IDENTITY, new IdentityConverter() );
+ converters.registerConverter( ValueType.ENTITY_REFERENCE, new EntityReferenceConverter() );
+
+ // Big numbers types
+ converters.registerConverter( ValueType.BIG_DECIMAL, new BigDecimalConverter() );
+ converters.registerConverter( ValueType.BIG_INTEGER, new BigIntegerConverter() );
+
+ // Date types
+ converters.registerConverter( ValueType.INSTANT, new InstantConverter() );
+ converters.registerConverter( ValueType.ZONED_DATE_TIME, new ZonedDateTimeConverter() );
+ converters.registerConverter( ValueType.OFFSET_DATE_TIME, new OffsetDateTimeConverter() );
+ converters.registerConverter( ValueType.LOCAL_DATE_TIME, new LocalDateTimeConverter() );
+ converters.registerConverter( ValueType.LOCAL_DATE, new LocalDateConverter() );
+ converters.registerConverter( ValueType.LOCAL_TIME, new LocalTimeConverter() );
+ converters.registerConverter( ValueType.DURATION, new DurationConverter() );
+ converters.registerConverter( ValueType.PERIOD, new PeriodConverter() );
+ }
+
+ private static abstract class ToStringConverter<T> implements Converter<T>
+ {
+ @Override
+ public String toString( T object )
+ {
+ return object.toString();
+ }
+ }
+
+ private static class IdentityConverter extends ToStringConverter<Identity>
+ {
+ @Override
+ public Class<Identity> type()
+ {
+ return Identity.class;
+ }
+
+ @Override
+ public Identity fromString( String string )
+ {
+ return StringIdentity.fromString( string );
+ }
+ }
+
+ private static class EntityReferenceConverter extends ToStringConverter<EntityReference>
+ {
+ @Override
+ public Class<EntityReference> type()
+ {
+ return EntityReference.class;
+ }
+
+ @Override
+ public EntityReference fromString( String string )
+ {
+ return EntityReference.parseEntityReference( string );
+ }
+ }
+
+ private static class BigDecimalConverter extends ToStringConverter<BigDecimal>
+ {
+ @Override
+ public Class<BigDecimal> type()
+ {
+ return BigDecimal.class;
+ }
+
+ @Override
+ public BigDecimal fromString( String string )
+ {
+ return new BigDecimal( string );
+ }
+ }
+
+ private static class BigIntegerConverter extends ToStringConverter<BigInteger>
+ {
+ @Override
+ public Class<BigInteger> type()
+ {
+ return BigInteger.class;
+ }
+
+ @Override
+ public BigInteger fromString( String string )
+ {
+ return new BigInteger( string );
+ }
+ }
+
+ private static class PeriodConverter extends ToStringConverter<Period>
+ {
+ @Override
+ public Class<Period> type() { return Period.class; }
+
+ @Override
+ public Period fromString( String string )
+ {
+ return Period.parse( string );
+ }
+ }
+
+ private static class DurationConverter extends ToStringConverter<Duration>
+ {
+ @Override
+ public Class<Duration> type() { return Duration.class; }
+
+ @Override
+ public Duration fromString( String string )
+ {
+ return Duration.parse( string );
+ }
+ }
+
+ private static class LocalTimeConverter extends ToStringConverter<LocalTime>
+ {
+ @Override
+ public Class<LocalTime> type() { return LocalTime.class; }
+
+ @Override
+ public LocalTime fromString( String string )
+ {
+ return LocalTime.parse( string );
+ }
+ }
+
+ private static class LocalDateConverter extends ToStringConverter<LocalDate>
+ {
+ @Override
+ public Class<LocalDate> type() { return LocalDate.class; }
+
+ @Override
+ public LocalDate fromString( String string )
+ {
+ return LocalDate.parse( string );
+ }
+ }
+
+ private static class LocalDateTimeConverter extends ToStringConverter<LocalDateTime>
+ {
+ @Override
+ public Class<LocalDateTime> type() { return LocalDateTime.class; }
+
+ @Override
+ public LocalDateTime fromString( String string )
+ {
+ return LocalDateTime.parse( string );
+ }
+ }
+
+ private static class OffsetDateTimeConverter extends ToStringConverter<OffsetDateTime>
+ {
+ @Override
+ public Class<OffsetDateTime> type() { return OffsetDateTime.class; }
+
+ @Override
+ public OffsetDateTime fromString( String string )
+ {
+ return OffsetDateTime.parse( string );
+ }
+ }
+
+ private static class ZonedDateTimeConverter extends ToStringConverter<ZonedDateTime>
+ {
+ @Override
+ public Class<ZonedDateTime> type() { return ZonedDateTime.class; }
+
+ @Override
+ public ZonedDateTime fromString( String string )
+ {
+ return ZonedDateTime.parse( string );
+ }
+ }
+
+ private static class InstantConverter extends ToStringConverter<Instant>
+ {
+ @Override
+ public Class<Instant> type() { return Instant.class; }
+
+ @Override
+ public Instant fromString( String string )
+ {
+ return Instant.parse( string );
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java
----------------------------------------------------------------------
diff --git a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java
index 25f5a22..f477a8c 100644
--- a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java
+++ b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlDeserializer.java
@@ -41,6 +41,8 @@ import org.apache.polygene.api.entity.EntityReference;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
import org.apache.polygene.api.property.PropertyDescriptor;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.serialization.SerializationException;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.structure.ModuleDescriptor;
@@ -69,6 +71,9 @@ public class JavaxXmlDeserializer extends AbstractTextDeserializer implements Xm
private static final String NULL_ELEMENT_NAME = "null";
@This
+ private Converters converters;
+
+ @This
private JavaxXmlAdapters adapters;
@Uses
@@ -97,6 +102,11 @@ public class JavaxXmlDeserializer extends AbstractTextDeserializer implements Xm
{
return null;
}
+ Converter<Object> converter = converters.converterFor( valueType );
+ if( converter != null )
+ {
+ return (T) converter.fromString( doDeserialize( module, ValueType.STRING, xml ).toString() );
+ }
JavaxXmlAdapter<?> adapter = adapters.adapterFor( valueType );
if( adapter != null )
{
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializationService.java
----------------------------------------------------------------------
diff --git a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializationService.java b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializationService.java
index 3917340..10b692e 100644
--- a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializationService.java
+++ b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializationService.java
@@ -17,27 +17,16 @@
*/
package org.apache.polygene.serialization.javaxxml;
-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.OffsetDateTime;
-import java.time.Period;
-import java.time.ZonedDateTime;
import java.util.function.BiFunction;
import java.util.function.Function;
-import org.apache.polygene.api.entity.EntityReference;
-import org.apache.polygene.api.identity.Identity;
-import org.apache.polygene.api.identity.StringIdentity;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.service.ServiceActivation;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.type.ValueType;
+import org.apache.polygene.spi.serialization.BuiltInConverters;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
@@ -50,6 +39,12 @@ public interface JavaxXmlSerializationService extends JavaxXmlSerialization, Ser
private ServiceDescriptor descriptor;
@This
+ private BuiltInConverters builtInConverters;
+
+ @This
+ private Converters converters;
+
+ @This
private JavaxXmlAdapters adapters;
private boolean registrationDone = false;
@@ -59,6 +54,8 @@ public interface JavaxXmlSerializationService extends JavaxXmlSerialization, Ser
{
if( !registrationDone )
{
+ registerCustomConverters();
+ registerBuiltInConverters();
registerCustomAdapters();
registerBaseAdapters();
registrationDone = true;
@@ -68,6 +65,16 @@ public interface JavaxXmlSerializationService extends JavaxXmlSerialization, Ser
@Override
public void passivateService() {}
+ private void registerCustomConverters()
+ {
+ // TODO register custom converters
+ }
+
+ private void registerBuiltInConverters()
+ {
+ builtInConverters.registerBuiltInConverters( converters );
+ }
+
private void registerCustomAdapters()
{
JavaxXmlSettings.orDefault( descriptor.metaInfo( JavaxXmlSettings.class ) )
@@ -87,24 +94,6 @@ public interface JavaxXmlSerializationService extends JavaxXmlSerialization, Ser
adapters.registerAdapter( ValueType.BYTE, new ByteAdapter() );
adapters.registerAdapter( ValueType.FLOAT, new FloatAdapter() );
adapters.registerAdapter( ValueType.DOUBLE, new DoubleAdapter() );
-
- // Number types
- adapters.registerAdapter( ValueType.BIG_DECIMAL, new BigDecimalAdapter() );
- adapters.registerAdapter( ValueType.BIG_INTEGER, new BigIntegerAdapter() );
-
- // Date types
- adapters.registerAdapter( ValueType.INSTANT, new InstantAdapter() );
- adapters.registerAdapter( ValueType.ZONED_DATE_TIME, new ZonedDateTimeAdapter() );
- adapters.registerAdapter( ValueType.OFFSET_DATE_TIME, new OffsetDateTimeAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_DATE_TIME, new LocalDateTimeAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_DATE, new LocalDateAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_TIME, new LocalTimeAdapter() );
- adapters.registerAdapter( ValueType.DURATION, new DurationAdapter() );
- adapters.registerAdapter( ValueType.PERIOD, new PeriodAdapter() );
-
- // Other supported types
- adapters.registerAdapter( ValueType.IDENTITY, new IdentityAdapter() );
- adapters.registerAdapter( ValueType.ENTITY_REFERENCE, new EntityReferenceAdapter() );
}
private static abstract class ToStringTextNodeAdapter<T> implements JavaxXmlAdapter<T>
@@ -224,149 +213,5 @@ public interface JavaxXmlSerializationService extends JavaxXmlSerialization, Ser
return Double.valueOf( node.getNodeValue() );
}
}
-
- private static class BigDecimalAdapter extends ToStringTextNodeAdapter<BigDecimal>
- {
- @Override
- public Class<BigDecimal> type() { return BigDecimal.class; }
-
- @Override
- public BigDecimal deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return new BigDecimal( node.getNodeValue() );
- }
- }
-
- private static class BigIntegerAdapter extends ToStringTextNodeAdapter<BigInteger>
- {
- @Override
- public Class<BigInteger> type() { return BigInteger.class; }
-
- @Override
- public BigInteger deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return new BigInteger( node.getNodeValue() );
- }
- }
-
- private static class InstantAdapter extends ToStringTextNodeAdapter<Instant>
- {
- @Override
- public Class<Instant> type() { return Instant.class; }
-
- @Override
- public Instant deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return Instant.parse( node.getNodeValue() );
- }
- }
-
- private static class ZonedDateTimeAdapter extends ToStringTextNodeAdapter<ZonedDateTime>
- {
- @Override
- public Class<ZonedDateTime> type() { return ZonedDateTime.class; }
-
- @Override
- public ZonedDateTime deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return ZonedDateTime.parse( node.getNodeValue() );
- }
- }
-
- private static class OffsetDateTimeAdapter extends ToStringTextNodeAdapter<OffsetDateTime>
- {
- @Override
- public Class<OffsetDateTime> type() { return OffsetDateTime.class; }
-
- @Override
- public OffsetDateTime deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return OffsetDateTime.parse( node.getNodeValue() );
- }
- }
-
- private static class LocalDateTimeAdapter extends ToStringTextNodeAdapter<LocalDateTime>
- {
- @Override
- public Class<LocalDateTime> type() { return LocalDateTime.class; }
-
- @Override
- public LocalDateTime deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return LocalDateTime.parse( node.getNodeValue() );
- }
- }
-
- private static class LocalDateAdapter extends ToStringTextNodeAdapter<LocalDate>
- {
- @Override
- public Class<LocalDate> type() { return LocalDate.class; }
-
- @Override
- public LocalDate deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return LocalDate.parse( node.getNodeValue() );
- }
- }
-
- private static class LocalTimeAdapter extends ToStringTextNodeAdapter<LocalTime>
- {
- @Override
- public Class<LocalTime> type() { return LocalTime.class; }
-
- @Override
- public LocalTime deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return LocalTime.parse( node.getNodeValue() );
- }
- }
-
- private static class DurationAdapter extends ToStringTextNodeAdapter<Duration>
- {
- @Override
- public Class<Duration> type() { return Duration.class; }
-
- @Override
- public Duration deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return Duration.parse( node.getNodeValue() );
- }
- }
-
- private static class PeriodAdapter extends ToStringTextNodeAdapter<Period>
- {
- @Override
- public Class<Period> type() { return Period.class; }
-
- @Override
- public Period deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return Period.parse( node.getNodeValue() );
- }
- }
-
- private static class IdentityAdapter extends ToStringTextNodeAdapter<Identity>
- {
- @Override
- public Class<Identity> type() { return Identity.class; }
-
- @Override
- public Identity deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return StringIdentity.fromString( node.getNodeValue() );
- }
- }
-
- private static class EntityReferenceAdapter extends ToStringTextNodeAdapter<EntityReference>
- {
- @Override
- public Class<EntityReference> type() { return EntityReference.class; }
-
- @Override
- public EntityReference deserialize( Node node, BiFunction<Node, ValueType, Object> deserializationFunction )
- {
- return EntityReference.parseEntityReference( node.getNodeValue() );
- }
- }
}
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java
----------------------------------------------------------------------
diff --git a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java
index f0ce0fa..49f1fa0 100644
--- a/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java
+++ b/extensions/serialization-javaxxml/src/main/java/org/apache/polygene/serialization/javaxxml/JavaxXmlSerializer.java
@@ -34,6 +34,8 @@ import org.apache.polygene.api.composite.CompositeInstance;
import org.apache.polygene.api.entity.EntityReference;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.serialization.SerializationException;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.type.ArrayType;
@@ -61,6 +63,9 @@ public class JavaxXmlSerializer extends AbstractTextSerializer implements XmlSer
private static final String NULL_ELEMENT_NAME = "null";
@This
+ private Converters converters;
+
+ @This
private JavaxXmlAdapters adapters;
@Uses
@@ -99,6 +104,11 @@ public class JavaxXmlSerializer extends AbstractTextSerializer implements XmlSer
return document.createElement( NULL_ELEMENT_NAME );
}
Class<?> objectClass = object.getClass();
+ Converter<Object> converter = converters.converterFor( objectClass );
+ if( converter != null )
+ {
+ return doSerialize( document, options, converter.toString( object ), false );
+ }
JavaxXmlAdapter<?> adapter = adapters.adapterFor( objectClass );
if( adapter != null )
{
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackDeserializer.java
----------------------------------------------------------------------
diff --git a/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackDeserializer.java b/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackDeserializer.java
index 70b4b8a..7a82751 100644
--- a/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackDeserializer.java
+++ b/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackDeserializer.java
@@ -39,6 +39,8 @@ import org.apache.polygene.api.entity.EntityReference;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.mixin.Mixins;
import org.apache.polygene.api.property.PropertyDescriptor;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.serialization.Deserializer;
import org.apache.polygene.api.serialization.SerializationException;
import org.apache.polygene.api.structure.ModuleDescriptor;
@@ -70,6 +72,9 @@ public interface MessagePackDeserializer extends Deserializer
class Mixin extends AbstractBinaryDeserializer
{
@This
+ private Converters converters;
+
+ @This
private MessagePackAdapters adapters;
@Override
@@ -100,6 +105,11 @@ public interface MessagePackDeserializer extends Deserializer
{
return null;
}
+ Converter<Object> converter = converters.converterFor( valueType );
+ if( converter != null )
+ {
+ return (T) converter.fromString( doDeserialize( module, ValueType.STRING, value ).toString() );
+ }
MessagePackAdapter<?> adapter = adapters.adapterFor( valueType );
if( adapter != null )
{
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializationService.java
----------------------------------------------------------------------
diff --git a/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializationService.java b/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializationService.java
index 4cd23b7..51badc3 100644
--- a/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializationService.java
+++ b/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializationService.java
@@ -17,27 +17,16 @@
*/
package org.apache.polygene.serialization.msgpack;
-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.OffsetDateTime;
-import java.time.Period;
-import java.time.ZonedDateTime;
import java.util.function.BiFunction;
import java.util.function.Function;
-import org.apache.polygene.api.entity.EntityReference;
-import org.apache.polygene.api.identity.Identity;
-import org.apache.polygene.api.identity.StringIdentity;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.injection.scope.Uses;
import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.service.ServiceActivation;
import org.apache.polygene.api.service.ServiceDescriptor;
import org.apache.polygene.api.type.ValueType;
+import org.apache.polygene.spi.serialization.BuiltInConverters;
import org.msgpack.value.Value;
import org.msgpack.value.ValueFactory;
@@ -50,6 +39,12 @@ public interface MessagePackSerializationService extends MessagePackSerializatio
private ServiceDescriptor descriptor;
@This
+ private BuiltInConverters builtInConverters;
+
+ @This
+ private Converters converters;
+
+ @This
private MessagePackAdapters adapters;
private boolean registrationDone = false;
@@ -59,6 +54,8 @@ public interface MessagePackSerializationService extends MessagePackSerializatio
{
if( !registrationDone )
{
+ registerCustomConverters();
+ registerBuiltInConverters();
registerCustomAdapters();
registerBaseAdapters();
registrationDone = true;
@@ -68,6 +65,16 @@ public interface MessagePackSerializationService extends MessagePackSerializatio
@Override
public void passivateService() {}
+ private void registerCustomConverters()
+ {
+ // TODO register custom converters
+ }
+
+ private void registerBuiltInConverters()
+ {
+ builtInConverters.registerBuiltInConverters( converters );
+ }
+
private void registerCustomAdapters()
{
MessagePackSettings.orDefault( descriptor.metaInfo( MessagePackSettings.class ) )
@@ -87,24 +94,6 @@ public interface MessagePackSerializationService extends MessagePackSerializatio
adapters.registerAdapter( ValueType.BYTE, new ByteAdapter() );
adapters.registerAdapter( ValueType.FLOAT, new FloatAdapter() );
adapters.registerAdapter( ValueType.DOUBLE, new DoubleAdapter() );
-
- // Number types
- adapters.registerAdapter( ValueType.BIG_DECIMAL, new BigDecimalAdapter() );
- adapters.registerAdapter( ValueType.BIG_INTEGER, new BigIntegerAdapter() );
-
- // Date types
- adapters.registerAdapter( ValueType.INSTANT, new InstantAdapter() );
- adapters.registerAdapter( ValueType.ZONED_DATE_TIME, new ZonedDateTimeAdapter() );
- adapters.registerAdapter( ValueType.OFFSET_DATE_TIME, new OffsetDateTimeAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_DATE_TIME, new LocalDateTimeAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_DATE, new LocalDateAdapter() );
- adapters.registerAdapter( ValueType.LOCAL_TIME, new LocalTimeAdapter() );
- adapters.registerAdapter( ValueType.DURATION, new DurationAdapter() );
- adapters.registerAdapter( ValueType.PERIOD, new PeriodAdapter() );
-
- // Other supported types
- adapters.registerAdapter( ValueType.IDENTITY, new IdentityAdapter() );
- adapters.registerAdapter( ValueType.ENTITY_REFERENCE, new EntityReferenceAdapter() );
}
private static abstract class ToStringAdapter<T> implements MessagePackAdapter<T>
@@ -266,149 +255,5 @@ public interface MessagePackSerializationService extends MessagePackSerializatio
return value.asFloatValue().toDouble();
}
}
-
- private static class BigDecimalAdapter extends ToStringAdapter<BigDecimal>
- {
- @Override
- public Class<BigDecimal> type() { return BigDecimal.class; }
-
- @Override
- public BigDecimal deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return new BigDecimal( value.asStringValue().asString() );
- }
- }
-
- private static class BigIntegerAdapter extends ToStringAdapter<BigInteger>
- {
- @Override
- public Class<BigInteger> type() { return BigInteger.class; }
-
- @Override
- public BigInteger deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return new BigInteger( value.asStringValue().asString() );
- }
- }
-
- private static class InstantAdapter extends ToStringAdapter<Instant>
- {
- @Override
- public Class<Instant> type() { return Instant.class; }
-
- @Override
- public Instant deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return Instant.parse( value.asStringValue().asString() );
- }
- }
-
- private static class ZonedDateTimeAdapter extends ToStringAdapter<ZonedDateTime>
- {
- @Override
- public Class<ZonedDateTime> type() { return ZonedDateTime.class; }
-
- @Override
- public ZonedDateTime deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return ZonedDateTime.parse( value.asStringValue().asString() );
- }
- }
-
- private static class OffsetDateTimeAdapter extends ToStringAdapter<OffsetDateTime>
- {
- @Override
- public Class<OffsetDateTime> type() { return OffsetDateTime.class; }
-
- @Override
- public OffsetDateTime deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return OffsetDateTime.parse( value.asStringValue().asString() );
- }
- }
-
- private static class LocalDateTimeAdapter extends ToStringAdapter<LocalDateTime>
- {
- @Override
- public Class<LocalDateTime> type() { return LocalDateTime.class; }
-
- @Override
- public LocalDateTime deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return LocalDateTime.parse( value.asStringValue().asString() );
- }
- }
-
- private static class LocalDateAdapter extends ToStringAdapter<LocalDate>
- {
- @Override
- public Class<LocalDate> type() { return LocalDate.class; }
-
- @Override
- public LocalDate deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return LocalDate.parse( value.asStringValue().asString() );
- }
- }
-
- private static class LocalTimeAdapter extends ToStringAdapter<LocalTime>
- {
- @Override
- public Class<LocalTime> type() { return LocalTime.class; }
-
- @Override
- public LocalTime deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return LocalTime.parse( value.asStringValue().asString() );
- }
- }
-
- private static class DurationAdapter extends ToStringAdapter<Duration>
- {
- @Override
- public Class<Duration> type() { return Duration.class; }
-
- @Override
- public Duration deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return Duration.parse( value.asStringValue().asString() );
- }
- }
-
- private static class PeriodAdapter extends ToStringAdapter<Period>
- {
- @Override
- public Class<Period> type() { return Period.class; }
-
- @Override
- public Period deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return Period.parse( value.asStringValue().asString() );
- }
- }
-
- private static class IdentityAdapter extends ToStringAdapter<Identity>
- {
- @Override
- public Class<Identity> type() { return Identity.class; }
-
- @Override
- public Identity deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return StringIdentity.fromString( value.asStringValue().asString() );
- }
- }
-
- private static class EntityReferenceAdapter extends ToStringAdapter<EntityReference>
- {
- @Override
- public Class<EntityReference> type() { return EntityReference.class; }
-
- @Override
- public EntityReference deserialize( Value value, BiFunction<Value, ValueType, Object> deserializeFunction )
- {
- return EntityReference.parseEntityReference( value.asStringValue().asString() );
- }
- }
}
}
http://git-wip-us.apache.org/repos/asf/polygene-java/blob/ea178b90/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializer.java
----------------------------------------------------------------------
diff --git a/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializer.java b/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializer.java
index a8f396c..c01ef29 100644
--- a/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializer.java
+++ b/extensions/serialization-msgpack/src/main/java/org/apache/polygene/serialization/msgpack/MessagePackSerializer.java
@@ -30,6 +30,8 @@ import org.apache.polygene.api.common.Optional;
import org.apache.polygene.api.composite.CompositeInstance;
import org.apache.polygene.api.injection.scope.This;
import org.apache.polygene.api.mixin.Mixins;
+import org.apache.polygene.api.serialization.Converter;
+import org.apache.polygene.api.serialization.Converters;
import org.apache.polygene.api.serialization.SerializationException;
import org.apache.polygene.api.serialization.Serializer;
import org.apache.polygene.api.type.ArrayType;
@@ -57,6 +59,9 @@ public interface MessagePackSerializer extends Serializer
class Mixin extends AbstractBinarySerializer
{
@This
+ private Converters converters;
+
+ @This
private MessagePackAdapters adapters;
@Override
@@ -84,6 +89,11 @@ public interface MessagePackSerializer extends Serializer
return ValueFactory.newNil();
}
Class<?> objectClass = object.getClass();
+ Converter<Object> converter = converters.converterFor( objectClass );
+ if( converter != null )
+ {
+ return doSerialize( options, converter.toString( object ), false );
+ }
MessagePackAdapter<?> adapter = adapters.adapterFor( objectClass );
if( adapter != null )
{