package nl.fontys.sofa.limo.service.provider;
import java.util.Collection;
import java.util.List;
import nl.fontys.sofa.limo.api.dao.DAO;
import nl.fontys.sofa.limo.api.exception.DAONotFoundException;
import nl.fontys.sofa.limo.api.service.status.StatusBarService;
import nl.fontys.sofa.limo.domain.BaseEntity;
import org.openide.util.Lookup;
import org.openide.util.lookup.AbstractLookup;
import org.openide.util.lookup.InstanceContent;
/**
* Decorator for DAOs, i.e. DAOS handle database communication, but this Service
* handles updating data in the application when data in the DB has changed in
* the meanwhile (e.g. when a tuple is removed in DB, this service makes sure
* that this data is not available anymore in the application itself
*
* @author Dominik Kaisers {@literal <d.kaisers@student.fontys.nl>}
* @param <T> - baseEntities
*/
public class AbstractService<T extends BaseEntity> implements DAO<T>, Lookup.Provider {
protected final DAO dao;
protected final InstanceContent instanceContent;
protected final Lookup lookup;
private final StatusBarService status;
public AbstractService(Class<? extends DAO> daoClass) throws DAONotFoundException {
this.dao = Lookup.getDefault().lookup(daoClass);
this.instanceContent = new InstanceContent();
this.lookup = new AbstractLookup(instanceContent);
status = Lookup.getDefault().lookup(StatusBarService.class);
if (dao == null) {
throw new DAONotFoundException("DAO of type " + daoClass.getSimpleName() + " not found...");
} else {
List<T> instances = dao.findAll();
instanceContent.set(instances, null);
}
}
/**
* Should be called after clearing the database.
* This function clears the lookup for the service so it updates the tables in the topcomponents
* @param c service class to clear the lookup from
*/
public void emptyLookup(Class c){
Collection<? extends BaseEntity> lookupAll = lookup.lookupAll(c);
lookupAll.stream().forEach((obj) -> {
instanceContent.remove(obj);
});
}
@Override
public List<T> findAll() {
return dao.findAll();
}
@Override
public T findById(String id) {
try {
return (T) dao.findById(id);
} catch (Exception e) {
status.setMessage(id, StatusBarService.ACTION_FOUND, StatusBarService.STATE_FAIL, e);
return null;
}
}
@Override
public T findByUniqueIdentifier(String uniqueIdentifier) {
return (T) dao.findByUniqueIdentifier(uniqueIdentifier);
}
@Override
public T insert(T entity) {
return insert(entity, true);
}
@Override
public T insert(T entity, boolean updateTimestamp) {
try {
T result = (T) dao.insert(entity, updateTimestamp);
instanceContent.add(result);
status.setMessage(entity.getName(), StatusBarService.ACTION_CREATE, StatusBarService.STATE_SUCCESS, null);
return result;
} catch (Exception e) {
status.setMessage(entity.getName(), StatusBarService.ACTION_CREATE, StatusBarService.STATE_FAIL, e);
return null;
}
}
@Override
public boolean update(T entity) {
try {
boolean result = dao.update(entity);
instanceContent.set(dao.findAll(), null);
status.setMessage(entity.getName(), StatusBarService.ACTION_UPDATE, StatusBarService.STATE_SUCCESS, null);
return result;
} catch (Exception e) {
status.setMessage("", StatusBarService.ACTION_UPDATE, StatusBarService.STATE_FAIL, e);
return false;
}
}
@Override
public boolean delete(T entity) {
try {
boolean result = dao.delete(entity);
instanceContent.set(dao.findAll(), null);
status.setMessage(entity.getName(), StatusBarService.ACTION_DELETE, StatusBarService.STATE_SUCCESS, null);
return result;
} catch (Exception e) {
status.setMessage(entity.getName(), StatusBarService.ACTION_DELETE, StatusBarService.STATE_FAIL, null);
return false;
}
}
@Override
public Lookup getLookup() {
return this.lookup;
}
}