Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 7CC77200B29 for ; Thu, 16 Jun 2016 08:02:48 +0200 (CEST) Received: by cust-asf.ponee.io (Postfix) id 7B52F160A57; Thu, 16 Jun 2016 06:02:48 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id CCE4D160A4D for ; Thu, 16 Jun 2016 08:02:46 +0200 (CEST) Received: (qmail 38016 invoked by uid 500); 16 Jun 2016 06:02:46 -0000 Mailing-List: contact commits-help@zest.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@zest.apache.org Delivered-To: mailing list commits@zest.apache.org Received: (qmail 37994 invoked by uid 99); 16 Jun 2016 06:02:45 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 16 Jun 2016 06:02:45 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id BDD5DDFBA8; Thu, 16 Jun 2016 06:02:45 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: niclas@apache.org To: commits@zest.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: zest-java git commit: ZEST-158 : Removed support for legacy Map serialization format. Date: Thu, 16 Jun 2016 06:02:45 +0000 (UTC) archived-at: Thu, 16 Jun 2016 06:02:48 -0000 Repository: zest-java Updated Branches: refs/heads/develop 93b6d0302 -> 65c7df371 ZEST-158 : Removed support for legacy Map serialization format. Project: http://git-wip-us.apache.org/repos/asf/zest-java/repo Commit: http://git-wip-us.apache.org/repos/asf/zest-java/commit/65c7df37 Tree: http://git-wip-us.apache.org/repos/asf/zest-java/tree/65c7df37 Diff: http://git-wip-us.apache.org/repos/asf/zest-java/diff/65c7df37 Branch: refs/heads/develop Commit: 65c7df37108e7d94a432aefc34d9aca020f64baf Parents: 93b6d03 Author: Niclas Hedhman Authored: Thu Jun 16 14:02:05 2016 +0800 Committer: Niclas Hedhman Committed: Thu Jun 16 14:02:05 2016 +0800 ---------------------------------------------------------------------- .../zest/api/property/IllegalTypeException.java | 77 ++++++++++ .../java/org/apache/zest/api/type/MapType.java | 17 --- .../org/apache/zest/api/type/Serialization.java | 62 -------- .../apache/zest/api/value/ValueSerializer.java | 12 -- .../runtime/composite/CompositeMethodModel.java | 31 +++- .../zest/runtime/property/PropertyModel.java | 28 ++-- .../zest/runtime/types/ValueTypeFactory.java | 20 ++- .../apache/zest/bootstrap/InvalidTypesTest.java | 141 +++++++++++++++++++ .../spi/value/ValueDeserializerAdapter.java | 44 ++---- .../zest/spi/value/ValueSerializerAdapter.java | 50 ++----- .../orgjson/OrgJsonValueDeserializer.java | 37 ----- .../jackson/JacksonValueDeserializer.java | 35 ----- .../stax/StaxValueDeserializer.java | 29 ---- .../serialization/JsonRepresentation.java | 2 +- 14 files changed, 288 insertions(+), 297 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/api/src/main/java/org/apache/zest/api/property/IllegalTypeException.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/zest/api/property/IllegalTypeException.java b/core/api/src/main/java/org/apache/zest/api/property/IllegalTypeException.java new file mode 100644 index 0000000..cf811a1 --- /dev/null +++ b/core/api/src/main/java/org/apache/zest/api/property/IllegalTypeException.java @@ -0,0 +1,77 @@ +/* + * 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.zest.api.property; + +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; + +/** + * Some known types are prohibited from use in Apache Zest. + * + * This exception is thrown when you try to use any of the prohibited types. + * The types are; + *
    + *
  • java.util.Date
  • + *
  • java.util.Calendar
  • + *
  • java.util.DateFormatter
  • + *
  • java.util.SimpleDateFormatter
  • + *
  • java.sql.Date
  • + *
  • java.sql.Time
  • + *
  • org.joda.time.*
  • + *
