/** * 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.privacypreferencemanager; import java.util.ArrayList; import java.util.Enumeration; import java.util.Hashtable; import java.util.List; import java.util.concurrent.ExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.context.CtxException; import org.societies.api.context.model.CtxAttribute; import org.societies.api.context.model.CtxEntity; import org.societies.api.context.model.CtxIdentifier; import org.societies.api.context.model.CtxModelObject; import org.societies.api.context.model.CtxOriginType; import org.societies.api.context.model.MalformedCtxIdentifierException; import org.societies.api.identity.IIdentityManager; import org.societies.api.identity.InvalidFormatException; import org.societies.api.identity.Requestor; import org.societies.api.identity.util.DataIdentifierFactory; import org.societies.api.identity.util.DataTypeUtils; import org.societies.api.identity.util.RequestorUtils; import org.societies.api.internal.context.broker.ICtxBroker; import org.societies.api.internal.privacytrust.privacyprotection.IPrivacyAgreementManager; import org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.AgreementEnvelope; import org.societies.api.internal.privacytrust.privacyprotection.model.privacypolicy.IAgreement; import org.societies.api.internal.privacytrust.trust.ITrustBroker; import org.societies.api.internal.schema.privacytrust.privacyprotection.preferences.AccessControlPreferenceDetailsBean; import org.societies.api.internal.schema.privacytrust.privacyprotection.preferences.PrivacyOutcomeConstantsBean; import org.societies.api.internal.useragent.feedback.IUserFeedback; import org.societies.api.internal.useragent.model.ExpProposalContent; import org.societies.api.internal.useragent.model.ExpProposalType; import org.societies.api.privacytrust.privacy.model.PrivacyException; import org.societies.api.privacytrust.privacy.util.privacypolicy.ResourceUtils; import org.societies.api.schema.identity.DataIdentifier; import org.societies.api.schema.identity.DataIdentifierScheme; import org.societies.api.schema.identity.DataTypeDescription; import org.societies.api.schema.identity.RequestorBean; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Action; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ActionConstants; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Condition; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ConditionConstants; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Decision; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.RequestItem; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Resource; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.ResponseItem; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.ContextPreferenceCondition; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.IPrivacyOutcome; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.IPrivacyPreference; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.IPrivacyPreferenceTreeModel; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.PrivacyCondition; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.PrivacyPreference; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.accesscontrol.AccessControlOutcome; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.accesscontrol.AccessControlPreferenceTreeModel; import org.societies.privacytrust.privacyprotection.api.model.privacypreference.constants.OperatorConstants; import org.societies.privacytrust.privacyprotection.api.util.PrivacyPreferenceUtils; import org.societies.privacytrust.privacyprotection.privacypreferencemanager.evaluation.PreferenceEvaluator; import org.societies.privacytrust.privacyprotection.privacypreferencemanager.evaluation.PrivateContextCache; import org.societies.privacytrust.privacyprotection.privacypreferencemanager.management.PrivatePreferenceCache; /** * @author Eliza * */ public class AccessControlPreferenceManager { private final static Logger logging = LoggerFactory.getLogger(AccessControlPreferenceManager.class); private final PrivatePreferenceCache prefCache; private final PrivateContextCache contextCache; private final IUserFeedback userFeedback; private final ITrustBroker trustBroker; private final ICtxBroker ctxBroker; private final IPrivacyAgreementManager agreementMgr; private final IIdentityManager idMgr; public AccessControlPreferenceManager(PrivatePreferenceCache prefCache, PrivateContextCache contextCache, IUserFeedback userFeedback, ITrustBroker trustBroker, ICtxBroker ctxBroker, IPrivacyAgreementManager agreementMgr, IIdentityManager idMgr){ this.prefCache = prefCache; this.contextCache = contextCache; this.userFeedback = userFeedback; this.trustBroker = trustBroker; this.ctxBroker = ctxBroker; this.agreementMgr = agreementMgr; this.idMgr = idMgr; } private ResponseItem checkPreferenceForAccessControl(AccessControlPreferenceDetailsBean details, IPrivacyPreferenceTreeModel model, List<Condition> conditions) throws MalformedCtxIdentifierException{ RequestorBean requestor = details.getRequestor(); DataIdentifier dataId = DataIdentifierFactory.fromUri(details.getResource().getDataIdUri()); Action action = details.getAction(); this.logging.debug("Evaluating preference"); IPrivacyOutcome outcome = this.evaluatePreference(model.getRootPreference(), conditions); String actionList = ""; if (null==outcome){ this.logging.debug("Evaluation returned no result. Asking the user: "+dataId.getType()); this.logging.debug("Evaluation returned no result. Asking the user: "+dataId.getType()); String allow = "Allow"; String deny = "Deny"; List<String> response = new ArrayList<String>(); String proposalText = requestor.getRequestorId().toString()+" is requesting access to: \n" + "resource:"+dataId.getType()+"\n("+dataId.getUri()+")\nto perform a "+actionList+" operation."; try { response = this.userFeedback.getExplicitFB(ExpProposalType.ACKNACK, new ExpProposalContent(proposalText, new String[]{allow,deny})).get(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (response.contains(allow)){ this.storeDecision(requestor, dataId, conditions, action, PrivacyOutcomeConstantsBean.ALLOW); return this.createResponseItem(requestor, dataId, action, conditions, Decision.PERMIT); }else{ this.storeDecision(requestor, dataId, conditions, action, PrivacyOutcomeConstantsBean.BLOCK); return this.createResponseItem(requestor, dataId, action, conditions, Decision.DENY); } /*int n = myMessageBox.showConfirmDialog(requestor.getRequestorId().toString()+" is requesting access to: \n" + "resource:"+dataId.getType()+"\n("+dataId.getUri()+")\nto perform a "+actionList+" operation. \nAllow?", "Access request", JOptionPane.YES_NO_OPTION); if (n==JOptionPane.YES_OPTION){ this.askToStoreDecision(requestor, dataId, conditions, actions, PrivacyOutcomeConstants.ALLOW); return this.createResponseItem(requestor, dataId, actions, conditions, Decision.PERMIT); }else{ this.askToStoreDecision(requestor, dataId, conditions, actions, PrivacyOutcomeConstants.BLOCK); return this.createResponseItem(requestor, dataId, actions, conditions, Decision.DENY); }*/ }else{ if (((AccessControlOutcome) outcome).getEffect()==PrivacyOutcomeConstantsBean.ALLOW){ this.logging.debug("Returning PERMIT decision for resource: "+dataId.getUri()); return this.createResponseItem(requestor, dataId, action, conditions, Decision.PERMIT); } this.logging.debug("Returning DENY decision for resource: "+dataId.getUri()); return this.createResponseItem(requestor, dataId, action, conditions, Decision.DENY); } } public IPrivacyOutcome evaluatePreference(IPrivacyPreference privPref, List<Condition> conditions){ PreferenceEvaluator ppE = new PreferenceEvaluator(this.contextCache, trustBroker); Hashtable<IPrivacyOutcome, List<CtxIdentifier>> results = ppE.evaluateAccessCtrlPreference(privPref, conditions); Enumeration<IPrivacyOutcome> outcomes = results.keys(); //JOptionPane.showMessageDialog(null, results.size()); if (outcomes.hasMoreElements()){ return outcomes.nextElement(); } return null; } /* * (non-Javadoc) * @see org.societies.privacytrust.privacyprotection.api.IPrivacyPreferenceManager#checkPermission(org.societies.api.identity.Requestor, org.societies.api.context.model.CtxAttributeIdentifier, java.util.List) */ public List<ResponseItem> checkPermission(RequestorBean requestor, List<DataIdentifier> dataIds, List<Action> actions) throws PrivacyException{ if (null==dataIds || dataIds.size() <= 0){ this.logging.debug("requested permission for null CtxIdentifier. returning : null"); return null; } List<ResponseItem> permissions = new ArrayList<ResponseItem>(); for(DataIdentifier dataId : dataIds) { permissions.addAll(checkPermission(requestor, dataId, actions)); } return permissions; } public List<ResponseItem> checkPermission(RequestorBean requestor, DataIdentifier dataId, List<Action> actions) throws PrivacyException{ if (null==dataId){ this.logging.debug("requested permission for null CtxIdentifier. returning : null"); return null; } List<Condition> conditions = new ArrayList<Condition>(); this.logging.debug("checkPermission: \nRequestor: "+requestor.toString()+"\nctxId: "+dataId.getUri()+"\n and actions..."); try { AgreementEnvelope agreementEnv = this.agreementMgr.getAgreement(RequestorUtils.toRequestor(requestor, this.idMgr)); if (agreementEnv!=null){ IAgreement agreement = agreementEnv.getAgreement(); for (ResponseItem item: agreement.getRequestedItems()){ if (item.getRequestItem().getResource().getDataType().equals(dataId.getType())){ conditions = item.getRequestItem().getConditions(); //JOptionPane.showMessageDialog(null, "Found conditions in agreement"); } } } } catch (InvalidFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); } AccessControlPreferenceDetailsBean details = new AccessControlPreferenceDetailsBean(); details.setRequestor(requestor); Resource resource = ResourceUtils.create(dataId.getUri()); details.setResource(resource); List<AccessControlPreferenceTreeModel> models = new ArrayList<AccessControlPreferenceTreeModel>(); Hashtable<Action,ResponseItem> alreadyStoredItems = new Hashtable<Action,ResponseItem>(); List<Action> notExistsInPreference = new ArrayList<Action>(); for (Action action: actions){ details.setAction(action); this.logging.debug("Retrieving preference for: "+PrivacyPreferenceUtils.toString(details)); try{ ResponseItem evaluationResult = this.evaluateAccCtrlPreference(details, conditions); //this.checkPreferenceForAccessControl(model, requestor, dataId, conditions, action); if (evaluationResult!=null){ alreadyStoredItems.put(action, evaluationResult); }else{ notExistsInPreference.add(action); } } catch (PrivacyException pe){ notExistsInPreference.add(action); } } //TODO: merge response items List<ResponseItem> responseItems = new ArrayList<ResponseItem>(); ResponseItem item = new ResponseItem(); item.setDecision(Decision.PERMIT); RequestItem reqItem = new RequestItem(); reqItem.setResource(resource); item.setRequestItem(reqItem); item.setDecision(Decision.DENY); // by default int nbOfAcceptedActions = 0; DataTypeDescription dataTypeDescription = (new DataTypeUtils()).getFriendlyDescription(dataId.getType()); String proposalText = requestor.getRequestorId().toString()+" is requesting access to your \"<span title=\""+dataTypeDescription.getFriendlyDescription()+"\">"+dataTypeDescription.getFriendlyName()+"</span>\" in order to perform the following actions.\n" + "Pick the allowed actions:"; String[] actionsStr = new String[notExistsInPreference.size()]; int i = 0; for (Action a: notExistsInPreference){ actionsStr[i] = a.getActionConstant().name(); i++; } ExpProposalContent expContent = new ExpProposalContent(proposalText, actionsStr); // -- Retrieve User Feedback List<String> acceptedActions = null; try { // - Ask for user's feedback acceptedActions = userFeedback.getExplicitFB(ExpProposalType.CHECKBOXLIST, expContent).get(); } catch (Exception e) { logging.error("Can't retrieve user's feedback", e); acceptedActions = null; } finally { // - Store decision AND fill the ResponseItem with the accepted actions (even if errors happened) for (Action action : notExistsInPreference){ // Accepted by the user if (null != acceptedActions && acceptedActions.contains(action.getActionConstant().name())) { nbOfAcceptedActions++; item.getRequestItem().getActions().add(action); storeDecision(requestor, dataId, conditions, action, PrivacyOutcomeConstantsBean.ALLOW); } // Not accepted else { storeDecision(requestor, dataId, conditions, action, PrivacyOutcomeConstantsBean.BLOCK); } } } // -- Fill the ResponseItem with existing previous actions Enumeration<Action> actionkeys = alreadyStoredItems.keys(); while (actionkeys.hasMoreElements()) { Action nextElement = actionkeys.nextElement(); if (alreadyStoredItems.get(nextElement).getDecision().equals(Decision.PERMIT)) { nbOfAcceptedActions++; item.getRequestItem().getActions().add(nextElement); } } // -- Take a decision // Some actions have been accepted if (nbOfAcceptedActions >= 1) { item.setDecision(Decision.PERMIT); } // No actions have been accepted else { item.getRequestItem().getActions().addAll(notExistsInPreference); item.getRequestItem().getActions().addAll(alreadyStoredItems.keySet()); } responseItems.add(item); return responseItems; } private void storeDecision(RequestorBean requestor, DataIdentifier dataId, List<Condition> conditions,Action action, PrivacyOutcomeConstantsBean decision){ Resource resource = new Resource(); resource.setDataIdUri(dataId.getUri()); resource.setScheme(dataId.getScheme()); resource.setDataType(dataId.getType()); List<RequestorBean> requestors = new ArrayList<RequestorBean>(); requestors.add(requestor); try { AccessControlOutcome outcome = new AccessControlOutcome(decision); AccessControlPreferenceDetailsBean detailsBean = new AccessControlPreferenceDetailsBean(); AccessControlPreferenceTreeModel model = new AccessControlPreferenceTreeModel(detailsBean, this.createAccessCtrlPrivacyPreference(conditions,action, resource, outcome)); detailsBean.setRequestor(requestor); detailsBean.setAction(action); detailsBean.setResource(resource); this.prefCache.addAccCtrlPreference(detailsBean, model); } catch (PrivacyException e) { // TODO Auto-generated catch block e.printStackTrace(); } //} } private PrivacyPreference createAccessCtrlPrivacyPreference(List<Condition> conditions, Action action, Resource resource, AccessControlOutcome outcome) throws PrivacyException{ PrivacyPreference withAllConditionsPreference = this.createPreferenceWithPrivacyConditions(conditions, action, outcome); if (resource.getScheme().equals(DataIdentifierScheme.CONTEXT)){ try { // 2013-04-16: updated by Olivier to replace CtxAttributeIdentifier to CtxIdentifier. Add logic to handle also CtxEntity and not just CtxAttribute CtxIdentifier ctxIdentifier = (CtxIdentifier) ResourceUtils.getDataIdentifier(resource); CtxModelObject ctxModelObject = this.ctxBroker.retrieve(ctxIdentifier).get(); ContextPreferenceCondition condition; PrivacyPreference conditionPreference; // -- CtxAttribute if (ctxModelObject!=null && ctxModelObject instanceof CtxAttribute){ CtxAttribute ctxAttribute = (CtxAttribute) ctxModelObject; // CtxAttribute is inferred or sensed: add a privacy preference condition if (null!=ctxAttribute.getQuality() && null!=ctxAttribute.getQuality().getOriginType() && (ctxAttribute.getQuality().getOriginType().equals(CtxOriginType.INFERRED) || ctxAttribute.getQuality().getOriginType().equals(CtxOriginType.SENSED))){ switch (ctxAttribute.getValueType()){ case DOUBLE: condition = new ContextPreferenceCondition(ctxIdentifier, OperatorConstants.EQUALS, ctxAttribute.getDoubleValue().toString()); conditionPreference = new PrivacyPreference(condition); conditionPreference.add(withAllConditionsPreference); return conditionPreference; case INTEGER: condition = new ContextPreferenceCondition(ctxIdentifier, OperatorConstants.EQUALS, ctxAttribute.getIntegerValue().toString()); conditionPreference = new PrivacyPreference(condition); conditionPreference.add(withAllConditionsPreference); return conditionPreference; case STRING: condition = new ContextPreferenceCondition(ctxIdentifier, OperatorConstants.EQUALS, ctxAttribute.getStringValue()); conditionPreference = new PrivacyPreference(condition); conditionPreference.add(withAllConditionsPreference); return conditionPreference; } } // -- CtxEntity else if (ctxModelObject!=null && ctxModelObject instanceof CtxEntity){ CtxEntity ctxEntity = (CtxEntity) ctxModelObject; // TODO for Eliza: check if it is relevant to add a ContextPreferenceCondition or not // condition = new ContextPreferenceCondition(ctxIdentifier, OperatorConstants.EQUALS, ctxEntity.getOwnerId()); // conditionPreference = new PrivacyPreference(condition); // conditionPreference.add(withAllConditionsPreference); // return conditionPreference; } }else{ throw new PrivacyException("Could not create access control preference as there was no ctxAttribute found in DB with the provided dataIdentifier"); } } catch (MalformedCtxIdentifierException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecutionException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CtxException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return withAllConditionsPreference; } private PrivacyPreference createPreferenceWithPrivacyConditions( List<Condition> conditions, Action action, AccessControlOutcome outcome) { PrivacyPreference rootPreference = new PrivacyPreference(outcome); for (Condition condition : conditions){ rootPreference = this.getPrivacyCondition(rootPreference, condition); } return rootPreference; } private PrivacyPreference getPrivacyCondition(PrivacyPreference preference, Condition condition){ PrivacyPreference pref = new PrivacyPreference(new PrivacyCondition(condition)); pref.add(preference); return pref; } private ResponseItem createResponseItem(RequestorBean requestor, DataIdentifier dataId, Action action, List<Condition> conditions, Decision decision){ RequestItem reqItem = new RequestItem(); List<Action> actions = new ArrayList<Action>(); actions.add(action); reqItem.setActions(actions); reqItem.setConditions(conditions); Resource resource = new Resource(); resource.setDataIdUri(dataId.getUri()); resource.setDataType(dataId.getType()); resource.setScheme(dataId.getScheme()); reqItem.setResource(resource); ResponseItem respItem = new ResponseItem(); respItem.setDecision(decision); respItem.setRequestItem(reqItem); return respItem; } /* private List<Action> adjustActions(List<Action> actions){ boolean hasCreate = false; boolean hasWrite = false; boolean hasDelete = false; for (Action a: actions){ if (a.getActionConstant().equals(ActionConstants.CREATE)){ hasCreate = true; } if (a.getActionConstant().equals(ActionConstants.WRITE)){ hasWrite = true; } if (a.getActionConstant().equals(ActionConstants.DELETE)){ hasDelete = true; } } Action write = new Action(); write.setActionConstant(ActionConstants.WRITE); Action create = new Action(); create.setActionConstant(ActionConstants.CREATE); Action delete = new Action(); delete.setActionConstant(ActionConstants.DELETE); Action read = new Action(); read.setActionConstant(ActionConstants.READ); if (hasCreate){ actions = new ArrayList<Action>(); actions.add(write); actions.add(create); actions.add(delete); actions.add(read); } else if (hasWrite){ actions = new ArrayList<Action>(); actions.add(write); actions.add(read); if (hasDelete){ actions.add(delete); } } return actions; }*/ /** * new methods; */ public boolean deleteAccCtrlPreference( AccessControlPreferenceDetailsBean details) { return this.prefCache.removeAccCtrlPreference(details); } public ResponseItem evaluateAccCtrlPreference( AccessControlPreferenceDetailsBean details, List<Condition> conditions) throws PrivacyException { AccessControlPreferenceTreeModel model = this.prefCache.getAccCtrlPreference(details); if (model!=null){ try { return this.checkPreferenceForAccessControl(details, model, conditions); } catch (MalformedCtxIdentifierException e) { // TODO Auto-generated catch block e.printStackTrace(); } } throw new PrivacyException("Could not find preference for given details"); } public AccessControlPreferenceTreeModel getAccCtrlPreference( AccessControlPreferenceDetailsBean details) { return this.prefCache.getAccCtrlPreference(details); } public List<AccessControlPreferenceDetailsBean> getAccCtrlPreferenceDetails() { return this.prefCache.getAccCtrlPreferenceDetails(); } public boolean storeAccCtrlPreference( AccessControlPreferenceDetailsBean details, AccessControlPreferenceTreeModel model) { return this.prefCache.addAccCtrlPreference(details, model); } /** * * @param requestor * @param dataIds the list of requestedItems for which preferences exist * @return a hashtable whose keys represent the preference conditions (context) */ public Hashtable<CtxIdentifier, ArrayList<AccessControlPreferenceDetailsBean>> getContextConditions(Requestor requestor, List<DataIdentifier> dataIds){ Hashtable<CtxIdentifier, ArrayList<AccessControlPreferenceDetailsBean>> detailsToBeMonitored = new Hashtable<CtxIdentifier, ArrayList<AccessControlPreferenceDetailsBean>>(); List<AccessControlPreferenceDetailsBean> accCtrlPreferenceDetails = this.getAccCtrlPreferenceDetails(); String display = ""; for (AccessControlPreferenceDetailsBean detail : accCtrlPreferenceDetails){ display = display.concat("\nRequestor: "+RequestorUtils.toString(detail.getRequestor())+", resource: "+ResourceUtils.toString(detail.getResource())+", action: "+detail.getAction().toString()); } //JOptionPane.showMessageDialog(null, "Found prefs: "+accCtrlPreferenceDetails.size()+display); //for every requested item in the privacy policy for (DataIdentifier requestedDataId : dataIds){ //JOptionPane.showMessageDialog(null, "requested ids loop: "+requestedDataId.getType()); //for every preference for (AccessControlPreferenceDetailsBean detail: accCtrlPreferenceDetails){ //JOptionPane.showMessageDialog(null, "requested detail loop: "+detail.getResource().getDataType()+" \n"+detail.getRequestor().getRequestorId()); //if the preference refers to this resource if (requestedDataId.getType().equalsIgnoreCase(detail.getResource().getDataType())){ //if the preference refers to this requestor if (RequestorUtils.equal(detail.getRequestor(), RequestorUtils.toRequestorBean(requestor))){ //JOptionPane.showMessageDialog(null, "Requestor: "+RequestorUtils.toString(detail.getRequestor())+" vs "+RequestorUtils.toString(RequestorUtils.toRequestorBean(requestor))); //retrieve the preference, iterate through it, and retrieve all the conditions AccessControlPreferenceTreeModel accCtrlPreference = this.getAccCtrlPreference(detail); IPrivacyPreference rootPreference = accCtrlPreference.getRootPreference(); Enumeration<IPrivacyPreference> postorderEnumeration = rootPreference.postorderEnumeration(); ArrayList<CtxIdentifier> ctxIds = new ArrayList<CtxIdentifier>(); while (postorderEnumeration.hasMoreElements()){ IPrivacyPreference nextElement = postorderEnumeration.nextElement(); if (nextElement.getUserObject()!=null){ //JOptionPane.showMessageDialog(null, "Processing element "+nextElement.getUserObject().toString()); if (nextElement.getUserObject() instanceof ContextPreferenceCondition){ CtxIdentifier contextConditionID =((ContextPreferenceCondition)nextElement.getCondition()).getCtxIdentifier(); //if the list doesn't already contain this condition if (!ctxIds.contains(contextConditionID)){ ctxIds.add(contextConditionID); } } } } for (CtxIdentifier ctxId : ctxIds){ //if the ctxId already exists as a key, add the preference details to the list if (detailsToBeMonitored.containsKey(ctxId)){ detailsToBeMonitored.get(ctxId).add(detail); }else{ //else add the new ctxID as key and add the preference details in the list ArrayList<AccessControlPreferenceDetailsBean> list = new ArrayList<AccessControlPreferenceDetailsBean>(); list.add(detail); detailsToBeMonitored.put(ctxId, list); } } } } } } return detailsToBeMonitored; } private boolean contains(List<CtxIdentifier> dataIds, String uri){ for (CtxIdentifier ctxId : dataIds){ if (ctxId.getUri().equals(uri)){ return true; } } return false; } public static void main(String[] args){ AccessControlPreferenceManager prefMgr = new AccessControlPreferenceManager(null, null, null, null, null, null, null); List<Condition> conditions = new ArrayList<Condition>(); Condition condition = new Condition(); condition.setConditionConstant(ConditionConstants.SHARE_WITH_3RD_PARTIES); condition.setValue("No"); Condition condition2 = new Condition(); condition2.setConditionConstant(ConditionConstants.DATA_RETENTION_IN_HOURS); condition2.setValue("24"); conditions.add(condition2); conditions.add(condition); Action action = new Action(); action.setActionConstant(ActionConstants.READ); AccessControlOutcome outcome = new AccessControlOutcome(PrivacyOutcomeConstantsBean.ALLOW); PrivacyPreference pref = prefMgr.createPreferenceWithPrivacyConditions(conditions, action, outcome); System.out.println(pref.getRoot()); } }