From 459fcb72595f12a9d02a15672a3a676c25790d06 Mon Sep 17 00:00:00 2001
From: buczekp <buczekp>
Date: Wed, 8 Apr 2009 11:57:27 +0000
Subject: [PATCH] [LMS-825] added code generation using sequence (not used yet
 during registration)

SVN: 10629
---
 .../business/bo/AbstractBusinessObject.java   | 17 ++++
 .../server/business/bo/ExperimentBO.java      |  5 ++
 .../generic/server/business/bo/SampleBO.java  |  7 ++
 .../server/dataaccess/IDAOFactory.java        |  4 +
 .../server/dataaccess/db/AbstractDAO.java     | 16 +++-
 .../server/dataaccess/db/CodeSequenceDAO.java | 43 ++++++++++
 .../server/dataaccess/db/DAOFactory.java      |  8 ++
 .../server/dataaccess/db/ExternalDataDAO.java | 32 ++++---
 .../dataaccess/db/ICodeSequenceDAO.java       | 29 +++++++
 .../generic/shared/dto/SequenceNames.java     | 84 ++++++++++---------
 openbis/source/sql/generic/032/schema-032.sql |  1 +
 .../migration/migration-031-032.sql           |  6 ++
 12 files changed, 190 insertions(+), 62 deletions(-)
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/CodeSequenceDAO.java
 create mode 100644 openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ICodeSequenceDAO.java

diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
index cbe85c2cc78..b5c7450d7db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IRoleAssignmentDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleTypeDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IVocabularyDAO;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.ICodeSequenceDAO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
@@ -77,6 +78,17 @@ abstract class AbstractBusinessObject implements IDAOFactory
         DataAccessExceptionTranslator.throwException(exception, subject);
     }
 
+    /**
+     * @return Generated code for given <var>entityKind</var>. The code has a prefix that depends on
+     *         <var>entityKind</var> and a sufix witch is a unique number.
+     */
+    protected String createCode(EntityKind entityKind)
+    {
+        final long id = getCodeSequenceDAO().getNextCodeSequenceId();
+        final String code = String.valueOf(entityKind.name().charAt(0)) + id;
+        return code;
+    }
+
     //
     // IDAOFactory
     //
@@ -180,4 +192,9 @@ abstract class AbstractBusinessObject implements IDAOFactory
     {
         return daoFactory.getMaterialDAO();
     }
+
+    public ICodeSequenceDAO getCodeSequenceDAO()
+    {
+        return daoFactory.getCodeSequenceDAO();
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index 11700775116..e45cf0c5ea6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -336,4 +336,9 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
                 properties, registrator));
     }
 
+    public void setGeneratedCode()
+    {
+        final String code = createCode(EntityKind.EXPERIMENT);
+        experiment.setCode(code);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
index 917721bcc2b..cbe0b33266a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SourceType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.IdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
  * The unique {@link ISampleBO} implementation.
@@ -298,4 +299,10 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam
         sample.setProperties(entityPropertiesConverter.updateProperties(existingProperties, type,
                 properties, registrator));
     }
