blob: 15e3c0e9c925636dc847bd874eef1c57baf9fcf1 [file] [log] [blame]
/********************************************************************************
* Copyright (c) 2015-2019 Contributors to the Eclipse Foundation
*
* See the NOTICE file(s) distributed with this work for additional
* information regarding copyright ownership.
*
* This program and the accompanying materials are made available under the
* terms of the Eclipse Public License v. 2.0 which is available at
* http://www.eclipse.org/legal/epl-2.0.
*
* SPDX-License-Identifier: EPL-2.0
*
********************************************************************************/
package org.eclipse.mdm.businessobjects.service;
import java.util.Arrays;
import java.util.function.Consumer;
import org.eclipse.mdm.api.base.Transaction;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.dflt.EntityManager;
import org.eclipse.mdm.businessobjects.control.MDMEntityAccessException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import io.vavr.CheckedFunction2;
/**
* Helper class providing functions to realize transactional data operations
*
* @author Alexander Nehmer, science+computing AG Tuebingen (Atos SE)
*
*/
public final class DataAccessHelper {
private static final Logger LOG = LoggerFactory.getLogger(DataAccessHelper.class);
/**
* Just hide the default constructor
*/
private DataAccessHelper() {
}
/**
* Returns a function that executes one transactional operation within a
* transaction.
*
* @return Function that executes a transactional operation on an entity within
* a transaction.
*/
// TODO anehmer on 2017-11-22: extend this method to handle lists of objects
public static <T extends Entity> T execute(EntityManager em, T entity,
CheckedFunction2<Transaction, Entity, Entity> operation) {
Transaction t = null;
try {
// start transaction to persist ValueList
t = em.startTransaction();
// perform the transactional operation
@SuppressWarnings("unchecked")
T processedEntity = (T) operation.apply(t, entity);
// commit the transaction
t.commit();
// return the processed entity
return processedEntity;
} catch (Throwable e) {
if (t != null) {
t.abort();
}
throw new MDMEntityAccessException(e.getMessage(), e);
}
}
/**
* Function that creates an {@link Entity} and returns it.
*/
public static final CheckedFunction2<Transaction, Entity, Entity> DELETE = (transaction, entity) -> {
if (entity instanceof Deletable) {
// TODO anehmer on 2017-11-22: call to delete() should return entity
transaction.delete(Arrays.asList((Deletable) entity));
}
// if entity cannot be deleted
else {
throw new MDMEntityAccessException("Entity to delete is no Deletable");
}
return entity;
};
/**
* Function that creates the given {@link Entity} and returns the updated
* entity.
*/
public static final CheckedFunction2<Transaction, Entity, Entity> CREATE = (transaction, entity) -> {
// TODO anehmer on 2017-11-22: call to create() should return entity
transaction.create(Arrays.asList(entity));
return entity;
};
/**
* Function that updates the given {@link Entity} it is executed upon and
* returns the updated entity.
*/
public static final CheckedFunction2<Transaction, Entity, Entity> UPDATE = (transaction, entity) -> {
// TODO anehmer on 2017-11-22: call to update() should return entity
transaction.update(Arrays.asList(entity));
return entity;
};
/**
* Handles a {@link Throwable} by loggging the exception message and rethrowing
* a {@link MDMEntityAccessException}
*/
// TODO should be replaced in Resources by buildErrorResponse()
public static final Consumer<? super Throwable> rethrowAsMDMEntityAccessException = e -> {
// TODO anehmer on 2017-11-09: check if logging is necessary depending on how we
// handle error logging and client response in general
LOG.error(e.getMessage(), e);
throw new MDMEntityAccessException(e.getMessage(), e);
};
/**
* Function that handles an occurred exception without rethrowing it
*/
// TODO anehmer on 2017-11-22: remove method and logger
public static final Consumer<? super Throwable> handleException = e -> {
LOG.error(e.getMessage(), e);
};
}