package de.passau.uni.sec.compose.id.core.service;
import java.util.Collection;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.passau.uni.sec.compose.id.common.exception.IdManagementException;
import de.passau.uni.sec.compose.id.common.exception.IdManagementException.Level;
import de.passau.uni.sec.compose.id.core.domain.IPrincipal;
import de.passau.uni.sec.compose.id.core.event.AbstractGetEvent;
import de.passau.uni.sec.compose.id.core.event.Event;
import de.passau.uni.sec.compose.id.core.event.ListApplicationsOwnedByUserEvent;
import de.passau.uni.sec.compose.id.core.event.ListEntitiesInGroupEvent;
import de.passau.uni.sec.compose.id.core.event.ListServiceCompositionsOwnedByUserEvent;
import de.passau.uni.sec.compose.id.core.event.ListServiceInstancesOwnedByUserEvent;
import de.passau.uni.sec.compose.id.core.event.ListServiceObjectsOwnedByUserEvent;
import de.passau.uni.sec.compose.id.core.event.ListServiceSourceCodesOwnedByUserEvent;
import de.passau.uni.sec.compose.id.core.event.ListUsersInGroupEvent;
import de.passau.uni.sec.compose.id.core.persistence.entities.Application;
import de.passau.uni.sec.compose.id.core.persistence.entities.EntityGroupMembership;
import de.passau.uni.sec.compose.id.core.persistence.entities.Group;
import de.passau.uni.sec.compose.id.core.persistence.entities.Membership;
import de.passau.uni.sec.compose.id.core.persistence.entities.ServiceComposition;
import de.passau.uni.sec.compose.id.core.persistence.entities.ServiceInstance;
import de.passau.uni.sec.compose.id.core.persistence.entities.ServiceObject;
import de.passau.uni.sec.compose.id.core.persistence.entities.ServiceSourceCode;
import de.passau.uni.sec.compose.id.core.persistence.entities.User;
import de.passau.uni.sec.compose.id.core.persistence.repository.ApplicationRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.EntityGroupMembershipRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.GroupRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.MembershipRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.ServiceCompositionRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.ServiceInstanceRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.ServiceObjectRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.ServiceSourceCodeRepository;
import de.passau.uni.sec.compose.id.core.persistence.repository.UserRepository;
import de.passau.uni.sec.compose.id.core.service.security.Authorization;
import de.passau.uni.sec.compose.id.rest.messages.ApplicationResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.EntityGroupMembershipResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.EntityResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.EntitySetResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.MembershipResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.ServiceCompositionResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.ServiceInstanceResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.ServiceObjectResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.ServiceSourceCodeResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.UsersInGroupMessage;
@Service
public class ListEntitiesOwnedByUserService extends AbstractListEntityService
{
private static Logger LOG = LoggerFactory.getLogger(ListEntitiesOwnedByUserService.class);
@Autowired
GroupRepository groupRepository;
@Autowired
ServiceObjectRepository soRepo;
@Autowired
ServiceInstanceRepository serviceInstanceRepo;
@Autowired
ServiceSourceCodeRepository serviceSourceRepo;
@Autowired
ServiceCompositionRepository serviceCompRepo;
@Autowired
ApplicationRepository appRepo;
@Autowired
UserRepository userRepository;
@Autowired
Authorization authz;
@Override
public Object postACListAllEntities(Event event)
throws IdManagementException {
AbstractGetEvent getEvent = (AbstractGetEvent)event;
User owner = userRepository.getOne(getEvent.getId());
List<Object> list = new LinkedList<Object>();
if(event instanceof ListApplicationsOwnedByUserEvent)
{
List<Application> ret = appRepo.findByOwner(owner);
for(Application app: ret)
list.add(new ApplicationResponseMessage(app));
}
else if (event instanceof ListServiceCompositionsOwnedByUserEvent)
{
List<ServiceComposition> ret = serviceCompRepo.findByOwner(owner);
for(ServiceComposition sc: ret)
list.add(new ServiceCompositionResponseMessage(sc));
}
else if (event instanceof ListServiceInstancesOwnedByUserEvent)
{
List<ServiceInstance> ret = serviceInstanceRepo.findByOwner(owner);
for(ServiceInstance si: ret)
list.add(new ServiceInstanceResponseMessage(si));
}
else if(event instanceof ListServiceSourceCodesOwnedByUserEvent)
{
List<ServiceSourceCode> ret = serviceSourceRepo.findByDeveloper(owner);
for(ServiceSourceCode sc: ret)
list.add(new ServiceSourceCodeResponseMessage(sc));
}
else if(event instanceof ListServiceObjectsOwnedByUserEvent)
{
List<ServiceObject> ret = soRepo.findByOwner(owner);
for(ServiceObject so: ret)
{
ServiceObjectResponseMessage m = new ServiceObjectResponseMessage(so,null);
m.setApi_token(null);
list.add(m);
}
}
EntitySetResponseMessage res = new EntitySetResponseMessage();
res.setEntities(list);
return res;
}
@Override
public void verifyACListAllEntities(Event event)
throws IdManagementException {
Collection<IPrincipal> p = event.getPrincipals();
if(p == null || p.size()==0)
throw new IdManagementException("Authentication required.",null, LOG," Attempt to access GET without providing credentials",Level.DEBUG, 401);
}
}