package org.societies.webapp.controller.userfeedback; import org.societies.api.internal.schema.useragent.feedback.UserFeedbackAccessControlEvent; import org.societies.api.internal.useragent.feedback.IUserFeedback; import org.societies.api.privacytrust.privacy.model.privacypolicy.constants.PrivacyConditionsConstantValues; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.*; import org.societies.webapp.controller.BasePageController; import org.societies.webapp.wrappers.RequestItemWrapper; import javax.annotation.PostConstruct; import javax.faces.application.FacesMessage; import javax.faces.bean.ManagedBean; import javax.faces.bean.ManagedProperty; import javax.faces.bean.ViewScoped; import javax.faces.context.FacesContext; import javax.servlet.http.HttpServletRequest; import java.util.Collections; import java.util.Comparator; import java.util.List; @ManagedBean(name = "accessControlController") @ViewScoped public class AccessControlRequestController extends BasePageController { private static String getIdFromQueryString() { HttpServletRequest hsr = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); if (hsr.getParameter("id") != null) return hsr.getParameter("id"); return ""; } @ManagedProperty(value = "#{notifications}") private NotificationsController notificationsController; @ManagedProperty(value = "#{userFeedback}") private IUserFeedback userFeedback; private String eventID; private UserFeedbackAccessControlEvent event; public AccessControlRequestController() { if (log.isDebugEnabled()) log.debug("AccessControlRequestController ctor()"); } public NotificationsController getNotificationsController() { return notificationsController; } public void setNotificationsController(NotificationsController notificationsController) { this.notificationsController = notificationsController; } public IUserFeedback getUserFeedback() { return userFeedback; } public void setUserFeedback(IUserFeedback userFeedback) { this.userFeedback = userFeedback; } @PostConstruct public void initMethod() { if (log.isDebugEnabled()) log.debug("init()"); eventID = getIdFromQueryString(); event = notificationsController.getAcceessControlEvent(eventID); if (event != null) { if (log.isDebugEnabled()) log.debug("Preparing event for GUI with ID " + eventID); prepareEventForGUI(event); } else { log.warn("Event not found for ID " + eventID); } } @SuppressWarnings("MethodMayBeStatic") public Decision[] getDecisionOptions() { return new Decision[]{ Decision.DENY, Decision.PERMIT }; } @SuppressWarnings("MethodMayBeStatic") public String[] getAvailableConditionValues(ConditionConstants condition) { return PrivacyConditionsConstantValues.getValues(condition); } public List<ResponseItem> getResponseItems() { return event != null ? event.getResponseItems() : null; } public UserFeedbackAccessControlEvent getCurrentAccessEvent() { return event; } public String completeAccessRequestAction() { log.debug("completeAccessRequestAction() id=" + eventID); if (event == null) { log.warn("'event' is null - cannot proceed with completeAccessRequestAction() method"); return null; } // TODO: validate action check boxes prepareEventForTransmission(event); try { userFeedback.submitAccessControlResponse(eventID, event.getResponseItems(), event.getRequestor()); } catch (Exception e) { addGlobalMessage("Error publishing notification of completed access control event", e.getMessage(), FacesMessage.SEVERITY_ERROR); log.error("Error publishing notification of completed negotiation", e); } return "home"; // previously, could redirect to next negotiation - but this makes no sense now } public String cancelAccessRequestAction() { log.debug("cancelAccessRequestAction()"); if (event == null) { log.warn("'event' is null - cannot proceed with cancelAccessRequestAction() method"); return null; } prepareEventForTransmission(event); try { userFeedback.submitAccessControlResponse(eventID, event.getResponseItems(), event.getRequestor()); } catch (Exception e) { addGlobalMessage("Error publishing notification of cancelled access control event", e.getMessage(), FacesMessage.SEVERITY_ERROR); log.error("Error publishing notification of cancelled access control event", e); } return "home"; // previously, could redirect to next negotiation - but this makes no sense now } private static void prepareEventForGUI(UserFeedbackAccessControlEvent event) { List<ResponseItem> responseItems = event.getResponseItems(); for (ResponseItem response : responseItems) { RequestItemWrapper request = new RequestItemWrapper(response.getRequestItem()); response.setRequestItem(request); // add any missing ConditionConstants for (ConditionConstants constant : ConditionConstants.values()) { boolean found = false; for (Condition condition : request.getConditions()) { if (constant.equals(condition.getConditionConstant())) { found = true; break; } } if (!found) { Condition newCondition = new Condition(); newCondition.setConditionConstant(constant); newCondition.setOptional(true); newCondition.setValue(""); request.getConditions().add(newCondition); } } // quickly sort by condition name Collections.sort(request.getConditions(), new Comparator<Condition>() { @Override public int compare(Condition o1, Condition o2) { return o1.getConditionConstant().name().compareTo(o2.getConditionConstant().name()); } }); } } private static void prepareEventForTransmission(UserFeedbackAccessControlEvent event) { for (ResponseItem response : event.getResponseItems()) { RequestItemWrapper requestWrapper = (RequestItemWrapper) response.getRequestItem(); RequestItem request = requestWrapper.getRequestItem(); // remove any optional, unset ConditionConstants for (int i = 0; i < request.getConditions().size(); i++) { Condition condition = request.getConditions().get(i); if (condition.isOptional() && condition.getValue() == null || "".equals(condition.getValue())) { request.getConditions().remove(i); i--; } } // Action strings need to be converted back to Actions // Actually we're just filtering out the unselected ones // we always need read, add it if we haven't got it if (!requestWrapper.getSelectedActionNames().contains("READ")) requestWrapper.getSelectedActionNames().add("READ"); for (int i = 0; i < request.getActions().size(); i++) { Action action = request.getActions().get(i); boolean found = false; for (String name : requestWrapper.getSelectedActionNames()) { if (action.getActionConstant().name().equals(name)) { found = true; break; } } if (!found) { request.getActions().remove(i); i--; } } } clearResponseItemWrapper(event); } private static void clearResponseItemWrapper(UserFeedbackAccessControlEvent event) { for (ResponseItem item : event.getResponseItems()) { RequestItem oldItem = item.getRequestItem(); RequestItem newItem = new RequestItem(); newItem.setActions(oldItem.getActions()); newItem.setConditions(oldItem.getConditions()); newItem.setOptional(oldItem.isOptional()); newItem.setResource(oldItem.getResource()); item.setRequestItem(newItem); } } }