();
+ }
+ errs.add(invalid);
+ }
+ }
+ return errs;
+ }
+
+ public void refresh(EbeanServer server, Query> query, Transaction t, Object parentBean) {
+
+ BeanSet> newBeanSet = (BeanSet>)server.findSet(query, t);
+ refresh(newBeanSet, parentBean);
+ }
+
+ public void refresh(BeanCollection> bc, Object parentBean) {
+
+ BeanSet> newBeanSet = (BeanSet>)bc;
+
+ Set> current = (Set>)many.getValue(parentBean);
+
+ newBeanSet.setModifyListening(many.getModifyListenMode());
+ if (current == null){
+ // the currentList is null? Not really expecting this...
+ many.setValue(parentBean,newBeanSet);
+
+ } else if (current instanceof BeanSet>) {
+ // normally this case, replace just the underlying list
+ BeanSet> currentBeanSet = (BeanSet>)current;
+ currentBeanSet.setActualSet(newBeanSet.getActualSet());
+ currentBeanSet.setModifyListening(many.getModifyListenMode());
+
+ } else {
+ // replace the entire set
+ many.setValue(parentBean, newBeanSet);
+ }
+ }
+
+ public void jsonWrite(WriteJsonContext ctx, String name, Object collection, boolean explicitInclude) {
+
+ Set> set;
+ if (collection instanceof BeanCollection>){
+ BeanSet> bc = (BeanSet>)collection;
+ if (!bc.isPopulated()){
+ if (explicitInclude){
+ // invoke lazy loading as collection
+ // is explicitly included in the output
+ bc.size();
+ } else {
+ return;
+ }
+ }
+ set = bc.getActualSet();
+ } else {
+ set = (Set>)collection;
+ }
+
+ int count = 0;
+ ctx.beginAssocMany(name);
+ Iterator> it = set.iterator();
+ while (it.hasNext()) {
+ Object detailBean = it.next();
+ if (count++ > 0){
+ ctx.appendComma();
+ }
+ targetDescriptor.jsonWrite(ctx, detailBean);
+ }
+ ctx.endAssocMany();
+ }
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/CollectionTypeConverter.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/CollectionTypeConverter.java
deleted file mode 100644
index 29ecff903..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/CollectionTypeConverter.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.avaje.ebeaninternal.server.deploy;
-
-/**
- * Used to convert between collection types.
- *
- * This typically means wrap and unwrap mutable scala collection types of Buffer, Set and Map.
- *
- *
- * @author rbygrave
- *
- */
-public interface CollectionTypeConverter {
-
- /**
- * Convert the wrapped type to the underlying Java List, Set or Map.
- */
- public Object toUnderlying(Object wrapped);
-
- /**
- * Wrap the underlying Java List, Set or Map into the final collection type.
- */
- public Object toWrapped(Object wrapped);
-
-}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/DetermineManyType.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/DetermineManyType.java
index 7042abf6b..6fe93ae59 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/DetermineManyType.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/DetermineManyType.java
@@ -1,64 +1,27 @@
-package com.avaje.ebeaninternal.server.deploy;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Determine the Many Type for a property.
- *
- * Scala types require CollectionTypeConverter's to wrap and unwrap from the
- * underlying java types used.
- *
- */
-public class DetermineManyType {
-
- private final boolean withScalaSupport;
- private final ManyType scalaBufMany;
- private final ManyType scalaSetMany;
- private final ManyType scalaMapMany;
-
- public DetermineManyType(boolean withScalaSupport) {
- this.withScalaSupport = withScalaSupport;
- if (withScalaSupport){
-
- CollectionTypeConverter bufConverter = new ScalaBufferConverter();
- CollectionTypeConverter setConverter = new ScalaSetConverter();
- CollectionTypeConverter mapConverter = new ScalaMapConverter();
-
- this.scalaBufMany = new ManyType(ManyType.Underlying.LIST, bufConverter);
- this.scalaSetMany = new ManyType(ManyType.Underlying.SET, setConverter);
- this.scalaMapMany = new ManyType(ManyType.Underlying.MAP, mapConverter);
-
- } else {
- this.scalaBufMany = null;
- this.scalaSetMany = null;
- this.scalaMapMany = null;
- }
- }
-
- public ManyType getManyType(Class> type) {
- if (type.equals(List.class)){
- return ManyType.JAVA_LIST;
- }
- if (type.equals(Set.class)){
- return ManyType.JAVA_SET;
- }
- if (type.equals(Map.class)){
- return ManyType.JAVA_MAP;
- }
- if (withScalaSupport){
- // only get in here when scala in classpath
- if (type.equals(scala.collection.mutable.Buffer.class)){
- return scalaBufMany;
- }
- if (type.equals(scala.collection.mutable.Set.class)){
- return scalaSetMany;
- }
- if (type.equals(scala.collection.mutable.Map.class)){
- return scalaMapMany;
- }
- }
- return null;
- }
-}
+package com.avaje.ebeaninternal.server.deploy;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Determine the Many Type for a property.
+ */
+public class DetermineManyType {
+
+ public DetermineManyType() {
+ }
+
+ public ManyType getManyType(Class> type) {
+ if (type.equals(List.class)) {
+ return ManyType.JAVA_LIST;
+ }
+ if (type.equals(Set.class)) {
+ return ManyType.JAVA_SET;
+ }
+ if (type.equals(Map.class)) {
+ return ManyType.JAVA_MAP;
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ManyType.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ManyType.java
index 8fff64f24..59e375c8a 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ManyType.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/ManyType.java
@@ -21,15 +21,9 @@ public class ManyType {
private final Underlying underlying;
- private final CollectionTypeConverter typeConverter;
- private ManyType(Underlying underlying) {
- this(underlying, null);
- }
-
- public ManyType(Underlying underlying, CollectionTypeConverter typeConverter) {
+ public ManyType(Underlying underlying) {
this.underlying = underlying;
- this.typeConverter = typeConverter;
switch (underlying) {
case LIST:
queryType = SpiQuery.Type.LIST;
@@ -57,12 +51,5 @@ public class ManyType {
public Underlying getUnderlying() {
return underlying;
}
-
- /**
- * Return the type converter if there is one.
- */
- public CollectionTypeConverter getTypeConverter() {
- return typeConverter;
- }
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaBufferConverter.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaBufferConverter.java
deleted file mode 100644
index 50bb84543..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaBufferConverter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.avaje.ebeaninternal.server.deploy;
-
-import scala.collection.JavaConversions;
-
-/**
- * Converts between Java List and Scala mutable Buffer.
- *
- * @author rbygrave
- */
-public class ScalaBufferConverter implements CollectionTypeConverter {
-
-// @SuppressWarnings({ "rawtypes" })
- public Object toUnderlying(Object wrapped) {
- throw new IllegalArgumentException("Scala types not supported in this build");
-// if (wrapped instanceof JavaConversions.JListWrapper){
-// return ((JavaConversions.JListWrapper)wrapped).underlying();
-// }
-// return null;
- }
-
- public Object toWrapped(Object wrapped) {
- throw new IllegalArgumentException("Scala types not supported in this build");
-// if (wrapped instanceof java.util.List>){
-// return JavaConversions.asScalaBuffer((java.util.List>)wrapped);
-// }
-// return wrapped;
- }
-
-}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaMapConverter.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaMapConverter.java
deleted file mode 100644
index 525d4b8f8..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaMapConverter.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.avaje.ebeaninternal.server.deploy;
-
-import scala.collection.JavaConversions;
-
-/**
- * Converts between Java Map and Scala mutable Map.
- *
- * @author rbygrave
- */
-public class ScalaMapConverter implements CollectionTypeConverter {
-
-// @SuppressWarnings({ "rawtypes" })
- public Object toUnderlying(Object wrapped) {
- throw new IllegalArgumentException("Scala types not supported in this build");
-// if (wrapped instanceof JavaConversions.JMapWrapper){
-// return ((JavaConversions.JMapWrapper)wrapped).underlying();
-// }
-// return null;
- }
-
- public Object toWrapped(Object wrapped) {
- throw new IllegalArgumentException("Scala types not supported in this build");
-// if (wrapped instanceof java.util.Map,?>){
-// return JavaConversions.mapAsScalaMap((java.util.Map,?>)wrapped);
-// }
-// return wrapped;
- }
-
-}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaSetConverter.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaSetConverter.java
deleted file mode 100644
index 238c0de3c..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/ScalaSetConverter.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package com.avaje.ebeaninternal.server.deploy;
-
-import scala.collection.JavaConversions;
-import scala.collection.convert.DecorateAsScala;
-
-/**
- * Converts between Java Set and Scala mutable Set.
- *
- * @author rbygrave
- */
-public class ScalaSetConverter implements CollectionTypeConverter {
-
-// @SuppressWarnings({ "rawtypes" })
- public Object toUnderlying(Object wrapped) {
- throw new IllegalArgumentException("Scala types not supported in this build");
-// if (wrapped instanceof JavaConversions.JSetWrapper){
-// return ((JavaConversions.JSetWrapper)wrapped).underlying();
-// }
-// return null;
- }
-
- public Object toWrapped(Object wrapped) {
- throw new IllegalArgumentException("Scala types not supported in this build");
-// if (wrapped instanceof java.util.Set>){
-// return JavaConversions.asScalaSet((java.util.Set>)wrapped);
-// }
-// return wrapped;
- }
-
-}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployCreateProperties.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployCreateProperties.java
index 0722cdc98..dd6260dd7 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployCreateProperties.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DeployCreateProperties.java
@@ -12,7 +12,6 @@ import java.util.logging.Logger;
import javax.persistence.PersistenceException;
import javax.persistence.Transient;
-import com.avaje.ebean.config.ScalarTypeConverter;
import com.avaje.ebeaninternal.server.core.Message;
import com.avaje.ebeaninternal.server.deploy.DetermineManyType;
import com.avaje.ebeaninternal.server.deploy.ManyType;
@@ -23,7 +22,6 @@ import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanPropertyAssocOne;
import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanPropertyCompound;
import com.avaje.ebeaninternal.server.deploy.meta.DeployBeanPropertySimpleCollection;
import com.avaje.ebeaninternal.server.type.CtCompoundType;
-import com.avaje.ebeaninternal.server.type.ScalaOptionTypeConverter;
import com.avaje.ebeaninternal.server.type.ScalarType;
import com.avaje.ebeaninternal.server.type.TypeManager;
import com.avaje.ebeaninternal.server.type.reflect.CheckImmutableResponse;
@@ -38,33 +36,14 @@ import com.avaje.ebeaninternal.server.type.reflect.CheckImmutableResponse;
public class DeployCreateProperties {
private static final Logger logger = Logger.getLogger(DeployCreateProperties.class.getName());
-
- private final Class> scalaOptionClass;
- /**
- * Use to wrap and unwrap Scala Option.
- */
- @SuppressWarnings("rawtypes")
- private final ScalarTypeConverter scalaOptionTypeConverter;
-
- private final DetermineManyType determineManyType;
+
+ private final DetermineManyType determineManyType;
private final TypeManager typeManager;
- @SuppressWarnings("rawtypes")
public DeployCreateProperties(TypeManager typeManager) {
this.typeManager = typeManager;
-
- Class> tmpOptionClass = DetectScala.getScalaOptionClass();
-
- if (tmpOptionClass == null){
- scalaOptionClass = null;
- scalaOptionTypeConverter = null;
- } else {
- scalaOptionClass = tmpOptionClass;
- scalaOptionTypeConverter = new ScalaOptionTypeConverter();
- }
-
- this.determineManyType = new DetermineManyType(tmpOptionClass != null);
+ this.determineManyType = new DetermineManyType();
}
/**
@@ -293,12 +272,6 @@ public class DeployCreateProperties {
Class> propertyType = field.getType();
Class> innerType = propertyType;
- ScalarTypeConverter, ?> typeConverter = null;
-
- if (propertyType.equals(scalaOptionClass)){
- innerType = determineTargetType(field);
- typeConverter = scalaOptionTypeConverter;
- }
// check for Collection type (list, set or map)
ManyType manyType = determineManyType.getManyType(propertyType);
@@ -318,17 +291,17 @@ public class DeployCreateProperties {
}
if (innerType.isEnum() || innerType.isPrimitive()){
- return new DeployBeanProperty(desc, propertyType, null, typeConverter);
+ return new DeployBeanProperty(desc, propertyType, null, null);
}
ScalarType> scalarType = typeManager.getScalarType(innerType);
if (scalarType != null) {
- return new DeployBeanProperty(desc, propertyType, scalarType, typeConverter);
+ return new DeployBeanProperty(desc, propertyType, scalarType, null);
}
CtCompoundType> compoundType = typeManager.getCompoundType(innerType);
if (compoundType != null) {
- return new DeployBeanPropertyCompound(desc, propertyType, compoundType, typeConverter);
+ return new DeployBeanPropertyCompound(desc, propertyType, compoundType, null);
}
if (!isTransientField(field)){
@@ -340,13 +313,13 @@ public class DeployCreateProperties {
typeManager.recursiveCreateScalarDataReader(innerType);
compoundType = typeManager.getCompoundType(innerType);
if (compoundType != null) {
- return new DeployBeanPropertyCompound(desc, propertyType, compoundType, typeConverter);
+ return new DeployBeanPropertyCompound(desc, propertyType, compoundType, null);
}
} else {
// use reflection to support simple immutable value objects
scalarType = typeManager.recursiveCreateScalarTypes(innerType);
- return new DeployBeanProperty(desc, propertyType, scalarType, typeConverter);
+ return new DeployBeanProperty(desc, propertyType, scalarType, null);
}
}
} catch (Exception e){
diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DetectScala.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DetectScala.java
deleted file mode 100644
index 9511da836..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/deploy/parse/DetectScala.java
+++ /dev/null
@@ -1,43 +0,0 @@
-package com.avaje.ebeaninternal.server.deploy.parse;
-
-import java.util.logging.Logger;
-
-import com.avaje.ebeaninternal.api.ClassUtil;
-
-/**
- * Used to detected if Scala support is required.
- *
- * @author rbygrave
- */
-public class DetectScala {
-
- private static final Logger logger = Logger.getLogger(DetectScala.class.getName());
-
- private static Class> scalaOptionClass = initScalaOptionClass();
-
- private static boolean hasScalaSupport = scalaOptionClass != null;
-
- private static Class> initScalaOptionClass() {
- try {
- return ClassUtil.forName("scala.Option");
- } catch (ClassNotFoundException e) {
- // scala not in the classpath...
- logger.fine("Scala type 'scala.Option' not found. Scala Support disabled.");
- return null;
- }
- }
-
- /**
- * Return true if scala is in the classpath.
- */
- public static boolean hasScalaSupport() {
- return hasScalaSupport;
- }
-
- /**
- * Return the scala.Option class or null if scala is not in the classpath.
- */
- public static Class> getScalaOptionClass() {
- return scalaOptionClass;
- }
-}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java
index a8c29748c..df13ae07c 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DefaultPersister.java
@@ -729,8 +729,8 @@ public final class DefaultPersister implements Persister {
this.updateNullProperties = false;
}
- private Object getValueUnderlying() {
- return many.getValueUnderlying(parentBean);
+ private Object getValue() {
+ return many.getValue(parentBean);
}
private boolean isModifyListenMode() {
@@ -794,7 +794,7 @@ public final class DefaultPersister implements Persister {
private void removeAssocManyPrivateOwned(SaveManyPropRequest saveMany) {
- Object details = saveMany.getValueUnderlying();
+ Object details = saveMany.getValue();
// check that the list is not null and if it is a BeanCollection
// check that is has been populated (don't trigger lazy loading)
@@ -822,7 +822,7 @@ public final class DefaultPersister implements Persister {
BeanPropertyAssocMany> prop = saveMany.getMany();
- Object details = saveMany.getValueUnderlying();
+ Object details = saveMany.getValue();
// check that the list is not null and if it is a BeanCollection
// check that is has been populated (don't trigger lazy loading)
@@ -989,7 +989,7 @@ public final class DefaultPersister implements Persister {
private void saveAssocManyIntersection(SaveManyPropRequest saveManyPropRequest, boolean deleteMissingChildren) {
BeanPropertyAssocMany> prop = saveManyPropRequest.getMany();
- Object value = prop.getValueUnderlying(saveManyPropRequest.getParentBean());
+ Object value = prop.getValue(saveManyPropRequest.getParentBean());
if (value == null) {
return;
}
@@ -1126,7 +1126,7 @@ public final class DefaultPersister implements Persister {
if (ModifyListenMode.REMOVALS.equals(manys[i].getModifyListenMode())) {
// PrivateOwned ...
- Object details = manys[i].getValueUnderlying(parentBean);
+ Object details = manys[i].getValue(parentBean);
if (details instanceof BeanCollection>) {
Set> modifyRemovals = ((BeanCollection>) details).getModifyRemovals();
if (modifyRemovals != null && !modifyRemovals.isEmpty()) {
diff --git a/src/main/java/com/avaje/ebeaninternal/server/persist/DmlUtil.java b/src/main/java/com/avaje/ebeaninternal/server/persist/DmlUtil.java
index 9d17f9fc1..b528ee821 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/persist/DmlUtil.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/persist/DmlUtil.java
@@ -1,34 +1,23 @@
-package com.avaje.ebeaninternal.server.persist;
-
-import com.avaje.ebeaninternal.server.deploy.parse.DetectScala;
-
-/**
- * Utility object with helper methods for DML.
- */
-public class DmlUtil {
-
- private static final boolean hasScalaSupport = DetectScala.hasScalaSupport();
-
- /**
- * Return true if the value is null or a Numeric 0 (for primitive int's and long's) or Option empty.
- */
- public static boolean isNullOrZero(Object value){
- if (value == null){
- return true;
- }
-
- if (value instanceof Number){
- return ((Number)value).longValue() == 0l;
- }
-
- if (hasScalaSupport){
- if (value instanceof scala.Option>) {
- if (((scala.Option>) value).isEmpty()) {
- return true;
- }
- }
- }
-
- return false;
- }
-}
+package com.avaje.ebeaninternal.server.persist;
+
+
+/**
+ * Utility object with helper methods for DML.
+ */
+public class DmlUtil {
+
+ /**
+ * Return true if the value is null or a Numeric 0 (for primitive int's and long's) or Option empty.
+ */
+ public static boolean isNullOrZero(Object value){
+ if (value == null){
+ return true;
+ }
+
+ if (value instanceof Number){
+ return ((Number)value).longValue() == 0l;
+ }
+
+ return false;
+ }
+}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalaOptionTypeConverter.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalaOptionTypeConverter.java
deleted file mode 100644
index 5491bfb5e..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalaOptionTypeConverter.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.avaje.ebeaninternal.server.type;
-
-import scala.Option;
-
-import com.avaje.ebean.config.ScalarTypeConverter;
-
-/**
- * A type converter to support scala.Option.
- *
- * @author rbygrave
- *
- * @param the underlying type
- */
-public class ScalaOptionTypeConverter implements ScalarTypeConverter, S>{
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public Option getNullValue() {
- return (scala.Option)scala.None$.MODULE$;
- }
-
- public S unwrapValue(Option beanType) {
-
- if (beanType.isEmpty()){
- return null;
- } else {
- return beanType.get();
- }
- }
-
- @SuppressWarnings({ "unchecked", "rawtypes" })
- public Option wrapValue(S scalarType) {
- if (scalarType == null){
- return (scala.Option)scala.None$.MODULE$;
- }
- if (scalarType instanceof scala.Some){
- return (Option)scalarType;
- }
- return new scala.Some(scalarType);
- }
-
-
-}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeScalaDouble.java b/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeScalaDouble.java
deleted file mode 100644
index 4c5f7e8a3..000000000
--- a/src/main/java/com/avaje/ebeaninternal/server/type/ScalarTypeScalaDouble.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.avaje.ebeaninternal.server.type;
-
-import scala.Double;
-
-import com.avaje.ebean.config.ScalarTypeConverter;
-
-public class ScalarTypeScalaDouble extends ScalarTypeWrapper