Class AutoNumServiceImpl

java.lang.Object
fr.becpg.repo.entity.impl.AutoNumServiceImpl
All Implemented Interfaces:
AutoNumService

@Service("autoNumService") public class AutoNumServiceImpl extends Object implements AutoNumService
Enhanced implementation of AutoNumService with improved thread safety, error handling, and performance optimizations.
Version:
$Id: $Id
Author:
querephi
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    private static class 
     
  • Field Summary

    Fields
    Modifier and Type
    Field
    Description
     
    private static final String
    Constant CACHE_KEY_SEPARATOR="-"
    private static final Long
    Constant DEFAULT_AUTO_NUM
    private static final Pattern
    Constant DEFAULT_PATTERN
    private static final String
    Constant DEFAULT_PREFIX=""
    private org.alfresco.service.cmr.dictionary.DictionaryService
     
     
    private static final org.apache.commons.logging.Log
    Constant logger
    private static final String
    Constant NAME_TEMPLATE="%s - %s"
    private org.alfresco.repo.domain.node.NodeDAO
     
    private org.alfresco.service.cmr.repository.NodeService
     
    private org.alfresco.repo.policy.BehaviourFilter
     
    private static final String
    Constant PREFIX_MSG_PREFIX="autonum.prefix."
    private RepoService
     
    private org.alfresco.repo.model.Repository
     
    private org.alfresco.service.transaction.TransactionService
     
  • Constructor Summary

    Constructors
    Constructor
    Description
     
  • Method Summary

    Modifier and Type
    Method
    Description
    private String
    buildPrefixPattern(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName)
    buildPrefixPattern.
    private Long
    createAutoNum(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long autoNumValue, String autoNumPrefix)
    createAutoNum.
    private Map<org.alfresco.service.namespace.QName,Serializable>
    createAutoNumProperties(String name, org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long autoNumValue, String autoNumPrefix)
    createAutoNumProperties.
    private String
    createCacheKey(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    createCacheKey.
    private String
    createLockKey(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    createLockKey.
    private String
    createMatchPattern.
    private String
    createNewAutoNum(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    createNewAutoNum.
    private void
    createOrUpdateAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, String autoNumCode)
    createOrUpdateAutoNumValue.
    void
    deleteAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    Delete auto num value.
    private void
    deleteCounter(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    Deletes a counter node and evicts it from the cache.
    private Optional<org.alfresco.service.cmr.repository.NodeRef>
    findAutoNumNodeRef(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    findAutoNumNodeRef.
    private String
    formatCode(String prefix, Long autoNumValue)
    formatCode.
    private String
    generateAndSetNewCode(org.alfresco.service.cmr.repository.NodeRef nodeRef, org.alfresco.service.namespace.QName typeQName, org.alfresco.service.namespace.QName codeQName)
    generateAndSetNewCode.
    private String
    generateNextAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    generateNextAutoNumValue.
    getAutoNumMatchPattern(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName)
    getAutoNumMatchPattern.
    org.alfresco.service.cmr.repository.NodeRef
    getAutoNumNodeRef(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    getAutoNumNodeRef.
    private String
    getAutoNumPrefix(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName)
    getAutoNumPrefix.
    getAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    Gets the auto num value.
    private String
    getDefaultPrefix(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    getDefaultPrefix.
    getOrCreateBeCPGCode(org.alfresco.service.cmr.repository.NodeRef nodeRef)
    getOrCreateBeCPGCode.
    getOrCreateCode(org.alfresco.service.cmr.repository.NodeRef nodeRef, org.alfresco.service.namespace.QName codeQName)
    getOrCreateCode.
    private String
    getPrefix(org.alfresco.service.cmr.repository.NodeRef autoNumNodeRef, String defaultPrefix)
    getPrefix.
    getPrefixedCode(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName, Long autoNumValue)
    getPrefixedCode.
    private String
    incrementExistingAutoNum(org.alfresco.service.cmr.repository.NodeRef autoNumNodeRef)
    incrementExistingAutoNum.
    private boolean
    isCodeAlreadyUsed(org.alfresco.service.namespace.QName typeQName, org.alfresco.service.namespace.QName codeQName, String code, org.alfresco.service.cmr.repository.NodeRef excludeNodeRef)
    isCodeAlreadyUsed.
    private boolean
    isCommittedByAnotherTransaction(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    Tells whether the counter exists and was last written by a transaction other than the current one.
    parseAutoNumCode(String autoNumCode, org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    parseAutoNumCode.
    private String
    processNodeCode(org.alfresco.service.cmr.repository.NodeRef nodeRef, org.alfresco.service.namespace.QName codeQName)
    processNodeCode.
    boolean
    setAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long counter)
    setAutoNumValue.
    private boolean
    updateCounterValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long counter)
    Sets the value of an existing counter.
    private void
    updateExistingAutoNumIfNecessary(org.alfresco.service.cmr.repository.NodeRef autoNumNodeRef, Long newValue)
    updateExistingAutoNumIfNecessary.
    private void
    validateInputs(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
    validateInputs.
    private <T> T
    writeCounter(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Supplier<T> write)
    Runs a write on a counter node under the lock of that counter, in its own short transaction whenever the counter is already committed.
    private <T> T
    Runs a counter write without updating the auditable properties of the counter, as the caller transaction does for the entity it codes.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Field Details

    • NAME_TEMPLATE

      private static final String NAME_TEMPLATE
      Constant NAME_TEMPLATE="%s - %s"
      See Also:
    • DEFAULT_AUTO_NUM

      private static final Long DEFAULT_AUTO_NUM
      Constant DEFAULT_AUTO_NUM
    • PREFIX_MSG_PREFIX

      private static final String PREFIX_MSG_PREFIX
      Constant PREFIX_MSG_PREFIX="autonum.prefix."
      See Also:
    • DEFAULT_PREFIX

      private static final String DEFAULT_PREFIX
      Constant DEFAULT_PREFIX=""
      See Also:
    • DEFAULT_PATTERN

      private static final Pattern DEFAULT_PATTERN
      Constant DEFAULT_PATTERN
    • CACHE_KEY_SEPARATOR

      private static final String CACHE_KEY_SEPARATOR
      Constant CACHE_KEY_SEPARATOR="-"
      See Also:
    • logger

      private static final org.apache.commons.logging.Log logger
      Constant logger
    • lockMap

      private final ConcurrentHashMap<String,ReentrantLock> lockMap
    • nodeService

      @Autowired private org.alfresco.service.cmr.repository.NodeService nodeService
    • repoService

      @Autowired private RepoService repoService
    • repositoryHelper

      @Autowired private org.alfresco.repo.model.Repository repositoryHelper
    • dictionaryService

      @Autowired private org.alfresco.service.cmr.dictionary.DictionaryService dictionaryService
    • beCPGCacheService

      @Autowired private BeCPGCacheService beCPGCacheService
    • policyBehaviourFilter

      @Autowired private org.alfresco.repo.policy.BehaviourFilter policyBehaviourFilter
    • transactionService

      @Autowired private org.alfresco.service.transaction.TransactionService transactionService
    • nodeDAO

      @Autowired private org.alfresco.repo.domain.node.NodeDAO nodeDAO
  • Constructor Details

    • AutoNumServiceImpl

      public AutoNumServiceImpl()
  • Method Details

    • getAutoNumValue

      public String getAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
      Gets the auto num value.
      Specified by:
      getAutoNumValue in interface AutoNumService
      Parameters:
      className - the class name
      propertyName - the property name
      Returns:
      the auto num value
    • setAutoNumValue

      public boolean setAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long counter)

      setAutoNumValue.

      Specified by:
      setAutoNumValue in interface AutoNumService
      Parameters:
      className - a QName object
      propertyName - a QName object
      counter - a Long object
      Returns:
      a boolean
    • deleteAutoNumValue

      public void deleteAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
      Delete auto num value.
      Specified by:
      deleteAutoNumValue in interface AutoNumService
      Parameters:
      className - the class name
      propertyName - the property name
    • getAutoNumMatchPattern

      public String getAutoNumMatchPattern(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName)

      getAutoNumMatchPattern.

      Specified by:
      getAutoNumMatchPattern in interface AutoNumService
      Parameters:
      type - a QName object.
      propertyName - a QName object.
      Returns:
      the pattern string for the corresponding code
    • getPrefixedCode

      public String getPrefixedCode(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName, Long autoNumValue)

      getPrefixedCode.

      Specified by:
      getPrefixedCode in interface AutoNumService
      Parameters:
      type - a QName object.
      propertyName - a QName object.
      autoNumValue - a Long object.
      Returns:
      the prefixed String for the given type
    • getOrCreateCode

      public String getOrCreateCode(org.alfresco.service.cmr.repository.NodeRef nodeRef, org.alfresco.service.namespace.QName codeQName)

      getOrCreateCode.

      Specified by:
      getOrCreateCode in interface AutoNumService
      Parameters:
      nodeRef - a NodeRef object.
      codeQName - a QName object.
      Returns:
      a String object.
    • getOrCreateBeCPGCode

      public String getOrCreateBeCPGCode(org.alfresco.service.cmr.repository.NodeRef nodeRef)

      getOrCreateBeCPGCode.

      Specified by:
      getOrCreateBeCPGCode in interface AutoNumService
      Parameters:
      nodeRef - a NodeRef object.
      Returns:
      a String object.
    • getAutoNumNodeRef

      public org.alfresco.service.cmr.repository.NodeRef getAutoNumNodeRef(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      getAutoNumNodeRef.

      Specified by:
      getAutoNumNodeRef in interface AutoNumService
      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      the NodeRef of the AutoNum value
    • validateInputs

      private void validateInputs(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      validateInputs.

      Parameters:
      className - a QName object
      propertyName - a QName object
    • writeCounter

      private <T> T writeCounter(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Supplier<T> write)
      Runs a write on a counter node under the lock of that counter, in its own short transaction whenever the counter is already committed.

      The database row lock taken by the write is then released when the inner transaction commits, before the Java lock is released. A caller transaction therefore never holds the counter row while it waits for the Java lock: otherwise two transactions coding several entities each wait for the other one, a cycle neither the JVM nor the database can detect, that only ends with the lock wait timeout.

      The write stays in the caller transaction when the counter does not exist yet, or when the caller transaction has already written it: the inner transaction cannot see the counter, or the folders it lives in, before the caller commits, and would wait for a row locked by its own suspended caller.

      A counter value consumed by a caller transaction that rolls back or retries is lost, leaving a gap in the numbering.

      Type Parameters:
      T - the type returned by the write
      Parameters:
      className - the class the counter belongs to
      propertyName - the property the counter numbers
      write - the write to run on the counter node
      Returns:
      the value returned by the write
    • isCommittedByAnotherTransaction

      private boolean isCommittedByAnotherTransaction(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
      Tells whether the counter exists and was last written by a transaction other than the current one.
      Parameters:
      className - the class the counter belongs to
      propertyName - the property the counter numbers
      Returns:
      true if the counter can be written in its own transaction
    • writeWithoutAuditing

      private <T> T writeWithoutAuditing(Supplier<T> write)
      Runs a counter write without updating the auditable properties of the counter, as the caller transaction does for the entity it codes.
      Type Parameters:
      T - the type returned by the write
      Parameters:
      write - the write to run on the counter node
      Returns:
      the value returned by the write
    • updateCounterValue

      private boolean updateCounterValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long counter)
      Sets the value of an existing counter.
      Parameters:
      className - the class the counter belongs to
      propertyName - the property the counter numbers
      counter - the new value of the counter
      Returns:
      true if the counter exists and was updated, false otherwise
    • deleteCounter

      private void deleteCounter(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)
      Deletes a counter node and evicts it from the cache.
      Parameters:
      className - the class the counter belongs to
      propertyName - the property the counter numbers
    • createLockKey

      private String createLockKey(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      createLockKey.

      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • createCacheKey

      private String createCacheKey(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      createCacheKey.

      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • generateNextAutoNumValue

      private String generateNextAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      generateNextAutoNumValue.

      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • incrementExistingAutoNum

      private String incrementExistingAutoNum(org.alfresco.service.cmr.repository.NodeRef autoNumNodeRef)

      incrementExistingAutoNum.

      Parameters:
      autoNumNodeRef - a NodeRef object
      Returns:
      a String object
    • createNewAutoNum

      private String createNewAutoNum(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      createNewAutoNum.

      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • findAutoNumNodeRef

      private Optional<org.alfresco.service.cmr.repository.NodeRef> findAutoNumNodeRef(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      findAutoNumNodeRef.

      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      a Optional object
    • buildPrefixPattern

      private String buildPrefixPattern(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName)

      buildPrefixPattern.

      Parameters:
      type - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • createMatchPattern

      private String createMatchPattern(String prefix)

      createMatchPattern.

      Parameters:
      prefix - a String object
      Returns:
      a String object
    • getAutoNumPrefix

      private String getAutoNumPrefix(org.alfresco.service.namespace.QName type, org.alfresco.service.namespace.QName propertyName)

      getAutoNumPrefix.

      Parameters:
      type - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • processNodeCode

      private String processNodeCode(org.alfresco.service.cmr.repository.NodeRef nodeRef, org.alfresco.service.namespace.QName codeQName)

      processNodeCode.

      Parameters:
      nodeRef - a NodeRef object
      codeQName - a QName object
      Returns:
      a String object
    • isCodeAlreadyUsed

      private boolean isCodeAlreadyUsed(org.alfresco.service.namespace.QName typeQName, org.alfresco.service.namespace.QName codeQName, String code, org.alfresco.service.cmr.repository.NodeRef excludeNodeRef)

      isCodeAlreadyUsed.

      Parameters:
      typeQName - a QName object
      codeQName - a QName object
      code - a String object
      excludeNodeRef - a NodeRef object
      Returns:
      a boolean
    • generateAndSetNewCode

      private String generateAndSetNewCode(org.alfresco.service.cmr.repository.NodeRef nodeRef, org.alfresco.service.namespace.QName typeQName, org.alfresco.service.namespace.QName codeQName)

      generateAndSetNewCode.

      Parameters:
      nodeRef - a NodeRef object
      typeQName - a QName object
      codeQName - a QName object
      Returns:
      a String object
    • createOrUpdateAutoNumValue

      private void createOrUpdateAutoNumValue(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, String autoNumCode)

      createOrUpdateAutoNumValue.

      Parameters:
      className - a QName object
      propertyName - a QName object
      autoNumCode - a String object
    • parseAutoNumCode

      private AutoNumServiceImpl.AutoNumInfo parseAutoNumCode(String autoNumCode, org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      parseAutoNumCode.

      Parameters:
      autoNumCode - a String object
      className - a QName object
      propertyName - a QName object
      Returns:
      a AutoNumServiceImpl.AutoNumInfo object
    • updateExistingAutoNumIfNecessary

      private void updateExistingAutoNumIfNecessary(org.alfresco.service.cmr.repository.NodeRef autoNumNodeRef, Long newValue)

      updateExistingAutoNumIfNecessary.

      Parameters:
      autoNumNodeRef - a NodeRef object
      newValue - a Long object
    • getDefaultPrefix

      private String getDefaultPrefix(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName)

      getDefaultPrefix.

      Parameters:
      className - a QName object
      propertyName - a QName object
      Returns:
      a String object
    • createAutoNum

      private Long createAutoNum(org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long autoNumValue, String autoNumPrefix)

      createAutoNum.

      Parameters:
      className - a QName object
      propertyName - a QName object
      autoNumValue - a Long object
      autoNumPrefix - a String object
      Returns:
      a Long object
    • createAutoNumProperties

      private Map<org.alfresco.service.namespace.QName,Serializable> createAutoNumProperties(String name, org.alfresco.service.namespace.QName className, org.alfresco.service.namespace.QName propertyName, Long autoNumValue, String autoNumPrefix)

      createAutoNumProperties.

      Parameters:
      name - a String object
      className - a QName object
      propertyName - a QName object
      autoNumValue - a Long object
      autoNumPrefix - a String object
      Returns:
      a Map object
    • getPrefix

      private String getPrefix(org.alfresco.service.cmr.repository.NodeRef autoNumNodeRef, String defaultPrefix)

      getPrefix.

      Parameters:
      autoNumNodeRef - a NodeRef object
      defaultPrefix - a String object
      Returns:
      a String object
    • formatCode

      private String formatCode(String prefix, Long autoNumValue)

      formatCode.

      Parameters:
      prefix - a String object
      autoNumValue - a Long object
      Returns:
      a String object