package org.aksw.sparqlify.admin.web.api;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnitUtil;
import org.aksw.service_framework.jpa.core.ServiceRepositoryJpaImpl;
import org.aksw.service_framework.jpa.core.ServiceState;
import org.aksw.sparqlify.jpa.EntityInverseMapper;
import org.aksw.sparqlify.jpa.EntityRef;
import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.sparql.core.Quad;
import org.apache.jena.vocabulary.RDF;
public class ServiceManagerImpl<C, E, S>
implements ServiceManager
{
private EntityInverseMapper inverseMapper;
private ServiceRepositoryJpaImpl<C, E, S> serviceRepository;
public ServiceManagerImpl(ServiceRepositoryJpaImpl<C, E, S> serviceRepository, EntityInverseMapper inverseMapper) {
this.inverseMapper = inverseMapper;
this.serviceRepository = serviceRepository;
}
public static <C, E, S> ServiceManagerImpl<C, E, S> create(ServiceRepositoryJpaImpl<C, E, S> serviceRepository, EntityInverseMapper inverseMapper) {
ServiceManagerImpl<C, E, S> result = new ServiceManagerImpl<C, E, S>(serviceRepository, inverseMapper);
return result;
}
public static Set<Object> extractIds(EntityManagerFactory emf, Collection<?> entities) {
PersistenceUnitUtil puu = emf.getPersistenceUnitUtil();
Set<Object> result = new HashSet<Object>();
for(Object entity : entities) {
Object id = puu.getIdentifier(entity);
result.add(id);
}
return result;
}
public Set<Object> getEntityIds(String serviceUriStr) {
Node uri = NodeFactory.createURI(serviceUriStr);
Quad quad = new Quad(Quad.defaultGraphNodeGenerated, uri, RDF.type.asNode(), ServiceVocab.ServiceExecution.asNode());
List<EntityRef> entityRef = inverseMapper.map(quad);
EntityManagerFactory emf = serviceRepository.getEntityManagerFactory();
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
List<?> entities = EntityRefUtils.fetchEntities(em, entityRef);
Set<Object> result = extractIds(emf, entities);
em.getTransaction().commit();
em.close();
return result;
}
public Set<Object> getConfigIds(String serviceUriStr) {
Set<Object> result = new HashSet<Object>();
Set<Object> executionContextIds = getEntityIds(serviceUriStr);
for(Object executionContextId : executionContextIds) {
ServiceState state = serviceRepository.getStateByExecutionContextId(executionContextId);
Object configId = state != null ? state.getConfigId() : null;
if(state != null) {
result.add(configId);
}
}
return result;
}
@Override
public void startService(String serviceUriStr) {
Set<Object> configIds = getConfigIds(serviceUriStr);
for(Object configId : configIds) {
serviceRepository.startByConfigId(configId);
}
}
@Override
public void stopService(String serviceUriStr) {
Set<Object> configIds = getConfigIds(serviceUriStr);
for(Object configId : configIds) {
serviceRepository.stopByConfigId(configId);
}
}
@Override
public void deleteService(String serviceUriStr) {
Set<Object> configIds = getConfigIds(serviceUriStr);
for(Object configId : configIds) {
serviceRepository.deleteByConfigId(configId);
}
}
@Override
public String registerService(Object configId) {
serviceRepository.startByConfigId(configId);
// TODO Currently we cannot map a configId to its URI
return null;
}
@Override
public Object getConfigId(String serviceUriStr) {
Set<Object> configIds = getConfigIds(serviceUriStr);
if(configIds.size() > 1) {
throw new RuntimeException("Multiple ids not expected");
}
Object result = configIds.isEmpty() ? null : configIds.iterator().next();
return result;
}
// @Override
// public void deleteService(String serviceUriStr) {
// Set<Object> executionContextIds = getEntityIds(serviceUriStr);
// for(Object executionContextId : executionContextIds) {
// ServiceState state = serviceRepository.getStateByExecutionContextId(executionContextId);
// Object configId = state != null ? state.getConfigId() : null;
//
// serviceRepository.stopByConfigId(configId);
//
// }
// }
}