You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@polygene.apache.org by ni...@apache.org on 2017/04/11 12:54:12 UTC

[2/2] polygene-java git commit: POLYGENE-152 : Disallow certain classes as Property types, i.e Vector, Dictionary, Hashtable, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, org.joda.time

POLYGENE-152 : Disallow certain classes as Property types, i.e Vector, Dictionary, Hashtable, java.util.Date, java.sql.Date, java.sql.Time, java.sql.Timestamp, org.joda.time


Project: http://git-wip-us.apache.org/repos/asf/polygene-java/repo
Commit: http://git-wip-us.apache.org/repos/asf/polygene-java/commit/68f2ea56
Tree: http://git-wip-us.apache.org/repos/asf/polygene-java/tree/68f2ea56
Diff: http://git-wip-us.apache.org/repos/asf/polygene-java/diff/68f2ea56

Branch: refs/heads/develop
Commit: 68f2ea567989e3c302272c11adcb70d75cb4d152
Parents: 4fa29e2
Author: niclas <ni...@spicter.com>
Authored: Tue Apr 11 20:54:04 2017 +0800
Committer: niclas <ni...@spicter.com>
Committed: Tue Apr 11 20:54:04 2017 +0800

----------------------------------------------------------------------
 .../property/InvalidPropertyTypeException.java  |  5 ++
 .../runtime/property/PropertyModel.java         | 49 +++++++++++++++-----
 2 files changed, 42 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68f2ea56/core/api/src/main/java/org/apache/polygene/api/property/InvalidPropertyTypeException.java
----------------------------------------------------------------------
diff --git a/core/api/src/main/java/org/apache/polygene/api/property/InvalidPropertyTypeException.java b/core/api/src/main/java/org/apache/polygene/api/property/InvalidPropertyTypeException.java
index 1addfae..c566011 100644
--- a/core/api/src/main/java/org/apache/polygene/api/property/InvalidPropertyTypeException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/property/InvalidPropertyTypeException.java
@@ -27,6 +27,11 @@ import org.apache.polygene.api.common.ConstructionException;
  */
 public class InvalidPropertyTypeException extends ConstructionException
 {
+    public InvalidPropertyTypeException( String message )
+    {
+        super(message);
+    }
+
     public InvalidPropertyTypeException( AccessibleObject accessor )
     {
         super( createMessage( accessor ) );

http://git-wip-us.apache.org/repos/asf/polygene-java/blob/68f2ea56/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java
----------------------------------------------------------------------
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java
index 29b1f61..2c7ead6 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/property/PropertyModel.java
@@ -39,9 +39,9 @@ import org.apache.polygene.api.property.InitialValueProvider;
 import org.apache.polygene.api.property.InvalidPropertyTypeException;
 import org.apache.polygene.api.property.Property;
 import org.apache.polygene.api.property.PropertyDescriptor;
-import org.apache.polygene.api.structure.Module;
 import org.apache.polygene.api.serialization.Deserializer;
 import org.apache.polygene.api.service.ServiceFinder;
+import org.apache.polygene.api.structure.Module;
 import org.apache.polygene.api.structure.ModuleDescriptor;
 import org.apache.polygene.api.type.ValueCompositeType;
 import org.apache.polygene.api.type.ValueType;
@@ -56,13 +56,14 @@ import org.apache.polygene.runtime.type.ValueTypeFactoryInstance;
 
 /**
  * Model for a Property.
- *
+ * <p>
  * <p>Equality is based on the Property accessor object (property type and name), not on the QualifiedName.</p>
  */
 public class PropertyModel
     implements PropertyDescriptor, PropertyInfo, Binder, Visitable<PropertyModel>
 {
     private Type type;
+
     private transient AccessibleObject accessor; // Interface accessor
 
     private final QualifiedName qualifiedName;
@@ -88,7 +89,7 @@ public class PropertyModel
                           MetaInfo metaInfo,
                           Object initialValue,
                           InitialValueProvider initialValueProvider
-    )
+                        )
     {
         if( accessor instanceof Method )
         {
@@ -100,8 +101,9 @@ public class PropertyModel
         }
         this.immutable = immutable;
         this.metaInfo = metaInfo;
-        type = GenericPropertyInfo.propertyTypeOf( accessor );
         this.accessor = accessor;
+        type = GenericPropertyInfo.propertyTypeOf( accessor );
+        checkTypeValidity( type );
         qualifiedName = QualifiedName.fromAccessor( accessor );
         if( initialValueProvider != null )
         {
@@ -109,13 +111,37 @@ public class PropertyModel
         }
         else
         {
-            this.initialValueProvider = new DefaultInitialValueProvider(useDefaults, initialValue);
+            this.initialValueProvider = new DefaultInitialValueProvider( useDefaults, initialValue );
         }
         this.constraints = constraints;
         final Queryable queryable = accessor.getAnnotation( Queryable.class );
         this.queryable = queryable == null || queryable.value();
     }
 
+    private void checkTypeValidity( Type type )
+    {
+        // Make sure certain data types doesn't take hold in Polygene applications.
+        String typeName = type.getTypeName();
+        if( typeName.contains( "java.util.Date" )
+            || typeName.contains( "java.util.Calendar" )
+            || typeName.contains( "java.util.GregorianCalendar" )
+            || typeName.contains( "java.sql.Date" )
+            || typeName.contains( "java.sql.Time" )
+            || typeName.contains( "java.sql.Timestamp" )
+            || typeName.contains( "org.joda.time" )
+            )
+        {
+            throw new InvalidPropertyTypeException( type + " is not allowed in Polygene. Please use Java Time API instead." );
+        }
+        if( typeName.contains( "java.util.Dictionary" )
+            || typeName.contains( "java.util.Hashtable" )
+            || typeName.contains( "java.util.Vector" )
+            )
+        {
+            throw new InvalidPropertyTypeException( type + " is not allowed in Polygene. Please use the modern Java Collection API instead." );
+        }
+    }
+
     @Override
     public <T> T metaInfo( Class<T> infoType )
     {
@@ -175,12 +201,11 @@ public class PropertyModel
     }
 
     @Override
-    public Object resolveInitialValue(ModuleDescriptor moduleDescriptor)
+    public Object resolveInitialValue( ModuleDescriptor moduleDescriptor )
     {
-        return initialValueProvider.apply(moduleDescriptor.instance(), this);
+        return initialValueProvider.apply( moduleDescriptor.instance(), this );
     }
 
-
     @Override
     public void bind( Resolution resolution )
         throws BindingException
@@ -289,7 +314,7 @@ public class PropertyModel
         implements InitialValueProvider
     {
         @Override
-        public Object apply(Module module, PropertyDescriptor property)
+        public Object apply( Module module, PropertyDescriptor property )
         {
             return null;
         }
@@ -301,16 +326,16 @@ public class PropertyModel
         private final boolean useDefaults;
         private final Object initialValue;
 
-        private DefaultInitialValueProvider(boolean useDefaults, Object initialValue)
+        private DefaultInitialValueProvider( boolean useDefaults, Object initialValue )
         {
             this.useDefaults = useDefaults;
             this.initialValue = initialValue;
         }
 
         @Override
-        public Object apply(Module module, PropertyDescriptor property)
+        public Object apply( Module module, PropertyDescriptor property )
         {
-            return initialValue(module.descriptor(), initialValue, useDefaults);
+            return initialValue( module.descriptor(), initialValue, useDefaults );
         }
 
         private Object initialValue( ModuleDescriptor module, Object initialValue, boolean useDefaults )