From 6155c6ec151bc78f5601ff2a79bb9229a948073e Mon Sep 17 00:00:00 2001 From: Dave Ward Date: Mon, 28 May 2012 11:33:15 +0000 Subject: [PATCH] =?UTF-8?q?Merged=20V4.0-BUG-FIX=20to=20HEAD=20=20=20=2037?= =?UTF-8?q?067:=20ALF-13294=09CIFS:=20When=20versionable=20aspect=20is=20a?= =?UTF-8?q?ctive,=20using=20the=20Microsoft=20Word=20for=20Mac=202008=20op?= =?UTF-8?q?tion=20"always=20create=20a=20backup=20copy"=20leads=20to=20doc?= =?UTF-8?q?ument=20versions=20loss=20=20=20=2037073:=20ALF-14319=20Add=20a?= =?UTF-8?q?=20unit=20test=20for=20using=20the=20real=20remote=20credential?= =?UTF-8?q?s=20shared=20container=20(most=20use=20a=20test=20one=20to=20av?= =?UTF-8?q?oid=20issues/clashing),=20and=20tweak=20the=20qname=20to=20matc?= =?UTF-8?q?h=20other=20similar=20ones=20=20=20=2037074:=20Merged=20V3.4-BU?= =?UTF-8?q?G-FIX=20to=20V4.0-BUG=5FFIX=20=20=20=20=20=20=2036881:=20Merged?= =?UTF-8?q?=20DEV=20to=20V3.4-BUG-FIX=20=20=20=20=20=20=20=20=C2=A0=203675?= =?UTF-8?q?9:=20Fix=20to=20Checkin=20failing=20to=20distinguish=20between?= =?UTF-8?q?=20'null'=20and=20'unset'=20properties=20=20=20=20=20=20=20=20?= =?UTF-8?q?=C2=A0=20-=20Some=20minor=20ammendments=20to=20unit=20test=20as?= =?UTF-8?q?=20well=20=20=20=20=20=20=2036898:=20Merge=20HEAD=20to=20V3.4-B?= =?UTF-8?q?UG-FIX:=20=20=20=20=20=20=20=20=20=2033668:=20ALF-12541=20/=20A?= =?UTF-8?q?LF-14254:=20AMP=20files=20need=20to=20be=20able=20to=20be=20pin?= =?UTF-8?q?ned=20to=20specific=20"edition(s)"=20of=20Alfresco.=20It=20is?= =?UTF-8?q?=20now=20possible=20to=20specify=20a=20module.editions=20proper?= =?UTF-8?q?ty=20(eg.=20community)=20which=20is=20checked=20by=20the=20MMT.?= =?UTF-8?q?=20Also,=20the=20version=20is=20checked=20on=20install.=20Also,?= =?UTF-8?q?=20started=20refactoring=20some=20of=20the=20code=20for=20bette?= =?UTF-8?q?r=20reuse.=20=20=20=20=20=20=20=20=20=2033793:=20ALF-12541=20/?= =?UTF-8?q?=20ALF-14254:=20Better=20fix=20for=20ALF-12541=20-=20AMP=20file?= =?UTF-8?q?s=20need=20to=20be=20able=20to=20be=20pinned=20to=20specific=20?= =?UTF-8?q?"edition(s)"=20of=20Alfresco=20Share=20doesn't=20have=20a=20ver?= =?UTF-8?q?sion.properties=20file=20so=20I=20need=20to=20cater=20for=20tha?= =?UTF-8?q?t=20scenario.=20I=20didn't=20want=20to=20create=20the=20LogOutp?= =?UTF-8?q?ut=20interface=20but=20its=20a=20stop-gap=20until=20the=20MMT?= =?UTF-8?q?=20gets=20re-worked.=20=20=20=20=20=20=20=20=20=2033695:=20ALF-?= =?UTF-8?q?12531=20/=20ALF-14255:=20MMT=20needs=20to=20properly=20support?= =?UTF-8?q?=20upgrading=20of=20AMP=20files=20=20=20=20=20=20=20=20=20=2033?= =?UTF-8?q?725:=20ALF-12532=20/=20ALF-14256:=20MMT=20should=20fail=20with?= =?UTF-8?q?=20an=20error=20if=20the=20target=20war=20file=20doesn't=20exis?= =?UTF-8?q?t=20=20=20=20=20=20=20=20=20=2033735:=20ALF-12533=20/=20ALF-142?= =?UTF-8?q?57:=20When=20run=20with=20-directory,=20MMT=20should=20only=20b?= =?UTF-8?q?ackup=20the=20alfresco.war=20file=20once=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20=2033781:=20ALF-12540=20/=20ALF-14258:=20AMP=20-=20file-m?= =?UTF-8?q?apping.properties:=20white=20space=20at=20end=20of=20line=20is?= =?UTF-8?q?=20significant=20=20=20=20=20=20=20=20=20=2033880:=20ALF-12777?= =?UTF-8?q?=20/=20ALF-14259:=20MMT=20should=20not=20install=20AMPs=20which?= =?UTF-8?q?=20override=20pre-existing=20files=20in=20the=20war=20file,=20u?= =?UTF-8?q?nless=20-force=20is=20provided.=20The=20MMT=20is=20moving=20tow?= =?UTF-8?q?ard=20more=20of=20a=20validation=20phase=20(checks=20things,=20?= =?UTF-8?q?calculate=20changes)=20then=20an=20execution=20phase=20(makes?= =?UTF-8?q?=20the=20changes).=20=20=20=20=20=20=20=20=20=2033707:=20ALF-12?= =?UTF-8?q?541=20/=20ALF-14254:=20Fix=20for=20failing=20unit=20tests=20=20?= =?UTF-8?q?=20=20=20=20=2037030:=20ALF-12511=20Allow=20debugging=20of=20th?= =?UTF-8?q?e=20authentication=20chain=20at=20a=20high=20level=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20-=20enable=20with=20log4j.loggerorg.alfresco.?= =?UTF-8?q?repo.security.authentication.AbstractChainingAuthenticationServ?= =?UTF-8?q?ice=3Ddebug=20=20=20=20=20=20=2037066:=20Merged=20DEV=20to=20V3?= =?UTF-8?q?.4-BUG-FIX=20(3.4.10)=20=20=20=20=20=20=20=20=20=2037063:=20ALF?= =?UTF-8?q?-11956:=20WCM=20accessibility=20=20=20=20=20=20=20=20=20=20=20?= =?UTF-8?q?=20=20New=20Tab=20focus=20plugin=20is=20added=20for=20TinyMCE:?= =?UTF-8?q?=20=20=20=20=20=20=20=20=20=20=20=20=20-=20plugin=20covers=20th?= =?UTF-8?q?e=20RTE=20changes=20special=20for=20'XForms';=20=20=20=20=20=20?= =?UTF-8?q?=20=20=20=20=20=20=20-=20configuration=20for=20custom=20appeara?= =?UTF-8?q?nce=20has=20been=20set=20in=20'web-client-config-wcm.xml'=20=20?= =?UTF-8?q?=20=20=20=20=2037069:=20ALF-13379:=20READ=5FONLY=5FLOCK=20preve?= =?UTF-8?q?nts=20access=20via=20deprecated=20CMIS=20API=20=20=20=20=20=20?= =?UTF-8?q?=20-=20Fix=20by=20Alex=20Bykov=20=20=20=2037075:=20Fix=20for=20?= =?UTF-8?q?ALF-14267=20SOLR=20index=20check=20-=20First=20transaction=20ti?= =?UTF-8?q?me=20used=20instead=20of=20first=20ACL=20time=20-=20indexCheck,?= =?UTF-8?q?=20checkInitialState=20=20=20=2037076:=20Merged=20V3.4-BUG-FIX?= =?UTF-8?q?=20to=20V4.0-BUG-FIX=20(RECORD=20ONLY)=20=20=20=20=20=20=203694?= =?UTF-8?q?2:=20ALF-12081:=20Cancel=20Editing=20button=20should=20only=20b?= =?UTF-8?q?e=20shown=20for=20documents=20that=20are=20checked=20out=20for?= =?UTF-8?q?=20offline=20editing.=20=20=20=20=20=20=2036957:=20ALF-12081:?= =?UTF-8?q?=20Reverse-merging=20r36942=20pending=20UI=20team=20review?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@37079 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../default/network-protocol-context.xml | 5 +- .../mapping/AbstractVersioningProperty.java | 4 +- .../alfresco/repo/copy/CopyServiceImpl.java | 7 +- .../repo/copy/CopyServiceImplTest.java | 27 +++++++ .../RemoteCredentialsServiceImpl.java | 10 ++- .../RemoteCredentialsServicesTest.java | 74 ++++++++++++++++++- ...AbstractChainingAuthenticationService.java | 30 +++++++- ...ubsystemChainingAuthenticationService.java | 22 +++++- 8 files changed, 166 insertions(+), 13 deletions(-) diff --git a/config/alfresco/subsystems/fileServers/default/network-protocol-context.xml b/config/alfresco/subsystems/fileServers/default/network-protocol-context.xml index 5b7eaedf0e..c5f2fedcb8 100644 --- a/config/alfresco/subsystems/fileServers/default/network-protocol-context.xml +++ b/config/alfresco/subsystems/fileServers/default/network-protocol-context.xml @@ -203,12 +203,13 @@ HIGH + - ^Backup.*.doc[x] + ^Backup.*.do[ct]{1}[x]?[m]? 20000 MEDIUM true - + diff --git a/source/java/org/alfresco/cmis/mapping/AbstractVersioningProperty.java b/source/java/org/alfresco/cmis/mapping/AbstractVersioningProperty.java index 94aae8bfa9..e5d9b9a1b5 100644 --- a/source/java/org/alfresco/cmis/mapping/AbstractVersioningProperty.java +++ b/source/java/org/alfresco/cmis/mapping/AbstractVersioningProperty.java @@ -71,6 +71,8 @@ public abstract class AbstractVersioningProperty extends AbstractProperty public boolean hasWorkingCopy(NodeRef nodeRef) { - return getServiceRegistry().getLockService().getLockType(nodeRef) == LockType.READ_ONLY_LOCK; + final ServiceRegistry serviceRegistry = getServiceRegistry(); + return serviceRegistry.getLockService().getLockType(nodeRef) == LockType.READ_ONLY_LOCK + && serviceRegistry.getCheckOutCheckInService().getWorkingCopy(nodeRef) != null; } } diff --git a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java index 5fda1c780a..14de29ac3e 100644 --- a/source/java/org/alfresco/repo/copy/CopyServiceImpl.java +++ b/source/java/org/alfresco/repo/copy/CopyServiceImpl.java @@ -677,12 +677,11 @@ public class CopyServiceImpl implements CopyService scratchProperties.clear(); for (QName propertyQName : propertyDefs.keySet()) { - Serializable value = sourceNodeProperties.get(propertyQName); - if (value == null) + if (sourceNodeProperties.containsKey(propertyQName)) { - continue; + Serializable value = sourceNodeProperties.get(propertyQName); + scratchProperties.put(propertyQName, value); } - scratchProperties.put(propertyQName, value); } // What does the behaviour do with properties? Map propsToCopy = callback.getCopyProperties(classQName, copyDetails, scratchProperties); diff --git a/source/java/org/alfresco/repo/copy/CopyServiceImplTest.java b/source/java/org/alfresco/repo/copy/CopyServiceImplTest.java index 8c72eb30c6..5abf08b5aa 100644 --- a/source/java/org/alfresco/repo/copy/CopyServiceImplTest.java +++ b/source/java/org/alfresco/repo/copy/CopyServiceImplTest.java @@ -159,6 +159,10 @@ public class CopyServiceImplTest extends TestCase private static final String USER_1 = "User1"; private static final String USER_2 = "User2"; + private static final QName TYPE_CUSTOM_CMIS_DOCUMENT = QName.createQName("{http://www.alfresco.org/model/cmis/custom}document"); + private static final QName PROP_CUSTOM_STRING = QName.createQName("{http://www.alfresco.org/model/cmis/custom}docprop_string"); + + /** * Test content */ @@ -1337,4 +1341,27 @@ public class CopyServiceImplTest extends TestCase } } } + + public void testCopyNullPropertyForAlf10712() throws Exception + { + nodeService.setType(sourceNodeRef, TYPE_CUSTOM_CMIS_DOCUMENT); + nodeService.setType(targetNodeRef, TYPE_CUSTOM_CMIS_DOCUMENT); + + Map customProperties = new HashMap(); + + customProperties.put(PROP_CUSTOM_STRING, null); + nodeService.setProperties(sourceNodeRef, customProperties); + + Serializable customPropValue = nodeService.getProperty(sourceNodeRef, PROP_CUSTOM_STRING); + assertNull((PROP_CUSTOM_STRING.toString() + " property must be set to NULL on the source node!"), customPropValue); + + customProperties.put(PROP_CUSTOM_STRING, TEST_VALUE_1); + nodeService.setProperties(targetNodeRef, customProperties); + Serializable customProp = nodeService.getProperty(targetNodeRef, PROP_CUSTOM_STRING); + assertEquals((PROP_CUSTOM_STRING.toString() + " must be set to '" + TEST_VALUE_1 + "' on the target node!"), TEST_VALUE_1, customProp ); + + copyService.copy(sourceNodeRef, targetNodeRef); + Serializable updatedCustomProp = nodeService.getProperty(targetNodeRef, PROP_CUSTOM_STRING); + assertNull((PROP_CUSTOM_STRING.toString() + " property must be set to NULL on the target node after copying!"), updatedCustomProp ); + } } diff --git a/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServiceImpl.java b/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServiceImpl.java index 94ed8126ba..0a3e1b8d5a 100644 --- a/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServiceImpl.java +++ b/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServiceImpl.java @@ -144,12 +144,20 @@ public class RemoteCredentialsServiceImpl implements RemoteCredentialsService credentialsFactories.put(credentialsType, factory); } + /** + * Provides a read only copy of the credentials factories, useful in unit tests + */ + protected Map getCredentialsFactories() + { + return Collections.unmodifiableMap(credentialsFactories); + } + // -------------------------------------------------------- private static QName SYSTEM_FOLDER_QNAME = QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, "system"); private static QName SHARED_CREDENTIALS_CONTAINER_QNAME = - QName.createQName(RemoteCredentialsModel.REMOTE_CREDENTIALS_MODEL_URL, SHARED_CREDENTIALS_CONTAINER_NAME); + QName.createQName(NamespaceService.SYSTEM_MODEL_1_0_URI, SHARED_CREDENTIALS_CONTAINER_NAME); /** * Gets the NodeRef of the holder of shared credentials remote systems. * diff --git a/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServicesTest.java b/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServicesTest.java index 28a31792b1..0f04f65606 100644 --- a/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServicesTest.java +++ b/source/java/org/alfresco/repo/remotecredentials/RemoteCredentialsServicesTest.java @@ -23,11 +23,13 @@ import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; import java.util.Set; import org.alfresco.model.ContentModel; import org.alfresco.query.PagingRequest; import org.alfresco.query.PagingResults; +import org.alfresco.repo.model.Repository; import org.alfresco.repo.policy.BehaviourFilter; import org.alfresco.repo.security.authentication.AuthenticationUtil; import org.alfresco.repo.transaction.RetryingTransactionHelper; @@ -38,7 +40,6 @@ import org.alfresco.service.cmr.remotecredentials.RemoteCredentialsService; import org.alfresco.service.cmr.repository.ChildAssociationRef; import org.alfresco.service.cmr.repository.NodeRef; import org.alfresco.service.cmr.repository.NodeService; -import org.alfresco.service.cmr.security.AuthorityService; import org.alfresco.service.cmr.security.MutableAuthenticationService; import org.alfresco.service.cmr.security.PermissionService; import org.alfresco.service.cmr.security.PersonService; @@ -60,7 +61,8 @@ import org.springframework.context.ApplicationContext; /** * Test cases for {@link RemoteCredentialsServiceImpl} and friends. * - * Note - this test will zap any existing shared credentials! + * Note - this test will largely use a test shared credentials + * container, but one test puts things into the real credentials folder * * @author Nick Burch * @since Odin @@ -95,6 +97,8 @@ public class RemoteCredentialsServicesTest private static DictionaryService DICTIONARY_SERVICE; private static NodeService NODE_SERVICE; private static NodeService PUBLIC_NODE_SERVICE; + private static NamespaceService NAMESPACE_SERVICE; + private static Repository REPOSITORY_HELPER; private static PersonService PERSON_SERVICE; private static RetryingTransactionHelper TRANSACTION_HELPER; private static TransactionService TRANSACTION_SERVICE; @@ -115,6 +119,8 @@ public class RemoteCredentialsServicesTest AUTHENTICATION_SERVICE = (MutableAuthenticationService)testContext.getBean("authenticationService"); BEHAVIOUR_FILTER = (BehaviourFilter)testContext.getBean("policyBehaviourFilter"); DICTIONARY_SERVICE = (DictionaryService)testContext.getBean("dictionaryService"); + NAMESPACE_SERVICE = (NamespaceService)testContext.getBean("namespaceService"); + REPOSITORY_HELPER = (Repository)testContext.getBean("repositoryHelper"); NODE_SERVICE = (NodeService)testContext.getBean("nodeService"); PUBLIC_NODE_SERVICE = (NodeService)testContext.getBean("NodeService"); PERSON_SERVICE = (PersonService)testContext.getBean("personService"); @@ -802,6 +808,70 @@ public class RemoteCredentialsServicesTest assertEquals(1, creds.getPage().size()); } + /** + * Most of the shared credentials container tests work on the test one, + * so that things are in a known and empty state. + * We have this one test that uses the real shared container, just to check + * that it's correctly setup and available + */ + @Test public void testRealSharedCredentialsContainer() throws Exception + { + // Create a new instance, using the real container + RemoteCredentialsServiceImpl realService = new RemoteCredentialsServiceImpl(); + realService.setDictionaryService(DICTIONARY_SERVICE); + realService.setNamespaceService(NAMESPACE_SERVICE); + realService.setNodeService(PUBLIC_NODE_SERVICE); + realService.setRepositoryHelper(REPOSITORY_HELPER); + + for (Entry e : ((RemoteCredentialsServiceImpl)PRIVATE_REMOTE_CREDENTIALS_SERVICE).getCredentialsFactories().entrySet() ) + { + realService.registerCredentialsFactory(e.getKey(), e.getValue()); + } + + + // Run as a test user + AuthenticationUtil.setFullyAuthenticatedUser(TEST_USER_ONE); + + // Do a create / fetch / delete step + PasswordCredentialsInfoImpl pwCredI = new PasswordCredentialsInfoImpl(); + pwCredI.setRemoteUsername(TEST_REMOTE_USERNAME_ONE); + pwCredI.setRemotePassword(TEST_USER_THREE); + BaseCredentialsInfo credentials = null; + + try + { + // Create + credentials = realService.createSharedCredentials(TEST_REMOTE_SYSTEM_ONE, pwCredI); + assertEquals(TEST_REMOTE_USERNAME_ONE, credentials.getRemoteUsername()); + + // Update + ((PasswordCredentialsInfoImpl)credentials).setRemoteUsername(TEST_REMOTE_USERNAME_TWO); + ((PasswordCredentialsInfoImpl)credentials).setRemotePassword(TEST_USER_ONE); + credentials = realService.updateCredentials(credentials); + assertEquals(TEST_REMOTE_USERNAME_TWO, credentials.getRemoteUsername()); + + // Delete + realService.deleteCredentials(credentials); + + // Tidy, and zap the test parent + PUBLIC_NODE_SERVICE.deleteNode(credentials.getRemoteSystemContainerNodeRef()); + credentials = null; + } + finally + { + // Tidy up if needed + if (credentials != null) + { + AuthenticationUtil.setAdminUserAsFullyAuthenticatedUser(); + + // Zap the credentials themselves + PUBLIC_NODE_SERVICE.deleteNode(credentials.getNodeRef()); + + // And their test parent + PUBLIC_NODE_SERVICE.deleteNode(credentials.getRemoteSystemContainerNodeRef()); + } + } + } // -------------------------------------------------------------------------------- diff --git a/source/java/org/alfresco/repo/security/authentication/AbstractChainingAuthenticationService.java b/source/java/org/alfresco/repo/security/authentication/AbstractChainingAuthenticationService.java index 2d4a89de68..23a59792de 100644 --- a/source/java/org/alfresco/repo/security/authentication/AbstractChainingAuthenticationService.java +++ b/source/java/org/alfresco/repo/security/authentication/AbstractChainingAuthenticationService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -25,6 +25,8 @@ import java.util.TreeSet; import org.alfresco.service.cmr.security.AuthenticationService; import org.alfresco.service.cmr.security.MutableAuthenticationService; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; /** * A base class for chaining authentication services. Where appropriate, methods will 'chain' across multiple @@ -34,6 +36,8 @@ import org.alfresco.service.cmr.security.MutableAuthenticationService; */ public abstract class AbstractChainingAuthenticationService extends AbstractAuthenticationService implements MutableAuthenticationService { + private static final Log logger = LogFactory.getLog(AbstractChainingAuthenticationService.class); + /** * Instantiates a new abstract chaining authentication service. */ @@ -173,15 +177,26 @@ public abstract class AbstractChainingAuthenticationService extends AbstractAuth public void authenticate(String userName, char[] password) throws AuthenticationException { preAuthenticationCheck(userName); - for (AuthenticationService authService : getUsableAuthenticationServices()) + List usableAuthenticationServices = getUsableAuthenticationServices(); + int counter = usableAuthenticationServices.size(); + for (AuthenticationService authService : usableAuthenticationServices) { try { + counter--; authService.authenticate(userName, password); + if (logger.isDebugEnabled()) + { + logger.debug("authenticate "+userName+" with "+getId(authService)+" SUCCEEDED"); + } return; } catch (AuthenticationException e) { + if (logger.isDebugEnabled()) + { + logger.debug("authenticate "+userName+" with "+getId(authService)+(counter == 0 ? " FAILED (end of chain)" : " failed (try next in chain)")); + } // Ignore and chain } } @@ -189,6 +204,17 @@ public abstract class AbstractChainingAuthenticationService extends AbstractAuth } + /** + * Should be overridden to returns the ID of the authService for use in debug. + * @param authService in question. + * @return the ID of the authService. This implementation has no way to work + * this out so returns the simple class name. + */ + protected String getId(AuthenticationService authService) + { + return authService.getClass().getSimpleName(); + } + /** * {@inheritDoc} */ diff --git a/source/java/org/alfresco/repo/security/authentication/subsystems/SubsystemChainingAuthenticationService.java b/source/java/org/alfresco/repo/security/authentication/subsystems/SubsystemChainingAuthenticationService.java index 31b3c76d20..09c120044c 100644 --- a/source/java/org/alfresco/repo/security/authentication/subsystems/SubsystemChainingAuthenticationService.java +++ b/source/java/org/alfresco/repo/security/authentication/subsystems/SubsystemChainingAuthenticationService.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2012 Alfresco Software Limited. * * This file is part of Alfresco * @@ -193,4 +193,24 @@ public class SubsystemChainingAuthenticationService extends AbstractChainingAuth } } + @Override + protected String getId(AuthenticationService authService) + { + this.lock.readLock().lock(); + try + { + for (String instance : this.instanceIds) + { + if (authService.equals(this.sourceBeans.get(instance))) + { + return instance; + } + } + } + finally + { + this.lock.readLock().unlock(); + } + return super.getId(authService); + } }