/** * Copyright (c) 2011, SOCIETIES Consortium (WATERFORD INSTITUTE OF TECHNOLOGY (TSSG), HERIOT-WATT UNIVERSITY (HWU), SOLUTA.NET * (SN), GERMAN AEROSPACE CENTRE (Deutsches Zentrum fuer Luft- und Raumfahrt e.V.) (DLR), Zavod za varnostne tehnologije * informacijske družbe in elektronsko poslovanje (SETCCE), INSTITUTE OF COMMUNICATION AND COMPUTER SYSTEMS (ICCS), LAKE * COMMUNICATIONS (LAKE), INTEL PERFORMANCE LEARNING SOLUTIONS LTD (INTEL), PORTUGAL TELECOM INOVAÇÃO, SA (PTIN), IBM Corp., * INSTITUT TELECOM (ITSUD), AMITEC DIACHYTI EFYIA PLIROFORIKI KAI EPIKINONIES ETERIA PERIORISMENIS EFTHINIS (AMITEC), TELECOM * ITALIA S.p.a.(TI), TRIALOG (TRIALOG), Stiftelsen SINTEF (SINTEF), NEC EUROPE LTD (NEC)) * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following * conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following * disclaimer in the documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package org.societies.privacytrust.privacyprotection.privacynegotiation.policyGeneration.client; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.concurrent.ExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.internal.privacytrust.privacyprotection.negotiation.NegotiationDetails; import org.societies.api.internal.schema.useragent.feedback.NegotiationDetailsBean; import org.societies.api.internal.useragent.feedback.IUserFeedback; import org.societies.api.privacytrust.privacy.util.privacypolicy.NegotiationStatusUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.RequestItemUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ResponsePolicyUtils; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Decision; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.NegotiationStatus; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestItem; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestPolicy; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponsePolicy; import org.societies.privacytrust.privacyprotection.api.IPrivacyPreferenceManager; import org.societies.privacytrust.privacyprotection.privacynegotiation.PrivacyPolicyNegotiationManager; /** * @author Eliza * @author Olivier Maridat (Trialog) * */ public class ClientResponsePolicyGenerator { private Logger LOG = LoggerFactory.getLogger(this.getClass()); private IUserFeedback userFeedback; private IPrivacyPreferenceManager privacyPreferenceManager; public ClientResponsePolicyGenerator(PrivacyPolicyNegotiationManager policyMgr){ userFeedback = policyMgr.getUserFeedback(); privacyPreferenceManager = policyMgr.getPrivacyPreferenceManager(); } public ResponsePolicy generatePolicy(NegotiationDetails details, RequestPolicy providerPolicy){ // Generate an empty failed response policy (may be useful) ResponsePolicy responsePolicyEmpty = new ResponsePolicy(); responsePolicyEmpty.setRequestor(providerPolicy.getRequestor()); responsePolicyEmpty.setNegotiationStatus(NegotiationStatus.FAILED); // Retrieve requested items List<RequestItem> requestItems = providerPolicy.getRequestItems(); // -- Retrieve PPN preferences HashMap<RequestItem, ResponseItem> evaluatePPNPreferences = this.privacyPreferenceManager.evaluatePPNPreferences(providerPolicy); // -- ResponsePolicy corresponding to the requested privacy policy ResponsePolicy responsePolicyGenerated = new ResponsePolicy(); List<ResponseItem> responseItems = new ArrayList<ResponseItem>(); // - Loop over requested items for (RequestItem requestItem : requestItems){ boolean found = false; for (RequestItem ppnPreferenceKey : evaluatePPNPreferences.keySet()){ // This item is already in the privacy preferences: use the existing response item if (RequestItemUtils.equal(requestItem, ppnPreferenceKey)){ responseItems.add(evaluatePPNPreferences.get(ppnPreferenceKey)); found = true; } } // This item is not in the privacy preferences: create an empty response item for it, PERMIT by default to simplify the user's life if (!found){ ResponseItem item = new ResponseItem(); item.setRequestItem(requestItem); item.setDecision(Decision.PERMIT); responseItems.add(item); } } responsePolicyGenerated.setResponseItems(responseItems); responsePolicyGenerated.setRequestor(providerPolicy.getRequestor()); responsePolicyGenerated.setNegotiationStatus(NegotiationStatus.ONGOING); LOG.debug("Generated response policy to be displayed to the user"); LOG.debug(ResponsePolicyUtils.toString(responsePolicyGenerated)); return responsePolicyGenerated; } public ResponsePolicy generatePolicyUserApproved(NegotiationDetails details, ResponsePolicy requestedResponsePolicy){ // Generate an empty failed response policy ( may be needed) ResponsePolicy responsePolicyEmpty = new ResponsePolicy(); responsePolicyEmpty.setRequestor(requestedResponsePolicy.getRequestor()); responsePolicyEmpty.setNegotiationStatus(NegotiationStatus.FAILED); // -- Let the user change the selected response policy ResponsePolicy responsePolicyUserApproved = new ResponsePolicy(); NegotiationDetailsBean negDetailsBean = new NegotiationDetailsBean(); negDetailsBean.setNegotiationID(details.getNegotiationID()); negDetailsBean.setRequestor(requestedResponsePolicy.getRequestor()); try { responsePolicyUserApproved = userFeedback.getPrivacyNegotiationFB(requestedResponsePolicy, negDetailsBean).get(); if (null == responsePolicyUserApproved){ LOG.error("Result of userfeedback negotiation request is null"); responsePolicyUserApproved = responsePolicyEmpty; } else if (NegotiationStatusUtils.equal(NegotiationStatus.FAILED, responsePolicyUserApproved.getNegotiationStatus())){ LOG.error("Result of userfeedback negotiation request has a 'failed' status"); responsePolicyUserApproved = responsePolicyEmpty; responsePolicyUserApproved.setResponseItems(new ArrayList<ResponseItem>()); } else { LOG.debug("Result of userfeedback negotiation request is valid, let's check it with the requested policy"); responsePolicyUserApproved.setNegotiationStatus(NegotiationStatus.ONGOING); } LOG.debug("Generated user response policy. ResponsePolicy contains: "+responsePolicyUserApproved.getResponseItems().size()+" responseItems"); LOG.debug(ResponsePolicyUtils.toString(responsePolicyUserApproved)); return responsePolicyUserApproved; } catch (InterruptedException e) { LOG.error("Negotiation failed due to interrupted exception", e); responsePolicyUserApproved = responsePolicyEmpty; } catch (ExecutionException e) { LOG.error("Negotiation failed due to execution exception", e); responsePolicyUserApproved = responsePolicyEmpty; } return responsePolicyUserApproved; } }