use of io.jmix.core.Entity in project jmix by jmix-framework.
the class NonDetachedTest method testCreateNew_DM.
@Test
public void testCreateNew_DM() throws Exception {
// check versioned entity
Group companyGroupCopy = metadata.getTools().copy(companyGroup);
assertTrue(entityStates.isNew(companyGroupCopy));
entityStates.makeDetached(companyGroupCopy);
User user = persistence.callInTransaction((em) -> em.find(User.class, this.user.getId()));
User userCopy = metadata.getTools().copy(user);
assertNull(userCopy.getGroup());
assertTrue(entityStates.isNew(userCopy));
entityStates.makeDetached(userCopy);
userCopy.setId(UuidProvider.createUuid());
userCopy.setVersion(null);
userCopy.setGroup(companyGroupCopy);
userCopy.setName("new name");
try {
AppBeans.get(DataManager.class).commit(userCopy);
user = persistence.callInTransaction((em) -> em.find(User.class, userCopy.getId()));
assertEquals("new name", user.getName());
} finally {
testSupport.deleteRecord(userCopy);
}
// check non-versioned entity
Server server = metadata.create(Server.class);
server.setName("server-" + server.getId());
assertTrue(entityStates.isNew(server));
entityStates.makeDetached(server);
try {
AppBeans.get(DataManager.class).commit(server);
Server loaded = persistence.callInTransaction(em -> em.find(Server.class, server.getId()));
assertNotNull(loaded);
} finally {
testSupport.deleteRecord(server);
}
}
use of io.jmix.core.Entity in project jmix by jmix-framework.
the class TestAfterCompleteTxListener method testCommit.
private void testCommit(boolean committed, Collection<Entity> detachedEntities) {
assertTrue(committed);
User user = null;
for (Entity entity : detachedEntities) {
assertTrue(entityStates.isDetached(entity));
if (entity instanceof User && ((User) entity).getLogin().startsWith("TxLstnrTst-1-"))
user = (User) entity;
}
if (user != null) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(persistence.getDataSource());
jdbcTemplate.update("update TEST_USER set NAME = 'updated by TestAfterCompleteTxListener' where ID = ?", user.getId().toString());
}
}
use of io.jmix.core.Entity in project jmix by jmix-framework.
the class EnhancementCheckDescriptorProcessor method process.
@Override
public void process(DescriptorProcessorContext context) {
ClassDescriptor descriptor = context.getDescriptor();
List<String> missingInterfaces = enhancingChecks.entrySet().stream().filter(entry -> !entry.getValue().test(descriptor.getJavaClass())).map(Map.Entry::getKey).map(Class::getSimpleName).collect(Collectors.toList());
if (!missingInterfaces.isEmpty()) {
String message = String.format("Entity class %s is missing some of enhancing interfaces:%s", descriptor.getJavaClass().getSimpleName(), Joiner.on(",").join(missingInterfaces));
log.error("\n=================================================================" + "\nProblems with entity enhancement detected:\n{}" + "\n=================================================================", message);
if (!Boolean.parseBoolean(environment.getProperty("jmix.data.disable-entity-enhancement-check"))) {
throw new EntityNotEnhancedException(message);
}
}
}
use of io.jmix.core.Entity in project jmix by jmix-framework.
the class JpaCacheSupport method evictEntity.
private void evictEntity(Object entity) {
if (entity instanceof Entity && !entityStates.isNew(entity)) {
String storeName = metadata.getClass(entity).getStore().getName();
EntityManagerFactory entityManagerFactory = storeAwareLocator.getEntityManagerFactory(storeName);
JpaCache cache = (JpaCache) entityManagerFactory.getCache();
cache.evict(entity, true);
}
}
use of io.jmix.core.Entity in project jmix by jmix-framework.
the class ResponseBuilder method buildResponse.
/**
* Convert loaded entity to data fetcher return format (Map<String, Object>)
*
* @param entity loaded entity
* @param fetchPlan loaded entity properties
* @param metaClass entity meta class
* @param props we need pass full set of properties to have information about system props such '_instanceName'
* @return entity converted to response as Map<String, Object>
*/
public Map<String, Object> buildResponse(Entity entity, FetchPlan fetchPlan, MetaClass metaClass, Set<String> props) {
Map<String, Object> entityAsMap = new HashMap<>();
// check and evaluate _instanceName, if required
if (environmentUtils.hasInstanceNameProperty(props)) {
entityAsMap.put(NamingUtils.SYS_ATTR_INSTANCE_NAME, metadataTools.getInstanceName(entity));
}
// must include id
writeIdField(entity, entityAsMap);
// compose result object by iterating over fetch plan props
fetchPlan.getProperties().forEach(prop -> {
String propName = prop.getName();
MetaProperty metaProperty = metaClass.getProperty(propName);
Object fieldValue = EntityValues.getValue(entity, propName);
Range propertyRange = metaProperty.getRange();
if (fieldValue == null) {
entityAsMap.put(propName, null);
return;
}
if (propertyRange.isDatatype() || propertyRange.isEnum()) {
entityAsMap.put(propName, fieldValue);
return;
}
if (propertyRange.isClass()) {
Set<String> nestedProps = environmentUtils.getNestedProps(props, propName);
if (fieldValue instanceof Entity) {
entityAsMap.put(propName, buildResponse((Entity) fieldValue, prop.getFetchPlan(), propertyRange.asClass(), nestedProps));
return;
}
if (fieldValue instanceof Collection) {
Collection<Object> values = ((Collection<Entity>) fieldValue).stream().map(e -> buildResponse(e, prop.getFetchPlan(), propertyRange.asClass(), nestedProps)).collect(Collectors.toList());
entityAsMap.put(propName, values);
return;
}
}
log.warn("buildResponse: failed for {}.{} unsupported range type ", metaClass.getName(), prop.getName());
throw new IllegalStateException("Unsupported range type " + propertyRange);
});
return entityAsMap;
}
Aggregations