/** * 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.datamanagement; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import java.util.concurrent.Future; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.cis.management.ICisManager; import org.societies.api.cis.management.ICisOwned; import org.societies.api.cis.management.ICisParticipant; import org.societies.api.comm.xmpp.interfaces.ICommManager; import org.societies.api.context.model.CtxModelObject; import org.societies.api.identity.IIdentity; import org.societies.api.identity.IdentityType; import org.societies.api.identity.InvalidFormatException; import org.societies.api.identity.util.DataIdentifierUtils; import org.societies.api.identity.util.RequestorUtils; import org.societies.api.internal.logging.IPerformanceMessage; import org.societies.api.internal.logging.PerformanceMessage; import org.societies.api.internal.privacytrust.privacy.util.dataobfuscation.DataWrapperFactory; import org.societies.api.internal.privacytrust.privacyprotection.IPrivacyDataManager; import org.societies.api.internal.privacytrust.privacyprotection.IPrivacyPolicyManager; import org.societies.api.internal.schema.privacytrust.privacy.model.dataobfuscation.DataWrapper; import org.societies.api.internal.schema.privacytrust.privacyprotection.preferences.DObfPreferenceDetailsBean; import org.societies.api.privacytrust.privacy.model.PrivacyException; import org.societies.api.privacytrust.privacy.util.privacypolicy.ActionUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ConditionUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.RequestItemUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.RequestPolicyUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ResourceUtils; import org.societies.api.privacytrust.privacy.util.privacypolicy.ResponseItemUtils; import org.societies.api.schema.identity.DataIdentifier; import org.societies.api.schema.identity.RequestorBean; import org.societies.api.schema.identity.RequestorCisBean; import org.societies.api.schema.identity.RequestorServiceBean; import org.societies.api.schema.privacytrust.privacy.model.privacypolicy.Action; 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.RequestPolicy; 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.IDataObfuscationManager; import org.societies.privacytrust.privacyprotection.api.IPrivacyDataManagerInternal; import org.societies.privacytrust.privacyprotection.api.IPrivacyPreferenceManager; import org.societies.privacytrust.privacyprotection.datamanagement.util.PrivacyDataManagerUtility; import org.springframework.beans.factory.annotation.Value; import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.AsyncResult; /** * @author Olivier Maridat (Trialog) */ public class PrivacyDataManager extends PrivacyDataManagerUtility implements IPrivacyDataManager { private static final Logger LOG = LoggerFactory.getLogger(PrivacyDataManager.class); private static final Logger PERF_LOG = LoggerFactory.getLogger("PerformanceMessage"); // to define a dedicated Logger for Performance Testing private static long performanceObfuscationCount = 0; /* Beans */ private IPrivacyDataManagerInternal privacyDataManagerInternal; private IPrivacyPreferenceManager privacyPreferenceManager; private IDataObfuscationManager dataObfuscationManager; private IPrivacyPolicyManager privacyPolicyManager; private ICommManager commManager; private ICisManager cisManager; /* Data */ public static final String CSS_ACCESS_CONTROL_TYPE = "CSS"; public static final String CIS_ACCESS_CONTROL_TYPE = "CIS"; /** * To choose between development and production mode. * In development mode, it is possible to disable the * privacy access control layer by a configuration * parameter. */ private static final boolean IS_DEVELOPMENT_MODE = false; /** * Flag to enable/disable access control and obfuscation */ private boolean enabled; /* ********************************* * ACCESS CONTROL * ******************************* */ @Override public List<ResponseItem> checkPermission(RequestorBean requestor, List<DataIdentifier> dataIds, List<Action> actions) throws PrivacyException { // -- Verify parameters if (null == requestor) { throw new PrivacyException("[Parameters] Not enought information: requestor or owner id is missing"); } if (null == dataIds || dataIds.size() <= 0) { throw new PrivacyException("[Parameters] Not enought information: data id is missing. At least the data type is expected."); } if (null == actions || actions.size() <= 0 || !ActionUtils.atLeast1MandatoryAction(actions)) { throw new PrivacyException("[Parameters] Actions are missing, at least one mandatory action is required, they can't be all optional."); } // TODO Check that all dataIds are leaf (in data hierarchy)? // Create useful values for default result List<DataIdentifier> remainingDataIds = new ArrayList<DataIdentifier>(); // deep copy of dataIds List<ResponseItem> permissions = new ArrayList<ResponseItem>(); List<RequestItem> requestedItems = new ArrayList<RequestItem>(); for(Iterator<DataIdentifier> it = dataIds.iterator(); it.hasNext();) { DataIdentifier dataId = it.next(); remainingDataIds.add(dataId); requestedItems.add(RequestItemUtils.create(ResourceUtils.create(dataId), actions, new ArrayList<Condition>())); } // Access control disabled if (!isEnabled()) { permissions.addAll(ResponseItemUtils.createList(Decision.PERMIT, requestedItems, false)); return permissions; // no storage } // -- Retrieve stored permissions try { permissions = privacyDataManagerInternal.getPermissions(requestor, dataIds, actions); // All decisions already stored if (null != permissions && permissions.size() == dataIds.size()) { return permissions; // no re-storage } } catch (Exception e) { LOG.warn("Error when retrieving stored decisions. Let's continue without storage", e); } if (null == permissions) { permissions = new ArrayList<ResponseItem>(); } List<DataIdentifier> availableDataIds = ResponseItemUtils.getDataIdentifiers(permissions); if (null != availableDataIds) { remainingDataIds.removeAll(availableDataIds); } // -- Some permissions are missing: retrieve them List<ResponseItem> newPermissions = new ArrayList<ResponseItem>(); Map<String, List<DataIdentifier>> sortedDataIds = sortByAccessControlType(remainingDataIds); LOG.debug("Check: Remaining data "+DataIdentifierUtils.toUriString(remainingDataIds)); // - Access control for CSS data: ask to PrivacyPreferenceManager if (sortedDataIds.containsKey(CSS_ACCESS_CONTROL_TYPE)) { List<ResponseItem> newCssPermissions = checkPermissionCssData(requestor, sortedDataIds.get(CSS_ACCESS_CONTROL_TYPE), actions); if (null != newCssPermissions && newCssPermissions.size() > 0) { newPermissions.addAll(newCssPermissions); } } // - Access control for CIS data: use the CIS privacy policy if (sortedDataIds.containsKey(CIS_ACCESS_CONTROL_TYPE)) { List<ResponseItem> newCisPermissions = checkPermissionCisData(requestor, sortedDataIds.get(CIS_ACCESS_CONTROL_TYPE), actions); if (null != newCisPermissions && newCisPermissions.size() > 0) { newPermissions.addAll(newCisPermissions); } } permissions.addAll(newPermissions); availableDataIds = ResponseItemUtils.getDataIdentifiers(newPermissions); if (null != availableDataIds) { remainingDataIds.removeAll(availableDataIds); } //-- Still some remainings? DENY them (no storage) if (null != remainingDataIds && remainingDataIds.size() > 0) { for(Iterator<DataIdentifier> it = remainingDataIds.iterator(); it.hasNext();) { DataIdentifier dataId = it.next(); permissions.add(ResponseItemUtils.create(Decision.DENY, RequestItemUtils.create(ResourceUtils.create(dataId), new ArrayList<Action>(), new ArrayList<Condition>()))); } } // -- Still no permission available: deny access to all if (null == permissions || permissions.size() <= 0) { permissions.addAll(ResponseItemUtils.createList(Decision.DENY, requestedItems, true)); return permissions; // no storage } // -- Store new permission retrieved from PrivacyPreferenceManager try { privacyDataManagerInternal.updatePermissions(requestor, newPermissions); } catch (Exception e) { LOG.error("Error during decisions storage", e); } return permissions; } public List<ResponseItem> checkPermissionCisData(RequestorBean requestor, List<DataIdentifier> dataIds, List<Action> actions) throws PrivacyException { List<ResponseItem> permissions = new ArrayList<ResponseItem>(); for (DataIdentifier dataId : dataIds) { permissions.addAll(checkPermissionCisData(requestor, dataId, actions)); } return permissions; } public List<ResponseItem> checkPermissionCisData(RequestorBean requestor, DataIdentifier dataId, List<Action> actions) throws PrivacyException { // -- Verify parameters if (!isDependencyInjectionDone(3)) { throw new PrivacyException("[Dependency Injection] PrivacyDataManager not ready"); } // -- Create useful values for default result List<Condition> conditions = new ArrayList<Condition>(); Resource resource = ResourceUtils.create(dataId); RequestItem requestItem = RequestItemUtils.create(resource, actions, conditions); ResponseItem permissionDeny = ResponseItemUtils.create(Decision.DENY, requestItem); ResponseItem permissionPermit = ResponseItemUtils.create(Decision.PERMIT, requestItem); List<ResponseItem> permissions = new ArrayList<ResponseItem>(); // -- Internal call (requestor == current node) IIdentity currentCssId = null; try { currentCssId = commManager.getIdManager().getThisNetworkNode(); } finally { // Error case if (null == currentCssId) { LOG.error("[CIS access control] No current CSS found"); permissions.add(permissionDeny); return permissions; } if (null != currentCssId && !(requestor instanceof RequestorServiceBean) && !(requestor instanceof RequestorCisBean) && requestor.getRequestorId().equals(currentCssId.getJid())) { LOG.debug("[CIS access control] Internal call: always PERMIT"); permissions.add(permissionPermit); return permissions; } } // -- Retrieve the CIS Privacy Policy String cisId = dataId.getOwnerId(); RequestorCisBean requestorCis = (RequestorCisBean) RequestorUtils.create(currentCssId.getJid(), cisId); RequestPolicy privacyPolicy = null; try { privacyPolicy = privacyPolicyManager.getPrivacyPolicy(requestorCis); } catch(Exception e) { LOG.error("[CIS access control] Error: The privacy policy can not be retrieved for this CIS: "+RequestorUtils.toString(requestorCis), e); privacyPolicy = null; } // Can't retrieve the privacy policy OR empty one: DENY all if (null == privacyPolicy || null == privacyPolicy.getRequestItems() || privacyPolicy.getRequestItems().size() <= 0) { LOG.error("[CIS access control] No privacy policy"); permissions.add(permissionDeny); return permissions; } // -- Search data request in the privacy policy /* * ALOGIRTHM * If the requested data is not in the privacy policy: DENY * The requested data is in the privacy policy: * * If this data is private: DENY * * If all requested actions are matching AND if this data is public: PERMIT * * If all requested actions are matching AND if this data is members only: retrieve CIS member list * ** If the requestor is in the CIS member list: PERMIT * ** Otherwise: DENY * * If partial requested actions are matching AND if this data is public: remove these actions and continue * * If partial requested actions are matching AND if this data is members only: if PERMIT with the CIS member list, remove these actions and continue */ List<ICisParticipant> cisMemberList = null; List<Action> actionsDeepCopy = new ArrayList<Action>(); for(int i = 0; i<actions.size(); i++) { actionsDeepCopy.add(ActionUtils.create(actions.get(i).getActionConstant(), actions.get(i).isOptional())); } try { LOG.debug("[CIS access control] Searching: "+dataId.getUri()+" in Cis Privacy Policy: "+RequestPolicyUtils.toXmlString(privacyPolicy)); for(RequestItem request : privacyPolicy.getRequestItems()) { DataIdentifier requestItemId = ResourceUtils.getDataIdentifier(request.getResource()); // - Match data id or data type if (DataIdentifierUtils.isParentOrSameType(requestItemId, dataId)) { List<Action> actionsThatMatch = new ArrayList<Action>(); boolean allRequestedActionsMatch = ActionUtils.contains(actionsDeepCopy, request.getActions(), actionsThatMatch); boolean canBeSharedWith3pServices = ConditionUtils.contains(ConditionConstants.SHARE_WITH_3RD_PARTIES, request.getConditions()); // All requested actions are matching AND if this data is public if (allRequestedActionsMatch && canBeSharedWith3pServices) { LOG.debug("[CIS access control] All requested items are matching (public): PERMIT"); permissions.add(permissionPermit); return permissions; } boolean canBeSharedWithCisMembersOnly = ConditionUtils.contains(ConditionConstants.SHARE_WITH_CIS_MEMBERS_ONLY, request.getConditions()); // Retrieve Cis member list if (null == cisMemberList) { cisMemberList = retrieveCisMemberList(dataId.getOwnerId()); } // All requested actions are matching AND if this data is members only if (allRequestedActionsMatch && canBeSharedWithCisMembersOnly) { LOG.debug("[CIS access control] All requested items are matching (members only): PERMIT if necessary"); // Is it a CIS member? if (isCisMember(cisMemberList, dataId.getOwnerId(), requestor.getRequestorId())) { permissions.add(permissionPermit); return permissions; } permissions.add(permissionDeny); return permissions; } // Requested actions are partially matching AND if this data is public if (actionsThatMatch.size() > 0 && canBeSharedWith3pServices) { LOG.debug("[CIS access control] Some requested items are matching (public)"); actionsDeepCopy.removeAll(actionsThatMatch); continue; } // Requested actions are partially matching AND if this data is members only if (actionsThatMatch.size() > 0 && canBeSharedWithCisMembersOnly) { LOG.debug("[CIS access control] Some requested items are matching (members only)"); // Is it a CIS member? if (isCisMember(cisMemberList, dataId.getOwnerId(), requestor.getRequestorId())) { actionsDeepCopy.removeAll(actionsThatMatch); continue; } permissions.add(permissionDeny); return permissions; } } } } catch(Exception e) { LOG.error("Exception during CIS Data Access control", e); } LOG.debug("[CIS access control] No requested items are matching, or an error appears, or anyway they are privates: always DENY"); permissions.clear(); permissions.add(permissionDeny); return permissions; } public List<ResponseItem> checkPermissionCssData(RequestorBean requestor, List<DataIdentifier> dataIds, List<Action> actions) throws PrivacyException { // Dependency injection if (!isDependencyInjectionDone(4)) { throw new PrivacyException("[Dependency Injection] PrivacyDataManager not ready"); } // -- Retrieve a permission using the PrivacyPreferenceManager List<ResponseItem> permissions = null; try { permissions = privacyPreferenceManager.checkPermission(requestor, dataIds, actions); } catch (Exception e) { LOG.error("Error when retrieving permission from PrivacyPreferenceManager", e); } return permissions; } /** * @param cisMemberList * @param ownerId * @throws PrivacyException */ public boolean isCisMember(List<ICisParticipant> cisMemberList, String cisId, String cssId) throws PrivacyException { if (null != cisMemberList) { for (ICisParticipant cisMember : cisMemberList) { if (cisMember.getMembersJid().equals(cssId)) { return true; } } } return false; } public List<ICisParticipant> retrieveCisMemberList(String cisId) { ICisOwned cis = cisManager.getOwnedCis(cisId); if (null == cis) { return new ArrayList<ICisParticipant>(); } Set<ICisParticipant> cisMemberListIncome = cis.getMemberList(); return new ArrayList<ICisParticipant>(cisMemberListIncome); } /** * Will sort these data ids in two types: CSS or CIS data id * @param dataIds List to sort * @return A map containing two list of data ids max. * One at the key {@link PrivacyDataManager#CSS_ACCESS_CONTROL_TYPE}. * The other at the key {@link PrivacyDataManager#CIS_ACCESS_CONTROL_TYPE}. * NULL is returned if no data id is provided. */ public Map<String, List<DataIdentifier>> sortByAccessControlType(List<DataIdentifier> dataIds) { if (null == dataIds || dataIds.size() <= 0) { return null; } Map<String, List<DataIdentifier>> sorted = new HashMap<String, List<DataIdentifier>>(); // Split in two lists List<DataIdentifier> cssList = new ArrayList<DataIdentifier>(); List<DataIdentifier> cisList = new ArrayList<DataIdentifier>(); for(Iterator<DataIdentifier> it = dataIds.iterator(); it.hasNext();) { DataIdentifier dataId = it.next(); if (isCssAccessControl(dataId)) { cssList.add(dataId); } else { cisList.add(dataId); } } // Store in the map if (cssList.size() > 0) { sorted.put(CSS_ACCESS_CONTROL_TYPE, cssList); } if (cisList.size() > 0) { sorted.put(CIS_ACCESS_CONTROL_TYPE, cisList); } return sorted; } /** * * @param dataId * @return true if this is a CSS access control, false if this is a CIS access control */ public boolean isCssAccessControl(DataIdentifier dataId) { if (null != dataId.getOwnerId()) { // Retrieve Owner IIdentity try { IIdentity ownerId = commManager.getIdManager().fromJid(dataId.getOwnerId()); // Check if the owner IIdentity has a CIS type if (null != ownerId && IdentityType.CIS.equals(ownerId.getType())) { return false; } } catch (InvalidFormatException e) { LOG.error("[From JID Error] IIdentity can not be understand.", e); } } return true; } /* ********************************* * OBFUSCATION * ******************************* */ @Async @Override public Future<DataWrapper> obfuscateData(RequestorBean requestor, DataWrapper dataWrapper) throws PrivacyException { // -- Verify parameters if (null == requestor) { throw new PrivacyException("[Parameters] Not enought information: requestor or owner id is missing"); } if (null == dataWrapper || null == dataWrapper.getData() || null == dataWrapper.getDataType()) { throw new PrivacyException("[Parameters] Not enought information: data missing or data type is missing"); } // Obfuscation disabled if (!isEnabled()) { return new AsyncResult<DataWrapper>(dataWrapper); } // -- Retrieve the obfuscation level DObfPreferenceDetailsBean dataObfuscationPrefDetails = new DObfPreferenceDetailsBean(); dataObfuscationPrefDetails.setResource(ResourceUtils.create(dataWrapper.getScheme(), dataWrapper.getDataType())); dataObfuscationPrefDetails.setRequestor(requestor); double obfuscationLevel = 1.0; try { obfuscationLevel = privacyPreferenceManager.evaluateDObfPreference(dataObfuscationPrefDetails); } catch(Exception e) { LOG.error("[Obfuscation] Can't retrieve obfuscation level from privacy preferences manager", e); return new AsyncResult<DataWrapper>(dataWrapper); } // - Performance loggings doPerformanceLogging(obfuscationLevel); // - If no obfuscation is required: return directly the wrapped data if (obfuscationLevel >= 1) { return new AsyncResult<DataWrapper>(dataWrapper); } // -- Obfuscate the data DataWrapper obfuscatedDataWrapper = dataObfuscationManager.obfuscateData(dataWrapper, obfuscationLevel); return new AsyncResult<DataWrapper>(obfuscatedDataWrapper); } @Async @Override public Future<List<CtxModelObject>> obfuscateData(RequestorBean requestor, List<CtxModelObject> ctxDataList) throws PrivacyException { Map<String, List<CtxModelObject>> obfuscableGroups = DataWrapperFactory.sortByObfuscability(ctxDataList); List<CtxModelObject> obfuscatedCtxDataList = new ArrayList<CtxModelObject>(); Map<String, Future<DataWrapper>> futureResults = new HashMap<String, Future<DataWrapper>>(); // -- Launch obfuscations for (Entry<String, List<CtxModelObject>> group : obfuscableGroups.entrySet()) { // Retrieve relevant wrapper DataWrapper dataWrapper = DataWrapperFactory.getDataWrapper(group.getKey(), group.getValue()); // No possible obfuscation: store CtxModelObject to send them back later if (null == dataWrapper) { obfuscatedCtxDataList.addAll(group.getValue()); continue; } // Launch obfuscation futureResults.put(group.getKey(), obfuscateData(requestor, dataWrapper)); } // -- Retrieve results for (Entry<String, Future<DataWrapper>> group : futureResults.entrySet()) { List<CtxModelObject> originalCtxDataList = obfuscableGroups.get(group.getKey()); try { DataWrapper obfuscateDataWrapper = group.getValue().get(); obfuscatedCtxDataList.addAll(DataWrapperFactory.retrieveData(obfuscateDataWrapper, originalCtxDataList)); } catch (Exception e) { LOG.error("Can't retrieve some obfuscated data: "+group.getKey(), e); obfuscatedCtxDataList.addAll(originalCtxDataList); } } return new AsyncResult<List<CtxModelObject>>(obfuscatedCtxDataList); } @Async private Future<Double> doPerformanceLogging(double obfuscationLevel) { // Counter IPerformanceMessage m = new PerformanceMessage(); m.setSourceComponent(this.getClass()+""); m.setD82TestTableName("S73"); m.setTestContext("Privacyprotection.PrivacyDataManager.Obfuscation.Counter"); m.setOperationType("NumberOfObfuscationDone"); m.setPerformanceType(IPerformanceMessage.Quanitative); m.setPerformanceNameValue((++performanceObfuscationCount)+""); PERF_LOG.trace(m.toString()); // Average obfuscation m.setD82TestTableName("S75"); m.setTestContext("Privacyprotection.PrivacyDataManager.Obfuscation.AverageObfuscationLevel"); m.setOperationType("LogEachObfuscationLevel"); m.setPerformanceType(IPerformanceMessage.Quanitative); m.setPerformanceNameValue(obfuscationLevel+""); PERF_LOG.trace(m.toString()); return new AsyncResult<Double>(obfuscationLevel); } /* ********************************* * Dependency Management * ******************************* */ public void setPrivacyPreferenceManager(IPrivacyPreferenceManager privacyPreferenceManager) { this.privacyPreferenceManager = privacyPreferenceManager; } public void setPrivacyDataManagerInternal(IPrivacyDataManagerInternal privacyDataManagerInternal) { this.privacyDataManagerInternal = privacyDataManagerInternal; } public void setDataObfuscationManager(IDataObfuscationManager dataObfuscationManager) { this.dataObfuscationManager = dataObfuscationManager; } public void setPrivacyPolicyManager(IPrivacyPolicyManager privacyPolicyManager) { this.privacyPolicyManager = privacyPolicyManager; } public void setCommManager(ICommManager commManager) { this.commManager = commManager; } public void setCisManager(ICisManager cisManager) { this.cisManager = cisManager; } public boolean isEnabled() { if (IS_DEVELOPMENT_MODE) return enabled; return true; } /** * To enable / disable the privacy access control layer. * This is for development purpose, and will not be enforced in production mode. * @param enabled */ @Value("${accesscontrol.privacy.enabled:1}") public void setEnabled(boolean enabled) { this.enabled = enabled; } /** * Level 0: all * Level 1: privacyPref, commManager * Level 2: privacyPref, commManager, idManager * Level 3: privacyPref, privacyPol, commManager, cisManager * Level 4: privacyPref */ private boolean isDependencyInjectionDone(int level) { if (null == privacyPreferenceManager) { LOG.error("[Dependency Injection] Missing PrivacyPreferenceManager"); return false; } if (level == 0 || level == 1) { if (null == commManager) { LOG.error("[Dependency Injection] Missing CommManager"); return false; } } if (level == 0 || level == 2) { if (null == commManager) { LOG.error("[Dependency Injection] Missing CommManager"); return false; } if (null == commManager.getIdManager()) { LOG.error("[Dependency Injection] Missing IdManager"); return false; } } if (level == 0 || level == 3) { if (null == privacyPolicyManager) { LOG.error("[Dependency Injection] Missing PrivacyPolicyManager"); return false; } if (null == commManager) { LOG.error("[Dependency Injection] Missing CommManager"); return false; } if (null == cisManager) { LOG.error("[Dependency Injection] Missing CisManager"); return false; } } return true; } }