ref #10089 handle RegistrationDTO with TypedEntityReference again in cdmlib
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / ref / TypedEntityReference.java
index fa1f096030127acf6b880979738f52bba7abb113..92a545f5e47911ef508e3f09ece55349af132be5 100644 (file)
@@ -24,28 +24,70 @@ public class TypedEntityReference<T extends CdmBase> extends EntityReference {
 
     private static final long serialVersionUID = -4619590272174606288L;
 
+    public static <T extends CdmBase> TypedEntityReference<T> fromEntity(T entity) {
+        return TypedEntityReference.fromEntity(entity, true);
+    }
+
     private Class<T> type;
 
+    /**
+     * @deprecated use factory method instead, should only be used by in DTO sub-class constructors (TODO: to be made protected once no longer used publicly)
+     */
+    @Deprecated
     public TypedEntityReference(Class<T> type, UUID uuid, String label) {
         super(uuid, label);
         this.type = type;
     }
 
+    /**
+     * @deprecated use factory method instead, should only be used by in DTO sub-class constructors (TODO: to be made protected once no longer used publicly)
+     */
+    @Deprecated
+    protected TypedEntityReference(T entity) {
+        this.type = (Class<T>) entity.getClass();
+        this.uuid = entity.getUuid();
+    }
+
+    /**
+     * @deprecated use factory method instead, should only be used by in DTO sub-class constructors (TODO; to be made protected once no longer used publicly)
+     */
+    @Deprecated
     public TypedEntityReference(Class<T> type, UUID uuid) {
         super(uuid, null);
         this.type = type;
     }
 
-    public static  <T extends CdmBase> TypedEntityReference<T> fromEntity(T entity) {
+    public static  <T extends CdmBase> TypedEntityReference<T> fromEntity(T entity, boolean withLabel) {
         if(entity == null) {
             return null;
         }
         entity = HibernateProxyHelper.deproxy(entity);
-        if(IdentifiableEntity.class.isAssignableFrom(entity.getClass())) {
-            return new TypedEntityReference<T>((Class<T>)entity.getClass(), entity.getUuid(), ((IdentifiableEntity)entity).getTitleCache());
+        if(withLabel && IdentifiableEntity.class.isAssignableFrom(entity.getClass())) {
+            return new TypedEntityReference<>((Class<T>)entity.getClass(), entity.getUuid(), ((IdentifiableEntity)entity).getTitleCache());
         } else {
-            return new TypedEntityReference<T>((Class<T>)entity.getClass(), entity.getUuid());
+            return new TypedEntityReference<>((Class<T>)entity.getClass(), entity.getUuid());
+        }
+    }
+
+    public static  <T extends CdmBase> TypedEntityReference<T> fromEntityWithLabel(T entity, String explicitLabel) {
+        if(entity == null) {
+            return null;
+        }
+        entity = HibernateProxyHelper.deproxy(entity);
+        return new TypedEntityReference<>((Class<T>)entity.getClass(), entity.getUuid(), explicitLabel);
+    }
+
+    /**
+     * Casts the <code>TypedEntityReference</code> to the <code>subType</code> if possible.
+     *
+     * @throws ClassCastException
+     *  If the {@link #type} is not a super type of <code>subType</code>.
+     */
+    public <S extends CdmBase> TypedEntityReference<S> castTo(Class<S> subType){
+        if(!type.isAssignableFrom(subType)) {
+            throw new ClassCastException("Cannot cast " + type.getName() + " to " + subType.getName());
         }
+        return new TypedEntityReference<>(subType, getUuid());
     }
 
     public Class<T> getType() {