+ * + * This exception may be thrown either when a Property type is declared with any + * of these, or if a method under Zest control is called containing any of these + * types. + * + * If the system property zest.types.allow.prohibited=true, then the check is disabled + * and those types are allowed. Use with extreme care. + */ +public class IllegalTypeException extends RuntimeException +{ + public IllegalTypeException( String message ) + { + super( message ); + } + + + public static boolean checkProhibited( Type type ) + { + if( type instanceof ParameterizedType ) + { + // raw type is the container, e.g. Collection in Collection + type = ( (ParameterizedType) type ).getRawType(); + } + if( type instanceof Class ) + { + String typeName = ( (Class) type ).getName(); + return typeName.equals( "java.util.Date" ) + || typeName.equals( "java.util.Calendar" ) + || typeName.equals( "java.text.DateFormat" ) + || typeName.equals( "java.text.SimpleDateFormat" ) + || typeName.equals( "java.sql.Date" ) + || typeName.equals( "java.sql.Time" ) + || typeName.startsWith( "org.joda.time." ); + } + return false; + } + +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/api/src/main/java/org/apache/zest/api/type/MapType.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/zest/api/type/MapType.java b/core/api/src/main/java/org/apache/zest/api/type/MapType.java index 2fc6893..c76fd60 100644 --- a/core/api/src/main/java/org/apache/zest/api/type/MapType.java +++ b/core/api/src/main/java/org/apache/zest/api/type/MapType.java @@ -33,7 +33,6 @@ public final class MapType private ValueType keyType; private ValueType valueType; - private final Serialization.Variant variant; public static boolean isMap( Type type ) { @@ -46,22 +45,11 @@ public final class MapType return new MapType( Map.class, ValueType.of( keyType ), ValueType.of( valueType ) ); } - public static MapType of( Class keyType, Class valueType, Serialization.Variant variant ) - { - return new MapType( Map.class, ValueType.of( keyType ), ValueType.of( valueType ), variant ); - } - public MapType( Class type, ValueType keyType, ValueType valueType ) { - this( type, keyType, valueType, Serialization.Variant.entry ); - } - - public MapType( Class type, ValueType keyType, ValueType valueType, Serialization.Variant variant ) - { super( type ); this.keyType = keyType; this.valueType = valueType; - this.variant = variant; if( !isMap( type ) ) { throw new IllegalArgumentException( type + " is not a Map." ); @@ -78,11 +66,6 @@ public final class MapType return valueType; } - public Serialization.Variant variant() - { - return variant; - } - @Override public String toString() { http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/api/src/main/java/org/apache/zest/api/type/Serialization.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/zest/api/type/Serialization.java b/core/api/src/main/java/org/apache/zest/api/type/Serialization.java deleted file mode 100644 index 81a0188..0000000 --- a/core/api/src/main/java/org/apache/zest/api/type/Serialization.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.zest.api.type; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Serialization options for Property intstances. - *

- * The {@code entry} type represents the explicit key=keyValue, value=valueValue. For JSON serialization; - *

- *
- *     [
- *         { "key1" : "value1" },
- *         { "key2" : "value2" }
- *     ]
- * 
- *

- * For XML serialization; - *

- *
- *     <object>
- *         <
- *     </object>
- * 
- *

- * The {@code object} type represents the explicit keyValue=valueValue. - *

- */ -@Retention( RetentionPolicy.RUNTIME ) -@Target( { ElementType.TYPE, ElementType.METHOD } ) -@Documented -public @interface Serialization -{ - Variant value(); - - enum Variant - { - entry, object - } -} http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/api/src/main/java/org/apache/zest/api/value/ValueSerializer.java ---------------------------------------------------------------------- diff --git a/core/api/src/main/java/org/apache/zest/api/value/ValueSerializer.java b/core/api/src/main/java/org/apache/zest/api/value/ValueSerializer.java index 6ab536e..249b78f 100644 --- a/core/api/src/main/java/org/apache/zest/api/value/ValueSerializer.java +++ b/core/api/src/main/java/org/apache/zest/api/value/ValueSerializer.java @@ -178,7 +178,6 @@ public interface ValueSerializer * Default to TRUE. */ public static final String INCLUDE_TYPE_INFO = "includeTypeInfo"; - public static final String MAP_ENTRIES_AS_OBJECTS = "mapentriesasobjects"; private final Map options = new HashMap<>(); /** @@ -187,7 +186,6 @@ public interface ValueSerializer public Options() { this.options.put( INCLUDE_TYPE_INFO, "true" ); - this.options.put( MAP_ENTRIES_AS_OBJECTS, "true" ); } /** @@ -208,16 +206,6 @@ public interface ValueSerializer return put( INCLUDE_TYPE_INFO, false ); } - public Options withMapEntriesAsObjects() - { - return put( MAP_ENTRIES_AS_OBJECTS, true ); - } - - public Options withMapEntriesAsKeyValuePairs() - { - return put( MAP_ENTRIES_AS_OBJECTS, false ); - } - /** * Get Boolean option value. * @param option The option http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/runtime/src/main/java/org/apache/zest/runtime/composite/CompositeMethodModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/composite/CompositeMethodModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/composite/CompositeMethodModel.java index 237b023..03d8868 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/composite/CompositeMethodModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/composite/CompositeMethodModel.java @@ -28,17 +28,20 @@ import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; import org.apache.zest.api.common.ConstructionException; import org.apache.zest.api.composite.MethodDescriptor; +import org.apache.zest.api.property.IllegalTypeException; import org.apache.zest.api.structure.ModuleDescriptor; import org.apache.zest.api.util.NullArgumentException; import org.apache.zest.functional.HierarchicalVisitor; import org.apache.zest.functional.VisitableHierarchy; import org.apache.zest.runtime.injection.Dependencies; import org.apache.zest.runtime.injection.DependencyModel; -import org.apache.zest.spi.module.ModuleSpi; + +import static org.apache.zest.api.property.IllegalTypeException.checkProhibited; /** * JAVADOC @@ -67,6 +70,7 @@ public final class CompositeMethodModel MixinsModel mixinsModel ) { + validateMethod( method ); this.method = method; mixins = mixinsModel; concerns = concernsModel; @@ -83,6 +87,20 @@ public final class CompositeMethodModel // instancePool = new SynchronizedCompositeMethodInstancePool(); } + private void validateMethod( Method method ) + { + Class[] parameterTypes = method.getParameterTypes(); + for( Class type : parameterTypes ) + { + if( checkProhibited( type ) ) + { + throw new IllegalTypeException( "In method " + method.getName() + " of " + mixins + " has a argument type " + type + .getName() + ". This is a prohibited type in Apache Zest." ); + } + } + } + + // Model @Override @@ -100,7 +118,16 @@ public final class CompositeMethodModel @SuppressWarnings( "unchecked" ) public Stream dependencies() { - return Stream.of( concerns, sideEffects ).filter( e -> e != null ).flatMap( Dependencies::dependencies ); + return Stream.of( concerns, sideEffects ) + .filter( e -> e != null ) + .flatMap( new Function>() + { + @Override + public Stream apply( Dependencies dependencies ) + { + return dependencies.dependencies(); + } + } ); // return flattenIterables( filter( notNull(), iterable( concerns != null ? concerns.dependencies() : null, // sideEffects != null ? sideEffects.dependencies() : null ) ) ); } http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/runtime/src/main/java/org/apache/zest/runtime/property/PropertyModel.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/property/PropertyModel.java b/core/runtime/src/main/java/org/apache/zest/runtime/property/PropertyModel.java index 807194f..c140850 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/property/PropertyModel.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/property/PropertyModel.java @@ -35,12 +35,12 @@ import org.apache.zest.api.constraint.ConstraintViolationException; import org.apache.zest.api.entity.Queryable; import org.apache.zest.api.property.DefaultValues; import org.apache.zest.api.property.GenericPropertyInfo; +import org.apache.zest.api.property.IllegalTypeException; import org.apache.zest.api.property.InvalidPropertyTypeException; import org.apache.zest.api.property.Property; import org.apache.zest.api.property.PropertyDescriptor; import org.apache.zest.api.service.NoSuchServiceException; import org.apache.zest.api.structure.ModuleDescriptor; -import org.apache.zest.api.type.Serialization; import org.apache.zest.api.type.ValueCompositeType; import org.apache.zest.api.type.ValueType; import org.apache.zest.api.util.Classes; @@ -54,6 +54,8 @@ import org.apache.zest.runtime.model.Binder; import org.apache.zest.runtime.model.Resolution; import org.apache.zest.runtime.types.ValueTypeFactory; +import static org.apache.zest.api.property.IllegalTypeException.checkProhibited; + //import static org.apache.zest.functional.Iterables.empty; //import static org.apache.zest.functional.Iterables.first; @@ -65,6 +67,8 @@ import org.apache.zest.runtime.types.ValueTypeFactory; public class PropertyModel implements PropertyDescriptor, PropertyInfo, Binder, Visitable { + private static boolean disallowProhibited = Boolean.getBoolean("zest.property.types.allow.prohibited"); + private Type type; private transient AccessibleObject accessor; // Interface accessor @@ -106,6 +110,10 @@ public class PropertyModel this.immutable = immutable; this.metaInfo = metaInfo; type = GenericPropertyInfo.propertyTypeOf( accessor ); + if( PropertyModel.disallowProhibited && checkProhibited(type) ) + { + throw new IllegalTypeException( type + "is not allowed as a Property type" ); + } this.accessor = accessor; qualifiedName = QualifiedName.fromAccessor( accessor ); @@ -226,8 +234,7 @@ public class PropertyModel ValueTypeFactory factory = ValueTypeFactory.instance(); Class declaringClass = ( (Member) accessor() ).getDeclaringClass(); Class mainType = resolution.model().types().findFirst().orElse( null ); - Serialization.Variant variant = findVariant(); - valueType = factory.newValueType( type(), declaringClass, mainType, resolution.layer(), resolution.module(), variant ); + valueType = factory.newValueType( type(), declaringClass, mainType, resolution.layer(), resolution.module()); builderInfo = new BuilderPropertyInfo(); if( type instanceof TypeVariable ) { @@ -235,21 +242,6 @@ public class PropertyModel } } - private Serialization.Variant findVariant() - { - Serialization serialization = metaInfo.get( Serialization.class ); - Serialization.Variant variant = null; - if( serialization != null ) - { - variant = serialization.value(); - } - if( variant == null ) - { - variant = Serialization.Variant.entry; - } - return variant; - } - @Override public boolean accept( Visitor visitor ) throws ThrowableType http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java b/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java index 427ce43..f19d618 100644 --- a/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java +++ b/core/runtime/src/main/java/org/apache/zest/runtime/types/ValueTypeFactory.java @@ -31,7 +31,6 @@ import org.apache.zest.api.common.Visibility; import org.apache.zest.api.type.CollectionType; import org.apache.zest.api.type.EnumType; import org.apache.zest.api.type.MapType; -import org.apache.zest.api.type.Serialization; import org.apache.zest.api.type.ValueCompositeType; import org.apache.zest.api.type.ValueType; import org.apache.zest.api.util.Classes; @@ -64,8 +63,7 @@ public class ValueTypeFactory Class declaringClass, Class compositeType, LayerModel layer, - ModuleModel module, - Serialization.Variant variant + ModuleModel module ) { ValueType valueType; @@ -80,12 +78,12 @@ public class ValueTypeFactory TypeVariable collectionTypeVariable = (TypeVariable) collectionType; collectionType = Classes.resolveTypeVariable( collectionTypeVariable, declaringClass, compositeType ); } - ValueType collectedType = newValueType( collectionType, declaringClass, compositeType, layer, module, variant ); + ValueType collectedType = newValueType( collectionType, declaringClass, compositeType, layer, module ); valueType = new CollectionType( Classes.RAW_CLASS.apply( type ), collectedType ); } else { - ValueType collectedType = newValueType( Object.class, declaringClass, compositeType, layer, module, variant ); + ValueType collectedType = newValueType( Object.class, declaringClass, compositeType, layer, module ); valueType = new CollectionType( Classes.RAW_CLASS.apply( type ), collectedType ); } } @@ -100,21 +98,21 @@ public class ValueTypeFactory TypeVariable keyTypeVariable = (TypeVariable) keyType; keyType = Classes.resolveTypeVariable( keyTypeVariable, declaringClass, compositeType ); } - ValueType keyedType = newValueType( keyType, declaringClass, compositeType, layer, module, variant ); + ValueType keyedType = newValueType( keyType, declaringClass, compositeType, layer, module ); Type valType = pt.getActualTypeArguments()[ 1 ]; if( valType instanceof TypeVariable ) { TypeVariable valueTypeVariable = (TypeVariable) valType; valType = Classes.resolveTypeVariable( valueTypeVariable, declaringClass, compositeType ); } - ValueType valuedType = newValueType( valType, declaringClass, compositeType, layer, module, variant ); - valueType = new MapType( Classes.RAW_CLASS.apply( type ), keyedType, valuedType, variant ); + ValueType valuedType = newValueType( valType, declaringClass, compositeType, layer, module ); + valueType = new MapType( Classes.RAW_CLASS.apply( type ), keyedType, valuedType ); } else { - ValueType keyType = newValueType( Object.class, declaringClass, compositeType, layer, module, variant ); - ValueType valuesType = newValueType( Object.class, declaringClass, compositeType, layer, module, variant ); - valueType = new MapType( Classes.RAW_CLASS.apply( type ), keyType, valuesType, variant ); + ValueType keyType = newValueType( Object.class, declaringClass, compositeType, layer, module ); + ValueType valuesType = newValueType( Object.class, declaringClass, compositeType, layer, module ); + valueType = new MapType( Classes.RAW_CLASS.apply( type ), keyType, valuesType ); } } else if( ValueCompositeType.isValueComposite( type ) ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/runtime/src/test/java/org/apache/zest/bootstrap/InvalidTypesTest.java ---------------------------------------------------------------------- diff --git a/core/runtime/src/test/java/org/apache/zest/bootstrap/InvalidTypesTest.java b/core/runtime/src/test/java/org/apache/zest/bootstrap/InvalidTypesTest.java new file mode 100644 index 0000000..103e182 --- /dev/null +++ b/core/runtime/src/test/java/org/apache/zest/bootstrap/InvalidTypesTest.java @@ -0,0 +1,141 @@ +/* + * 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.zest.bootstrap; + +import org.apache.zest.api.activation.ActivationException; +import org.apache.zest.api.common.InvalidApplicationException; +import org.apache.zest.api.mixin.NoopMixin; +import org.apache.zest.api.property.IllegalTypeException; +import org.junit.Test; + +public class InvalidTypesTest +{ + public void givenMethodWithStringWhenDeclaringExpectOk() + throws Throwable + { + bootWith( Interface0.class ); + } + + @Test( expected = IllegalTypeException.class ) + public void givenMethodWithJavaUtilDateWhenDeclaringExpectException() + throws Throwable + { + bootWith( Interface1.class ); + } + + @Test( expected = IllegalTypeException.class ) + public void givenMethodWithJavaUtilCalendarWhenDeclaringExpectException() + throws Throwable + { + bootWith( Interface2.class ); + } + + @Test( expected = IllegalTypeException.class ) + public void givenMethodWithJavaSqlTimeWhenDeclaringExpectException() + throws Throwable + { + bootWith( Interface3.class ); + } + + @Test( expected = IllegalTypeException.class ) + public void givenMethodWithJavaSqlDateWhenDeclaringExpectException() + throws Throwable + { + bootWith( Interface4.class ); + } + + @Test( expected = IllegalTypeException.class ) + public void givenMethodWithJavaTextDateFormatWhenDeclaringExpectException() + throws Throwable + { + bootWith( Interface5.class ); + } + + @Test( expected = IllegalTypeException.class ) + public void givenMethodWithJavaTextSimpleDateFormatWhenDeclaringExpectException() + throws Throwable + { + bootWith( Interface6.class ); + } + + private void bootWith( Class type ) + throws Throwable + { + try + { + new SingletonAssembler() + { + + @Override + public void assemble( ModuleAssembly module ) + throws AssemblyException + { + module.values( type ).withMixins( NoopMixin.class ); + } + }; + } + catch( AssemblyException | ActivationException e ) + { + Throwable cause = e.getCause(); + if( cause instanceof InvalidApplicationException ) + { + throw cause.getCause(); + } + + } + } + + interface Interface0 + { + void doSomething( String abc ); + } + + interface Interface1 + { + void doSomething( java.util.Date arg1 ); + } + + interface Interface2 + { + void doSomething( String abc, java.util.Calendar arg1 ); + } + + interface Interface3 + { + void doSomething( String abc, java.sql.Time arg1 ); + } + + interface Interface4 + { + void doSomething( String abc, java.sql.Date arg1 ); + } + + interface Interface5 + { + void doSomething( String abc, java.text.DateFormat arg1 ); + } + + interface Interface6 + { + void doSomething( String abc, java.text.SimpleDateFormat arg1 ); + } + +} http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java b/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java index 93a8d7e..e9c8c75 100644 --- a/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java +++ b/core/spi/src/main/java/org/apache/zest/spi/value/ValueDeserializerAdapter.java @@ -48,7 +48,6 @@ import org.apache.zest.api.structure.ModuleDescriptor; import org.apache.zest.api.type.CollectionType; import org.apache.zest.api.type.EnumType; import org.apache.zest.api.type.MapType; -import org.apache.zest.api.type.Serialization; import org.apache.zest.api.type.ValueCompositeType; import org.apache.zest.api.type.ValueType; import org.apache.zest.api.value.ValueBuilder; @@ -81,10 +80,13 @@ import static org.apache.zest.functional.Iterables.empty; *

*
    *
  • BigInteger and BigDecimal depends on {@link org.apache.zest.api.value.ValueSerializer.Options};
  • - *
  • Date as String in ISO-8601, {@literal @millis@} or {@literal /Date(..)} Microsoft format;
  • - *
  • DateTime (JodaTime) as a ISO-8601 String with optional timezone offset;
  • - *
  • LocalDateTime (JodaTime) as whatever {@link LocalDateTime#parse} accept as {@literal instant};
  • - *
  • LocalDate (JodaTime) as whatever {@link LocalDate#parse} accept as {@literal instant};
  • + *
  • ZonedDateTime as a ISO-8601 String with optional timezone name;
  • + *
  • OffsetDateTime as a ISO-8601 String with optional timezone offset;
  • + *
  • LocalDateTime as whatever {@link LocalDateTime#parse} accept as {@literal instant};
  • + *
  • LocalDate as whatever {@link LocalDate#parse} accept as {@literal instant};
  • + *
  • LocalTime as whatever {@link LocalTime#parse} accept as {@literal instant};
  • + *
  • Duration as a ISO-8601 String representing a {@link java.time.Duration}
  • + *
  • Period as a ISO-8601 String representing a {@link java.time.Period}
  • *
* * @param Implementor pull-parser type @@ -552,7 +554,7 @@ public abstract class ValueDeserializerAdapter module, inputNode, namedAssociationName, - buildDeserializeInputNodeFunction( module, MapType.of( String.class, EntityReference.class, Serialization.Variant.object ) ) ); + buildDeserializeInputNodeFunction( module, MapType.of( String.class, EntityReference.class ) ) ); stateMap.put( namedAssociationName, value ); } } @@ -620,15 +622,7 @@ public abstract class ValueDeserializerAdapter else // Explicit Map if( MapType.class.isAssignableFrom( valueType.getClass() ) ) { - MapType mapType = (MapType) valueType; - if( mapType.variant().equals( Serialization.Variant.entry ) ) - { - return (T) deserializeNodeEntryMap( module, (MapType) valueType, inputNode ); - } - else - { - return (T) deserializeNodeObjectMap( module, (MapType) valueType, inputNode ); - } + return (T) deserializeNodeObjectMap( module, (MapType) valueType, inputNode ); } else // Enum if( EnumType.class.isAssignableFrom( valueType.getClass() ) || type.isEnum() ) @@ -715,18 +709,6 @@ public abstract class ValueDeserializerAdapter return collection; } - private Map deserializeNodeEntryMap( ModuleDescriptor module, MapType mapType, InputNodeType inputNode ) - throws Exception - { - Map map = new HashMap<>(); - putArrayNodeInMap( module, - inputNode, - this.buildDeserializeInputNodeFunction( module, mapType.keyType() ), - this.buildDeserializeInputNodeFunction( module, mapType.valueType() ), - map ); - return map; - } - private Map deserializeNodeObjectMap( ModuleDescriptor module, MapType mapType, InputNodeType inputNode ) throws Exception { @@ -966,14 +948,6 @@ public abstract class ValueDeserializerAdapter ) throws Exception; - protected abstract void putArrayNodeInMap( ModuleDescriptor module, - InputNodeType inputNode, - Function keyDeserializer, - Function valueDeserializer, - Map map - ) - throws Exception; - protected abstract void putObjectNodeInMap( ModuleDescriptor module, InputNodeType inputNode, Function valueDeserializer, http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java b/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java index e428f4e..8a223e5 100644 --- a/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java +++ b/core/spi/src/main/java/org/apache/zest/spi/value/ValueSerializerAdapter.java @@ -86,7 +86,7 @@ public abstract class ValueSerializerAdapter implements ValueSerializer { - public interface ComplexSerializer + interface ComplexSerializer { void serialize( Options options, T object, OutputType output ) throws Exception; @@ -349,7 +349,7 @@ public abstract class ValueSerializerAdapter { onFieldStart( output, "_type" ); onValueStart( output ); - onValue( output, descriptor.valueType().types().findFirst().get().getName()); + onValue( output, descriptor.valueType().types().findFirst().get().getName() ); onValueEnd( output ); onFieldEnd( output ); } @@ -369,7 +369,7 @@ public abstract class ValueSerializerAdapter throw new ValueSerializationException( "Unable to serialize property " + persistentProperty, e ); } } ); - descriptor.valueType().associations().forEach(associationDescriptor -> { + descriptor.valueType().associations().forEach( associationDescriptor -> { Association association = state.associationFor( associationDescriptor.accessor() ); try { @@ -413,7 +413,7 @@ public abstract class ValueSerializerAdapter { throw new ValueSerializationException( "Unable to serialize manyassociation " + associationDescriptor, e ); } - }); + } ); descriptor.valueType().namedAssociations().forEach( associationDescriptor -> { NamedAssociation namedAssociation = state.namedAssociationFor( associationDescriptor.accessor() ); try @@ -470,42 +470,16 @@ public abstract class ValueSerializerAdapter @SuppressWarnings( "unchecked" ) Map map = (Map) object; //noinspection ConstantConditions - if( options.getBoolean( Options.MAP_ENTRIES_AS_OBJECTS ) ) - { - onObjectStart( output ); - for( Map.Entry entry : map.entrySet() ) - { - onFieldStart( output, entry.getKey().toString() ); - onValueStart( output ); - doSerialize( options, entry.getValue(), output, false ); - onValueEnd( output ); - onFieldEnd( output ); - } - onObjectEnd( output ); - } - else + onObjectStart( output ); + for( Map.Entry entry : map.entrySet() ) { - onArrayStart( output ); - for( Map.Entry entry : map.entrySet() ) - { - onObjectStart( output ); - - onFieldStart( output, "key" ); - onValueStart( output ); - onValue( output, entry.getKey().toString() ); - onValueEnd( output ); - onFieldEnd( output ); - - onFieldStart( output, "value" ); - onValueStart( output ); - doSerialize( options, entry.getValue(), output, false ); - onValueEnd( output ); - onFieldEnd( output ); - - onObjectEnd( output ); - } - onArrayEnd( output ); + onFieldStart( output, entry.getKey().toString() ); + onValueStart( output ); + doSerialize( options, entry.getValue(), output, false ); + onValueEnd( output ); + onFieldEnd( output ); } + onObjectEnd( output ); } private void serializeBase64Serializable( Object object, OutputType output ) http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/core/spi/src/main/java/org/apache/zest/valueserialization/orgjson/OrgJsonValueDeserializer.java ---------------------------------------------------------------------- diff --git a/core/spi/src/main/java/org/apache/zest/valueserialization/orgjson/OrgJsonValueDeserializer.java b/core/spi/src/main/java/org/apache/zest/valueserialization/orgjson/OrgJsonValueDeserializer.java index 7b5eb4d..bd71cc4 100644 --- a/core/spi/src/main/java/org/apache/zest/valueserialization/orgjson/OrgJsonValueDeserializer.java +++ b/core/spi/src/main/java/org/apache/zest/valueserialization/orgjson/OrgJsonValueDeserializer.java @@ -464,43 +464,6 @@ public class OrgJsonValueDeserializer } @Override - protected void putArrayNodeInMap( ModuleDescriptor module, - Object inputNode, - Function keyDeserializer, - Function valueDeserializer, - Map map - ) - throws Exception - { - if( JSONObject.NULL.equals( inputNode ) ) - { - return; - } - if( !( inputNode instanceof JSONArray ) ) - { - throw new ValueSerializationException( "Expected an array but got " + inputNode ); - } - JSONArray array = (JSONArray) inputNode; - for( int idx = 0; idx < array.length(); idx++ ) - { - Object item = array.get( idx ); - if( !( item instanceof JSONObject ) ) - { - throw new ValueSerializationException( "Expected an object but got " + inputNode ); - } - JSONObject object = (JSONObject) item; - Object keyNode = object.get( "key" ); - Object valueNode = object.get( "value" ); - K key = keyDeserializer.apply( keyNode ); - V value = valueDeserializer.apply( valueNode ); - if( key != null ) - { - map.put( key, value ); - } - } - } - - @Override protected void putObjectNodeInMap( ModuleDescriptor module, Object inputNode, Function valueDeserializer, http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonValueDeserializer.java ---------------------------------------------------------------------- diff --git a/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonValueDeserializer.java b/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonValueDeserializer.java index 5589467..2fb106f 100644 --- a/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonValueDeserializer.java +++ b/extensions/valueserialization-jackson/src/main/java/org/apache/zest/valueserialization/jackson/JacksonValueDeserializer.java @@ -312,41 +312,6 @@ public class JacksonValueDeserializer } @Override - protected void putArrayNodeInMap( ModuleDescriptor module, - JsonNode inputNode, - Function keyDeserializer, - Function valueDeserializer, - Map map - ) - throws Exception - { - if( isNullOrMissing( inputNode ) ) - { - return; - } - if( !inputNode.isArray() ) - { - throw new ValueSerializationException( "Expected an array but got " + inputNode ); - } - ArrayNode array = (ArrayNode) inputNode; - for( JsonNode item : array ) - { - if( !item.isObject() ) - { - throw new ValueSerializationException( "Expected an object but got " + inputNode ); - } - JsonNode keyNode = item.get( "key" ); - JsonNode valueNode = item.get( "value" ); - K key = keyDeserializer.apply( keyNode ); - V value = valueDeserializer.apply( valueNode ); - if( key != null ) - { - map.put( key, value ); - } - } - } - - @Override protected void putObjectNodeInMap( ModuleDescriptor module, JsonNode inputNode, Function valueDeserializer, http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/extensions/valueserialization-stax/src/main/java/org/apache/zest/valueserialization/stax/StaxValueDeserializer.java ---------------------------------------------------------------------- diff --git a/extensions/valueserialization-stax/src/main/java/org/apache/zest/valueserialization/stax/StaxValueDeserializer.java b/extensions/valueserialization-stax/src/main/java/org/apache/zest/valueserialization/stax/StaxValueDeserializer.java index 85a159e..d1c17c6 100644 --- a/extensions/valueserialization-stax/src/main/java/org/apache/zest/valueserialization/stax/StaxValueDeserializer.java +++ b/extensions/valueserialization-stax/src/main/java/org/apache/zest/valueserialization/stax/StaxValueDeserializer.java @@ -404,35 +404,6 @@ public class StaxValueDeserializer } @Override - protected void putArrayNodeInMap( ModuleDescriptor module, - Node inputNode, - Function keyDeserializer, - Function valueDeserializer, Map map - ) - throws Exception - { - if( inputNode == null ) - { - return; - } - if( !"array".equals( inputNode.getLocalName() ) ) - { - throw new ValueSerializationException( "Expected an but got " + inputNode ); - } - NodeList entriesNodes = inputNode.getChildNodes(); - for( int idx = 0; idx < entriesNodes.getLength(); idx++ ) - { - Node entryNode = entriesNodes.item( idx ); - K key = getObjectFieldValue( module, entryNode, "key", keyDeserializer ); - V value = getObjectFieldValue( module, entryNode, "value", valueDeserializer ); - if( key != null ) - { - map.put( key, value ); - } - } - } - - @Override protected void putObjectNodeInMap( ModuleDescriptor module, Node inputNode, Function valueDeserializer, http://git-wip-us.apache.org/repos/asf/zest-java/blob/65c7df37/libraries/restlet/src/main/java/org/apache/zest/library/restlet/serialization/JsonRepresentation.java ---------------------------------------------------------------------- diff --git a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/serialization/JsonRepresentation.java b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/serialization/JsonRepresentation.java index 1527d90..71eaa12 100644 --- a/libraries/restlet/src/main/java/org/apache/zest/library/restlet/serialization/JsonRepresentation.java +++ b/libraries/restlet/src/main/java/org/apache/zest/library/restlet/serialization/JsonRepresentation.java @@ -42,7 +42,7 @@ import org.restlet.representation.Representation; public class JsonRepresentation extends OutputRepresentation { - private static final ValueSerializer.Options OPTIONS_NO_TYPE = new ValueSerializer.Options().withoutTypeInfo().withMapEntriesAsObjects(); + private static final ValueSerializer.Options OPTIONS_NO_TYPE = new ValueSerializer.Options().withoutTypeInfo(); @Structure private ZestSPI spi;