//* Licensed Materials - Property of *
//* IBM *
//* Miracle A/S *
//* Alexandra Instituttet A/S *
//* *
//* eu.abc4trust.pabce.1.34 *
//* *
//* (C) Copyright IBM Corp. 2014. All Rights Reserved. *
//* (C) Copyright Miracle A/S, Denmark. 2014. All Rights Reserved. *
//* (C) Copyright Alexandra Instituttet A/S, Denmark. 2014. All *
//* Rights Reserved. *
//* US Government Users Restricted Rights - Use, duplication or *
//* disclosure restricted by GSA ADP Schedule Contract with IBM Corp. *
//* *
//* This file is licensed under the Apache License, Version 2.0 (the *
//* "License"); you may not use this file except in compliance with *
//* the License. You may obtain a copy of the License at: *
//* http://www.apache.org/licenses/LICENSE-2.0 *
//* Unless required by applicable law or agreed to in writing, *
//* software distributed under the License is distributed on an *
//* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY *
//* KIND, either express or implied. See the License for the *
//* specific language governing permissions and limitations *
//* under the License. *
//*/**/****************************************************************
package eu.abc4trust.ri.servicehelper.user;
import java.net.URI;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;
import com.google.inject.Inject;
import eu.abc4trust.returnTypes.SitdReturn;
import eu.abc4trust.returnTypes.SptdReturn;
import eu.abc4trust.ui.idSelection.IdentitySelection;
import eu.abc4trust.xml.Attribute;
import eu.abc4trust.xml.CandidatePresentationToken;
import eu.abc4trust.xml.CandidatePresentationTokenList;
import eu.abc4trust.xml.CredentialDescription;
import eu.abc4trust.xml.CredentialDescriptions;
import eu.abc4trust.xml.CredentialDescriptionsEntry;
import eu.abc4trust.xml.CredentialUidList;
import eu.abc4trust.xml.InspectorChoiceList;
import eu.abc4trust.xml.InspectorDescription;
import eu.abc4trust.xml.InspectorDescriptions;
import eu.abc4trust.xml.InspectorDescriptionsEntry;
import eu.abc4trust.xml.IssuanceTokenDescription;
import eu.abc4trust.xml.Metadata;
import eu.abc4trust.xml.ObjectFactory;
import eu.abc4trust.xml.PolicyDescription;
import eu.abc4trust.xml.PolicyDescriptions;
import eu.abc4trust.xml.PolicyDescriptionsEntry;
import eu.abc4trust.xml.PresentationTokenDescription;
import eu.abc4trust.xml.PseudonymChoiceList;
import eu.abc4trust.xml.PseudonymDescription;
import eu.abc4trust.xml.PseudonymDescriptionValue;
import eu.abc4trust.xml.PseudonymDescriptions;
import eu.abc4trust.xml.PseudonymDescriptionsEntry;
import eu.abc4trust.xml.PseudonymMetadata;
import eu.abc4trust.xml.SelectIssuanceTokenDescription;
import eu.abc4trust.xml.SelectPresentationTokenDescription;
import eu.abc4trust.xml.Token;
import eu.abc4trust.xml.URISet;
import eu.abc4trust.xml.util.XmlUtils;
public class JSonIdentitySelection implements IdentitySelection {
public SelectPresentationTokenDescription selectPresentationTokenDescription;
// public SelectPresentationTokenDescriptionReturn selectPresentationTokenDescriptionReturn;
public SelectIssuanceTokenDescription selectIssuanceTokenDescription;
// public SelectIssuanceTokenDescriptionReturn selectIssuanceTokenDescriptionReturn;
@Inject
public JSonIdentitySelection() {
// TODO Auto-generated method stub
System.out.println("*** JSON identity selection *** DO NOT USE IN PRODUCTION ***");
}
private PolicyDescriptions createPolicyDescriptions(Map<URI, PolicyDescription> policies) {
PolicyDescriptions pd = new PolicyDescriptions();
for(URI key : policies.keySet()) {
PolicyDescriptionsEntry entry = new PolicyDescriptionsEntry();
entry.setKey(key);
entry.setValue(policies.get(key));
pd.getEntry().add(entry);
}
return pd;
}
private CredentialDescriptions createCredentialDescriptions(Map<URI, CredentialDescription> policies) {
CredentialDescriptions cd = new CredentialDescriptions();
for(URI key : policies.keySet()) {
CredentialDescriptionsEntry entry = new CredentialDescriptionsEntry();
entry.setKey(key);
entry.setValue(policies.get(key));
cd.getEntry().add(entry);
}
return cd;
}
private PseudonymDescriptions createPseudonymDescriptions(Map<URI, PseudonymDescription> policies) {
PseudonymDescriptions pd = new PseudonymDescriptions();
for(URI key : policies.keySet()) {
PseudonymDescriptionValue value = new PseudonymDescriptionValue();
value.setPseudonymDescription(policies.get(key));
PseudonymDescriptionsEntry entry = new PseudonymDescriptionsEntry();
entry.setKey(key);
entry.setValue(value);
pd.getEntry().add(entry);
}
return pd;
}
private InspectorDescriptions createInspectorDescriptions(Map<URI, InspectorDescription> policies) {
InspectorDescriptions id = new InspectorDescriptions();
for(URI key : policies.keySet()) {
InspectorDescriptionsEntry entry = new InspectorDescriptionsEntry();
entry.setKey(key);
entry.setValue(policies.get(key));
id.getEntry().add(entry);
}
return id;
}
@Override
public SptdReturn selectPresentationTokenDescription(
Map<URI, PolicyDescription> policies,
Map<URI, CredentialDescription> credentialDescriptions,
Map<URI, PseudonymDescription> pseudonyms,
Map<URI, InspectorDescription> inspectors,
List<PresentationTokenDescription> tokens,
List<List<URI>> credentialUids,
List<Set<List<URI>>> pseudonymChoice,
List<List<Set<URI>>> inspectorChoice) {
System.out.println("### selectPresentationTokenDescription");
System.out.println("*** - policies : " + policies.size());
System.out.println("*** - credentialDescriptions : " + credentialDescriptions.size());
System.out.println("*** - pseudonyms : " + pseudonyms.size());
System.out.println("*** - inspectors : " + inspectors.size());
System.out.println("### - tokens : " + tokens.size());
System.out.println("*** - credentialUids : " + credentialUids.size());
System.out.println("*** - pseudonymChoice : " + pseudonymChoice.size());
System.out.println("*** - inspectorChoice : " + inspectorChoice.size());
try {
this.selectPresentationTokenDescription = new SelectPresentationTokenDescription();
// selectPresentationTokenDescription.setPolicyDescriptions(createPolicyDescriptions(policies));
// selectPresentationTokenDescription.setCredentialDescriptions(createCredentialDescriptions(credentialDescriptions));
// selectPresentationTokenDescription.setPseudonymDescriptions(createPseudonymDescriptions(pseudonyms));
// selectPresentationTokenDescription.setInspectorDescriptions(createInspectorDescriptions(inspectors));
this.selectPresentationTokenDescription.setPolicyDescriptions(this.createPolicyDescriptions(policies));
this.selectPresentationTokenDescription.setCredentialDescriptions(this.createCredentialDescriptions(credentialDescriptions));
this.selectPresentationTokenDescription.setPseudonymDescriptions(this.createPseudonymDescriptions(pseudonyms));
this.selectPresentationTokenDescription.setInspectorDescriptions(this.createInspectorDescriptions(inspectors));
CandidatePresentationTokenList cptl = new CandidatePresentationTokenList();
this.selectPresentationTokenDescription.setCandidatePresentationTokenList(cptl);
int ix = 0;
for (PresentationTokenDescription token : tokens) {
CandidatePresentationToken candidatePresentationToken = new CandidatePresentationToken();
Token td = new Token();
td.setPolicyUID(token.getPolicyUID());
td.setTokenUID(token.getTokenUID());
candidatePresentationToken.setToken(td );
PolicyDescription policy = policies.get(token.getPolicyUID());
candidatePresentationToken.getFriendlyTokenDescription().addAll(policy.getMessage().getFriendlyPolicyDescription());
CredentialUidList cul = new CredentialUidList();
cul.getCredentialUid().addAll(credentialUids.get(ix));
candidatePresentationToken.setCredentialUidList(cul);
candidatePresentationToken.setPseudonymChoiceList(this.createPseudonymChoiceList(pseudonymChoice.get(ix)));
candidatePresentationToken.setInspectorChoiceList(this.createInspectorChoiceList(inspectorChoice.get(ix)));
cptl.getCandidatePresentationToken().add(candidatePresentationToken);
ix++;
}
} catch (Exception e) {
System.err.println("FAILED TO CREAT JSON");
e.printStackTrace();
}
int chosenPolicyNumber = 0;
// Map<URI, PseudonymMetadata> metadataToChange = new HashMap<URI, PseudonymMetadata>();
List<URI> chosenPseudonyms = new ArrayList<URI>();
// TreeSet<List<URI>> orderedSet = new TreeSet<List<URI>>();
Set<List<URI>> chosenPseudonym = pseudonymChoice.get(chosenPolicyNumber);
// orderedSet.addAll(chosenPseudonym);
if(chosenPseudonym.iterator().hasNext()) {
chosenPseudonyms = chosenPseudonym.iterator().next(); // orderedSet.first();
}
System.out.println("### : chosen pseudonyms " + chosenPseudonyms);
List<URI> chosenInspectors = new ArrayList<URI>();
if (chosenInspectors.isEmpty()) {
for (List<Set<URI>> uris : inspectorChoice) {
for (Set<URI> uriset : uris) {
// System.out.println("adding: " + uriset);
chosenInspectors.addAll(uriset);
}
}
}
// From Janus' PolicySelector
Map<URI, PseudonymMetadata> metadataToChange = new HashMap<URI, PseudonymMetadata>();
// List<URI> chosenPseudonyms = new LinkedList<URI>();
//
for (Set<List<URI>> urisetlist : pseudonymChoice) {
for(List<URI> urilist : urisetlist) {
for(URI pseudonymUri : urilist) {
PseudonymDescription pseudonymDescription = pseudonyms.get(pseudonymUri);
PseudonymMetadata pseudonymMetadata = pseudonymDescription.getPseudonymMetadata();
// PseudonymMetadata pseudonymMetadata = new PseudonymMetadata();
pseudonymMetadata.setHumanReadableData("My HumanReadableData - Will Be Removed (according to comment in schema)");
Metadata metadata = new Metadata();
pseudonymMetadata.setMetadata(metadata);
metadataToChange.put(pseudonymUri, pseudonymMetadata);
}
}
}
// selectPresentationTokenDescriptionReturn = new SelectPresentationTokenDescriptionReturn();
// selectPresentationTokenDescriptionReturn.chosenPresentationToken = chosenPresentationToken;
// selectPresentationTokenDescriptionReturn.metadataToChange = metadataToChange;
// selectPresentationTokenDescriptionReturn.chosenPseudonyms = chosenPseudonyms;
// selectPresentationTokenDescriptionReturn.chosenInspectors = chosenInspectors;
return new SptdReturn(chosenPolicyNumber, metadataToChange, chosenPseudonyms,
chosenInspectors);
}
private InspectorChoiceList createInspectorChoiceList(List<Set<URI>> list) {
InspectorChoiceList icl = new InspectorChoiceList();
for(Set<URI> set : list) {
URISet uriSet = new URISet();
uriSet.getURI().addAll(Arrays.asList(set.toArray(new URI[0])));
icl.getURISet().add(uriSet);
}
return icl;
}
private PseudonymChoiceList createPseudonymChoiceList(Set<List<URI>> set) {
PseudonymChoiceList pcl = new PseudonymChoiceList();
Iterator<List<URI>> iterator = set.iterator();
while(iterator.hasNext()) {
URISet uriSet = new URISet();
uriSet.getURI().addAll(iterator.next());
pcl.getURISet().add(uriSet);
}
return pcl;
}
// TODO: remove dead code?
@SuppressWarnings("unused")
private List<HashSet<URI>> convertToHashSet(List<Set<URI>> list) {
System.out.println("convertToHashSet " + list);
if (list == null) {
System.out.println("- null");
return null;
}
List<HashSet<URI>> copiedList = new ArrayList<HashSet<URI>>();
for (Set<URI> set : list) {
HashSet<URI> new_set = new HashSet<URI>(set);
copiedList.add(new_set);
}
return copiedList;
}
@Override
public SitdReturn selectIssuanceTokenDescription(
Map<URI, PolicyDescription> policies,
Map<URI, CredentialDescription> credentialDescriptions,
Map<URI, PseudonymDescription> pseudonyms,
Map<URI, InspectorDescription> inspectors,
List<IssuanceTokenDescription> tokens,
List<List<URI>> credentialUids,
List<Attribute> selfClaimedAttributes,
List<Set<List<URI>>> pseudonymChoice,
List<List<Set<URI>>> inspectorChoice) {
System.out.println("=== selectIssuanceTokenDescription");
System.out.println("*** - policies : " + policies.size());
System.out.println("*** - credentialDescriptions : " + credentialDescriptions.size());
System.out.println("*** - pseudonyms : " + pseudonyms.size());
System.out.println("*** - inspectors : " + inspectors.size());
System.out.println("### - tokens : " + tokens.size());
System.out.println("*** - credentialUids : " + credentialUids.size());
System.out.println("*** - selfClaimedAttributes : " + selfClaimedAttributes.size());
System.out.println("*** - pseudonymChoice : " + pseudonymChoice.size());
System.out.println("*** - inspectorChoice : " + inspectorChoice.size());
try {
this.selectIssuanceTokenDescription = new SelectIssuanceTokenDescription();
this.selectIssuanceTokenDescription.setPolicyDescriptions(this.createPolicyDescriptions(policies));
this.selectIssuanceTokenDescription.setCredentialDescriptions(this.createCredentialDescriptions(credentialDescriptions));
this.selectIssuanceTokenDescription.setPseudonymDescriptions(this.createPseudonymDescriptions(pseudonyms));
this.selectIssuanceTokenDescription.setInspectorDescriptions(this.createInspectorDescriptions(inspectors));
// selectIssuanceTokenDescription.credentialDescriptions = credentialDescriptions;
// // TODO(enr): Fix pseudonyms, inspectors and policies
// // selectIssuanceTokenDescription.pseudonyms = pseudonyms;
// selectIssuanceTokenDescription.selfClaimedAttributes.attributes = selfClaimedAttributes;
// int ix = 0;
// for (IssuanceTokenDescription token : tokens) {
// CandidateIssuanceToken candidateIssuanceToken = new CandidateIssuanceToken();
// candidateIssuanceToken.token = token;
// candidateIssuanceToken.credentialUids.credentialUids = credentialUids.get(ix);
// // TODO(enr): Fix this
// // candidateIssuanceToken.pseudonymChoice.pseudonymChoice =
// // convertToHashSet(pseudonymChoice.get(ix));
// // candidateIssuanceToken.inspectorChoice.inspectorChoice =
// // convertToHashSet(inspectorChoice.get(ix));
//
// selectIssuanceTokenDescription.candidateIssuanceTokenList.list
// .add(candidateIssuanceToken);
// ix++;
// }
String xml =
XmlUtils.toXml(new ObjectFactory()
.createSelectIssuanceTokenDescription(this.selectIssuanceTokenDescription), false);
System.out.println("selectIssuanceTokenDescription : XML : " + xml);
} catch (Exception e) {
System.err.println("FAILED TO CREAT JSON");
e.printStackTrace();
}
// Choose always the first choice among all the alternatives
int chosenIssuanceToken = 0;
Map<URI, PseudonymMetadata> metadataToChange = new HashMap<URI, PseudonymMetadata>();
List<URI> chosenPseudonyms = new ArrayList<URI>();
// TODO(enr): Fix this
/*
* for (Set<URI> ps : pseudonymChoice.get(chosenIssuanceToken)) { // Note: the code below
* guarantees that we chose the first pseudonym alphabetically // for repeatability (HashSet
* don't guarantee any order). TreeSet<URI> orderedSet = new TreeSet<URI>();
* orderedSet.addAll(ps); URI first = orderedSet.first(); chosenPseudonyms.add(first);
* metadataToChange.put(first, new PseudonymMetadata()); }
*/
List<URI> chosenInspectors = new ArrayList<URI>();
for (Set<URI> is : inspectorChoice.get(chosenIssuanceToken)) {
// Note: the code below guarantees that we chose the first inspector alphabetically
// for repeatability (HashSet don't guarantee any order).
TreeSet<URI> orderedSet = new TreeSet<URI>();
orderedSet.addAll(is);
chosenInspectors.add(orderedSet.first());
}
List<Object> chosenAttributeValues = new ArrayList<Object>();
for (Attribute a : selfClaimedAttributes) {
chosenAttributeValues.add(a.getAttributeValue());
}
// selectIssuanceTokenDescriptionReturn = new SelectIssuanceTokenDescriptionReturn();
// selectIssuanceTokenDescriptionReturn.chosenIssuanceToken = chosenIssuanceToken;
// selectIssuanceTokenDescriptionReturn.metadataToChange = metadataToChange;
// selectIssuanceTokenDescriptionReturn.chosenPseudonyms = chosenPseudonyms;
// selectIssuanceTokenDescriptionReturn.chosenInspectors = chosenInspectors;
// selectIssuanceTokenDescriptionReturn.chosenAttributeValues = chosenAttributeValues;
return new SitdReturn(chosenIssuanceToken, metadataToChange, chosenPseudonyms,
chosenInspectors, chosenAttributeValues);
}
}