/**
* 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 org.societies.api.context.model.CtxIdentifier;
import org.societies.api.identity.IIdentity;
import org.societies.api.identity.IdentityType;
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.IDSPreferenceDetailsBean;
import org.societies.api.privacytrust.privacy.model.PrivacyException;
import org.societies.api.schema.identity.RequestorBean;
import org.societies.api.schema.identity.RequestorCisBean;
import org.societies.api.schema.identity.RequestorServiceBean;
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.ids.IDSPrivacyPreferenceTreeModel;
import org.societies.privacytrust.privacyprotection.api.model.privacypreference.ids.IdentitySelectionPreferenceOutcome;
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 IDSPreferenceManager {
private final PrivatePreferenceCache prefCache;
private final PrivateContextCache contextCache;
private ITrustBroker trustBroker;
public IDSPreferenceManager(PrivatePreferenceCache prefCache, PrivateContextCache contextCache, ITrustBroker trustBroker){
this.prefCache = prefCache;
this.contextCache = contextCache;
this.trustBroker = trustBroker;
}
private IIdentity evaluateIDSPreferenceIrrespectiveOfRequestor(IAgreement agreement, List<IIdentity> identities){
ArrayList<IdentitySelectionPreferenceOutcome> outcomes = new ArrayList<IdentitySelectionPreferenceOutcome>();
for (int i=0; i<identities.size(); i++){
IDSPreferenceDetailsBean details = new IDSPreferenceDetailsBean();
details.setAffectedIdentity(identities.get(i).getJid());
IPrivacyPreferenceTreeModel model = prefCache.getIDSPreference(details);
if (model!=null){
IdentitySelectionPreferenceOutcome outcome = (IdentitySelectionPreferenceOutcome) this.evaluatePreference(model.getRootPreference());
if (null!=outcome){
outcomes.add(outcome);
}
}
}
if (outcomes.size()==0){
return null;
}
if (outcomes.size()==1){
return outcomes.get(0).getIdentity();
}
if (outcomes.size()>1){
List<IIdentity> dpiList = new ArrayList<IIdentity>();
for (IdentitySelectionPreferenceOutcome out: outcomes){
dpiList.add(out.getIdentity());
}
return this.askUserToSelectIIdentity(agreement, dpiList);
}
return null;
}
private IIdentity askUserToSelectIIdentity(IAgreement agreement, List<IIdentity> candidateIdentities){
List<String> strCandidateIDs = new ArrayList<String>();
strCandidateIDs.add((new InvalidIdentity()).toString());
for (IIdentity userId : candidateIdentities){
strCandidateIDs.add(userId.toString());
}
String s = "";
if (agreement.getRequestor() instanceof RequestorServiceBean){
s = this.askUserToSelectIdentityForStartingService((RequestorServiceBean) agreement.getRequestor(), strCandidateIDs);
}else if (agreement.getRequestor() instanceof RequestorCisBean){
s = this.askUserToSelectIdentityForJoiningCIS((RequestorCisBean) agreement.getRequestor(), strCandidateIDs);
}
for (IIdentity id : candidateIdentities){
if (s.equalsIgnoreCase(id.toString())){
return id;
}
}
return new InvalidIdentity();
}
private String askUserToSelectIdentityForStartingService(RequestorServiceBean requestor, List<String> strCandidates){
return strCandidates.get(0);
/*return (String) myMessageBox.showInputDialog(
"Select an IIdentity for starting session with service:\n",
"provided by: "+requestor.getRequestorId().toString()+
"\nwith serviceID: "+requestor.getRequestorServiceId().toString(),
JOptionPane.QUESTION_MESSAGE,
strCandidates.toArray(), strCandidates.get(0));*/
}
private String askUserToSelectIdentityForJoiningCIS(RequestorCisBean requestor, List<String> strCandidates){
return strCandidates.get(0);
/* return (String) myMessageBox.showInputDialog(
"Select an IIdentity for joining CIS:\n",
"CIS id: "+requestor.getCisRequestorId().toString()+
"\nadministered by: "+requestor.getRequestorId().toString(),
JOptionPane.QUESTION_MESSAGE,
strCandidates.toArray(), strCandidates.get(0));*/
}
private String askUserToSelectIdentityForInteractingWithCSS(RequestorBean requestor, List<String> strCandidates){
return strCandidates.get(0);
/* return (String) myMessageBox.showInputDialog(
"Select an IIdentity for interacting with CSS:\n",
"CSS id: "+requestor.getRequestorId().toString(),
JOptionPane.QUESTION_MESSAGE,
strCandidates.toArray(), strCandidates.get(0));
*/ }
private IIdentity evaluateIDSPreferenceBasedOnProviderDPI(IAgreement agreement, List<IIdentity> identities){
ArrayList<IdentitySelectionPreferenceOutcome> outcomes = new ArrayList<IdentitySelectionPreferenceOutcome>();
for (int i=0; i<identities.size(); i++){
IDSPreferenceDetailsBean details = new IDSPreferenceDetailsBean();
details.setAffectedIdentity(identities.get(i).getJid());
details.setRequestor(agreement.getRequestor());
IPrivacyPreferenceTreeModel model = prefCache.getIDSPreference(details);
if (model!=null){
IdentitySelectionPreferenceOutcome outcome = (IdentitySelectionPreferenceOutcome) this.evaluatePreference(model.getRootPreference());
if (null!=outcome){
outcomes.add(outcome);
}
}
}
if (outcomes.size()==0){
return null;
}
if (outcomes.size()==1){
return outcomes.get(0).getIdentity();
}
if (outcomes.size()>1){
List<IIdentity> dpiList = new ArrayList<IIdentity>();
for (IdentitySelectionPreferenceOutcome out: outcomes){
dpiList.add(out.getIdentity());
}
return this.askUserToSelectIIdentity(agreement, dpiList);
}
return null;
}
private IIdentity evaluateIDSPreferenceBasedOnAllInfo(IAgreement agreement, List<IIdentity> identities){
ArrayList<IdentitySelectionPreferenceOutcome> outcomes = new ArrayList<IdentitySelectionPreferenceOutcome>();
for (int i=0; i<identities.size(); i++){
IDSPreferenceDetailsBean details = new IDSPreferenceDetailsBean();
details.setAffectedIdentity(identities.get(i).getJid());
details.setRequestor(agreement.getRequestor());
IPrivacyPreferenceTreeModel model = prefCache.getIDSPreference(details);
/* if (model == null){
JOptionPane.showMessageDialog(null, "prefCache returned null model for details:"+details.toString());
}*/
if (model!=null){
IdentitySelectionPreferenceOutcome outcome = (IdentitySelectionPreferenceOutcome) this.evaluatePreference(model.getRootPreference());
if (null!=outcome){
//JOptionPane.showMessageDialog(null, "Evaluation returned non-null outcome");
outcomes.add(outcome);
}
}
}
if (outcomes.size()==0){
//JOptionPane.showMessageDialog(null, "No preference was applicable. returning null dpi");
return null;
}
if (outcomes.size()==1){
//JOptionPane.showMessageDialog(null, "ONE preference was applicable. returning dpi:"+outcomes.get(0).getIIdentity());
return outcomes.get(0).getIdentity();
}
if (outcomes.size()>1){
//JOptionPane.showMessageDialog(null, "MULTIPLE preferences were applicable. asking the user");
List<IIdentity> dpiList = new ArrayList<IIdentity>();
for (IdentitySelectionPreferenceOutcome out: outcomes){
dpiList.add(out.getIdentity());
}
return this.askUserToSelectIIdentity(agreement, dpiList);
}
return null;
}
private IPrivacyOutcome evaluatePreference(IPrivacyPreference privPref){
PreferenceEvaluator ppE = new PreferenceEvaluator(this.contextCache, trustBroker);
Hashtable<IPrivacyOutcome, List<CtxIdentifier>> results = ppE.evaluatePreference(privPref);
Enumeration<IPrivacyOutcome> outcomes = results.keys();
if (outcomes.hasMoreElements()){
return outcomes.nextElement();
}
return null;
}
public IIdentity evaluateIDSPreference(IDSPreferenceDetailsBean details) {
IDSPrivacyPreferenceTreeModel model = this.prefCache.getIDSPreference(details);
IPrivacyOutcome out = this.evaluatePreference(model.getRootPreference());
if (out instanceof IdentitySelectionPreferenceOutcome){
return ((IdentitySelectionPreferenceOutcome) out).getIdentity();
}
return null;
}
public IIdentity evaluateIDSPreference(RequestorBean requestor){
List<IDSPreferenceDetailsBean> details = this.prefCache.getIDSPreferenceDetails();
List<IIdentity> identities = new ArrayList<IIdentity>();
for (IDSPreferenceDetailsBean detail : details){
if (detail.getRequestor().equals(requestor)){
identities.add(this.evaluateIDSPreference(detail));
}
}
if (identities.size()==0){
return null;
}
if (identities.size()==1){
return identities.get(0);
}
List<String> strCandidateIDs = new ArrayList<String>();
strCandidateIDs.add((new InvalidIdentity()).toString());
for (IIdentity userId : identities){
strCandidateIDs.add(userId.toString());
}
String createNew = "Create new Identity";
strCandidateIDs.add(createNew);
String s = "";
if (requestor instanceof RequestorServiceBean){
s = this.askUserToSelectIdentityForStartingService((RequestorServiceBean) requestor, strCandidateIDs);
}else if (requestor instanceof RequestorCisBean){
s = this.askUserToSelectIdentityForJoiningCIS((RequestorCisBean) requestor, strCandidateIDs);
}else{
s = this.askUserToSelectIdentityForInteractingWithCSS(requestor, strCandidateIDs);
}
for (IIdentity id : identities){
if (s.equalsIgnoreCase(id.toString())){
return id;
}
}
return new InvalidIdentity();
}
public IIdentity evaluateIDSPreferences(IAgreement agreement, List<IIdentity> identities){
IIdentity selectedIIdentity = this.evaluateIDSPreferenceBasedOnAllInfo(agreement, identities);
if (selectedIIdentity==null){
selectedIIdentity = this.evaluateIDSPreferenceBasedOnProviderDPI(agreement, identities);
if (selectedIIdentity == null){
selectedIIdentity = this.evaluateIDSPreferenceIrrespectiveOfRequestor(agreement, identities);
if (selectedIIdentity == null){
return null;
}else if (selectedIIdentity instanceof InvalidIdentity){
//user wants to use a new identity
return null;
}else{
return selectedIIdentity;
}
}else if (selectedIIdentity instanceof InvalidIdentity){
//user wants to use a new identity
return null;
}else{
return selectedIIdentity;
}
}else if (selectedIIdentity instanceof InvalidIdentity){
//user wants to use a new identity
return null;
}else{
return selectedIIdentity;
}
}
public void addIDSDecision(RequestorBean requestor, String selectedIdentity) {
IDSPreferenceDetailsBean details = new IDSPreferenceDetailsBean();
details.setAffectedIdentity(selectedIdentity);
details.setRequestor(requestor);
IPrivacyPreferenceTreeModel model = this.getIDSPreference(details);
}
private class InvalidIdentity implements IIdentity{
public InvalidIdentity(){
}
@Override
public String getJid() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getBareJid() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getDomain() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getIdentifier() {
// TODO Auto-generated method stub
return null;
}
@Override
public IdentityType getType() {
// TODO Auto-generated method stub
return null;
}
}
/**
* new methods;
*/
public boolean deleteIDSPreference(IDSPreferenceDetailsBean details) {
return this.prefCache.removeIDSPreference(details);
}
public IDSPrivacyPreferenceTreeModel getIDSPreference(
IDSPreferenceDetailsBean details) {
return this.prefCache.getIDSPreference(details);
}
public List<IDSPreferenceDetailsBean> getIDSPreferenceDetails() {
return this.prefCache.getIDSPreferenceDetails();
}
public boolean storeIDSPreference(IDSPreferenceDetailsBean details,
IDSPrivacyPreferenceTreeModel model) throws PrivacyException {
if (model.getDetails().equals(details)){
return this.prefCache.addIDSPreference(details, model);
}
throw new PrivacyException("IDSPreferenceDetailsBean parameter did not match IDSPrivacyPreferenceTreeModel.getDetails()");
}
}