I am trying to develop user definable workflow at run time!
Is there any way we can make the ApprovalHelper class not Entity dependent i.e. avoid repeated coding of each entities as follows?
Contract contract = persistence.getEntityManager().find(Contract.class, entityId);
@Component("demo_ApprovalHelper")
public class ApprovalHelper {
@Inject
private Persistence persistence;
public void updateState(UUID entityId, String state) {
try (Transaction tx = persistence.getTransaction()) {
<b>Contract contract = persistence.getEntityManager().find(Contract.class, entityId);</b>
if (contract != null) {
contract.setState(state);
}
tx.commit();
}
}
}
gorbunkov
(Maxim Gorbunkov)
August 30, 2017, 7:37am
#2
You can pass an entity name as a method argument and use it. Something like this:
package com.company.demo.core;
import com.haulmont.chile.core.model.MetaClass;
import com.haulmont.cuba.core.EntityManager;
import com.haulmont.cuba.core.Persistence;
import com.haulmont.cuba.core.Transaction;
import com.haulmont.cuba.core.entity.Entity;
import com.haulmont.cuba.core.global.Metadata;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.UUID;
@Component("demo_UniversalApprovalHelper")
public class UniversalApprovalHelper {
@Inject
private Persistence persistence;
@Inject
private Metadata metadata;
public void updateState(UUID entityId, String entityName, String state) {
Transaction tx = persistence.getTransaction();
try {
EntityManager em = persistence.getEntityManager();
MetaClass metaClass = metadata.getClassNN(entityName);
Entity entity = em.find((Class<Entity>) metaClass.getJavaClass(), entityId);
if (entity != null) {
entity.setValue("state", state);
}
tx.commit();
} finally {
tx.end();
}
}
}
Thank you Max. I have another question but asking in a separate post.