1 /*******************************************************************************
2 * ============LICENSE_START====================================================
4 * * ===========================================================================
5 * * Copyright © 2017 AT&T Intellectual Property. All rights reserved.
6 * * ===========================================================================
7 * * Licensed under the Apache License, Version 2.0 (the "License");
8 * * you may not use this file except in compliance with the License.
9 * * You may obtain a copy of the License at
11 * * http://www.apache.org/licenses/LICENSE-2.0
13 * * Unless required by applicable law or agreed to in writing, software
14 * * distributed under the License is distributed on an "AS IS" BASIS,
15 * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * * See the License for the specific language governing permissions and
17 * * limitations under the License.
18 * * ============LICENSE_END====================================================
21 ******************************************************************************/
23 package org.onap.aaf.authz.service.mapper;
25 import static org.junit.Assert.assertEquals;
26 import static org.junit.Assert.assertFalse;
27 import static org.junit.Assert.assertNotNull;
28 import static org.junit.Assert.assertNull;
29 import static org.junit.Assert.assertTrue;
30 import static org.junit.Assert.fail;
31 import static org.mockito.BDDMockito.given;
32 import static org.mockito.Matchers.any;
33 import static org.mockito.Matchers.anyString;
34 import static org.mockito.Matchers.eq;
35 import static org.mockito.Mockito.mock;
36 import static org.mockito.Mockito.verify;
37 import static org.mockito.Mockito.verifyZeroInteractions;
38 import static org.onap.aaf.auth.layer.Result.ERR_BadData;
39 import static org.onap.aaf.auth.layer.Result.ERR_General;
41 import java.io.IOException;
42 import java.util.ArrayList;
43 import java.util.Calendar;
44 import java.util.Collection;
45 import java.util.Date;
46 import java.util.GregorianCalendar;
47 import java.util.HashMap;
48 import java.util.HashSet;
49 import java.util.List;
52 import java.util.stream.Collectors;
54 import org.junit.Before;
55 import org.junit.Test;
56 import org.junit.runner.RunWith;
57 import org.mockito.Mock;
58 import org.mockito.runners.MockitoJUnitRunner;
59 import org.onap.aaf.auth.dao.cass.Namespace;
60 import org.onap.aaf.auth.dao.cass.NsDAO;
61 import org.onap.aaf.auth.dao.cass.NsSplit;
62 import org.onap.aaf.auth.dao.cass.NsType;
63 import org.onap.aaf.auth.dao.cass.PermDAO;
64 import org.onap.aaf.auth.dao.cass.PermDAO.Data;
65 import org.onap.aaf.auth.dao.cass.RoleDAO;
66 import org.onap.aaf.auth.dao.cass.UserRoleDAO;
67 import org.onap.aaf.auth.dao.hl.Question;
68 import org.onap.aaf.auth.dao.hl.Question.Access;
69 import org.onap.aaf.auth.env.AuthzTrans;
70 import org.onap.aaf.auth.env.AuthzTrans.REQD_TYPE;
71 import org.onap.aaf.auth.layer.Result;
72 import org.onap.aaf.auth.org.Organization;
73 import org.onap.aaf.auth.org.Organization.Expiration;
74 import org.onap.aaf.auth.rserv.Pair;
75 import org.onap.aaf.auth.service.mapper.Mapper.API;
76 import org.onap.aaf.auth.service.mapper.Mapper_2_0;
77 import org.onap.aaf.cadi.CadiException;
78 import org.onap.aaf.misc.env.APIException;
79 import org.onap.aaf.misc.env.Env;
80 import org.onap.aaf.misc.env.TimeTaken;
82 import aaf.v2_0.NsRequest;
84 import aaf.v2_0.Nss.Ns;
86 import aaf.v2_0.PermRequest;
87 import aaf.v2_0.Perms;
89 import aaf.v2_0.Request;
91 import aaf.v2_0.RoleRequest;
92 import aaf.v2_0.Roles;
93 import aaf.v2_0.UserRole;
94 import aaf.v2_0.UserRoleRequest;
95 import aaf.v2_0.UserRoles;
97 @RunWith(MockitoJUnitRunner.class)
98 public class JU_Mapper_2_0 {
99 private static final String USER = "John";
101 private Mapper_2_0 mapper;
103 private Question question;
105 private AuthzTrans transaction;
107 private TimeTaken tt;
111 public void setUp() throws APIException, IOException, CadiException {
112 given(transaction.start(anyString(), eq(Env.SUB))).willReturn(tt);
113 given(transaction.user()).willReturn(USER);
114 this.mapper = new Mapper_2_0(question);
117 @Test(expected = ClassCastException.class)
118 public void ns_willThrowException_whenInvalidRequestType() {
120 Request rq = new Request();
123 mapper.ns(transaction, rq);
126 fail("Expected ClassCastException");
130 public void ns_shouldConvertNamespaceRequest_whenValidTypeIsExplicitlyProvided() {
132 String namespaceName = "org.companyA.app1";
133 String namespaceType = "APP";
134 NsType expectedNsType = NsType.APP;
135 NsRequest nsRequest = createNsRequestForType(namespaceName, namespaceType);
138 Result<Namespace> result = mapper.ns(transaction,nsRequest);
141 assertTrue(result.isOK());
142 assertNamespaceValues(result.value, expectedNsType, namespaceName);
143 verify(transaction).checkpoint(namespaceName,Env.ALWAYS);
147 public void ns_shouldConvertNamespaceRequest_whenInValidTypeIsExplicitlyProvided() {
149 String namespaceName = "org.companyA.app1.service0";
150 String invalidNsType = "BLUE";
151 NsType expectedNsType = NsType.APP;
152 NsRequest nsRequest = createNsRequestForType(namespaceName, invalidNsType);
155 Result<Namespace> result = mapper.ns(transaction,nsRequest);
158 assertTrue(result.isOK());
159 assertNamespaceValues(result.value, expectedNsType, namespaceName);
160 verify(transaction).checkpoint(namespaceName,Env.ALWAYS);
164 public void ns_shouldConvertRootNamespaceRequest_whenTypeNotProvided() {
166 String rootNsName = "org";
167 NsType expectedNsType = NsType.ROOT;
168 NsRequest nsRequest = createNsRequestForType(rootNsName, null);
171 Result<Namespace> result = mapper.ns(transaction,nsRequest);
174 assertTrue(result.isOK());
175 assertNamespaceValues(result.value, expectedNsType, rootNsName);
176 verify(transaction).checkpoint(rootNsName,Env.ALWAYS);
180 public void ns_shouldConvertCompanyNamespaceRequest_whenTypeNotProvided() {
182 String companyNsName = "org.companyA";
183 NsType expectedNsType = NsType.COMPANY;
184 NsRequest nsRequest = createNsRequestForType(companyNsName, null);
187 Result<Namespace> result = mapper.ns(transaction,nsRequest);
190 assertTrue(result.isOK());
191 assertNamespaceValues(result.value, expectedNsType, companyNsName);
192 verify(transaction).checkpoint(companyNsName,Env.ALWAYS);
195 private void assertNamespaceValues(Namespace value, NsType nsType, String namespaceName) {
196 List<String> people = Lists.newArrayList("tk007@people.osaaf.org");
197 assertEquals(Integer.valueOf(nsType.type), value.type);
198 assertEquals(namespaceName, value.name);
199 assertEquals("some namespace description", value.description);
200 assertEquals(people, value.admin);
201 assertEquals(people, value.owner);
204 private NsRequest createNsRequestForType(String nsName, String nsType) {
205 NsRequest req = mapper.newInstance(API.NS_REQ);
208 req.setDescription("some namespace description");
209 req.getAdmin().add("tk007@people.osaaf.org");
210 req.getResponsible().add("tk007@people.osaaf.org");
215 public void nss_shouldConvertNamespaceToNss_withoutAttributes() {
217 Nss nss = mapper.newInstance(API.NSS);
218 Namespace ns = mapper.ns(transaction, createNsRequestForType("org.onap", null)).value;
221 Result<Nss> result = mapper.nss(transaction, ns, nss);
224 assertTrue(result.isOK());
225 assertEquals("Only one Ns should be added",1, result.value.getNs().size());
226 Ns addedNs = Iterables.getOnlyElement(result.value.getNs());
227 assertEquals(ns.admin, addedNs.getAdmin());
228 assertEquals(ns.name, addedNs.getName());
229 assertEquals(ns.owner, addedNs.getResponsible());
230 assertEquals(ns.description, addedNs.getDescription());
231 assertTrue(addedNs.getAttrib().isEmpty());
235 public void nss_shouldConvertNamespaceToNss_withAttributes() {
237 Nss nss = mapper.newInstance(API.NSS);
238 Namespace ns = mapper.ns(transaction, createNsRequestForType("org.onap", null)).value;
239 ns.attrib = Lists.newArrayList();
241 Map<String, String> attribs = ImmutableMap.of("key1", "value1", "key2", "value2", "key3", "value3", "key4", "value4", "key5", "value5");
242 attribs.forEach((key,val) -> ns.attrib.add(new Pair<>(key,val)));
245 Result<Nss> result = mapper.nss(transaction, ns, nss);
248 assertTrue(result.isOK());
249 assertEquals("Only one Ns should be added",1, result.value.getNs().size());
250 Ns addedNs = Iterables.getOnlyElement(result.value.getNs());
251 assertEquals(attribNum, addedNs.getAttrib().size());
252 addedNs.getAttrib().forEach( attr -> {
253 assertEquals(attr.getValue(), attribs.get(attr.getKey()));
258 public void nss_shouldAddSeveralNamespacesToNss() {
260 Nss nss = mapper.newInstance(API.NSS);
261 Namespace ns1 = mapper.ns(transaction, createNsRequestForType("org.onap", "COMPANY")).value;
262 Namespace ns2 = mapper.ns(transaction, createNsRequestForType("org.onap.prh", "APP")).value;
265 Result<Nss> result = mapper.nss(transaction, Lists.newArrayList(ns1,ns2), nss);
268 assertTrue(result.isOK());
269 assertEquals("Two namespaces should be added",2, result.value.getNs().size());
273 public void perm_shouldNotAddPerms_whenFilterIsSet_andUserIsNotAuthorized() {
275 given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
276 .willReturn(Result.err(9, "error"));
277 Perms permsContainer = mapper.newInstance(API.PERMS);
278 List<PermDAO.Data> permsData = Lists.newArrayList(new PermDAO.Data());
279 boolean filter = true;
282 Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, filter);
285 assertTrue(result.isOK());
286 assertEquals("No perms added",0,result.value.getPerm().size());
290 public void perm_shouldAddPerm_withNamespaceSet_whenUserIsAuthorized_AndNamespaceIsRequestedType() {
292 given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
293 .willReturn(Result.ok(new NsDAO.Data()));
294 given(transaction.requested(REQD_TYPE.ns)).willReturn(true);
295 Perms permsContainer = mapper.newInstance(API.PERMS);
296 Set<String> roles = Sets.newHashSet("org.onap.portal.owner","org.onap.portal.designer"
297 ,"org.onap.portal.tester");
298 String namespace = "org.onap.portal";
299 String type = "access";
300 String fullType = namespace + "." +type;
301 String action = "read";
302 String description = "Portal Read Access";
303 List<PermDAO.Data> permsData = Lists.newArrayList(createPermDAOobj(namespace, type, "*",action, roles, description));
304 boolean filter = true;
307 Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, filter);
310 assertTrue(result.isOK());
311 assertEquals("Perm is added",1,result.value.getPerm().size());
312 Perm perm = Iterables.getOnlyElement(result.value.getPerm());
313 assertEquals(namespace, perm.getNs());
314 assertEquals(fullType, perm.getType());
315 assertEquals(action, perm.getAction());
316 assertEquals("*", perm.getInstance());
317 assertEquals(description, perm.getDescription());
318 assertEquals(Lists.newArrayList(roles), perm.getRoles());
322 public void perm_shouldAddPerm_withoutNamespaceSet_whenUserIsAuthorized_AndNamespaceIsNotRequestedType() {
324 given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
325 .willReturn(Result.ok(new NsDAO.Data()));
326 given(transaction.requested(REQD_TYPE.ns)).willReturn(false);
327 Perms permsContainer = mapper.newInstance(API.PERMS);
328 String namespace = "org.onap.portal";
329 String type = "access";
330 String fullType = namespace + "." + type;
331 String action = "read";
332 List<PermDAO.Data> permsData = Lists.newArrayList(createPermDAOobj(namespace, type, "*",action, null, null));
333 boolean filter = true;
336 Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, filter);
339 assertTrue(result.isOK());
340 assertEquals("Perm is added",1,result.value.getPerm().size());
341 Perm perm = Iterables.getOnlyElement(result.value.getPerm());
342 assertNull(perm.getNs());
343 assertEquals(fullType, perm.getType());
344 assertEquals(action, perm.getAction());
348 public void perm_shouldAddPermsWithCorrectSortedOrder() {
350 given(question.mayUser(eq(transaction), eq(USER), any(PermDAO.Data.class), eq(Access.read)))
351 .willReturn(Result.ok(new NsDAO.Data()));
352 Perms permsContainer = mapper.newInstance(API.PERMS);
353 PermDAO.Data perm1 = createPermDAOobj("org.onap.portal", "access", "*", "read", null, null);
354 PermDAO.Data perm2 = createPermDAOobj("org.onap.portal", "access", "*", "write", null, null);
355 PermDAO.Data perm3 = createPermDAOobj("org.onap.portal", "design", "*", "new", null, null);
356 PermDAO.Data perm4 = createPermDAOobj("org.onap.portal", "workflow", "1", "edit", null, null);
357 PermDAO.Data perm5 = createPermDAOobj("org.onap.portal", "workflow", "2", "edit", null, null);
358 List<PermDAO.Data> permsData = Lists.newArrayList(perm4, perm1, perm5, perm3, perm2);
359 List<PermDAO.Data> correctOrderPerms = Lists.newArrayList(perm1, perm2, perm3, perm4, perm5);
362 Result<Perms> result = mapper.perms(transaction, permsData, permsContainer, true);
365 assertTrue(result.isOK());
366 assertEquals("Alls Perms added",5,result.value.getPerm().size());
367 List<Perm> mappedPerms = result.value.getPerm();
368 for (int i=0; i<5; i++) {
369 comparePerm(correctOrderPerms.get(i), mappedPerms.get(i));
373 private void comparePerm(Data data, Perm perm) {
374 assertEquals(data.ns + "." + data.type, perm.getType());
375 assertEquals(data.instance, perm.getInstance());
376 assertEquals(data.action, perm.getAction());
379 private PermDAO.Data createPermDAOobj(String ns, String name, String instance, String action, Set<String> roles, String description) {
380 NsSplit nss = new NsSplit(ns, name);
381 PermDAO.Data perm = new PermDAO.Data(nss, instance, action);
383 perm.description = description;
388 public void role_shouldReturnErrorResult_whenNssIsNok() throws Exception {
390 String roleName = "admin";
391 RoleRequest request = createRoleRequest(roleName, "role description");
392 given(question.deriveNsSplit(transaction, roleName)).willReturn(Result.err(new IllegalArgumentException()));
395 Result<RoleDAO.Data> result = mapper.role(transaction, request);
398 assertFalse(result.isOK());
399 assertNull(result.value);
400 assertEquals(ERR_General, result.status);
404 public void role_shouldReturnMappedRoleObject_whenNssIsOk() throws Exception {
406 String roleName = "admin";
407 String roleNs = "org.onap.roles";
408 String roleFullName = roleNs + "." + roleName;
409 String description =" role description";
410 RoleRequest request = createRoleRequest(roleFullName, description);
411 given(question.deriveNsSplit(transaction, roleFullName)).willReturn(Result.ok(new NsSplit(roleNs, roleName)));
414 Result<RoleDAO.Data> result = mapper.role(transaction, request);
417 assertTrue(result.isOK());
418 assertEquals(roleName, result.value.name);
419 assertEquals(roleNs, result.value.ns);
420 assertEquals(description, result.value.description);
421 verify(transaction).checkpoint(roleFullName, Env.ALWAYS);
424 private RoleRequest createRoleRequest(String name, String description) {
425 RoleRequest req = mapper.newInstance(API.ROLE_REQ);
427 req.setDescription(description);
432 public void roles_shouldNotAddAnyRoles_whenFilterFlagIsNotSet() {
434 Roles initialRoles = new Roles();
435 RoleDAO.Data role = createRoleDAOobj("org.onap.app1", "org.onap.app1.admin", "description");
438 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), initialRoles, false);
441 assertTrue(result.isOK());
442 assertEquals(initialRoles.getRole(), result.value.getRole());
446 public void roles_shouldNotAddAnyRoles_whenFilterFlagIsSet_andUserIsNotAuthorizedToReadRole() {
448 Roles initialRoles = new Roles();
449 RoleDAO.Data role = createRoleDAOobj("org.onap.app1", "org.onap.app1.admin", "description");
450 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
451 .willReturn(Result.err(9, "error"));
454 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), initialRoles, true);
457 assertTrue(result.isOK());
458 assertEquals(initialRoles.getRole(), result.value.getRole());
462 public void roles_shouldAddRolesWithoutNamespace_whenNsNotRequested_andFilterFlagSet_andUserIsAuthorized() {
463 test_roles_shouldAddRoles(false);
467 public void roles_shouldAddRolesWithNamespace_whenNsRequested_andFilterFlagSet_andUserIsAuthorized() {
468 test_roles_shouldAddRoles(true);
471 private void test_roles_shouldAddRoles(boolean namespaceRequested) {
473 String namespace = "org.onap.app1";
474 String description = "role description";
475 Set<String> roleNames = Sets.newHashSet(namespace+".admin", namespace+".deployer");
476 List<RoleDAO.Data> daoRoles = roleNames.stream().map( name -> createRoleDAOobj(namespace, name, description))
477 .collect(Collectors.toList());
478 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
479 .willReturn(Result.ok(new NsDAO.Data()));
480 given(transaction.requested(REQD_TYPE.ns)).willReturn(namespaceRequested);
483 Result<Roles> result = mapper.roles(transaction, daoRoles, new Roles(), true);
486 assertTrue(result.isOK());
487 assertEquals(2, result.value.getRole().size());
488 result.value.getRole().stream().forEach( role -> {
489 assertTrue(role.getPerms().isEmpty());
490 if (namespaceRequested) {
491 assertEquals(namespace, role.getNs());
493 assertNull(role.getNs());
495 assertTrue(roleNames.contains(role.getName()));
496 assertEquals(description, role.getDescription());
501 public void roles_shouldReturnErrorResult_whenAnyPermHasInvalidFormat() {
503 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
504 .willReturn(Result.ok(new NsDAO.Data()));
505 RoleDAO.Data role = createRoleDAOobj("org.onap.app", "org.onap.app.admin", "description");
506 role.perms = Sets.newHashSet("invalidPermFormat");
509 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), new Roles(), true);
512 assertFalse(result.isOK());
513 assertEquals(ERR_BadData, result.status);
517 public void roles_shouldAddPerms_whenAllPermsProperlyDefined_andUserCanViewIt() {
519 given(question.mayUser(eq(transaction), eq(USER), any(RoleDAO.Data.class), eq(Access.read)))
520 .willReturn(Result.ok(new NsDAO.Data()));
521 given(question.deriveNsSplit(transaction, "org.onap.app")).willReturn(Result.ok(mock(NsSplit.class)));
522 RoleDAO.Data role = createRoleDAOobj("org.onap.app", "org.onap.app.admin", "description");
523 role.perms = Sets.newHashSet("org.onap.app|access|*|read,approve");
526 Result<Roles> result = mapper.roles(transaction, Lists.newArrayList(role), new Roles(), true);
529 assertTrue(result.isOK());
530 Role mappedRole = Iterables.getOnlyElement(result.value.getRole());
531 Pkey pKey = Iterables.getOnlyElement(mappedRole.getPerms());
532 assertEquals("org.onap.app.access", pKey.getType());
533 assertEquals("*", pKey.getInstance());
534 assertEquals("read,approve", pKey.getAction());
537 private RoleDAO.Data createRoleDAOobj(String namespace, String rolename, String desc) {
538 NsDAO.Data ns = new NsDAO.Data();
540 RoleDAO.Data role = RoleDAO.Data.create(ns, rolename);
541 role.description = desc;
546 public void userRoles_shouldMapUserRolesFromDAO() {
548 String user = "john@people.osaaf.org";
549 String role = "admin";
550 String namespace = "org.osaaf.aaf";
554 Date expiration = new Calendar.Builder().setDate(year,month-1, day).build().getTime(); //month is 0-based
555 UserRoles targetRoles = new UserRoles();
558 Result<UserRoles> result = mapper.userRoles(transaction, Lists.newArrayList(
559 createUserRoleDAOobj(user, expiration, namespace, role)), targetRoles);
562 assertTrue(result.isOK());
563 UserRole targetRole = Iterables.getOnlyElement(result.value.getUserRole());
564 assertEquals(user, targetRole.getUser());
565 assertEquals(role, targetRole.getRole());
566 assertEquals(year, targetRole.getExpires().getYear());
567 assertEquals(month, targetRole.getExpires().getMonth());
568 assertEquals(day, targetRole.getExpires().getDay());
572 public void userRole_shouldReturnErrorResult_whenAnyExceptionOccurs() {
574 PermRequest wrongRequestType = new PermRequest();
577 Result<UserRoleDAO.Data> result = mapper.userRole(transaction, wrongRequestType);
580 assertFalse(result.isOK());
581 assertEquals(ERR_BadData, result.status);
582 verifyZeroInteractions(transaction);
586 public void userRole_shouldReturnEmptyRoleDAOobj_whenRequestIsEmpty() {
588 UserRoleRequest request = new UserRoleRequest();
589 given(question.deriveNsSplit(any(), any())).willReturn(Result.err(new IllegalArgumentException()));
590 Organization org = mock(Organization.class);
591 given(org.expiration(any(), eq(Expiration.UserInRole), any())).willReturn(new GregorianCalendar());
592 given(transaction.org()).willReturn(org);
595 Result<UserRoleDAO.Data> result = mapper.userRole(transaction, request);
598 assertTrue(result.isOK());
599 assertNull(result.value.ns);
600 assertNull(result.value.rname);
601 assertNull(result.value.role);
602 assertNull(result.value.user);
603 assertNotNull(result.value.expires);
607 public void userRole_shouldReturnMappedRoleDAOobj_whenRequestIsFilled() {
609 String user = "johny@people.osaaf.org";
610 String role = "org.onap.app1.deployer";
611 String rName = "deployer";
612 String namespace = "org.onap.app1";
614 given(question.deriveNsSplit(transaction, role)).willReturn(Result.ok(new NsSplit(namespace, rName)));
615 Organization org = mock(Organization.class);
616 given(org.expiration(any(), eq(Expiration.UserInRole), any())).willReturn(new GregorianCalendar());
617 given(transaction.org()).willReturn(org);
620 Result<UserRoleDAO.Data> result = mapper.userRole(transaction, createUserRoleRequest(role, user));
623 assertTrue(result.isOK());
624 assertEquals(user, result.value.user);
625 assertEquals(role, result.value.role);
626 assertEquals(rName, result.value.rname);
627 assertEquals(namespace, result.value.ns);
628 assertNotNull(result.value.expires);
631 private UserRoleRequest createUserRoleRequest(String role, String user) {
632 UserRoleRequest request = new UserRoleRequest();
633 request.setRole(role);
634 request.setUser(user);
638 private UserRoleDAO.Data createUserRoleDAOobj(String userName, Date expires, String namespace, String roleName) {
639 UserRoleDAO.Data userRole = new UserRoleDAO.Data();
640 userRole.user = userName;
641 userRole.expires = expires;
642 userRole.ns = namespace;
643 userRole.role = roleName;
648 * Need to do without Google stuff
649 * @author Instrumental
652 public static class ImmutableMap {
653 public static <T,U> Map<T,U> of(Object ... tag_value) {
654 Map<T,U> rv = new HashMap<>();
655 for(int i=0;i<tag_value.length-1;i+=2) {
656 rv.put((T)tag_value[i],(U)tag_value[i+1]);
664 * Need to do without Google stuff
665 * @author Instrumental
668 public static class Iterables {
669 public static <T> T getOnlyElement(List<T> lt) {
679 * Need to do without Google stuff
680 * @author Instrumental
683 public static class Lists {
684 @SuppressWarnings("unchecked")
685 public static <T> List<T> newArrayList(Collection<T> ... init ) {
686 List<T> rv = new ArrayList<>();
687 for(Collection<T> o : init) {
695 @SuppressWarnings("unchecked")
696 public static <T> List<T> newArrayList(Object ... init ) {
697 List<T> rv = new ArrayList<>();
698 for(Object o : init) {
707 * Need to do without Google stuff
708 * @author Instrumental
711 public static class Sets {
712 @SuppressWarnings("unchecked")
713 public static <T> Set<T> newHashSet(Object ... init ) {
714 Set<T> rv = new HashSet<>();
715 for(Object o : init) {