package de.passau.uni.sec.compose.id.rest.controller;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.util.UriComponentsBuilder;
import de.passau.uni.sec.compose.id.common.exception.IdManagementException;
import de.passau.uni.sec.compose.id.core.domain.IPrincipal;
import de.passau.uni.sec.compose.id.core.event.GetApplicationEvent;
import de.passau.uni.sec.compose.id.core.event.GetServiceCompositionEvent;
import de.passau.uni.sec.compose.id.core.event.GetServiceInstanceEvent;
import de.passau.uni.sec.compose.id.core.event.GetServiceObjectEvent;
import de.passau.uni.sec.compose.id.core.event.GetServiceSourceCodeEvent;
import de.passau.uni.sec.compose.id.core.event.GetUserEvent;
import de.passau.uni.sec.compose.id.core.service.AnyEntityById;
import de.passau.uni.sec.compose.id.core.service.ApplicationService;
import de.passau.uni.sec.compose.id.core.service.CloudPublisher;
import de.passau.uni.sec.compose.id.core.service.ServiceCompositionService;
import de.passau.uni.sec.compose.id.core.service.ServiceInstanceService;
import de.passau.uni.sec.compose.id.core.service.ServiceObjectService;
import de.passau.uni.sec.compose.id.core.service.ServiceSourceCodeService;
import de.passau.uni.sec.compose.id.core.service.UpdateManager;
import de.passau.uni.sec.compose.id.core.service.UserService;
import de.passau.uni.sec.compose.id.core.service.security.RestAuthentication;
import de.passau.uni.sec.compose.id.rest.messages.EntityResponseMessage;
import de.passau.uni.sec.compose.id.rest.messages.Id;
@Controller
@RequestMapping("/idm/update/push/")
public class TriggerUpdateEntityController {
private static Logger LOG = LoggerFactory.getLogger(TriggerUpdateEntityController.class);
@Autowired
private AnyEntityById entityById;
@Autowired
private RestAuthentication authenticator;
@Autowired
UpdateManager update;
@RequestMapping(value="{Id}/", method={RequestMethod.GET})
public @ResponseBody ResponseEntity<Object> getUser( @RequestHeader("Authorization") String token,
@PathVariable(value="Id") String uid,UriComponentsBuilder builder
){
return doCall(token, uid);
}
@RequestMapping(value="", method={RequestMethod.POST})
public @ResponseBody ResponseEntity<Object> getUser( @RequestHeader("Authorization") String token,
UriComponentsBuilder builder,
@Valid @RequestBody Id message){
String uid = message.getId();
return doCall(token, uid);
}
private ResponseEntity<Object> doCall(String token, String uid) {
Collection<String> cred = new LinkedList<String>();
cred.add(token);
try{
//This method just authenticates... it doesn't do access control
Collection<IPrincipal> principals = authenticator.authenticatePrincipals(LOG,cred);
int status = update.handleUpdateForEntity(uid,principals);
return new ResponseEntity<Object>(status, HttpStatus.OK);
}
catch(IdManagementException idm){
//sinc@Autowirede the creation of the exception generated the log entries for the stacktrace, we don't do it again here
return new ResponseEntity<Object>(idm.getErrorAsMap(), HttpStatus.valueOf(idm.getHTTPErrorCode()));
}
catch(Exception e)
{
String s = IdManagementException.getStackTrace(e);
LOG.error(s);
return new ResponseEntity<Object>(null, HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}