From 15d1cd7b18ef528e4e0b484b170ca5182cdc413d Mon Sep 17 00:00:00 2001 From: Sanjay Dalal Date: Wed, 19 May 2010 19:26:06 +0000 Subject: [PATCH] CSPACE-1482 refactored authgen and authseed such that these could be invoked from service runtime as well (at startup time). test authz import --- .../importer}/AuthorizationGen.java | 24 ++- .../importer/AuthorizationSeed.java | 168 ++++++++++++++++++ .../import-data/import-permissions-roles.xml | 40 ++--- .../import-data/import-permissions.xml | 40 ++--- .../AbstractAuthorizationTestImpl.java | 18 -- .../importer/AuthorizationSeedTest.java | 124 +++---------- 6 files changed, 246 insertions(+), 168 deletions(-) rename services/authorization-mgt/import/src/{test/java/org/collectionspace/services/authorization/generator => main/java/org/collectionspace/services/authorization/importer}/AuthorizationGen.java (90%) create mode 100644 services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationSeed.java diff --git a/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/generator/AuthorizationGen.java b/services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationGen.java similarity index 90% rename from services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/generator/AuthorizationGen.java rename to services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationGen.java index 73633d03d..0d48a2704 100644 --- a/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/generator/AuthorizationGen.java +++ b/services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationGen.java @@ -21,7 +21,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.collectionspace.services.authorization.generator; +package org.collectionspace.services.authorization.importer; import java.io.File; import org.slf4j.Logger; @@ -32,6 +32,7 @@ import java.util.List; import java.util.UUID; import javax.xml.bind.JAXBContext; import javax.xml.bind.Marshaller; +import org.collectionspace.services.authorization.AccountRole; import org.collectionspace.services.authorization.ActionType; import org.collectionspace.services.authorization.Permission; import org.collectionspace.services.authorization.EffectType; @@ -40,6 +41,7 @@ import org.collectionspace.services.authorization.PermissionRole; import org.collectionspace.services.authorization.PermissionValue; import org.collectionspace.services.authorization.PermissionsList; import org.collectionspace.services.authorization.PermissionsRolesList; +import org.collectionspace.services.authorization.Role; import org.collectionspace.services.authorization.RoleValue; import org.collectionspace.services.authorization.SubjectType; import org.collectionspace.services.common.config.TenantBindingConfigReaderImpl; @@ -47,7 +49,8 @@ import org.collectionspace.services.common.service.ServiceBindingType; import org.collectionspace.services.common.tenant.TenantBindingType; /** - * + * AuthorizationGen generates authorizations (permissions and roles) + * for tenant services * @author */ public class AuthorizationGen { @@ -58,13 +61,17 @@ public class AuthorizationGen { private Hashtable tenantBindings = new Hashtable(); - public void initialize(String tenantBindingFile) throws Exception { + public void initialize(String tenantBindingFileName) throws Exception { TenantBindingConfigReaderImpl tenantBindingConfigReader = new TenantBindingConfigReaderImpl(null); - tenantBindingConfigReader.read(tenantBindingFile); + tenantBindingConfigReader.read(tenantBindingFileName); tenantBindings = tenantBindingConfigReader.getTenantBindings(); + if (logger.isDebugEnabled()) { + logger.debug("initialized with tenant bindings from " + tenantBindingFileName); + } } + public void createDefaultServicePermissions() { for (String tenantId : tenantBindings.keySet()) { List perms = createDefaultServicePermissions(tenantId); @@ -84,6 +91,7 @@ public class AuthorizationGen { } + private Permission buildCommonPermission(String tenantId, String resourceName) { String id = UUID.randomUUID().toString(); Permission perm = new Permission(); @@ -165,7 +173,9 @@ public class AuthorizationGen { pcList.setPermissions(permList); toFile(pcList, PermissionsList.class, fileName); - logger.info("exported permissions to " + fileName); + if (logger.isDebugEnabled()) { + logger.debug("exported permissions to " + fileName); + } } public void exportPermissionRoles(String fileName) { @@ -173,7 +183,9 @@ public class AuthorizationGen { psrsl.setPermissionRoles(permRoleList); toFile(psrsl, PermissionsRolesList.class, fileName); - logger.info("exported permissions-roles to " + fileName); + if (logger.isDebugEnabled()) { + logger.debug("exported permissions-roles to " + fileName); + } } private void toFile(Object o, Class jaxbClass, String fileName) { diff --git a/services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationSeed.java b/services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationSeed.java new file mode 100644 index 000000000..4ef03369a --- /dev/null +++ b/services/authorization-mgt/import/src/main/java/org/collectionspace/services/authorization/importer/AuthorizationSeed.java @@ -0,0 +1,168 @@ +/** + * This document is a part of the source code and related artifacts + * for CollectionSpace, an open source collections management system + * for museums and related institutions: + + * http://www.collectionspace.org + * http://wiki.collectionspace.org + + * Copyright 2009 University of California at Berkeley + + * Licensed under the Educational Community License (ECL), Version 2.0. + * You may not use this file except in compliance with this License. + + * You may obtain a copy of the ECL 2.0 License at + + * https://source.collectionspace.org/collection-space/LICENSE.txt + + * 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 org.collectionspace.services.authorization.importer; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import org.collectionspace.services.authorization.ActionType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.collectionspace.services.authorization.AuthZ; +import org.collectionspace.services.authorization.CSpaceAction; +import org.collectionspace.services.authorization.Permission; +import org.collectionspace.services.authorization.PermissionAction; +import org.collectionspace.services.authorization.PermissionException; +import org.collectionspace.services.authorization.PermissionRole; +import org.collectionspace.services.authorization.PermissionsList; +import org.collectionspace.services.authorization.PermissionsRolesList; +import org.collectionspace.services.authorization.RoleValue; +import org.collectionspace.services.authorization.URIResourceImpl; + +/** + * AuthorizationSeed seeds authorizations (permission, role) into authz provider database + * @author + */ +public class AuthorizationSeed { + + final Logger logger = LoggerFactory.getLogger(AuthorizationSeed.class); + + + /** + * seedPermissions seed permissions from given files + * @param permFileName permisison file name + * @param permRoleFileName permission role file name + * @throws Exception + */ + public void seedPermissions(String permFileName, String permRoleFileName) throws Exception { + PermissionsList permList = + (PermissionsList) fromFile(PermissionsList.class, + permFileName); + if (logger.isDebugEnabled()) { + logger.debug("read permissions from " + permFileName); + } + PermissionsRolesList permRoleList = + (PermissionsRolesList) fromFile(PermissionsRolesList.class, + permRoleFileName); + if (logger.isDebugEnabled()) { + logger.debug("read permissions-roles from " + permRoleFileName); + } + + seedPermissions(permList, permRoleList); + } + + /** + * seedPermissions seed permissions from given permisison and permission role lists + * @param permList + * @param permRoleList + * @throws Exception + */ + public void seedPermissions(PermissionsList permList, PermissionsRolesList permRoleList) + throws Exception { + for (Permission p : permList.getPermissions()) { + if (logger.isDebugEnabled()) { + logger.debug("adding permission for res=" + p.getResourceName()); + } + for (PermissionRole pr : permRoleList.getPermissionRoles()) { + if (pr.getPermissions().get(0).getPermissionId().equals(p.getCsid())) { + addPermissionsForUri(p, pr); + } + } + } + } + + /** + * addPermissionsForUri add permissions from given permission configuration + * with assumption that resource is of type URI + * @param permission configuration + */ + private void addPermissionsForUri(Permission perm, + PermissionRole permRole) throws PermissionException { + List principals = new ArrayList(); + if (!perm.getCsid().equals(permRole.getPermissions().get(0).getPermissionId())) { + throw new IllegalArgumentException("permission ids do not" + + " match for role=" + permRole.getRoles().get(0).getRoleName() + + " with permissionId=" + permRole.getPermissions().get(0).getPermissionId() + + " for permission with csid=" + perm.getCsid()); + } + for (RoleValue roleValue : permRole.getRoles()) { + principals.add(roleValue.getRoleName()); + } + List permActions = perm.getActions(); + for (PermissionAction permAction : permActions) { + CSpaceAction action = getAction(permAction.getName()); + URIResourceImpl uriRes = new URIResourceImpl(perm.getTenantId(), + perm.getResourceName(), action); + AuthZ.get().addPermissions(uriRes, principals.toArray(new String[0])); + } + } + + /** + * getAction is a convenience method to get corresponding action for + * given ActionType + * @param action + * @return + */ + private CSpaceAction getAction(ActionType action) { + if (ActionType.CREATE.equals(action)) { + return CSpaceAction.CREATE; + } else if (ActionType.READ.equals(action)) { + return CSpaceAction.READ; + } else if (ActionType.UPDATE.equals(action)) { + return CSpaceAction.UPDATE; + } else if (ActionType.DELETE.equals(action)) { + return CSpaceAction.DELETE; + } else if (ActionType.SEARCH.equals(action)) { + return CSpaceAction.SEARCH; + } else if (ActionType.ADMIN.equals(action)) { + return CSpaceAction.ADMIN; + } else if (ActionType.START.equals(action)) { + return CSpaceAction.START; + } else if (ActionType.STOP.equals(action)) { + return CSpaceAction.STOP; + } + throw new IllegalArgumentException("action = " + action.toString()); + } + + static Object fromFile(Class jaxbClass, String fileName) throws Exception { + InputStream is = new FileInputStream(fileName); + try { + JAXBContext context = JAXBContext.newInstance(jaxbClass); + Unmarshaller unmarshaller = context.createUnmarshaller(); + //note: setting schema to null will turn validator off + unmarshaller.setSchema(null); + return jaxbClass.cast(unmarshaller.unmarshal(is)); + } finally { + if (is != null) { + try { + is.close(); + } catch (Exception e) { + } + } + } + } +} diff --git a/services/authorization-mgt/import/src/main/resources/import-data/import-permissions-roles.xml b/services/authorization-mgt/import/src/main/resources/import-data/import-permissions-roles.xml index 53ff7fd92..8aa8b869e 100644 --- a/services/authorization-mgt/import/src/main/resources/import-data/import-permissions-roles.xml +++ b/services/authorization-mgt/import/src/main/resources/import-data/import-permissions-roles.xml @@ -3,7 +3,7 @@ ROLE - d517250a-91a8-4b19-b1a4-75ad56d3012a + 05afcbb5-42f2-4d93-a2c8-aaaed450c306 collectionobjects @@ -14,7 +14,7 @@ ROLE - eb155cad-cfac-4bcd-bdb3-34c8406bb6c7 + 4891efb7-91c8-45f8-920e-ffc86e17b3da intakes @@ -25,7 +25,7 @@ ROLE - 04383c28-f9d0-4628-bd8d-90c07963630d + 20e8c44d-103c-4b1d-bee0-80e13c02d472 loansin @@ -36,7 +36,7 @@ ROLE - 1280b13b-0e02-4c11-955d-5151ac15cb16 + 544cfaee-455f-4daa-a037-c4b0907bbf20 loansout @@ -47,7 +47,7 @@ ROLE - 86ed3672-c338-4537-893d-69bbef22ea7e + f16f4cd8-62ba-4a43-932f-38521f0fa18d movements @@ -58,7 +58,7 @@ ROLE - 293a5a00-e2ca-49f9-9f52-6cefbceae1a7 + a20baf6b-d476-4106-a836-1b600bf669f8 vocabularies @@ -69,7 +69,7 @@ ROLE - 1c1152e4-2e7b-4744-bf86-8c47f62f6b2a + 779a0b7e-27eb-4621-8920-588c296e12ee vocabularyitems @@ -80,7 +80,7 @@ ROLE - 29e217f7-d1a0-463b-9f3e-1804be23f127 + 2d873988-7339-42ad-b432-ebb77df34910 orgauthorities @@ -91,7 +91,7 @@ ROLE - 34197256-031f-4218-bb8d-c02a9d202986 + d0623091-4e67-45ae-8aff-8e91d51cf49a organizations @@ -102,7 +102,7 @@ ROLE - d327da0e-da21-4716-a01c-47ad828ec2b4 + 3d4824f9-1f98-436d-a7bb-3a24e972e8e4 personauthorities @@ -113,7 +113,7 @@ ROLE - d2746267-4ade-4e12-8dc4-11ee151c7f2e + d5119e61-b858-413c-a756-8effa0b390b4 persons @@ -124,7 +124,7 @@ ROLE - 5dcbce71-bc19-4da0-8072-d994c8854007 + 467a5287-f758-4300-9cb4-ed3a1ad36aee acquisitions @@ -135,7 +135,7 @@ ROLE - a2cd134f-c418-4c9c-8a85-bb530a97cea8 + 0745fb96-cf8d-4cfa-93ed-9b3d078e206e relations @@ -146,7 +146,7 @@ ROLE - bfd8768d-64bc-47b7-9193-edfb5fc17884 + cc931e6c-dde9-41fa-be84-ae14329f6845 accounts @@ -157,7 +157,7 @@ ROLE - eb77d422-5019-470f-9670-b62bcd8eb9be + abfdb597-6432-42d8-9b82-93d520c5275a dimensions @@ -168,7 +168,7 @@ ROLE - c66becf5-0670-4e6f-83be-283ca28b9220 + 766015d1-5fff-4bc7-ba1c-1d17b71a47fe contacts @@ -179,7 +179,7 @@ ROLE - 9ce72e7a-dded-4b92-b0c1-3333e117a152 + f3269b91-2a01-4ddc-9f50-b29ddd1775ee authorization/roles @@ -190,7 +190,7 @@ ROLE - 407df950-207a-4490-a122-61ab43984956 + a00b8aa8-8965-4d8f-811f-51962310336a authorization/permissions @@ -201,7 +201,7 @@ ROLE - 5e16a57f-8c6d-4c93-b167-85c2c7881f02 + 983be9bf-f016-4673-8ada-ace546dd3254 authorization/permroles @@ -212,7 +212,7 @@ ROLE - d1a3663a-645b-4ac4-86b8-c6ecd05e1e12 + 1e73718d-c646-485a-a017-eb17eeb3aba2 accounts/accountroles diff --git a/services/authorization-mgt/import/src/main/resources/import-data/import-permissions.xml b/services/authorization-mgt/import/src/main/resources/import-data/import-permissions.xml index f1f501c89..aa58510eb 100644 --- a/services/authorization-mgt/import/src/main/resources/import-data/import-permissions.xml +++ b/services/authorization-mgt/import/src/main/resources/import-data/import-permissions.xml @@ -1,6 +1,6 @@ - + collectionobjects CREATE @@ -20,7 +20,7 @@ PERMIT 1 - + intakes CREATE @@ -40,7 +40,7 @@ PERMIT 1 - + loansin CREATE @@ -60,7 +60,7 @@ PERMIT 1 - + loansout CREATE @@ -80,7 +80,7 @@ PERMIT 1 - + movements CREATE @@ -100,7 +100,7 @@ PERMIT 1 - + vocabularies CREATE @@ -120,7 +120,7 @@ PERMIT 1 - + vocabularyitems CREATE @@ -140,7 +140,7 @@ PERMIT 1 - + orgauthorities CREATE @@ -160,7 +160,7 @@ PERMIT 1 - + organizations CREATE @@ -180,7 +180,7 @@ PERMIT 1 - + personauthorities CREATE @@ -200,7 +200,7 @@ PERMIT 1 - + persons CREATE @@ -220,7 +220,7 @@ PERMIT 1 - + acquisitions CREATE @@ -240,7 +240,7 @@ PERMIT 1 - + relations CREATE @@ -260,7 +260,7 @@ PERMIT 1 - + accounts CREATE @@ -280,7 +280,7 @@ PERMIT 1 - + dimensions CREATE @@ -300,7 +300,7 @@ PERMIT 1 - + contacts CREATE @@ -320,7 +320,7 @@ PERMIT 1 - + authorization/roles CREATE @@ -340,7 +340,7 @@ PERMIT 1 - + authorization/permissions CREATE @@ -360,7 +360,7 @@ PERMIT 1 - + authorization/permroles CREATE @@ -380,7 +380,7 @@ PERMIT 1 - + accounts/accountroles CREATE diff --git a/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AbstractAuthorizationTestImpl.java b/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AbstractAuthorizationTestImpl.java index 039241090..3a6da68a1 100644 --- a/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AbstractAuthorizationTestImpl.java +++ b/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AbstractAuthorizationTestImpl.java @@ -137,24 +137,6 @@ public abstract class AbstractAuthorizationTestImpl { } - static Object fromFile(Class jaxbClass, String fileName) throws Exception { - InputStream is = new FileInputStream(fileName); - try { - JAXBContext context = JAXBContext.newInstance(jaxbClass); - Unmarshaller unmarshaller = context.createUnmarshaller(); - //note: setting schema to null will turn validator off - unmarshaller.setSchema(null); - return jaxbClass.cast(unmarshaller.unmarshal(is)); - } finally { - if (is != null) { - try { - is.close(); - } catch (Exception e) { - } - } - } - } - @Test(dataProvider = "testName", dataProviderClass = AbstractAuthorizationTestImpl.class) public void test(String testName) { diff --git a/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AuthorizationSeedTest.java b/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AuthorizationSeedTest.java index 292ad614b..d1e45006a 100644 --- a/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AuthorizationSeedTest.java +++ b/services/authorization-mgt/import/src/test/java/org/collectionspace/services/authorization/importer/AuthorizationSeedTest.java @@ -23,26 +23,9 @@ */ package org.collectionspace.services.authorization.importer; -//import java.util.ArrayList; -//import java.util.List; import java.io.File; -import org.collectionspace.services.authorization.generator.AuthorizationGen; -import java.util.ArrayList; -import java.util.List; -import org.collectionspace.services.authorization.ActionType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -//import org.collectionspace.services.client.test.BaseServiceTest; -import org.collectionspace.services.authorization.AuthZ; -import org.collectionspace.services.authorization.CSpaceAction; -import org.collectionspace.services.authorization.Permission; -import org.collectionspace.services.authorization.PermissionAction; -import org.collectionspace.services.authorization.PermissionException; -import org.collectionspace.services.authorization.PermissionRole; -import org.collectionspace.services.authorization.PermissionsList; -import org.collectionspace.services.authorization.PermissionsRolesList; -import org.collectionspace.services.authorization.RoleValue; -import org.collectionspace.services.authorization.URIResourceImpl; import org.springframework.transaction.TransactionStatus; import org.testng.annotations.BeforeClass; @@ -59,7 +42,7 @@ public class AuthorizationSeedTest extends AbstractAuthorizationTestImpl { @BeforeClass(alwaysRun = true) public void seedData() { setup(); - TransactionStatus status = beginTransaction("seedData"); + TransactionStatus status = null; try { AuthorizationGen authzGen = new AuthorizationGen(); String tenantBindingFile = getTenantBindingFile(); @@ -69,99 +52,32 @@ public class AuthorizationSeedTest extends AbstractAuthorizationTestImpl { String exportDir = getExportDir(); authzGen.exportPermissions(exportDir + PERMISSION_FILE); authzGen.exportPermissionRoles(exportDir + PERMISSION_ROLE_FILE); - seedRoles(); - seedPermissions(); + if (logger.isDebugEnabled()) { + logger.debug("authroization generation completed "); + } + status = beginTransaction("seedData"); + AuthorizationSeed authzSeed = new AuthorizationSeed(); + String importDir = getImportDir(); + authzSeed.seedPermissions(importDir + PERMISSION_FILE, + importDir + PERMISSION_ROLE_FILE); + if (logger.isDebugEnabled()) { + logger.debug("authroization seeding completed "); + } } catch (Exception ex) { - rollbackTransaction(status); - ex.printStackTrace(); - throw new RuntimeException(ex); - } - commitTransaction(status); - } - - public void seedRoles() throws Exception { - //Should this test really be empty? - } - - public void seedPermissions() throws Exception { - String importDir = getImportDir(); - PermissionsList pcList = - (PermissionsList) fromFile(PermissionsList.class, - importDir + PERMISSION_FILE); - logger.info("read permissions from " - + importDir + PERMISSION_FILE); - PermissionsRolesList pcrList = - (PermissionsRolesList) fromFile(PermissionsRolesList.class, - importDir + PERMISSION_ROLE_FILE); - logger.info("read permissions-roles from " - + importDir + PERMISSION_ROLE_FILE); - AuthZ authZ = AuthZ.get(); - for (Permission p : pcList.getPermissions()) { + if (status != null) { + rollbackTransaction(status); + } if (logger.isDebugEnabled()) { - logger.debug("adding permission for res=" + p.getResourceName()); + ex.printStackTrace(); } - for (PermissionRole pr : pcrList.getPermissionRoles()) { - if (pr.getPermissions().get(0).getPermissionId().equals(p.getCsid())) { - addPermissionsForUri(p, pr); - } + throw new RuntimeException(ex); + } finally { + if (status != null) { + commitTransaction(status); } } } - /** - * addPermissionsForUri add permissions from given permission configuration - * with assumption that resource is of type URI - * @param permission configuration - */ - //FIXME this method should be in the restful web service resource of authz - private void addPermissionsForUri(Permission perm, - PermissionRole permRole) throws PermissionException { - List principals = new ArrayList(); - if (!perm.getCsid().equals(permRole.getPermissions().get(0).getPermissionId())) { - throw new IllegalArgumentException("permission ids do not" - + " match for role=" + permRole.getRoles().get(0).getRoleName() - + " with permissionId=" + permRole.getPermissions().get(0).getPermissionId() - + " for permission with csid=" + perm.getCsid()); - } - for (RoleValue roleValue : permRole.getRoles()) { - principals.add(roleValue.getRoleName()); - } - List permActions = perm.getActions(); - for (PermissionAction permAction : permActions) { - CSpaceAction action = getAction(permAction.getName()); - URIResourceImpl uriRes = new URIResourceImpl(perm.getTenantId(), - perm.getResourceName(), action); - AuthZ.get().addPermissions(uriRes, principals.toArray(new String[0])); - } - } - - /** - * getAction is a convenience method to get corresponding action for - * given ActionType - * @param action - * @return - */ - private CSpaceAction getAction(ActionType action) { - if (ActionType.CREATE.equals(action)) { - return CSpaceAction.CREATE; - } else if (ActionType.READ.equals(action)) { - return CSpaceAction.READ; - } else if (ActionType.UPDATE.equals(action)) { - return CSpaceAction.UPDATE; - } else if (ActionType.DELETE.equals(action)) { - return CSpaceAction.DELETE; - } else if (ActionType.SEARCH.equals(action)) { - return CSpaceAction.SEARCH; - } else if (ActionType.ADMIN.equals(action)) { - return CSpaceAction.ADMIN; - } else if (ActionType.START.equals(action)) { - return CSpaceAction.START; - } else if (ActionType.STOP.equals(action)) { - return CSpaceAction.STOP; - } - throw new IllegalArgumentException("action = " + action.toString()); - } - private String getTenantBindingFile() { String tenantBindingFile = System.getProperty("tenantbindings"); if (tenantBindingFile == null || tenantBindingFile.isEmpty()) { -- 2.47.3