cc89faa9ee9d3758c42b1d2535b4b77a0c3a68e5
[aaa.git] / aaa-shiro / impl / src / main / java / org / opendaylight / aaa / impl / shiro / tokenauthrealm / auth / ClaimBuilder.java
1 /*
2  * Copyright (c) 2014, 2017 Hewlett-Packard Development Company, L.P. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.aaa.impl.shiro.tokenauthrealm.auth;
9
10 import static org.opendaylight.aaa.impl.shiro.tokenauthrealm.util.EqualUtil.areEqual;
11 import static org.opendaylight.aaa.impl.shiro.tokenauthrealm.util.HashCodeUtil.hash;
12
13 import com.google.common.base.Strings;
14 import com.google.common.collect.ImmutableSet;
15 import java.io.Serializable;
16 import java.util.LinkedHashSet;
17 import java.util.Set;
18 import org.opendaylight.aaa.api.Claim;
19 import org.opendaylight.aaa.impl.shiro.tokenauthrealm.util.HashCodeUtil;
20
21 /**
22  * Builder for a {@link Claim}. The userId, user, and roles information is
23  * mandatory.
24  *
25  * @author liemmn
26  */
27 public class ClaimBuilder {
28     private String userId = "";
29     private String user = "";
30     private final Set<String> roles = new LinkedHashSet<>();
31     private String clientId = "";
32     private String domain = "";
33
34     public ClaimBuilder() {
35     }
36
37     public ClaimBuilder(Claim claim) {
38         clientId = claim.clientId();
39         userId = claim.userId();
40         user = claim.user();
41         domain = claim.domain();
42         roles.addAll(claim.roles());
43     }
44
45     public ClaimBuilder setClientId(String clientId) {
46         this.clientId = Strings.nullToEmpty(clientId).trim();
47         return this;
48     }
49
50     public ClaimBuilder setUserId(String userId) {
51         this.userId = Strings.nullToEmpty(userId).trim();
52         return this;
53     }
54
55     public ClaimBuilder setUser(String userName) {
56         user = Strings.nullToEmpty(userName).trim();
57         return this;
58     }
59
60     public ClaimBuilder setDomain(String domain) {
61         this.domain = Strings.nullToEmpty(domain).trim();
62         return this;
63     }
64
65     public ClaimBuilder addRoles(Set<String> roles) {
66         for (String role : roles) {
67             addRole(role);
68         }
69         return this;
70     }
71
72     public ClaimBuilder addRole(String role) {
73         roles.add(Strings.nullToEmpty(role).trim());
74         return this;
75     }
76
77     public Claim build() {
78         return new ImmutableClaim(this);
79     }
80
81     protected static class ImmutableClaim implements Claim, Serializable {
82         private static final long serialVersionUID = -8115027645190209129L;
83         private int hashCode = 0;
84         protected String clientId;
85         protected String userId;
86         protected String user;
87         protected String domain;
88         protected ImmutableSet<String> roles;
89
90         protected ImmutableClaim(ClaimBuilder base) {
91             clientId = base.clientId;
92             userId = base.userId;
93             user = base.user;
94             domain = base.domain;
95             roles = ImmutableSet.<String>builder().addAll(base.roles).build();
96
97             if (userId.isEmpty() || user.isEmpty() || roles.isEmpty() || roles.contains("")) {
98                 throw new IllegalStateException(
99                         "The Claim is missing one or more of the required fields.");
100             }
101         }
102
103         @Override
104         public String clientId() {
105             return clientId;
106         }
107
108         @Override
109         public String userId() {
110             return userId;
111         }
112
113         @Override
114         public String user() {
115             return user;
116         }
117
118         @Override
119         public String domain() {
120             return domain;
121         }
122
123         @Override
124         public Set<String> roles() {
125             return roles;
126         }
127
128         @Override
129         public boolean equals(Object object) {
130             if (this == object) {
131                 return true;
132             }
133             if (!(object instanceof Claim)) {
134                 return false;
135             }
136             Claim claim = (Claim) object;
137             return areEqual(roles, claim.roles()) && areEqual(domain, claim.domain())
138                     && areEqual(userId, claim.userId()) && areEqual(user, claim.user())
139                     && areEqual(clientId, claim.clientId());
140         }
141
142         @Override
143         public int hashCode() {
144             if (hashCode == 0) {
145                 int result = HashCodeUtil.SEED;
146                 result = hash(result, clientId);
147                 result = hash(result, userId);
148                 result = hash(result, user);
149                 result = hash(result, domain);
150                 result = hash(result, roles);
151                 hashCode = result;
152             }
153             return hashCode;
154         }
155
156         @Override
157         public String toString() {
158             return "clientId:" + clientId + "," + "userId:" + userId + "," + "userName:" + user
159                     + "," + "domain:" + domain + "," + "roles:" + roles;
160         }
161     }
162 }