Skip to content

Commit

Permalink
Non meta-property attributes of DTO entity are erased when the entity…
Browse files Browse the repository at this point in the history
… is opened in standard editor #131
  • Loading branch information
knstvk committed Sep 29, 2021
1 parent c8d6c90 commit 4999ef2
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 0 deletions.
36 changes: 36 additions & 0 deletions core/src/main/java/io/jmix/core/CopyingSystemState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/*
* Copyright 2021 Haulmont.
*
* Licensed 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 io.jmix.core;

/**
* Interface to be implemented by entities having a state which is not reflected in metadata. It's usually
* a non-persistent state which resides in fields with types not supported by metadata, like {@code Object}.
* <p>
* Some framework mechanisms copy entity instances by copying the state of all properties known to metadata (let's
* call it "main" state). If you want the "system" state to be copied along with the main state, implement this
* interface and copy the state in the {@link #copyFrom(Object)} method.
*
* @param <T> entity type
*/
public interface CopyingSystemState<T> {

/**
* Invoked by the framework when copying the entity instance.
* @param source source entity
*/
void copyFrom(T source);
}
8 changes: 8 additions & 0 deletions core/src/main/java/io/jmix/core/EntitySystemStateSupport.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,20 @@
@Component("core_EntitySystemStateSupport")
public class EntitySystemStateSupport {

@SuppressWarnings({"unchecked", "rawtypes"})
public void copySystemState(Entity src, Entity dst) {
dst.__getEntityEntry().copy(src.__getEntityEntry());
if (dst instanceof CopyingSystemState) {
((CopyingSystemState) dst).copyFrom(src);
}
}

@SuppressWarnings({"unchecked", "rawtypes"})
public void mergeSystemState(Entity src, Entity dst) {
dst.__getEntityEntry().copy(src.__getEntityEntry());
if (dst instanceof CopyingSystemState) {
((CopyingSystemState) dst).copyFrom(src);
}
}

public void mergeLazyLoadingState(Entity src, Entity dst, MetaProperty metaProperty,
Expand Down
11 changes: 11 additions & 0 deletions core/src/main/java/io/jmix/core/MetadataTools.java
Original file line number Diff line number Diff line change
Expand Up @@ -960,6 +960,7 @@ public <T> T copy(T source) {
* @param source source instance
* @param dest destination instance
*/
@SuppressWarnings({"rawtypes", "unchecked"})
public void copy(Object source, Object dest) {
checkNotNullArgument(source, "source is null");
checkNotNullArgument(dest, "dest is null");
Expand All @@ -986,6 +987,10 @@ public void copy(Object source, Object dest) {
}
}

if (dest instanceof CopyingSystemState && dest.getClass().isAssignableFrom(source.getClass())) {
((CopyingSystemState) dest).copyFrom(source);
}

// todo dynamic attributes
// if (source instanceof BaseGenericIdEntity && dest instanceof BaseGenericIdEntity) {
// ((BaseGenericIdEntity) dest).setDynamicAttributes(((BaseGenericIdEntity<?>) source).getDynamicAttributes());
Expand Down Expand Up @@ -1076,6 +1081,7 @@ public <T> T deepCopy(T source) {
/**
* Copies all property values from source to destination excluding null values.
*/
@SuppressWarnings({"unchecked", "rawtypes"})
public void deepCopy(Object source, Object destination, EntitiesHolder entitiesHolder) {
EntityPreconditions.checkEntityType(source);
EntityPreconditions.checkEntityType(destination);
Expand Down Expand Up @@ -1120,6 +1126,11 @@ public void deepCopy(Object source, Object destination, EntitiesHolder entitiesH
}
}

if (destination instanceof CopyingSystemState && destination.getClass().isAssignableFrom(source.getClass())) {
((CopyingSystemState) destination).copyFrom(source);
}


// todo dynamic attributes
// if (source instanceof BaseGenericIdEntity && destination instanceof BaseGenericIdEntity) {
// ((BaseGenericIdEntity) destination).setDynamicAttributes(((BaseGenericIdEntity<?>) source).getDynamicAttributes());
Expand Down

0 comments on commit 4999ef2

Please sign in to comment.