//* Licensed Materials - Property of *
//* IBM *
//* *
//* eu.abc4trust.pabce.1.34 *
//* *
//* (C) Copyright IBM Corp. 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.ui.idSelection;
import java.net.URI;
import java.util.ArrayList;
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 com.google.inject.Inject;
import eu.abc4trust.returnTypes.SitdReturn;
import eu.abc4trust.returnTypes.SptdReturn;
import eu.abc4trust.returnTypes.UiIssuanceArguments;
import eu.abc4trust.returnTypes.UiIssuanceReturn;
import eu.abc4trust.returnTypes.UiPresentationArguments;
import eu.abc4trust.returnTypes.UiPresentationReturn;
import eu.abc4trust.returnTypes.ui.CredentialInUi;
import eu.abc4trust.returnTypes.ui.InspectableAttribute;
import eu.abc4trust.returnTypes.ui.InspectorInUi;
import eu.abc4trust.returnTypes.ui.PseudonymInUi;
import eu.abc4trust.returnTypes.ui.PseudonymListCandidate;
import eu.abc4trust.returnTypes.ui.TokenCandidate;
import eu.abc4trust.returnTypes.ui.TokenCandidatePerPolicy;
import eu.abc4trust.xml.Attribute;
import eu.abc4trust.xml.CredentialDescription;
import eu.abc4trust.xml.FriendlyDescription;
import eu.abc4trust.xml.InspectorDescription;
import eu.abc4trust.xml.IssuanceTokenDescription;
import eu.abc4trust.xml.PolicyDescription;
import eu.abc4trust.xml.PresentationTokenDescription;
import eu.abc4trust.xml.PseudonymDescription;
import eu.abc4trust.xml.PseudonymMetadata;
public class IdentitySelectionUiConverter implements IdentitySelectionUi {
private final IdentitySelection is;
@Inject
public IdentitySelectionUiConverter(IdentitySelection is) {
this.is = is;
}
@Override
public UiPresentationReturn selectPresentationTokenDescription(UiPresentationArguments args) {
SptdReturn ret;
{
Map<URI, PolicyDescription> policies = new HashMap<URI, PolicyDescription>();
for(TokenCandidatePerPolicy p: args.tokenCandidatesPerPolicy) {
URI key = p.policy.getPolicyUID();
PolicyDescription pd = new PolicyDescription();
pd.setPolicyUID(key);
pd.setMessage(p.policy.getMessage());
policies.put(key, pd);
}
Map<URI, CredentialDescription> credentialDescriptions = new HashMap<URI, CredentialDescription>();
for(CredentialInUi cd: args.data.credentials) {
URI key = cd.desc.getCredentialUID();
credentialDescriptions.put(key, cd.desc);
}
Map<URI, PseudonymDescription> pseudonyms = new HashMap<URI, PseudonymDescription>();
for(PseudonymInUi p: args.data.pseudonyms) {
URI key = p.pseudonym.getPseudonymUID();
PseudonymDescription psd = new PseudonymDescription();
psd.setExclusive(p.pseudonym.isExclusive());
psd.setPseudonymMetadata(p.metadata);
psd.setPseudonymUID(key);
psd.setScope(p.pseudonym.getScope());
pseudonyms.put(key, psd);
}
Map<URI, InspectorDescription> inspectors = new HashMap<URI, InspectorDescription>();
for(InspectorInUi i: args.data.inspectors) {
URI key = URI.create(i.uri);
InspectorDescription id = new InspectorDescription();
id.setInspectorUID(key);
for(FriendlyDescription fd: i.description) {
id.getFriendlyInspectorDescription().add(fd);
}
inspectors.put(key, id);
}
List<PresentationTokenDescription> tokens = new ArrayList<PresentationTokenDescription>();
List<List<URI>> credentialUids = new ArrayList<List<URI>>();
List<Set<List<URI>>> pseudonymChoice = new ArrayList<Set<List<URI>>>();
List<List<Set<URI>>> inspectorChoice = new ArrayList<List<Set<URI>>>();
for(TokenCandidatePerPolicy p: args.tokenCandidatesPerPolicy) {
for(TokenCandidate c: p.tokenCandidates) {
List<URI> credentialList = new ArrayList<URI>();
Set<List<URI> > pseudonymSet = new HashSet<List<URI>>();
List<Set<URI> > inspectorList = new ArrayList<Set<URI>>();
for(CredentialInUi ciu: c.credentials) {
credentialList.add(ciu.desc.getCredentialUID());
}
for(PseudonymListCandidate plc: c.pseudonymCandidates) {
List<URI> psList = new ArrayList<URI>();
for(PseudonymInUi piu: plc.pseudonyms) {
psList.add(piu.pseudonym.getPseudonymUID());
}
pseudonymSet.add(psList);
}
for(InspectableAttribute ia: c.inspectableAttributes) {
Set<URI> ins = new HashSet<URI>();
for(InspectorInUi iiu: ia.inspectorAlternatives) {
ins.add(URI.create(iiu.uri));
}
inspectorList.add(ins);
}
tokens.add(c.tokenDescription);
credentialUids.add(credentialList);
pseudonymChoice.add(pseudonymSet);
inspectorChoice.add(inspectorList);
}
}
ret = is.selectPresentationTokenDescription(policies, credentialDescriptions,
pseudonyms, inspectors, tokens, credentialUids, pseudonymChoice, inspectorChoice);
}
{
int i = ret.chosenPresentationToken;
int policy = 0;
int token = 0;
for(TokenCandidatePerPolicy tc: args.tokenCandidatesPerPolicy) {
if(i >= tc.tokenCandidates.size()) {
i -= tc.tokenCandidates.size();
policy++;
} else {
token = i;
break;
}
}
int chosenPsNymList = 0;
for(PseudonymListCandidate plc: args.tokenCandidatesPerPolicy.get(policy).tokenCandidates.get(token).pseudonymCandidates) {
if(isEqual(plc, ret.chosenPseudonyms)) {
chosenPsNymList = plc.candidateId;
break;
}
}
Map<String, PseudonymMetadata> mtc = new HashMap<String, PseudonymMetadata>();
for(URI key: ret.metadataToChange.keySet()) {
String s = key.toString();
mtc.put(s, ret.metadataToChange.get(key));
}
List<String> ci = new ArrayList<String>();
for(URI key: ret.chosenInspectors) {
ci.add(key.toString());
}
return new UiPresentationReturn(args.uiContext, policy, token, mtc, chosenPsNymList, ci);
}
}
private boolean isEqual(PseudonymListCandidate plc, List<URI> chosenPseudonyms) {
Iterator<PseudonymInUi> plci = plc.pseudonyms.iterator();
for(URI u: chosenPseudonyms) {
String s = plci.next().uri;
if(! u.toString().equals(s)) {
return false;
}
}
return true;
}
@Override
public UiIssuanceReturn selectIssuanceTokenDescription(UiIssuanceArguments args) {
//TODO(enr): fill out
SitdReturn ret;
{
//List<Attribute> selfClaimedAttributes = args.selfClaimedAttributes;
List<Attribute> selfClaimedAttributes = new ArrayList<Attribute>();
Map<URI, PolicyDescription> policies = new HashMap<URI, PolicyDescription>();
{
URI key = args.policy.getPresentationPolicy().getPolicyUID();
PolicyDescription pd = new PolicyDescription();
pd.setPolicyUID(key);
pd.setMessage(args.policy.getPresentationPolicy().getMessage());
policies.put(key, pd);
}
Map<URI, CredentialDescription> credentialDescriptions = new HashMap<URI, CredentialDescription>();
for(CredentialInUi cd: args.data.credentials) {
URI key = cd.desc.getCredentialUID();
credentialDescriptions.put(key, cd.desc);
}
Map<URI, PseudonymDescription> pseudonyms = new HashMap<URI, PseudonymDescription>();
for(PseudonymInUi p: args.data.pseudonyms) {
URI key = p.pseudonym.getPseudonymUID();
PseudonymDescription psd = new PseudonymDescription();
psd.setExclusive(p.pseudonym.isExclusive());
psd.setPseudonymMetadata(p.metadata);
psd.setPseudonymUID(key);
psd.setScope(p.pseudonym.getScope());
pseudonyms.put(key, psd);
}
Map<URI, InspectorDescription> inspectors = new HashMap<URI, InspectorDescription>();
for(InspectorInUi i: args.data.inspectors) {
URI key = URI.create(i.uri);
InspectorDescription id = new InspectorDescription();
id.setInspectorUID(key);
for(FriendlyDescription fd: i.description) {
id.getFriendlyInspectorDescription().add(fd);
}
inspectors.put(key, id);
}
List<IssuanceTokenDescription> tokens = new ArrayList<IssuanceTokenDescription>();
List<List<URI>> credentialUids = new ArrayList<List<URI>>();
List<Set<List<URI>>> pseudonymChoice = new ArrayList<Set<List<URI>>>();
List<List<Set<URI>>> inspectorChoice = new ArrayList<List<Set<URI>>>();
{
for(TokenCandidate c: args.tokenCandidates) {
List<URI> credentialList = new ArrayList<URI>();
Set<List<URI> > pseudonymSet = new HashSet<List<URI>>();
List<Set<URI> > inspectorList = new ArrayList<Set<URI>>();
for(CredentialInUi ciu: c.credentials) {
credentialList.add(ciu.desc.getCredentialUID());
}
for(PseudonymListCandidate plc: c.pseudonymCandidates) {
List<URI> psList = new ArrayList<URI>();
for(PseudonymInUi piu: plc.pseudonyms) {
psList.add(piu.pseudonym.getPseudonymUID());
}
pseudonymSet.add(psList);
}
for(InspectableAttribute ia: c.inspectableAttributes) {
Set<URI> ins = new HashSet<URI>();
for(InspectorInUi iiu: ia.inspectorAlternatives) {
ins.add(URI.create(iiu.uri));
}
inspectorList.add(ins);
}
IssuanceTokenDescription itd = new IssuanceTokenDescription();
itd.setCredentialTemplate(args.policy.getCredentialTemplate());
itd.setPresentationTokenDescription(c.tokenDescription);
tokens.add(itd);
credentialUids.add(credentialList);
pseudonymChoice.add(pseudonymSet);
inspectorChoice.add(inspectorList);
}
}
ret = is.selectIssuanceTokenDescription(policies, credentialDescriptions, pseudonyms,
inspectors, tokens, credentialUids, selfClaimedAttributes, pseudonymChoice, inspectorChoice);
}
{
int token = ret.chosenIssuanceToken;
int chosenPsNymList = 0;
for(PseudonymListCandidate plc: args.tokenCandidates.get(token).pseudonymCandidates) {
if(isEqual(plc, ret.chosenPseudonyms)) {
chosenPsNymList = plc.candidateId;
break;
}
}
Map<String, PseudonymMetadata> mtc = new HashMap<String, PseudonymMetadata>();
for(URI key: ret.metadataToChange.keySet()) {
String s = key.toString();
mtc.put(s, ret.metadataToChange.get(key));
}
List<String> ci = new ArrayList<String>();
for(URI key: ret.chosenInspectors) {
ci.add(key.toString());
}
return new UiIssuanceReturn(args.uiContext, token, mtc, chosenPsNymList, ci/*, ret.chosenAttributeValues*/);
}
}
}