+
+    public void setGeneratedCode()
+    {
+        final String code = createCode(EntityKind.SAMPLE);
+        sample.setCode(code);
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java
index 1a7096f7e1f..d5db673d6d9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/IDAOFactory.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.dataaccess;
 
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.ICodeSequenceDAO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
 
 /**
@@ -88,4 +89,7 @@ public interface IDAOFactory extends IAuthorizationDAOFactory
      */
     public IMaterialDAO getMaterialDAO();
 
+    /** Returns an implementation of {@link ICodeSequenceDAO} */
+    public ICodeSequenceDAO getCodeSequenceDAO();
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
index ae6da3fb020..101aa3e5d32 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/AbstractDAO.java
@@ -20,6 +20,8 @@ import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.List;
 
+import net.sf.beanlib.hibernate3.Hibernate3SequenceGenerator;
+
 import org.hibernate.HibernateException;
 import org.hibernate.Query;
 import org.hibernate.SQLQuery;
@@ -104,8 +106,8 @@ public abstract class AbstractDAO extends HibernateDaoSupport
     /**
      * Casts given <var>list</var> to specified type.
      * <p>
-     * The purpose of this method is to avoid <code>SuppressWarnings("unchecked")</code> in
-     * calling methods.
+     * The purpose of this method is to avoid <code>SuppressWarnings("unchecked")</code> in calling
+     * methods.
      * </p>
      */
     @SuppressWarnings("unchecked")
@@ -117,8 +119,8 @@ public abstract class AbstractDAO extends HibernateDaoSupport
     /**
      * Ensures that given {@link List} contains one and only one entity.
      * 
-     * @throws EmptyResultDataAccessException if given <var>entities</var> are <code>null</code>
-     *             or empty.
+     * @throws EmptyResultDataAccessException if given <var>entities</var> are <code>null</code> or
+     *             empty.
      * @throws IncorrectResultSizeDataAccessException if more than one entity is found in given
      *             {@link List}.
      */
@@ -218,4 +220,10 @@ public abstract class AbstractDAO extends HibernateDaoSupport
     {
         return objects;
     }
+
+    protected final long getNextSequenceId(String sequenceName)
+    {
+        return Hibernate3SequenceGenerator.nextval(sequenceName, getSession(true));
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/CodeSequenceDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/CodeSequenceDAO.java
new file mode 100644
index 00000000000..5350bfe6aec
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/CodeSequenceDAO.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
+
+import org.hibernate.SessionFactory;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SequenceNames;
+
+/**
+ * <i>Data Access Object</i> implementation for sequence named {@link SequenceNames#CODE_SEQUENCE}.
+ * 
+ * @author Piotr Buczek
+ */
+public class CodeSequenceDAO extends AbstractDAO implements ICodeSequenceDAO
+{
+
+    protected CodeSequenceDAO(final SessionFactory sessionFactory,
+            final DatabaseInstancePE databaseInstance)
+    {
+        super(sessionFactory, databaseInstance);
+    }
+
+    public long getNextCodeSequenceId()
+    {
+        return getNextSequenceId(SequenceNames.CODE_SEQUENCE);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
index 1fddb7f67d2..b6ccb96e0cb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DAOFactory.java
@@ -78,6 +78,8 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
 
     private final IMaterialDAO materialDAO;
 
+    private final ICodeSequenceDAO codeSequenceDAO;
+
     public DAOFactory(final DatabaseConfigurationContext context,
             final SessionFactory sessionFactory)
     {
@@ -95,6 +97,7 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
         fileFormatTypeDAO = new FileFormatTypeDAO(sessionFactory, databaseInstance);
         locatorTypeDAO = new LocatorTypeDAO(sessionFactory, databaseInstance);
         materialDAO = new MaterialDAO(sessionFactory, databaseInstance);
+        codeSequenceDAO = new CodeSequenceDAO(sessionFactory, databaseInstance);
         final EntityKind[] entityKinds = EntityKind.values();
         for (final EntityKind entityKind : entityKinds)
         {
@@ -179,4 +182,9 @@ public final class DAOFactory extends AuthorizationDAOFactory implements IDAOFac
     {
         return materialDAO;
     }
+
+    public ICodeSequenceDAO getCodeSequenceDAO()
+    {
+        return codeSequenceDAO;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
index 64f788c6860..f0a59908e43 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ExternalDataDAO.java
@@ -19,8 +19,6 @@ package ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
 import java.util.Date;
 import java.util.List;
 
-import net.sf.beanlib.hibernate3.Hibernate3SequenceGenerator;
-
 import org.apache.commons.lang.time.DateFormatUtils;
 import org.apache.log4j.Logger;
 import org.hibernate.SessionFactory;
@@ -54,13 +52,13 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
 final class ExternalDataDAO extends AbstractDAO implements IExternalDataDAO
 {
     private static final String EXTERNAL_DATA_UPDATE_TEMPLATE =
-        "insert into %s (data_id, location, loty_id, ffty_id, is_complete, cvte_id_stor_fmt) "
-        + "values (%d, '%s', %d, %d, '%c', %d)";
-    
+            "insert into %s (data_id, location, loty_id, ffty_id, is_complete, cvte_id_stor_fmt) "
+                    + "values (%d, '%s', %d, %d, '%c', %d)";
+
     private final static String DATA_CODE_DATE_FORMAT_PATTERN = "yyyyMMddHHmmssSSS";
-    
+
     private final static Class<ExternalDataPE> ENTITY_CLASS = ExternalDataPE.class;
-    
+
     private final static Class<DataPE> ENTITY_SUPER_CLASS = DataPE.class;
 
     private static final Logger operationLog =
@@ -85,8 +83,8 @@ final class ExternalDataDAO extends AbstractDAO implements IExternalDataDAO
 
         final List<ExternalDataPE> list =
                 cast(getHibernateTemplate().find(
-                        String.format("from %s e where e.%s = ? and e.deleted = false", TABLE_NAME, sourceType
-                                .getFieldName()), toArray(sample)));
+                        String.format("from %s e where e.%s = ? and e.deleted = false", TABLE_NAME,
+                                sourceType.getFieldName()), toArray(sample)));
         if (operationLog.isDebugEnabled())
         {
             operationLog.debug(String.format(
@@ -134,8 +132,7 @@ final class ExternalDataDAO extends AbstractDAO implements IExternalDataDAO
 
     public String createDataSetCode()
     {
-        long id =
-                Hibernate3SequenceGenerator.nextval(SequenceNames.DATA_SEQUENCE, getSession(true));
+        long id = getNextSequenceId(SequenceNames.DATA_SEQUENCE);
         return DateFormatUtils.format(new Date(), DATA_CODE_DATE_FORMAT_PATTERN) + "-"
                 + Long.toString(id);
     }
@@ -143,7 +140,7 @@ final class ExternalDataDAO extends AbstractDAO implements IExternalDataDAO
     public void createDataSet(DataPE dataset)
     {
         assert dataset != null : "Unspecified data set.";
-        
+
         dataset.setCode(CodeConverter.tryToDatabase(dataset.getCode()));
         final HibernateTemplate template = getHibernateTemplate();
         template.save(dataset);
@@ -168,10 +165,8 @@ final class ExternalDataDAO extends AbstractDAO implements IExternalDataDAO
         if (loaded instanceof ExternalDataPE == false)
         {
             String location = externalData.getLocation();
-            Long locatorTypeID = externalData
-                    .getLocatorType().getId();
-            Long fileFormatTypeID = externalData.getFileFormatType()
-                    .getId();
+            Long locatorTypeID = externalData.getLocatorType().getId();
+            Long fileFormatTypeID = externalData.getFileFormatType().getId();
             char complete = externalData.getComplete().name().charAt(0);
             Long storageFormatTermID = externalData.getStorageFormatVocabularyTerm().getId();
             final String sql =
@@ -189,10 +184,11 @@ final class ExternalDataDAO extends AbstractDAO implements IExternalDataDAO
         }
     }
 
-    public void markAsDeleted(ExternalDataPE dataSet, PersonPE registrator, String description, String reason)
+    public void markAsDeleted(ExternalDataPE dataSet, PersonPE registrator, String description,
+            String reason)
     {
         assert dataSet != null : "Unspecified data set.";
-        
+
         dataSet.setDeleted(true);
         EventPE event = new EventPE();
         event.setEventType(EventType.DELETION);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ICodeSequenceDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ICodeSequenceDAO.java
new file mode 100644
index 00000000000..0338b6aca63
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/ICodeSequenceDAO.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 ch.systemsx.cisd.openbis.generic.server.dataaccess.db;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.SequenceNames;
+
+/**
+ * <i>Data Access Object</i> for sequence named {@link SequenceNames#CODE_SEQUENCE}.
+ * 
+ * @author Piotr Buczek
+ */
+public interface ICodeSequenceDAO
+{
+    public long getNextCodeSequenceId();
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SequenceNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SequenceNames.java
index d93e76888e0..2f3526d0ddb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SequenceNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SequenceNames.java
@@ -21,81 +21,85 @@ package ch.systemsx.cisd.openbis.generic.shared.dto;
  * 
  * @author Christian Ribeaud
  */
-public final class SequenceNames {
+public final class SequenceNames
+{
 
-	public static final String CONTROLLED_VOCABULARY_SEQUENCE = "CONTROLLED_VOCABULARY_ID_SEQ";
+    public static final String CONTROLLED_VOCABULARY_SEQUENCE = "CONTROLLED_VOCABULARY_ID_SEQ";
 
-	public static final String CONTROLLED_VOCABULARY_TERM_SEQUENCE = "CVTE_ID_SEQ";
+    public static final String CONTROLLED_VOCABULARY_TERM_SEQUENCE = "CVTE_ID_SEQ";
 
-	public static final String DATA_SEQUENCE = "DATA_ID_SEQ";
+    public static final String DATA_SEQUENCE = "DATA_ID_SEQ";
 
-	public static final String DATA_SET_RELATIONSHIP_SEQUENCE = "DATA_SET_RELATIONSHIP_ID_SEQ";
+    public static final String DATA_SET_RELATIONSHIP_SEQUENCE = "DATA_SET_RELATIONSHIP_ID_SEQ";
 
-	public static final String DATA_SET_TYPE_SEQUENCE = "DATA_SET_TYPE_ID_SEQ";
+    public static final String DATA_SET_TYPE_SEQUENCE = "DATA_SET_TYPE_ID_SEQ";
 
-	public static final String DATA_STORE_SEQUENCE = "DATA_STORE_ID_SEQ";
+    public static final String DATA_STORE_SEQUENCE = "DATA_STORE_ID_SEQ";
 
-	public static final String DATA_TYPE_SEQUENCE = "DATA_TYPE_ID_SEQ";
+    public static final String DATA_TYPE_SEQUENCE = "DATA_TYPE_ID_SEQ";
 
-	public static final String DATABASE_INSTANCE_SEQUENCE = "DATABASE_INSTANCE_ID_SEQ";
+    public static final String DATABASE_INSTANCE_SEQUENCE = "DATABASE_INSTANCE_ID_SEQ";
 
-	public static final String ATTACHMENT_CONTENT_SEQUENCE = "ATTACHMENT_CONTENT_ID_SEQ";
+    public static final String ATTACHMENT_CONTENT_SEQUENCE = "ATTACHMENT_CONTENT_ID_SEQ";
 
-	public static final String ATTACHMENT_SEQUENCE = "ATTACHMENT_ID_SEQ";
+    public static final String ATTACHMENT_SEQUENCE = "ATTACHMENT_ID_SEQ";
 
-	public static final String EXPERIMENT_PROPERTY_SEQUENCE = "EXPERIMENT_PROPERTY_ID_SEQ";
+    public static final String EXPERIMENT_PROPERTY_SEQUENCE = "EXPERIMENT_PROPERTY_ID_SEQ";
 
-	public static final String DATA_SET_PROPERTY_SEQUENCE = "DATA_SET_PROPERTY_ID_SEQ";
+    public static final String DATA_SET_PROPERTY_SEQUENCE = "DATA_SET_PROPERTY_ID_SEQ";
 
-	public static final String EXPERIMENT_SEQUENCE = "EXPERIMENT_ID_SEQ";
+    public static final String EXPERIMENT_SEQUENCE = "EXPERIMENT_ID_SEQ";
 
-	public static final String EXPERIMENT_TYPE_PROPERTY_TYPE_SEQUENCE = "ETPT_ID_SEQ";
+    public static final String EXPERIMENT_TYPE_PROPERTY_TYPE_SEQUENCE = "ETPT_ID_SEQ";
 
-	public static final String DATA_SET_TYPE_PROPERTY_TYPE_SEQUENCE = "DSTPT_ID_SEQ";
+    public static final String DATA_SET_TYPE_PROPERTY_TYPE_SEQUENCE = "DSTPT_ID_SEQ";
 
-	public static final String EXPERIMENT_TYPE_SEQUENCE = "EXPERIMENT_TYPE_ID_SEQ";
+    public static final String EXPERIMENT_TYPE_SEQUENCE = "EXPERIMENT_TYPE_ID_SEQ";
 
-	public static final String FILE_FORMAT_TYPE_SEQUENCE = "FILE_FORMAT_TYPE_ID_SEQ";
+    public static final String FILE_FORMAT_TYPE_SEQUENCE = "FILE_FORMAT_TYPE_ID_SEQ";
 
-	public static final String GROUP_SEQUENCE = "GROUP_ID_SEQ";
+    public static final String GROUP_SEQUENCE = "GROUP_ID_SEQ";
 
-	public static final String INVALIDATION_SEQUENCE = "INVALIDATION_ID_SEQ";
+    public static final String INVALIDATION_SEQUENCE = "INVALIDATION_ID_SEQ";
 
-	public static final String LOCATOR_TYPE_SEQUENCE = "LOCATOR_TYPE_ID_SEQ";
+    public static final String LOCATOR_TYPE_SEQUENCE = "LOCATOR_TYPE_ID_SEQ";
 
-	public static final String MATERIAL_BATCH_SEQUENCE = "MATERIAL_BATCH_ID_SEQ";
+    public static final String MATERIAL_BATCH_SEQUENCE = "MATERIAL_BATCH_ID_SEQ";
 
-	public static final String MATERIAL_PROPERTY_SEQUENCE = "MATERIAL_PROPERTY_ID_SEQ";
+    public static final String MATERIAL_PROPERTY_SEQUENCE = "MATERIAL_PROPERTY_ID_SEQ";
 
-	public static final String MATERIAL_SEQUENCE = "MATERIAL_ID_SEQ";
+    public static final String MATERIAL_SEQUENCE = "MATERIAL_ID_SEQ";
 
-	public static final String MATERIAL_TYPE_PROPERTY_TYPE_SEQUENCE = "MTPT_ID_SEQ";
+    public static final String MATERIAL_TYPE_PROPERTY_TYPE_SEQUENCE = "MTPT_ID_SEQ";
 
-	public static final String MATERIAL_TYPE_SEQUENCE = "MATERIAL_TYPE_ID_SEQ";
+    public static final String MATERIAL_TYPE_SEQUENCE = "MATERIAL_TYPE_ID_SEQ";
 
-	public final static String PERSON_SEQUENCE = "PERSON_ID_SEQ";
+    public final static String PERSON_SEQUENCE = "PERSON_ID_SEQ";
 
-	public static final String PROJECT_SEQUENCE = "PROJECT_ID_SEQ";
+    public static final String PROJECT_SEQUENCE = "PROJECT_ID_SEQ";
 
-	public static final String PROPERTY_TYPES_SEQUENCE = "PROPERTY_TYPE_ID_SEQ";
+    public static final String PROPERTY_TYPES_SEQUENCE = "PROPERTY_TYPE_ID_SEQ";
 
-	public static final String ROLE_ASSIGNMENT_SEQUENCE = "ROLE_ASSIGNMENT_ID_SEQ";
+    public static final String ROLE_ASSIGNMENT_SEQUENCE = "ROLE_ASSIGNMENT_ID_SEQ";
 
-	public static final String SAMPLE_INPUT_SEQUENCE = "SAMPLE_INPUT_ID_SEQ";
+    public static final String SAMPLE_INPUT_SEQUENCE = "SAMPLE_INPUT_ID_SEQ";
 
-	public static final String SAMPLE_MATERIAL_BATCH_SEQUENCE = "SAMPLE_MATERIAL_BATCH_ID_SEQ";
+    public static final String SAMPLE_MATERIAL_BATCH_SEQUENCE = "SAMPLE_MATERIAL_BATCH_ID_SEQ";
 
-	public static final String SAMPLE_PROPERTY_SEQUENCE = "SAMPLE_PROPERTY_ID_SEQ";
+    public static final String SAMPLE_PROPERTY_SEQUENCE = "SAMPLE_PROPERTY_ID_SEQ";
 
-	public static final String SAMPLE_SEQUENCE = "SAMPLE_ID_SEQ";
+    public static final String SAMPLE_SEQUENCE = "SAMPLE_ID_SEQ";
 
-	public static final String SAMPLE_TYPE_PROPERTY_TYPE_SEQUENCE = "STPT_ID_SEQ";
+    public static final String SAMPLE_TYPE_PROPERTY_TYPE_SEQUENCE = "STPT_ID_SEQ";
 
-	public static final String SAMPLE_TYPE_SEQUENCE = "SAMPLE_TYPE_ID_SEQ";
+    public static final String SAMPLE_TYPE_SEQUENCE = "SAMPLE_TYPE_ID_SEQ";
 
-	public static final String EVENT_SEQUENCE = "EVENT_ID_SEQ";
+    public static final String EVENT_SEQUENCE = "EVENT_ID_SEQ";
 
-	private SequenceNames() {
-		// Can not be instantiated.
-	}
+    public static final String CODE_SEQUENCE = "CODE_SEQ";
+
+    private SequenceNames()
+    {
+        // Can not be instantiated.
+    }
 }
diff --git a/openbis/source/sql/generic/032/schema-032.sql b/openbis/source/sql/generic/032/schema-032.sql
index 44d49b6e4be..dadb3df633c 100644
--- a/openbis/source/sql/generic/032/schema-032.sql
+++ b/openbis/source/sql/generic/032/schema-032.sql
@@ -128,6 +128,7 @@ CREATE SEQUENCE SAMPLE_TYPE_ID_SEQ;
 CREATE SEQUENCE STPT_ID_SEQ;
 CREATE SEQUENCE DATA_SET_PROPERTY_ID_SEQ;
 CREATE SEQUENCE DSTPT_ID_SEQ;
+CREATE SEQUENCE CODE_SEQ;
 
 -- Creating primary key constraints
 
diff --git a/openbis/source/sql/postgresql/migration/migration-031-032.sql b/openbis/source/sql/postgresql/migration/migration-031-032.sql
index 2e1532900d4..e9dcb7ed1d3 100644
--- a/openbis/source/sql/postgresql/migration/migration-031-032.sql
+++ b/openbis/source/sql/postgresql/migration/migration-031-032.sql
@@ -57,6 +57,12 @@ DROP TABLE procedure_types;
 DROP SEQUENCE procedure_id_seq;
 DROP SEQUENCE procedure_type_id_seq;
 
+-- -------
+-- Add CODE_SEQ
+-- -------
+
+CREATE SEQUENCE CODE_SEQ;
+
 ------------------------------------------------------------------------------------
 --  Purpose:  Replace trigger SAMPLE_CODE_UNIQUENESS_CHECK 
 ------------------------------------------------------------------------------------
-- 
GitLab