Changeset 3981


Ignore:
Timestamp:
2010-04-09 07:06:33 (3 years ago)
Author:
evert
Message:

Generate ids for fielddescriptors
Use names instead of ids in Records
Introduced mixins

Location:
projects/lily/trunk
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • projects/lily/trunk/indexer/src/test/java/org/lilycms/indexer/test/IndexerTest.java

    r3978 r3981  
    2424import org.lilycms.queue.api.QueueListener; 
    2525import org.lilycms.queue.api.QueueMessage; 
     26import org.lilycms.repository.api.FieldDescriptor; 
    2627import org.lilycms.repository.api.FieldGroup; 
    2728import org.lilycms.repository.api.IdGenerator; 
     
    7677        // Create a record type 
    7778        ValueType stringValueType = typeManager.getValueType("STRING", false, false); 
    78         typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("field1", stringValueType, "field1GN")); 
    79         typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("field2", stringValueType, "field2GN")); 
    80         typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("field3", stringValueType, "field3GN")); 
     79        FieldDescriptor fieldDescriptor1 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(stringValueType, "field1")); 
     80        FieldDescriptor fieldDescriptor2 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(stringValueType, "field2")); 
     81        FieldDescriptor fieldDescriptor3 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(stringValueType, "field3")); 
    8182        FieldGroup fieldGroup1 = typeManager.newFieldGroup("fieldGroup1"); 
    82         fieldGroup1.setFieldGroupEntry(typeManager.newFieldGroupEntry("field1", Long.valueOf(1), true, "alias1")); 
    83         fieldGroup1.setFieldGroupEntry(typeManager.newFieldGroupEntry("field2", Long.valueOf(1), true, "alias2")); 
    84         fieldGroup1.setFieldGroupEntry(typeManager.newFieldGroupEntry("field3", Long.valueOf(1), true, "alias3")); 
     83        fieldGroup1.setFieldGroupEntry(typeManager.newFieldGroupEntry(fieldDescriptor1.getId(), Long.valueOf(1), true, "alias1")); 
     84        fieldGroup1.setFieldGroupEntry(typeManager.newFieldGroupEntry(fieldDescriptor2.getId(), Long.valueOf(1), true, "alias2")); 
     85        fieldGroup1.setFieldGroupEntry(typeManager.newFieldGroupEntry(fieldDescriptor3.getId(), Long.valueOf(1), true, "alias3")); 
    8586        fieldGroup1 = typeManager.createFieldGroup(fieldGroup1); 
    8687 
    87         typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("nvfield1", stringValueType, "nvfield1GN")); 
     88        FieldDescriptor nvFieldDescriptor1 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(stringValueType, "nvfield1")); 
    8889        FieldGroup fieldGroup2 = typeManager.newFieldGroup("fieldGroup2"); 
    89         fieldGroup2.setFieldGroupEntry(typeManager.newFieldGroupEntry("nvfield1", Long.valueOf(1), true, "nvalias1")); 
     90        fieldGroup2.setFieldGroupEntry(typeManager.newFieldGroupEntry(nvFieldDescriptor1.getId(), Long.valueOf(1), true, "nvalias1")); 
    9091        fieldGroup2 = typeManager.createFieldGroup(fieldGroup2); 
    9192         
  • projects/lily/trunk/repository/api/src/main/java/org/lilycms/repository/api/FieldDescriptor.java

    r3977 r3981  
    3030 */ 
    3131public interface FieldDescriptor { 
     32 
     33    void setId(String string); 
    3234    /** 
    3335     * The id of the {@link FieldDescriptor} is also the id to be used by the corresponding {@link Field} 
     
    5153     * The name can be chose by the user. 
    5254     */ 
    53     void setGlobalName(String name); 
     55    void setName(String name); 
    5456     
    5557    /** 
    5658     * @return the global unique name of the {@link FieldDescriptor} 
    5759     */ 
    58     String getGlobalName(); 
     60    String getName(); 
    5961     
    6062    /** 
     
    7274 
    7375    FieldDescriptor clone(); 
     76 
    7477} 
  • projects/lily/trunk/repository/api/src/main/java/org/lilycms/repository/api/Record.java

    r3978 r3981  
    6060    Long getRecordTypeVersion(Scope scope); 
    6161     
    62     void setField(Scope scope, String fieldId, Object value); 
     62    void setField(Scope scope, String fieldName, Object value); 
    6363 
    64     Object getField(Scope scope, String fieldId) throws FieldNotFoundException; 
     64    Object getField(Scope scope, String fieldName) throws FieldNotFoundException; 
    6565 
    6666    Map<String, Object> getFields(Scope scope); 
    6767 
    68     void addFieldsToDelete(Scope scope, List<String> fieldIds); 
     68    void addFieldsToDelete(Scope scope, List<String> fieldNames); 
    6969     
    70     void removeFieldsToDelete(Scope scope, List<String> fieldIds); 
     70    void removeFieldsToDelete(Scope scope, List<String> fieldNames); 
    7171 
    7272    List<String> getFieldsToDelete(Scope scope); 
  • projects/lily/trunk/repository/api/src/main/java/org/lilycms/repository/api/RecordType.java

    r3978 r3981  
    1515 */ 
    1616package org.lilycms.repository.api; 
     17 
     18import java.util.Map; 
    1719 
    1820import org.lilycms.repository.api.Record.Scope; 
     
    4648    Long getFieldGroupVersion(Scope scope); 
    4749     
     50    void addMixin(String recordTypeId, Long recordTypeVersion); 
     51     
     52    void removeMixin(String recordTypeId); 
     53     
     54    Map<String, Long> getMixins(); 
     55     
    4856    RecordType clone(); 
    4957     
  • projects/lily/trunk/repository/api/src/main/java/org/lilycms/repository/api/Repository.java

    r3979 r3981  
    9090    Record read(RecordId recordId) throws RecordNotFoundException, RecordTypeNotFoundException, FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException; 
    9191 
    92     Record read(RecordId recordId, List<String> nonVersionableFieldIds, List<String> versionableFieldIds, List<String> versionableMutableFieldIds) throws RecordNotFoundException, RecordTypeNotFoundException, FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException; 
     92    Record read(RecordId recordId, List<String> nonVersionableFieldNames, List<String> versionableFieldNames, List<String> versionableMutableFieldNames) throws RecordNotFoundException, RecordTypeNotFoundException, FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException; 
    9393 
    9494    Record read(RecordId recordId, Long version) throws RecordNotFoundException, RecordTypeNotFoundException, FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException; 
    9595 
    96     Record read(RecordId recordId, Long version, List<String> nonVersionableFieldIds, List<String> versionableFieldIds, List<String> versionableMutableFieldIds) throws RecordNotFoundException, RecordTypeNotFoundException, FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException; 
     96    Record read(RecordId recordId, Long version, List<String> nonVersionableFieldNames, List<String> versionableFieldNames, List<String> versionableMutableFieldNames) throws RecordNotFoundException, RecordTypeNotFoundException, FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException; 
    9797 
    9898    /** 
  • projects/lily/trunk/repository/api/src/main/java/org/lilycms/repository/api/TypeManager.java

    r3977 r3981  
    1818import java.util.List; 
    1919 
     20import org.lilycms.repository.api.Record.Scope; 
     21 
    2022 
    2123/** 
     
    3436     * @throws RecordTypeExistsException when a recordType with the same id already exists on the repository  
    3537     * @throws FieldGroupNotFoundException when the recordType refers to a non-existing {@link FieldGroup} 
     38     * @throws RecordTypeNotFoundException when a mixin of the recordType refers to a non-existing {@link RecordType}  
    3639     * @throws RepositoryException when an unexpected exception occurs on the repository 
    3740     */ 
    38     RecordType createRecordType(RecordType recordType) throws RecordTypeExistsException, FieldGroupNotFoundException, RepositoryException; 
     41    RecordType createRecordType(RecordType recordType) throws RecordTypeExistsException, FieldGroupNotFoundException, RecordTypeNotFoundException, RepositoryException; 
    3942     
    4043    /** 
     
    117120     * Creates a new {@link FieldDescriptor} object. 
    118121     */ 
     122    FieldDescriptor newFieldDescriptor(ValueType valueType, String name); 
     123     
    119124    FieldDescriptor newFieldDescriptor(String id, ValueType valueType, String globalName); 
    120125     
     
    122127     * Creates a {@link FieldDescriptor} on the repository with the properties defined in the {@link FieldDescriptor} object. 
    123128     * @return a {@link FieldDescriptor} object containing the updated version number of the fieldDescriptor 
    124      * @throws FieldDescriptorExistsException if a fieldDescriptor with the same id already exists on the repository  
    125129     * @throws RepositoryException when an unexpected exception occurs on the repository 
    126130     */ 
    127     FieldDescriptor createFieldDescriptor(FieldDescriptor fieldDescriptor) throws FieldDescriptorExistsException, RepositoryException; 
     131    FieldDescriptor createFieldDescriptor(FieldDescriptor fieldDescriptor) throws RepositoryException; 
    128132 
    129133    /** 
     
    161165     */ 
    162166    ValueType getValueType(String primitiveValueTypeName, boolean multiValue, boolean hierarchical); 
     167 
     168    FieldDescriptor getFieldDescriptor(Scope scope, String name, RecordType recordType) throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException; 
     169    
    163170} 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/FieldDescriptorImpl.java

    r3977 r3981  
    2222public class FieldDescriptorImpl implements FieldDescriptor { 
    2323 
    24     private final String id; 
     24    private String id; 
    2525    private Long version; 
    2626    private ValueType valueType; 
    27     private String globalName; 
     27    private String name; 
    2828 
    2929    /** 
     
    3131     * @use {@link TypeManager#newFieldDescriptor} instead 
    3232     */ 
    33     public FieldDescriptorImpl(String id, ValueType valueType, String globalName) { 
     33    public FieldDescriptorImpl(String id, ValueType valueType, String name) { 
    3434        this.id = id; 
    3535        this.valueType = valueType; 
    36         this.globalName = globalName; 
     36        this.name = name; 
    3737    } 
    3838 
    39     public String getGlobalName() { 
    40         return globalName; 
     39    public String getName() { 
     40        return name; 
    4141    } 
    4242 
     
    5353    } 
    5454 
    55     public void setGlobalName(String name) { 
    56         this.globalName = name; 
     55    public void setId(String id) { 
     56        this.id = id; 
     57    } 
     58     
     59    public void setName(String name) { 
     60        this.name = name; 
    5761    } 
    5862 
     
    6670     
    6771    public FieldDescriptor clone() { 
    68         FieldDescriptorImpl clone = new FieldDescriptorImpl(this.id, this.valueType, this.globalName); 
     72        FieldDescriptorImpl clone = new FieldDescriptorImpl(this.id, this.valueType, this.name); 
    6973        clone.version = this.version; 
    7074        return clone; 
     
    7579        final int prime = 31; 
    7680        int result = 1; 
    77         result = prime * result + ((globalName == null) ? 0 : globalName.hashCode()); 
     81        result = prime * result + ((name == null) ? 0 : name.hashCode()); 
    7882        result = prime * result + ((id == null) ? 0 : id.hashCode()); 
    7983        result = prime * result + ((valueType == null) ? 0 : valueType.hashCode()); 
     
    9195            return false; 
    9296        FieldDescriptorImpl other = (FieldDescriptorImpl) obj; 
    93         if (globalName == null) { 
    94             if (other.globalName != null) 
     97        if (name == null) { 
     98            if (other.name != null) 
    9599                return false; 
    96         } else if (!globalName.equals(other.globalName)) 
     100        } else if (!name.equals(other.name)) 
    97101            return false; 
    98102        if (id == null) { 
     
    116120    @Override 
    117121    public String toString() { 
    118         return "FieldDescriptorImpl [id=" + id + ", version=" + version + ", globalName=" + globalName 
     122        return "FieldDescriptorImpl [id=" + id + ", version=" + version + ", name=" + name 
    119123                        + ", valueType=" + valueType + "]"; 
    120124    } 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/HBaseRepository.java

    r3979 r3981  
    3737import org.lilycms.repository.api.FieldDescriptor; 
    3838import org.lilycms.repository.api.FieldDescriptorNotFoundException; 
    39 import org.lilycms.repository.api.FieldGroup; 
    40 import org.lilycms.repository.api.FieldGroupEntry; 
    4139import org.lilycms.repository.api.FieldGroupNotFoundException; 
    4240import org.lilycms.repository.api.IdGenerator; 
     
    8078    private final TypeManager typeManager; 
    8179    private final IdGenerator idGenerator; 
     80    private Map<Scope, byte[]> columnFamilies = new HashMap<Scope, byte[]>(); 
     81    private Map<Scope, byte[]> systemColumnFamilies = new HashMap<Scope, byte[]>(); 
     82    private Map<Scope, byte[]> recordTypeIdColumnNames = new HashMap<Scope, byte[]>(); 
     83    private Map<Scope, byte[]> recordTypeVersionColumnNames = new HashMap<Scope, byte[]>(); 
    8284 
    8385    public HBaseRepository(TypeManager typeManager, IdGenerator idGenerator, Configuration configuration) 
     
    101103            recordTable = new HTable(configuration, RECORD_TABLE); 
    102104        } 
     105        columnFamilies.put(Scope.NON_VERSIONABLE, NON_VERSIONABLE_COLUMN_FAMILY); 
     106        columnFamilies.put(Scope.VERSIONABLE, VERSIONABLE_COLUMN_FAMILY); 
     107        columnFamilies.put(Scope.VERSIONABLE_MUTABLE, VERSIONABLE_MUTABLE_COLUMN_FAMILY); 
     108        systemColumnFamilies.put(Scope.NON_VERSIONABLE, NON_VERSIONABLE_SYSTEM_COLUMN_FAMILY); 
     109        systemColumnFamilies.put(Scope.VERSIONABLE, VERSIONABLE_SYSTEM_COLUMN_FAMILY); 
     110        systemColumnFamilies.put(Scope.VERSIONABLE_MUTABLE, VERSIONABLE_SYSTEM_COLUMN_FAMILY); 
     111        recordTypeIdColumnNames.put(Scope.NON_VERSIONABLE, NON_VERSIONABLE_RECORDTYPEID_COLUMN_NAME); 
     112        recordTypeIdColumnNames.put(Scope.VERSIONABLE, VERSIONABLE_RECORDTYPEID_COLUMN_NAME); 
     113        recordTypeIdColumnNames.put(Scope.VERSIONABLE_MUTABLE, VERSIONABLE_MUTABLE_RECORDTYPEID_COLUMN_NAME); 
     114        recordTypeVersionColumnNames.put(Scope.NON_VERSIONABLE, NON_VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME); 
     115        recordTypeVersionColumnNames.put(Scope.VERSIONABLE, VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME); 
     116        recordTypeVersionColumnNames.put(Scope.VERSIONABLE_MUTABLE, VERSIONABLE_MUTABLE_RECORDTYPEVERSION_COLUMN_NAME); 
     117         
    103118    } 
    104119 
     
    209224        boolean changed = false; 
    210225        boolean versionableChanged = false; 
    211         if (putNonVersionableFields(record, originalRecord, recordType, put)) { 
     226        if (putFields(Scope.NON_VERSIONABLE, record, originalRecord, recordType, null, put)) { 
    212227            changed = true; 
    213228        } 
    214         if (putVersionableFields(record, originalRecord, recordType, version, put)) { 
     229        if (putFields(Scope.VERSIONABLE, record, originalRecord, recordType, version, put)) { 
    215230            changed = true; 
    216231            versionableChanged = true; 
    217232        } 
    218         if (putVersionableMutableFields(record, originalRecord, recordType, version, put)) { 
     233        if (putFields(Scope.VERSIONABLE_MUTABLE, record, originalRecord, recordType, version, put)) { 
    219234            changed = true; 
    220235            versionableChanged = true; 
     
    236251    } 
    237252 
    238     private boolean putNonVersionableFields(Record record, Record originalRecord, RecordType recordType, Put put) 
    239                     throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException { 
    240         if (putUpdateAndDeleteFieldGroupFields(record.getFields(Scope.NON_VERSIONABLE), record 
    241                         .getFieldsToDelete(Scope.NON_VERSIONABLE), originalRecord.getFields(Scope.NON_VERSIONABLE), 
    242                         recordType.getFieldGroupId(Scope.NON_VERSIONABLE), recordType 
    243                                         .getFieldGroupVersion(Scope.NON_VERSIONABLE), NON_VERSIONABLE_COLUMN_FAMILY, 
    244                         null, put)) { 
    245             put.add(NON_VERSIONABLE_SYSTEM_COLUMN_FAMILY, NON_VERSIONABLE_RECORDTYPEID_COLUMN_NAME, Bytes 
    246                             .toBytes(recordType.getId())); 
    247             put.add(NON_VERSIONABLE_SYSTEM_COLUMN_FAMILY, NON_VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME, Bytes 
    248                             .toBytes(recordType.getVersion())); 
    249             record.setRecordType(Scope.NON_VERSIONABLE, recordType.getId(), recordType.getVersion()); 
     253    private boolean putFields(Scope scope, Record record, Record originalRecord, RecordType recordType, Long version, Put put) 
     254                    throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
     255        if (putUpdateAndDeleteFieldGroupFields(record.getFields(scope), record.getFieldsToDelete(scope), originalRecord 
     256                        .getFields(scope), scope, recordType,  
     257                        columnFamilies.get(scope), version, put)) { 
     258            if (version == null) { 
     259                put.add(systemColumnFamilies.get(scope), recordTypeIdColumnNames.get(scope), Bytes.toBytes(recordType.getId())); 
     260                put.add(systemColumnFamilies.get(scope), recordTypeVersionColumnNames.get(scope), Bytes.toBytes(recordType 
     261                                .getVersion())); 
     262            } else { 
     263                put.add(systemColumnFamilies.get(scope), recordTypeIdColumnNames.get(scope), version, Bytes.toBytes(recordType.getId())); 
     264                put.add(systemColumnFamilies.get(scope), recordTypeVersionColumnNames.get(scope), version, Bytes.toBytes(recordType 
     265                                .getVersion())); 
     266 
     267            } 
     268            record.setRecordType(scope, recordType.getId(), recordType.getVersion()); 
    250269            return true; 
    251270        } 
    252271        return false; 
    253272    } 
    254  
    255     private boolean putVersionableFields(Record record, Record originalRecord, RecordType recordType, Long version, 
    256                     Put put) throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException { 
    257         if (putUpdateAndDeleteFieldGroupFields(record.getFields(Scope.VERSIONABLE), record 
    258                         .getFieldsToDelete(Scope.VERSIONABLE), originalRecord.getFields(Scope.VERSIONABLE), recordType 
    259                         .getFieldGroupId(Scope.VERSIONABLE), recordType.getFieldGroupVersion(Scope.VERSIONABLE), 
    260                         VERSIONABLE_COLUMN_FAMILY, version, put)) { 
    261             put.add(VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_RECORDTYPEID_COLUMN_NAME, version, Bytes 
    262                             .toBytes(recordType.getId())); 
    263             put.add(VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME, version, Bytes 
    264                             .toBytes(recordType.getVersion())); 
    265             record.setRecordType(Scope.VERSIONABLE, recordType.getId(), recordType.getVersion()); 
    266             return true; 
    267         } 
    268         return false; 
    269     } 
    270  
    271     private boolean putVersionableMutableFields(Record record, Record originalRecord, RecordType recordType, 
    272                     Long version, Put put) throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, 
    273                     RepositoryException { 
    274         if (putUpdateAndDeleteFieldGroupFields(record.getFields(Scope.VERSIONABLE_MUTABLE), record 
    275                         .getFieldsToDelete(Scope.VERSIONABLE_MUTABLE), originalRecord 
    276                         .getFields(Scope.VERSIONABLE_MUTABLE), recordType.getFieldGroupId(Scope.VERSIONABLE_MUTABLE), 
    277                         recordType.getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), VERSIONABLE_MUTABLE_COLUMN_FAMILY, 
    278                         version, put)) { 
    279             put.add(VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_MUTABLE_RECORDTYPEID_COLUMN_NAME, version, Bytes 
    280                             .toBytes(recordType.getId())); 
    281             put.add(VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_MUTABLE_RECORDTYPEVERSION_COLUMN_NAME, version, Bytes 
    282                             .toBytes(recordType.getVersion())); 
    283             record.setRecordType(Scope.VERSIONABLE_MUTABLE, recordType.getId(), recordType.getVersion()); 
    284             return true; 
    285         } 
    286         return false; 
    287     } 
    288  
     273     
    289274    private boolean putUpdateAndDeleteFieldGroupFields(Map<String, Object> fields, List<String> fieldsToDelete, 
    290                     Map<String, Object> originalFields, String fieldGroupId, Long fieldGroupVersion, 
     275                    Map<String, Object> originalFields, Scope scope, RecordType recordType, 
    291276                    byte[] columnFamily, Long version, Put put) throws FieldGroupNotFoundException, 
    292                     FieldDescriptorNotFoundException, RepositoryException { 
     277                    FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
    293278        // Update fields 
    294         boolean updated = putUpdateFieldGroupFields(fields, originalFields, fieldGroupId, fieldGroupVersion, 
    295                         columnFamily, version, put); 
     279        boolean updated = putUpdateFields(scope, fields, originalFields, version, recordType, put); 
    296280        // Delete fields 
    297         boolean deleted = putDeleteFieldgroupFields(fieldsToDelete, originalFields, columnFamily, version, put); 
     281        boolean deleted = putDeleteFields(scope, fieldsToDelete, originalFields, version, recordType, put); 
    298282        return updated || deleted; 
    299283    } 
    300284 
    301     private boolean putUpdateFieldGroupFields(Map<String, Object> fields, Map<String, Object> originalFields, 
    302                     String fieldGroupId, Long fieldGroupVersion, byte[] columnFamily, Long version, Put put) 
    303                     throws FieldGroupNotFoundException, RepositoryException, FieldDescriptorNotFoundException { 
     285    private boolean putUpdateFields(Scope scope, Map<String, Object> fields, Map<String, Object> originalFields, Long version, RecordType recordType, Put put) 
     286                    throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
    304287        boolean changed = false; 
    305288        for (Entry<String, Object> field : fields.entrySet()) { 
    306             String fieldId = field.getKey(); 
     289            String fieldName = field.getKey(); 
    307290            Object newValue = field.getValue(); 
    308             Object originalValue = originalFields.get(fieldId); 
     291            Object originalValue = originalFields.get(fieldName); 
    309292            if (((newValue == null) && (originalValue != null)) || !newValue.equals(originalValue)) { 
    310                 byte[] fieldIdAsBytes = Bytes.toBytes(fieldId); 
    311                 byte[] encodedFieldValue = encodeFieldValue(fieldGroupId, fieldGroupVersion, fieldId, newValue); 
     293                FieldDescriptor fieldDescriptor = typeManager.getFieldDescriptor(scope, fieldName, recordType); 
     294                byte[] fieldIdAsBytes = Bytes.toBytes(fieldDescriptor.getId()); 
     295                byte[] encodedFieldValue = encodeFieldValue(fieldDescriptor, newValue); 
    312296 
    313297                if (version != null) { 
    314                     put.add(columnFamily, fieldIdAsBytes, version, encodedFieldValue); 
     298                    put.add(columnFamilies.get(scope), fieldIdAsBytes, version, encodedFieldValue); 
    315299                } else { 
    316                     put.add(columnFamily, fieldIdAsBytes, encodedFieldValue); 
     300                    put.add(columnFamilies.get(scope), fieldIdAsBytes, encodedFieldValue); 
    317301                } 
    318302                changed = true; 
     
    322306    } 
    323307 
    324     private byte[] encodeFieldValue(String fieldGroupId, Long fieldGroupVersion, String fieldId, Object fieldValue) 
    325                     throws FieldGroupNotFoundException, RepositoryException, FieldDescriptorNotFoundException { 
    326         FieldGroup fieldGroup = typeManager.getFieldGroup(fieldGroupId, fieldGroupVersion); 
    327         FieldGroupEntry fieldGroupEntry = fieldGroup.getFieldGroupEntry(fieldId); 
    328         FieldDescriptor fieldDescriptor = typeManager.getFieldDescriptor(fieldGroupEntry.getFieldDescriptorId(), 
    329                         fieldGroupEntry.getFieldDescriptorVersion()); 
     308    private byte[] encodeFieldValue(FieldDescriptor fieldDescriptor, Object fieldValue) 
     309                    throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
    330310        ValueType valueType = fieldDescriptor.getValueType(); 
    331311 
     
    336316    } 
    337317 
    338     private boolean putDeleteFieldgroupFields(List<String> fieldsToDelete, Map<String, Object> originalFields, 
    339                     byte[] columnFamily, Long version, Put put) { 
     318    private boolean putDeleteFields(Scope scope, List<String> fieldsToDelete, Map<String, Object> originalFields, Long version, RecordType recordType, Put put) throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
    340319        boolean changed = false; 
    341320        for (String fieldToDelete : fieldsToDelete) { 
    342321            if (originalFields.get(fieldToDelete) != null) { 
     322                FieldDescriptor fieldDescriptor = typeManager.getFieldDescriptor(scope, fieldToDelete, recordType); 
     323                byte[] fieldIdAsBytes = Bytes.toBytes(fieldDescriptor.getId()); 
    343324                if (version != null) { 
    344                     put.add(columnFamily, Bytes.toBytes(fieldToDelete), version, 
    345                                     new byte[] { EncodingUtil.DELETE_FLAG }); 
     325                    put.add(columnFamilies.get(scope), fieldIdAsBytes, version, new byte[] { EncodingUtil.DELETE_FLAG }); 
    346326                } else { 
    347                     put.add(columnFamily, Bytes.toBytes(fieldToDelete), new byte[] { EncodingUtil.DELETE_FLAG }); 
     327                    put.add(columnFamilies.get(scope), fieldIdAsBytes, new byte[] { EncodingUtil.DELETE_FLAG }); 
    348328                } 
    349329                changed = true; 
     
    385365 
    386366        Put put = new Put(record.getId().toBytes()); 
    387         Map<String, Object> fieldsToUpdate = record.getFields(Scope.VERSIONABLE_MUTABLE); 
     367        Scope scope = Scope.VERSIONABLE_MUTABLE; 
     368        Map<String, Object> fieldsToUpdate = record.getFields(scope); 
    388369        Map<String, Object> originalFields = originalRecord 
    389                         .getFields(Scope.VERSIONABLE_MUTABLE); 
    390         String fieldGroupId = recordType.getFieldGroupId(Scope.VERSIONABLE_MUTABLE); 
    391         Long fieldGroupVersion = recordType.getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE); 
    392         boolean updated = putUpdateFieldGroupFields(fieldsToUpdate, originalFields, fieldGroupId, 
    393                         fieldGroupVersion, VERSIONABLE_MUTABLE_COLUMN_FAMILY, 
    394                         version, put); 
    395         List<String> fieldsToDelete = record.getFieldsToDelete(Scope.VERSIONABLE_MUTABLE); 
     370                        .getFields(scope); 
     371        boolean updated = putUpdateFields(scope, fieldsToUpdate, originalFields, version,  
     372                        recordType, put); 
     373        List<String> fieldsToDelete = record.getFieldsToDelete(scope); 
    396374        Map<String, Object> originalNextFields = new HashMap<String, Object>(); 
    397375        if (originalNextRecord != null) { 
    398             originalNextFields.putAll(originalNextRecord.getFields(Scope.VERSIONABLE_MUTABLE)); 
    399         } 
    400         boolean deleted = putDeleteMutableFieldgroupFields(fieldsToDelete, 
    401                         originalFields, originalNextFields, fieldGroupId, fieldGroupVersion, 
    402                         VERSIONABLE_MUTABLE_COLUMN_FAMILY, version, put); 
     376            originalNextFields.putAll(originalNextRecord.getFields(scope)); 
     377        } 
     378        boolean deleted = putDeleteMutableFields(fieldsToDelete, 
     379                        originalFields, originalNextFields, scope, recordType, 
     380                        columnFamilies.get(scope), version, put); 
    403381        if (updated || deleted) { 
    404             put.add(VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_MUTABLE_RECORDTYPEID_COLUMN_NAME, version, Bytes 
     382            put.add(systemColumnFamilies.get(scope), recordTypeIdColumnNames.get(scope), version, Bytes 
    405383                            .toBytes(recordType.getId())); 
    406             put.add(VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_MUTABLE_RECORDTYPEVERSION_COLUMN_NAME, version, Bytes 
     384            put.add(systemColumnFamilies.get(scope), recordTypeVersionColumnNames.get(scope), version, Bytes 
    407385                            .toBytes(recordType.getVersion())); 
    408386            try { 
     
    412390                                + "> on HBase table", e); 
    413391            } 
    414             newRecord.setRecordType(Scope.VERSIONABLE_MUTABLE, recordType.getId(), recordType.getVersion()); 
     392            newRecord.setRecordType(scope, recordType.getId(), recordType.getVersion()); 
    415393        } 
    416394        return newRecord; 
    417395    } 
    418396 
    419     private boolean putDeleteMutableFieldgroupFields(List<String> fieldsToDelete, Map<String, Object> originalFields, 
    420                     Map<String, Object> originalNextFields, String fieldGroupId, Long fieldGroupVersion, 
     397    private boolean putDeleteMutableFields(List<String> fieldsToDelete, Map<String, Object> originalFields, 
     398                    Map<String, Object> originalNextFields, Scope scope, RecordType recordType, 
    421399                    byte[] columnFamily, Long version, Put put) throws FieldGroupNotFoundException, 
    422                     RepositoryException, FieldDescriptorNotFoundException { 
     400                    FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
    423401        boolean changed = false; 
    424402        for (String fieldToDelete : fieldsToDelete) { 
    425403            Object originalValue = originalFields.get(fieldToDelete); 
    426404            if (originalValue != null) { 
    427                 put.add(columnFamily, Bytes.toBytes(fieldToDelete), version, new byte[] { EncodingUtil.DELETE_FLAG }); 
     405                FieldDescriptor fieldDescriptor = typeManager.getFieldDescriptor(scope, fieldToDelete, recordType); 
     406                byte[] fieldIdBytes = Bytes.toBytes(fieldDescriptor.getId()); 
     407                put.add(columnFamily, fieldIdBytes, version, new byte[] { EncodingUtil.DELETE_FLAG }); 
    428408                if (originalValue.equals(originalNextFields.get(fieldToDelete))) { 
    429                     byte[] encodedValue = encodeFieldValue(fieldGroupId, fieldGroupVersion, fieldToDelete, 
    430                                     originalValue); 
    431                     put.add(columnFamily, Bytes.toBytes(fieldToDelete), version + 1, encodedValue); 
     409                    byte[] encodedValue = encodeFieldValue(fieldDescriptor, originalValue); 
     410                    put.add(columnFamily, fieldIdBytes, version + 1, encodedValue); 
    432411                } 
    433412                changed = true; 
     
    501480    } 
    502481 
    503     private Pair<String, Long> extractNonVersionableRecordType(Result result, Record record) { 
    504         return new Pair<String, Long>(Bytes.toString(result.getValue(NON_VERSIONABLE_SYSTEM_COLUMN_FAMILY, 
    505                         NON_VERSIONABLE_RECORDTYPEID_COLUMN_NAME)), Bytes.toLong(result.getValue( 
    506                         NON_VERSIONABLE_SYSTEM_COLUMN_FAMILY, NON_VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME))); 
    507     } 
    508  
    509     private Pair<String, Long> extractVersionableRecordType(Result result, Long version, Record record) { 
     482    private Pair<String, Long> extractRecordType(Scope scope, Result result, Long version, Record record) { 
    510483        if (version == null) { 
    511484            // Get latest version 
    512             return new Pair<String, Long>(Bytes.toString(result.getValue(VERSIONABLE_SYSTEM_COLUMN_FAMILY, 
    513                             VERSIONABLE_RECORDTYPEID_COLUMN_NAME)), Bytes.toLong(result.getValue( 
    514                             VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME))); 
     485            return new Pair<String, Long>(Bytes.toString(result.getValue(systemColumnFamilies.get(scope), 
     486                            recordTypeIdColumnNames.get(scope))), Bytes.toLong(result.getValue( 
     487                            systemColumnFamilies.get(scope), recordTypeVersionColumnNames.get(scope)))); 
    515488 
    516489        } else { 
     
    518491            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> allVersionsMap = result.getMap(); 
    519492            NavigableMap<byte[], NavigableMap<Long, byte[]>> versionableSystemCFversions = allVersionsMap 
    520                             .get(VERSIONABLE_SYSTEM_COLUMN_FAMILY); 
    521             return extractVersionRecordType(version, versionableSystemCFversions, VERSIONABLE_RECORDTYPEID_COLUMN_NAME, 
    522                             VERSIONABLE_RECORDTYPEVERSION_COLUMN_NAME); 
    523         } 
    524     } 
    525  
    526     private Pair<String, Long> extractVersionableMutableRecordType(Result result, Long version, Record record) { 
    527         if (version == null) { 
    528             // Get latest version 
    529             return new Pair<String, Long>(Bytes.toString(result.getValue(VERSIONABLE_SYSTEM_COLUMN_FAMILY, 
    530                             VERSIONABLE_MUTABLE_RECORDTYPEID_COLUMN_NAME)), Bytes.toLong(result.getValue( 
    531                             VERSIONABLE_SYSTEM_COLUMN_FAMILY, VERSIONABLE_MUTABLE_RECORDTYPEVERSION_COLUMN_NAME))); 
    532         } else { 
    533             // Get on version 
    534             NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> allVersionsMap = result.getMap(); 
    535             NavigableMap<byte[], NavigableMap<Long, byte[]>> versionableSystemCFversions = allVersionsMap 
    536                             .get(VERSIONABLE_SYSTEM_COLUMN_FAMILY); 
    537             return extractVersionRecordType(version, versionableSystemCFversions, 
    538                             VERSIONABLE_MUTABLE_RECORDTYPEID_COLUMN_NAME, 
    539                             VERSIONABLE_MUTABLE_RECORDTYPEVERSION_COLUMN_NAME); 
     493                            .get(systemColumnFamilies.get(scope)); 
     494            return extractVersionRecordType(version, versionableSystemCFversions, recordTypeIdColumnNames.get(scope), 
     495                            recordTypeVersionColumnNames.get(scope)); 
    540496        } 
    541497    } 
     
    598554        } 
    599555        String fieldId = Bytes.toString(key); 
    600         ValueType valueType = typeManager.getFieldDescriptor(fieldId, null).getValueType(); 
     556        FieldDescriptor fieldDescriptor = typeManager.getFieldDescriptor(fieldId, null); 
     557        ValueType valueType = fieldDescriptor.getValueType(); 
    601558        Object value = valueType.fromBytes(EncodingUtil.stripPrefix(prefixedValue)); 
    602         return new Pair<String, Object>(fieldId, value); 
     559        return new Pair<String, Object>(fieldDescriptor.getName(), value); 
    603560    } 
    604561 
    605562    private void addFieldsToGet(Get get, List<String> nonVersionableFieldIds, List<String> versionableFieldIds, 
    606563                    List<String> versionableMutableFieldIds) throws RecordNotFoundException, RepositoryException { 
    607         boolean added = false; 
    608         added |= addFieldsToGet(get, nonVersionableFieldIds, NON_VERSIONABLE_COLUMN_FAMILY); 
    609         added |= addFieldsToGet(get, versionableFieldIds, VERSIONABLE_COLUMN_FAMILY); 
    610         added |= addFieldsToGet(get, versionableMutableFieldIds, VERSIONABLE_MUTABLE_COLUMN_FAMILY); 
    611         if (added) { 
     564        boolean addedVersionable =  addFieldsToGet(get, nonVersionableFieldIds, NON_VERSIONABLE_COLUMN_FAMILY); 
     565        boolean addedNonVersionable = addFieldsToGet(get, versionableFieldIds, VERSIONABLE_COLUMN_FAMILY); 
     566        boolean addedVersionableMutable = addFieldsToGet(get, versionableMutableFieldIds, VERSIONABLE_MUTABLE_COLUMN_FAMILY); 
     567        if (addedVersionable || addedNonVersionable || addedVersionableMutable) { 
    612568            addSystemColumnsToGet(get); 
    613569        } 
     
    639595    private boolean extractFields(Result result, Long version, Record record) throws RecordTypeNotFoundException, 
    640596                    FieldGroupNotFoundException, FieldDescriptorNotFoundException, RepositoryException { 
    641         boolean retrieved = false; 
    642         retrieved |= extractNonVersionableFields(result, record); 
    643         retrieved |= extractVersionableFields(result, version, record); 
    644         retrieved |= extractVersionableMutableFields(result, version, record); 
    645         return retrieved; 
    646     } 
    647  
    648     private boolean extractNonVersionableFields(Result result, Record record) throws RecordTypeNotFoundException, 
    649                     RepositoryException, FieldGroupNotFoundException, FieldDescriptorNotFoundException { 
    650         boolean retrieved = false; 
    651         Pair<String, Long> recordTypePair = extractNonVersionableRecordType(result, record); 
    652         String recordTypeId = recordTypePair.getV1(); 
    653         Long recordTypeVersion = recordTypePair.getV2(); 
    654         // If there is no recordType, there can't be any fields 
    655         if (recordTypeId != null) { 
    656             List<Pair<String, Object>> fields = extractFields(result.getFamilyMap(NON_VERSIONABLE_COLUMN_FAMILY)); 
    657             if (!fields.isEmpty()) { 
    658                 for (Pair<String, Object> field : fields) { 
    659                     record.setField(Scope.NON_VERSIONABLE, field.getV1(), field.getV2()); 
    660                 } 
    661                 record.setRecordType(Scope.NON_VERSIONABLE, recordTypeId, recordTypeVersion); 
    662                 retrieved = true; 
    663             } 
    664         } 
    665         return retrieved; 
    666     } 
    667  
    668     private boolean extractVersionableFields(Result result, Long version, Record record) 
     597        boolean nvExtracted = extractFields(Scope.NON_VERSIONABLE, result, null, record); 
     598        boolean vExtracted = extractFields(Scope.VERSIONABLE, result, version, record); 
     599        boolean vmExtracted = extractFields(Scope.VERSIONABLE_MUTABLE, result, version, record); 
     600        return nvExtracted || vExtracted || vmExtracted; 
     601    } 
     602 
     603    private boolean extractFields(Scope scope, Result result, Long version, Record record) 
    669604                    throws RecordTypeNotFoundException, RepositoryException, FieldGroupNotFoundException, 
    670605                    FieldDescriptorNotFoundException { 
    671606        boolean retrieved = false; 
    672         Pair<String, Long> recordTypePair = extractVersionableRecordType(result, version, record); 
     607        Pair<String, Long> recordTypePair = extractRecordType(scope, result, version, record); 
    673608        String recordTypeId = recordTypePair.getV1(); 
    674609        Long recordTypeVersion = recordTypePair.getV2(); 
     
    677612            List<Pair<String, Object>> fields; 
    678613            if (version == null) { 
    679                 fields = extractFields(result.getFamilyMap(VERSIONABLE_COLUMN_FAMILY)); 
     614                fields = extractFields(result.getFamilyMap(columnFamilies.get(scope))); 
    680615            } else { 
    681                 fields = extractVersionFields(version, result.getMap().get(VERSIONABLE_COLUMN_FAMILY)); 
     616                fields = extractVersionFields(version, result.getMap().get(columnFamilies.get(scope))); 
    682617            } 
    683618            if (!fields.isEmpty()) { 
    684619                for (Pair<String, Object> field : fields) { 
    685                     record.setField(Scope.VERSIONABLE, field.getV1(), field.getV2()); 
    686                 } 
    687                 record.setRecordType(Scope.VERSIONABLE, recordTypeId, recordTypeVersion); 
    688                 retrieved = true; 
    689             } 
    690         } 
    691         return retrieved; 
    692     } 
    693  
    694     private boolean extractVersionableMutableFields(Result result, Long version, Record record) 
    695                     throws RecordTypeNotFoundException, RepositoryException, FieldGroupNotFoundException, 
    696                     FieldDescriptorNotFoundException { 
    697         boolean retrieved = false; 
    698         Pair<String, Long> recordTypePair = extractVersionableMutableRecordType(result, version, record); 
    699         String recordTypeId = recordTypePair.getV1(); 
    700         Long recordTypeVersion = recordTypePair.getV2(); 
    701         // If there is no recordType, there can't be any fields 
    702         if (recordTypeId != null) { 
    703             List<Pair<String, Object>> fields; 
    704             if (version == null) { 
    705                 fields = extractFields(result.getFamilyMap(VERSIONABLE_MUTABLE_COLUMN_FAMILY)); 
    706             } else { 
    707                 fields = extractVersionFields(version, result.getMap().get(VERSIONABLE_MUTABLE_COLUMN_FAMILY)); 
    708             } 
    709             if (!fields.isEmpty()) { 
    710                 for (Pair<String, Object> field : fields) { 
    711                     record.setField(Scope.VERSIONABLE_MUTABLE, field.getV1(), field.getV2()); 
    712                 } 
    713                 record.setRecordType(Scope.VERSIONABLE_MUTABLE, recordTypeId, recordTypeVersion); 
     620                    record.setField(scope, field.getV1(), field.getV2()); 
     621                } 
     622                record.setRecordType(scope, recordTypeId, recordTypeVersion); 
    714623                retrieved = true; 
    715624            } 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/HBaseTypeManager.java

    r3978 r3981  
    2222import java.util.Map; 
    2323import java.util.NavigableMap; 
     24import java.util.UUID; 
    2425import java.util.Map.Entry; 
    2526 
     
    3536import org.apache.hadoop.hbase.util.Bytes; 
    3637import org.lilycms.repository.api.FieldDescriptor; 
    37 import org.lilycms.repository.api.FieldDescriptorExistsException; 
    3838import org.lilycms.repository.api.FieldDescriptorNotFoundException; 
    3939import org.lilycms.repository.api.FieldDescriptorUpdateException; 
     
    5959    private static final byte[] NON_VERSIONABLE_COLUMN_FAMILY = Bytes.toBytes("nonVersionableCF"); 
    6060    private static final byte[] VERSIONABLE_COLUMN_FAMILY = Bytes.toBytes("versionableCF"); 
     61    private static final byte[] MIXIN_COLUMN_FAMILY = Bytes.toBytes("mixinCF"); 
    6162 
    6263    private static final byte[] CURRENT_VERSION_COLUMN_NAME = Bytes.toBytes("$currentVersion"); 
     
    6667    private static final byte[] RECORDTYPE_VERSIONABLEMUTABLEFIELDGROUP_COLUMN_NAME = Bytes 
    6768                    .toBytes("$versionableMutableFG"); 
    68     private static final byte[] FIELDDESCRIPTOR_GLOBALNAME_COLUMN_NAME = Bytes.toBytes("$globalName"); 
     69    private static final byte[] FIELDDESCRIPTOR_NAME_COLUMN_NAME = Bytes.toBytes("$globalName"); 
    6970    private static final byte[] FIELDDESCRIPTOR_VALUETYPE_COLUMN_NAME = Bytes.toBytes("$valueType"); 
    7071 
     
    8283            tableDescriptor.addFamily(new HColumnDescriptor(VERSIONABLE_COLUMN_FAMILY, HConstants.ALL_VERSIONS, "none", 
    8384                            false, true, HConstants.FOREVER, false)); 
     85            tableDescriptor.addFamily(new HColumnDescriptor(MIXIN_COLUMN_FAMILY, HConstants.ALL_VERSIONS, "none", 
     86                            false, true, HConstants.FOREVER, false)); 
    8487            admin.createTable(tableDescriptor); 
    8588            typeTable = new HTable(configuration, TYPE_TABLE); 
     
    9497 
    9598    public RecordType createRecordType(RecordType recordType) throws RecordTypeExistsException, 
    96                     FieldGroupNotFoundException, RepositoryException { 
     99                    FieldGroupNotFoundException, RecordTypeNotFoundException, RepositoryException { 
    97100        ArgumentValidator.notNull(recordType, "recordType"); 
    98101        RecordType newRecordType = recordType.clone(); 
     
    106109            Put put = new Put(rowId); 
    107110            put.add(NON_VERSIONABLE_COLUMN_FAMILY, CURRENT_VERSION_COLUMN_NAME, Bytes.toBytes(recordTypeVersion)); 
     111 
    108112            String fieldGroupId = recordType.getFieldGroupId(Scope.NON_VERSIONABLE); 
    109113            if (fieldGroupId != null) { 
    110                 newRecordType.setFieldGroupVersion(Scope.NON_VERSIONABLE, putFieldGroupOnRecordType(recordTypeVersion, put, 
    111                                 fieldGroupId, recordType.getFieldGroupVersion(Scope.NON_VERSIONABLE), 
     114                newRecordType.setFieldGroupVersion(Scope.NON_VERSIONABLE, putFieldGroupOnRecordType(recordTypeVersion, 
     115                                put, fieldGroupId, recordType.getFieldGroupVersion(Scope.NON_VERSIONABLE), 
    112116                                RECORDTYPE_NONVERSIONABLEFIELDGROUP_COLUMN_NAME)); 
    113117            } 
     
    122126            fieldGroupId = recordType.getFieldGroupId(Scope.VERSIONABLE_MUTABLE); 
    123127            if (fieldGroupId != null) { 
    124                 newRecordType.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE, putFieldGroupOnRecordType(recordTypeVersion, put, 
    125                                 fieldGroupId, recordType.getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), 
     128                newRecordType.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE, putFieldGroupOnRecordType( 
     129                                recordTypeVersion, put, fieldGroupId, recordType 
     130                                                .getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), 
    126131                                RECORDTYPE_VERSIONABLEMUTABLEFIELDGROUP_COLUMN_NAME)); 
     132            } 
     133 
     134            Map<String, Long> mixins = recordType.getMixins(); 
     135            for (Entry<String, Long> mixin : mixins.entrySet()) { 
     136                newRecordType.addMixin(mixin.getKey(), putMixinOnRecordType(recordTypeVersion, put, mixin.getKey(), mixin.getValue())); 
    127137            } 
    128138 
     
    150160        // non-versionable field group 
    151161        Pair<Boolean, Long> updateResult = updateFieldGroupOnRecordType(put, newRecordTypeVersion, recordType 
    152                         .getFieldGroupId(Scope.NON_VERSIONABLE), recordType.getFieldGroupVersion(Scope.NON_VERSIONABLE), 
    153                         latestRecordType.getFieldGroupId(Scope.NON_VERSIONABLE), latestRecordType 
     162                        .getFieldGroupId(Scope.NON_VERSIONABLE), 
     163                        recordType.getFieldGroupVersion(Scope.NON_VERSIONABLE), latestRecordType 
     164                                        .getFieldGroupId(Scope.NON_VERSIONABLE), latestRecordType 
    154165                                        .getFieldGroupVersion(Scope.NON_VERSIONABLE), 
    155166                        RECORDTYPE_NONVERSIONABLEFIELDGROUP_COLUMN_NAME); 
    156167        if (updateResult.getV1()) { 
    157             recordTypeChanged =true; 
     168            recordTypeChanged = true; 
    158169            newRecordType.setFieldGroupVersion(Scope.NON_VERSIONABLE, updateResult.getV2()); 
    159170        } 
    160171 
    161172        // versionable field group 
    162         updateResult = updateFieldGroupOnRecordType(put, newRecordTypeVersion, recordType.getFieldGroupId(Scope.VERSIONABLE), 
    163                         recordType.getFieldGroupVersion(Scope.VERSIONABLE), latestRecordType.getFieldGroupId(Scope.VERSIONABLE), 
    164                         latestRecordType.getFieldGroupVersion(Scope.VERSIONABLE), 
     173        updateResult = updateFieldGroupOnRecordType(put, newRecordTypeVersion, recordType 
     174                        .getFieldGroupId(Scope.VERSIONABLE), recordType.getFieldGroupVersion(Scope.VERSIONABLE), 
     175                        latestRecordType.getFieldGroupId(Scope.VERSIONABLE), latestRecordType 
     176                                        .getFieldGroupVersion(Scope.VERSIONABLE), 
    165177                        RECORDTYPE_VERSIONABLEFIELDGROUP_COLUMN_NAME); 
    166178        if (updateResult.getV1()) { 
     
    171183        // versionable mutable field group 
    172184        updateResult = updateFieldGroupOnRecordType(put, newRecordTypeVersion, recordType 
    173                         .getFieldGroupId(Scope.VERSIONABLE_MUTABLE), recordType.getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), 
    174                         latestRecordType.getFieldGroupId(Scope.VERSIONABLE_MUTABLE), latestRecordType 
    175                                         .getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), 
     185                        .getFieldGroupId(Scope.VERSIONABLE_MUTABLE), recordType 
     186                        .getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), latestRecordType 
     187                        .getFieldGroupId(Scope.VERSIONABLE_MUTABLE), latestRecordType 
     188                        .getFieldGroupVersion(Scope.VERSIONABLE_MUTABLE), 
    176189                        RECORDTYPE_VERSIONABLEMUTABLEFIELDGROUP_COLUMN_NAME); 
    177190        if (updateResult.getV1()) { 
     
    179192            newRecordType.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE, updateResult.getV2()); 
    180193        } 
     194         
     195        boolean mixinsChanged = updateMixins(put, newRecordTypeVersion, recordType, latestRecordType); 
     196        recordTypeChanged |= mixinsChanged; 
    181197 
    182198        if (recordTypeChanged) { 
     
    221237    } 
    222238     
    223     public RecordType removeFieldGroups(String recordTypeId, boolean nonVersionable, boolean versionable, boolean versionableMutable) throws RecordTypeNotFoundException, RepositoryException { 
     239    private Long putMixinOnRecordType(Long recordTypeVersion, Put put, String mixinId, Long mixinVersion) throws RecordTypeNotFoundException, RepositoryException { 
     240        Long newMixinVersion = getRecordType(mixinId, mixinVersion).getVersion(); 
     241        put.add(MIXIN_COLUMN_FAMILY, Bytes.toBytes(mixinId), recordTypeVersion, Bytes.toBytes(newMixinVersion)); 
     242        return newMixinVersion; 
     243    } 
     244     
     245    private boolean updateMixins(Put put, Long newRecordTypeVersion, RecordType recordType, RecordType latestRecordType) { 
     246        boolean changed = false; 
     247        Map<String, Long> latestMixins = latestRecordType.getMixins(); 
     248        // Update mixins 
     249        for (Entry<String, Long> entry : recordType.getMixins().entrySet()) { 
     250            String mixinId = entry.getKey(); 
     251            Long mixinVersion = entry.getValue(); 
     252            if (!mixinVersion.equals(latestMixins.get(mixinId))) { 
     253                put.add(MIXIN_COLUMN_FAMILY, Bytes.toBytes(mixinId), newRecordTypeVersion, Bytes.toBytes(mixinVersion)); 
     254                changed = true; 
     255            } 
     256            latestMixins.remove(mixinId); 
     257        } 
     258        // Remove remaining mixins 
     259        for (Entry<String, Long> entry : latestMixins.entrySet()) { 
     260            put.add(MIXIN_COLUMN_FAMILY, Bytes.toBytes(entry.getKey()), newRecordTypeVersion, new byte[] { EncodingUtil.DELETE_FLAG }); 
     261            changed = true; 
     262        } 
     263        return changed; 
     264    } 
     265 
     266    public RecordType removeFieldGroups(String recordTypeId, boolean nonVersionable, boolean versionable, 
     267                    boolean versionableMutable) throws RecordTypeNotFoundException, RepositoryException { 
    224268        RecordType recordType = getRecordType(recordTypeId, null); 
    225269        Long version = recordType.getVersion() + 1; 
     
    228272        if (nonVersionable) { 
    229273            if (recordType.getFieldGroupId(Scope.NON_VERSIONABLE) != null) { 
    230                 put.add(VERSIONABLE_COLUMN_FAMILY, RECORDTYPE_NONVERSIONABLEFIELDGROUP_COLUMN_NAME, new byte[]{EncodingUtil.DELETE_FLAG}); 
     274                put.add(VERSIONABLE_COLUMN_FAMILY, RECORDTYPE_NONVERSIONABLEFIELDGROUP_COLUMN_NAME, 
     275                                new byte[] { EncodingUtil.DELETE_FLAG }); 
    231276                recordType.setFieldGroupId(Scope.NON_VERSIONABLE, null); 
    232                 recordType.setFieldGroupVersion(Scope.NON_VERSIONABLE,null); 
     277                recordType.setFieldGroupVersion(Scope.NON_VERSIONABLE, null); 
    233278                changed = true; 
    234279            } 
     
    236281        if (versionable) { 
    237282            if (recordType.getFieldGroupId(Scope.VERSIONABLE) != null) { 
    238                 put.add(VERSIONABLE_COLUMN_FAMILY, RECORDTYPE_VERSIONABLEFIELDGROUP_COLUMN_NAME, new byte[]{EncodingUtil.DELETE_FLAG}); 
     283                put.add(VERSIONABLE_COLUMN_FAMILY, RECORDTYPE_VERSIONABLEFIELDGROUP_COLUMN_NAME, 
     284                                new byte[] { EncodingUtil.DELETE_FLAG }); 
    239285                recordType.setFieldGroupId(Scope.VERSIONABLE, null); 
    240286                recordType.setFieldGroupVersion(Scope.VERSIONABLE, null); 
     
    244290        if (versionableMutable) { 
    245291            if (recordType.getFieldGroupId(Scope.VERSIONABLE_MUTABLE) != null) { 
    246                 put.add(VERSIONABLE_COLUMN_FAMILY, RECORDTYPE_VERSIONABLEMUTABLEFIELDGROUP_COLUMN_NAME, new byte[]{EncodingUtil.DELETE_FLAG}); 
     292                put.add(VERSIONABLE_COLUMN_FAMILY, RECORDTYPE_VERSIONABLEMUTABLEFIELDGROUP_COLUMN_NAME, 
     293                                new byte[] { EncodingUtil.DELETE_FLAG }); 
    247294                recordType.setFieldGroupId(Scope.VERSIONABLE_MUTABLE, null); 
    248295                recordType.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE, null); 
     
    255302                typeTable.put(put); 
    256303            } catch (IOException e) { 
    257                 throw new RepositoryException("Exception occured while removing fieldGroups from recordType <" + recordTypeId 
    258                                 + "> on HBase", e); 
     304                throw new RepositoryException("Exception occured while removing fieldGroups from recordType <" 
     305                                + recordTypeId + "> on HBase", e); 
    259306            } 
    260307            recordType.setVersion(version); 
     
    306353            recordType.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE, fieldGroup.getV2()); 
    307354        } 
     355         
     356        extractMixins(result, version, recordType); 
    308357        return recordType; 
    309358    } 
     
    331380        return fieldGroup; 
    332381    } 
     382     
     383    private void extractMixins(Result result, Long version, RecordType recordType) { 
     384        if (version != null) { 
     385            NavigableMap<byte[], NavigableMap<byte[], NavigableMap<Long, byte[]>>> allVersionsMap = result.getMap(); 
     386            NavigableMap<byte[], NavigableMap<Long, byte[]>> mixinVersionsMap = allVersionsMap.get(MIXIN_COLUMN_FAMILY); 
     387            if (mixinVersionsMap != null) { 
     388                for (Entry<byte[], NavigableMap<Long, byte[]>> entry : mixinVersionsMap.entrySet()) { 
     389                    String mixinId = Bytes.toString(entry.getKey()); 
     390                    Entry<Long, byte[]> ceilingEntry = entry.getValue().ceilingEntry(version); 
     391                    if (ceilingEntry != null) { 
     392                        if (!EncodingUtil.isDeletedField(ceilingEntry.getValue())) { 
     393                            recordType.addMixin(mixinId, Bytes.toLong(ceilingEntry.getValue())); 
     394                        } 
     395                    } 
     396                } 
     397            } 
     398        } else { 
     399            NavigableMap<byte[], byte[]> mixinMap = result.getFamilyMap(MIXIN_COLUMN_FAMILY); 
     400            if (mixinMap != null) { 
     401                for (Entry<byte[], byte[]> entry : mixinMap.entrySet()) { 
     402                    if (!EncodingUtil.isDeletedField(entry.getValue())) { 
     403                        recordType.addMixin(Bytes.toString(entry.getKey()), Bytes.toLong(entry.getValue())); 
     404                    } 
     405                } 
     406            } 
     407        } 
     408    } 
    333409 
    334410    private byte[] encodeFieldGroup(String fieldGroupId, Long fieldGroupVersion) { 
     
    438514        return newFieldGroupEntry; 
    439515    } 
    440      
    441     public FieldGroup removeFieldDescriptors(String fieldGroupId, List<String> fieldDescriptorIds) throws FieldGroupNotFoundException, RepositoryException{ 
     516 
     517    public FieldGroup removeFieldDescriptors(String fieldGroupId, List<String> fieldDescriptorIds) 
     518                    throws FieldGroupNotFoundException, RepositoryException { 
    442519        FieldGroup fieldGroup = getFieldGroup(fieldGroupId, null); 
    443520        Put put = new Put(Bytes.toBytes(fieldGroupId)); 
     
    448525                // Ignore 
    449526            } else { 
    450                 put.add(VERSIONABLE_COLUMN_FAMILY, Bytes.toBytes(fieldDescriptorId), version, new byte[]{EncodingUtil.DELETE_FLAG}); 
     527                put.add(VERSIONABLE_COLUMN_FAMILY, Bytes.toBytes(fieldDescriptorId), version, 
     528                                new byte[] { EncodingUtil.DELETE_FLAG }); 
    451529                fieldGroup.removeFieldGroupEntry(fieldDescriptorId); 
    452530                changed = true; 
     
    456534            put.add(NON_VERSIONABLE_COLUMN_FAMILY, CURRENT_VERSION_COLUMN_NAME, Bytes.toBytes(version)); 
    457535            try { 
    458             typeTable.put(put); 
     536                typeTable.put(put); 
    459537            } catch (IOException e) { 
    460                 throw new RepositoryException("Exception occured while removing fieldDescriptor <"+fieldGroupId+"> from fieldGroup <" + fieldGroup.getId() 
    461                                 + "> on HBase", e); 
     538                throw new RepositoryException("Exception occured while removing fieldDescriptor <" + fieldGroupId 
     539                                + "> from fieldGroup <" + fieldGroup.getId() + "> on HBase", e); 
    462540            } 
    463541            fieldGroup.setVersion(version); 
     
    467545 
    468546    public FieldGroup getFieldGroup(String id, Long version) throws FieldGroupNotFoundException, RepositoryException { 
     547        ArgumentValidator.notNull(id, "id"); 
    469548        FieldGroup fieldGroup = new FieldGroupImpl(id); 
    470549        byte[] rowId = Bytes.toBytes(id); 
     
    495574                Entry<Long, byte[]> ceilingEntry = entry.getValue().ceilingEntry(version); 
    496575                if (ceilingEntry != null) { 
    497                     FieldGroupEntry decodedFieldGroupEntry = decodeFieldGroupEntry(ceilingEntry.getValue(), fieldDescriptorId); 
     576                    FieldGroupEntry decodedFieldGroupEntry = decodeFieldGroupEntry(ceilingEntry.getValue(), 
     577                                    fieldDescriptorId); 
    498578                    if (decodedFieldGroupEntry != null) { 
    499579                        fieldGroup.setFieldGroupEntry(decodedFieldGroupEntry); 
     
    546626    } 
    547627 
    548     public FieldDescriptor newFieldDescriptor(String id, ValueType valueType, String globalName) { 
    549         ArgumentValidator.notNull(id, "id"); 
     628     
     629    public FieldDescriptor newFieldDescriptor(ValueType valueType, String name) { 
     630        return newFieldDescriptor(null, valueType, name); 
     631    } 
     632     
     633    public FieldDescriptor newFieldDescriptor(String id, ValueType valueType, String name) { 
    550634        ArgumentValidator.notNull(valueType, "valueType"); 
    551         ArgumentValidator.notNull(globalName, "globalName"); 
    552         return new FieldDescriptorImpl(id, valueType, globalName); 
     635        ArgumentValidator.notNull(name, "name"); 
     636        return new FieldDescriptorImpl(id, valueType, name); 
    553637    } 
    554638 
    555639    public FieldDescriptor createFieldDescriptor(FieldDescriptor fieldDescriptor) 
    556                     throws FieldDescriptorExistsException, RepositoryException { 
     640                    throws RepositoryException { 
    557641        ArgumentValidator.notNull(fieldDescriptor, "fieldDescriptor"); 
    558642        FieldDescriptor result; 
    559         byte[] rowId = Bytes.toBytes(fieldDescriptor.getId()); 
     643        // TODO use IdGenerator 
     644        UUID uuid = UUID.randomUUID(); 
     645        byte[] rowId; 
     646        rowId = fieldDescriptorIdToBytes(uuid); 
    560647        Long version = Long.valueOf(1); 
    561648        try { 
    562             if (typeTable.exists(new Get(rowId))) { 
    563                 throw new FieldDescriptorExistsException(fieldDescriptor); 
    564             } 
    565649            Put put = new Put(rowId); 
    566650            put.add(NON_VERSIONABLE_COLUMN_FAMILY, CURRENT_VERSION_COLUMN_NAME, Bytes.toBytes(version)); 
    567651            put.add(NON_VERSIONABLE_COLUMN_FAMILY, FIELDDESCRIPTOR_VALUETYPE_COLUMN_NAME, fieldDescriptor 
    568652                            .getValueType().toBytes()); 
    569             put.add(VERSIONABLE_COLUMN_FAMILY, FIELDDESCRIPTOR_GLOBALNAME_COLUMN_NAME, version, Bytes 
    570                             .toBytes(fieldDescriptor.getGlobalName())); 
     653            put.add(VERSIONABLE_COLUMN_FAMILY, FIELDDESCRIPTOR_NAME_COLUMN_NAME, version, Bytes 
     654                            .toBytes(fieldDescriptor.getName())); 
    571655            typeTable.put(put); 
    572656        } catch (IOException e) { 
     
    575659        } 
    576660        result = fieldDescriptor.clone(); 
     661        result.setId(uuid.toString()); 
    577662        result.setVersion(version); 
    578663        return result; 
     664    } 
     665 
     666    private byte[] fieldDescriptorIdToBytes(UUID id) { 
     667        byte[] rowId; 
     668        rowId = new byte[16]; 
     669        Bytes.putLong(rowId, 0, id.getMostSignificantBits()); 
     670        Bytes.putLong(rowId, 8, id.getLeastSignificantBits()); 
     671        return rowId; 
     672    } 
     673     
     674    private byte[] fieldDescriptorIdToBytes(String id) { 
     675        UUID uuid = UUID.fromString(id); 
     676        byte[] rowId; 
     677        rowId = new byte[16]; 
     678        Bytes.putLong(rowId, 0, uuid.getMostSignificantBits()); 
     679        Bytes.putLong(rowId, 8, uuid.getLeastSignificantBits()); 
     680        return rowId; 
    579681    } 
    580682 
     
    588690        } 
    589691        Long version = latestFieldDescriptor.getVersion(); 
    590         if (!fieldDescriptor.getGlobalName().equals(latestFieldDescriptor.getGlobalName())) { 
     692        if (!fieldDescriptor.getName().equals(latestFieldDescriptor.getName())) { 
    591693            version = version + 1; 
    592             Put put = new Put(Bytes.toBytes(fieldDescriptor.getId())); 
    593             put.add(VERSIONABLE_COLUMN_FAMILY, FIELDDESCRIPTOR_GLOBALNAME_COLUMN_NAME, version, Bytes 
    594                             .toBytes(fieldDescriptor.getGlobalName())); 
     694            Put put = new Put(fieldDescriptorIdToBytes(fieldDescriptor.getId())); 
     695            put.add(VERSIONABLE_COLUMN_FAMILY, FIELDDESCRIPTOR_NAME_COLUMN_NAME, version, Bytes 
     696                            .toBytes(fieldDescriptor.getName())); 
    595697            put.add(NON_VERSIONABLE_COLUMN_FAMILY, CURRENT_VERSION_COLUMN_NAME, Bytes.toBytes(version)); 
    596698            try { 
     
    610712        ArgumentValidator.notNull(id, "id"); 
    611713        Result result; 
    612         Get get = new Get(Bytes.toBytes(id)); 
     714        Get get = new Get(fieldDescriptorIdToBytes(id)); 
    613715        if (version != null) { 
    614716            get.setMaxVersions(); 
     
    626728        Long currentVersion = Bytes.toLong(nonVersionableColumnFamily.get(CURRENT_VERSION_COLUMN_NAME)); 
    627729        Long retrievedVersion; 
    628         String globalName; 
     730        String name; 
    629731        if (version != null) { 
    630732            if (version > currentVersion) { 
     
    635737                            .get(VERSIONABLE_COLUMN_FAMILY); 
    636738            NavigableMap<Long, byte[]> globalNameVersionsMap = versionableVersionsMap 
    637                             .get(FIELDDESCRIPTOR_GLOBALNAME_COLUMN_NAME); 
    638             globalName = Bytes.toString(globalNameVersionsMap.floorEntry(version).getValue()); 
     739                            .get(FIELDDESCRIPTOR_NAME_COLUMN_NAME); 
     740            name = Bytes.toString(globalNameVersionsMap.floorEntry(version).getValue()); 
    639741            retrievedVersion = version; 
    640742        } else { 
    641743            NavigableMap<byte[], byte[]> versionableColumnFamily = result.getFamilyMap(VERSIONABLE_COLUMN_FAMILY); 
    642             globalName = Bytes.toString(versionableColumnFamily.get(FIELDDESCRIPTOR_GLOBALNAME_COLUMN_NAME)); 
     744            name = Bytes.toString(versionableColumnFamily.get(FIELDDESCRIPTOR_NAME_COLUMN_NAME)); 
    643745            retrievedVersion = currentVersion; 
    644746        } 
    645747        ValueType valueType = ValueTypeImpl.fromBytes(nonVersionableColumnFamily 
    646748                        .get(FIELDDESCRIPTOR_VALUETYPE_COLUMN_NAME), this); 
    647         FieldDescriptor fieldDescriptor = new FieldDescriptorImpl(id, valueType, globalName); 
     749        FieldDescriptor fieldDescriptor = new FieldDescriptorImpl(id, valueType, name); 
    648750        fieldDescriptor.setVersion(retrievedVersion); 
    649751        return fieldDescriptor; 
     
    672774        return new ValueTypeImpl(primitiveValueTypes.get(primitiveValueTypeName), multivalue, hierarchy); 
    673775    } 
     776     
     777    // TODO cache these things on the RecordType itself? 
     778    public FieldDescriptor getFieldDescriptor(Scope scope, String name, RecordType recordType) throws FieldGroupNotFoundException, FieldDescriptorNotFoundException, RecordTypeNotFoundException, RepositoryException { 
     779        ArgumentValidator.notNull(scope, "scope"); 
     780        ArgumentValidator.notNull(name, "name"); 
     781        ArgumentValidator.notNull(recordType, "recordType"); 
     782        String fieldGroupId = recordType.getFieldGroupId(scope); 
     783        Long fieldGroupVersion = recordType.getFieldGroupVersion(scope); 
     784        if (fieldGroupId != null) { 
     785            FieldGroup fieldGroup = getFieldGroup(fieldGroupId, fieldGroupVersion); 
     786            for (FieldGroupEntry fieldGroupEntry : fieldGroup.getFieldGroupEntries()) { 
     787                String fieldDescriptorId = fieldGroupEntry.getFieldDescriptorId(); 
     788                Long fieldDescriptorVersion = fieldGroupEntry.getFieldDescriptorVersion(); 
     789                FieldDescriptor fieldDescriptor = getFieldDescriptor(fieldDescriptorId, fieldDescriptorVersion); 
     790                if (name.equals(fieldDescriptor.getName())) { 
     791                    return fieldDescriptor; 
     792                } 
     793            } 
     794        } 
     795        for (Entry<String, Long> entry : recordType.getMixins().entrySet()) { 
     796            RecordType mixin = getRecordType(entry.getKey(), entry.getValue()); 
     797            try { 
     798                FieldDescriptor fieldDescriptor = getFieldDescriptor(scope, name, mixin); 
     799                return fieldDescriptor; 
     800            } catch (FieldDescriptorNotFoundException exception) { 
     801                // skip 
     802            } 
     803        } 
     804        throw new FieldDescriptorNotFoundException(name, null); 
     805    } 
    674806 
    675807} 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/RecordImpl.java

    r3979 r3981  
    2828public class RecordImpl implements Record { 
    2929    private RecordId id; 
    30     private Map<String, Object> nonVersionableFields = new HashMap<String, Object>(); 
    31     private Map<String, Object> versionableFields = new HashMap<String, Object>(); 
    32     private Map<String, Object> versionableMutableFields = new HashMap<String, Object>(); 
     30    private Map<Scope, Map<String, Object>> fields = new HashMap<Scope, Map<String, Object>>(); 
    3331    private String recordTypeId; 
    3432    private Long recordTypeVersion; 
    35     private String nonVersionableRecordTypeId; 
    36     private Long nonVersionableRecordTypeVersion; 
    37     private String versionableRecordTypeId; 
    38     private Long versionableRecordTypeVersion; 
    39     private String versionableMutableRecordTypeId; 
    40     private Long versionableMutableRecordTypeVersion; 
     33    private Map<Scope, String> recordTypeIds = new HashMap<Scope, String>(); 
     34    private Map<Scope, Long> recordTypeVersions = new HashMap<Scope, Long>(); 
    4135    private Long version; 
    42     private List<String> nonVersionableFieldsToDelete = new ArrayList<String>(); 
    43     private List<String> versionableFieldsToDelete = new ArrayList<String>(); 
    44     private List<String> versionableMutableFieldsToDelete = new ArrayList<String>(); 
     36    private Map<Scope, List<String>> fieldsToDelete = new HashMap<Scope, List<String>>(); 
    4537 
    4638    /** 
     
    4941     */ 
    5042    public RecordImpl() { 
    51     } 
    52      
     43        initialize(); 
     44    } 
     45 
    5346    /** 
    5447     * This constructor should not be called directly. 
     
    5750    public RecordImpl(RecordId id) { 
    5851        this.id = id; 
     52        initialize(); 
     53    } 
     54 
     55    private void initialize() { 
     56        for (Scope scope : Scope.values()) { 
     57            fields.put(scope, new HashMap<String, Object>()); 
     58            fieldsToDelete.put(scope, new ArrayList<String>()); 
     59        } 
    5960    } 
    6061 
     
    8990     
    9091    public void setRecordType(Scope scope, String id, Long version) { 
    91         switch (scope) { 
    92         case NON_VERSIONABLE: 
    93             this.nonVersionableRecordTypeId = id; 
    94             this.nonVersionableRecordTypeVersion = version; 
    95             break; 
    96         case VERSIONABLE: 
    97             this.versionableRecordTypeId = id; 
    98             this.versionableRecordTypeVersion = version; 
    99             break; 
    100         case VERSIONABLE_MUTABLE: 
    101             this.versionableMutableRecordTypeId = id; 
    102             this.versionableMutableRecordTypeVersion = version; 
    103             break; 
    104         default: 
    105             break; 
    106         } 
     92        recordTypeIds.put(scope, id); 
     93        recordTypeVersions.put(scope, version); 
    10794    } 
    10895     
    10996    public String getRecordTypeId(Scope scope) { 
    110         switch (scope) { 
    111         case NON_VERSIONABLE: 
    112             return nonVersionableRecordTypeId; 
    113         case VERSIONABLE: 
    114             return versionableRecordTypeId; 
    115         case VERSIONABLE_MUTABLE: 
    116             return versionableMutableRecordTypeId; 
    117         default: 
    118             return null; 
    119         } 
     97        return recordTypeIds.get(scope); 
    12098    } 
    12199     
    122100    public Long getRecordTypeVersion(Scope scope) { 
    123         switch (scope) { 
    124         case NON_VERSIONABLE: 
    125             return nonVersionableRecordTypeVersion; 
    126         case VERSIONABLE: 
    127             return versionableRecordTypeVersion; 
    128         case VERSIONABLE_MUTABLE: 
    129             return versionableMutableRecordTypeVersion; 
    130         default: 
    131             return null; 
    132         } 
    133     } 
    134      
    135     public void setField(Scope scope, String fieldId, Object value) { 
    136         switch (scope) { 
    137         case NON_VERSIONABLE: 
    138             this.nonVersionableFields.put(fieldId, value); 
    139             break; 
    140         case VERSIONABLE: 
    141             this.versionableFields.put(fieldId, value); 
    142             break; 
    143         case VERSIONABLE_MUTABLE: 
    144             this.versionableMutableFields.put(fieldId, value); 
    145             break; 
    146         default: 
    147             break; 
    148         } 
    149     } 
    150      
    151     public Object getField(Scope scope, String fieldId) throws FieldNotFoundException { 
    152         Object field = null; 
    153         switch (scope) { 
    154         case NON_VERSIONABLE: 
    155             field = nonVersionableFields.get(fieldId); 
    156             break; 
    157         case VERSIONABLE: 
    158             field = versionableFields.get(fieldId); 
    159             break; 
    160         case VERSIONABLE_MUTABLE: 
    161             field = versionableMutableFields.get(fieldId); 
    162             break; 
    163         default: 
    164             break; 
    165         } 
     101        return recordTypeVersions.get(scope); 
     102    } 
     103     
     104    public void setField(Scope scope, String name, Object value) { 
     105        fields.get(scope).put(name, value); 
     106    } 
     107     
     108    public Object getField(Scope scope, String name) throws FieldNotFoundException { 
     109        Object field = fields.get(scope).get(name); 
    166110        if (field == null) { 
    167             throw new FieldNotFoundException(fieldId); 
     111            throw new FieldNotFoundException(name); 
    168112        } 
    169113        return field; 
     
    171115 
    172116    public Map<String, Object> getFields(Scope scope) { 
    173         switch (scope) { 
    174         case NON_VERSIONABLE: 
    175             return nonVersionableFields; 
    176         case VERSIONABLE: 
    177             return versionableFields; 
    178         case VERSIONABLE_MUTABLE: 
    179             return versionableMutableFields; 
    180         default: 
    181             return null; 
    182         } 
     117        return fields.get(scope); 
    183118    } 
    184119 
    185120    public List<String> getFieldsToDelete(Scope scope) { 
    186         switch (scope) { 
    187         case NON_VERSIONABLE: 
    188             return nonVersionableFieldsToDelete; 
    189         case VERSIONABLE: 
    190             return versionableFieldsToDelete; 
    191         case VERSIONABLE_MUTABLE: 
    192             return versionableMutableFieldsToDelete; 
    193         default: 
    194             return null; 
    195         } 
    196     } 
    197  
    198     public void addFieldsToDelete(Scope scope, List<String> fieldIds) { 
    199         switch (scope) { 
    200         case NON_VERSIONABLE: 
    201             this.nonVersionableFieldsToDelete .addAll(fieldIds); 
    202             break; 
    203         case VERSIONABLE: 
    204             this.versionableFieldsToDelete .addAll(fieldIds); 
    205             break; 
    206         case VERSIONABLE_MUTABLE: 
    207             this.versionableMutableFieldsToDelete .addAll(fieldIds); 
    208             break; 
    209         default: 
    210             break; 
    211         } 
    212     } 
    213  
    214     public void removeFieldsToDelete(Scope scope, List<String> fieldIds) { 
    215         switch (scope) { 
    216         case NON_VERSIONABLE: 
    217             this.nonVersionableFieldsToDelete .removeAll(fieldIds); 
    218             break; 
    219         case VERSIONABLE: 
    220             this.versionableFieldsToDelete .removeAll(fieldIds); 
    221             break; 
    222         case VERSIONABLE_MUTABLE: 
    223             this.versionableMutableFieldsToDelete .removeAll(fieldIds); 
    224             break; 
    225         default: 
    226             break; 
    227         } 
     121        return fieldsToDelete.get(scope); 
     122    } 
     123 
     124    public void addFieldsToDelete(Scope scope, List<String> names) { 
     125        fieldsToDelete.get(scope).addAll(names); 
     126    } 
     127 
     128    public void removeFieldsToDelete(Scope scope, List<String> names) { 
     129        fieldsToDelete.get(scope).removeAll(names); 
    228130    } 
    229131 
     
    234136        record.recordTypeId = recordTypeId; 
    235137        record.recordTypeVersion = recordTypeVersion; 
    236         record.nonVersionableRecordTypeId = nonVersionableRecordTypeId; 
    237         record.nonVersionableRecordTypeVersion = nonVersionableRecordTypeVersion; 
    238         record.versionableRecordTypeId = versionableRecordTypeId; 
    239         record.versionableRecordTypeVersion = versionableRecordTypeVersion; 
    240         record.versionableMutableRecordTypeId = versionableMutableRecordTypeId; 
    241         record.versionableMutableRecordTypeVersion = versionableMutableRecordTypeVersion; 
    242         record.nonVersionableFields.putAll(nonVersionableFields); 
    243         record.versionableFields.putAll(versionableFields); 
    244         record.versionableMutableFields.putAll(versionableMutableFields); 
    245         record.nonVersionableFieldsToDelete.addAll(nonVersionableFieldsToDelete); 
    246         record.versionableFieldsToDelete.addAll(versionableFieldsToDelete); 
    247         record.versionableMutableFieldsToDelete.addAll(versionableMutableFieldsToDelete); 
     138        record.recordTypeIds.putAll(recordTypeIds); 
     139        record.recordTypeVersions.putAll(recordTypeVersions); 
     140        for (Scope scope : Scope.values()) { 
     141            record.fields.get(scope).putAll(fields.get(scope)); 
     142            record.fieldsToDelete.get(scope).addAll(fieldsToDelete.get(scope)); 
     143        } 
    248144        return record; 
    249145    } 
     
    253149        final int prime = 31; 
    254150        int result = 1; 
     151        result = prime * result + ((fields == null) ? 0 : fields.hashCode()); 
     152        result = prime * result + ((fieldsToDelete == null) ? 0 : fieldsToDelete.hashCode()); 
    255153        result = prime * result + ((id == null) ? 0 : id.hashCode()); 
    256         result = prime * result + ((nonVersionableFields == null) ? 0 : nonVersionableFields.hashCode()); 
    257         result = prime * result 
    258                         + ((nonVersionableFieldsToDelete == null) ? 0 : nonVersionableFieldsToDelete.hashCode()); 
    259         result = prime * result + ((nonVersionableRecordTypeId == null) ? 0 : nonVersionableRecordTypeId.hashCode()); 
    260         result = prime * result 
    261                         + ((nonVersionableRecordTypeVersion == null) ? 0 : nonVersionableRecordTypeVersion.hashCode()); 
    262154        result = prime * result + ((recordTypeId == null) ? 0 : recordTypeId.hashCode()); 
     155        result = prime * result + ((recordTypeIds == null) ? 0 : recordTypeIds.hashCode()); 
    263156        result = prime * result + ((recordTypeVersion == null) ? 0 : recordTypeVersion.hashCode()); 
     157        result = prime * result + ((recordTypeVersions == null) ? 0 : recordTypeVersions.hashCode()); 
    264158        result = prime * result + ((version == null) ? 0 : version.hashCode()); 
    265         result = prime * result + ((versionableFields == null) ? 0 : versionableFields.hashCode()); 
    266         result = prime * result + ((versionableFieldsToDelete == null) ? 0 : versionableFieldsToDelete.hashCode()); 
    267         result = prime * result + ((versionableMutableFields == null) ? 0 : versionableMutableFields.hashCode()); 
    268         result = prime 
    269                         * result 
    270                         + ((versionableMutableFieldsToDelete == null) ? 0 : versionableMutableFieldsToDelete.hashCode()); 
    271         result = prime * result 
    272                         + ((versionableMutableRecordTypeId == null) ? 0 : versionableMutableRecordTypeId.hashCode()); 
    273         result = prime 
    274                         * result 
    275                         + ((versionableMutableRecordTypeVersion == null) ? 0 : versionableMutableRecordTypeVersion 
    276                                         .hashCode()); 
    277         result = prime * result + ((versionableRecordTypeId == null) ? 0 : versionableRecordTypeId.hashCode()); 
    278         result = prime * result 
    279                         + ((versionableRecordTypeVersion == null) ? 0 : versionableRecordTypeVersion.hashCode()); 
    280159        return result; 
    281160    } 
     
    290169            return false; 
    291170        RecordImpl other = (RecordImpl) obj; 
     171        if (fields == null) { 
     172            if (other.fields != null) 
     173                return false; 
     174        } else if (!fields.equals(other.fields)) 
     175            return false; 
     176        if (fieldsToDelete == null) { 
     177            if (other.fieldsToDelete != null) 
     178                return false; 
     179        } else if (!fieldsToDelete.equals(other.fieldsToDelete)) 
     180            return false; 
    292181        if (id == null) { 
    293182            if (other.id != null) 
     
    295184        } else if (!id.equals(other.id)) 
    296185            return false; 
    297         if (nonVersionableFields == null) { 
    298             if (other.nonVersionableFields != null) 
    299                 return false; 
    300         } else if (!nonVersionableFields.equals(other.nonVersionableFields)) 
    301             return false; 
    302         if (nonVersionableFieldsToDelete == null) { 
    303             if (other.nonVersionableFieldsToDelete != null) 
    304                 return false; 
    305         } else if (!nonVersionableFieldsToDelete.equals(other.nonVersionableFieldsToDelete)) 
    306             return false; 
    307         if (nonVersionableRecordTypeId == null) { 
    308             if (other.nonVersionableRecordTypeId != null) 
    309                 return false; 
    310         } else if (!nonVersionableRecordTypeId.equals(other.nonVersionableRecordTypeId)) 
    311             return false; 
    312         if (nonVersionableRecordTypeVersion == null) { 
    313             if (other.nonVersionableRecordTypeVersion != null) 
    314                 return false; 
    315         } else if (!nonVersionableRecordTypeVersion.equals(other.nonVersionableRecordTypeVersion)) 
    316             return false; 
    317186        if (recordTypeId == null) { 
    318187            if (other.recordTypeId != null) 
     
    320189        } else if (!recordTypeId.equals(other.recordTypeId)) 
    321190            return false; 
     191        if (recordTypeIds == null) { 
     192            if (other.recordTypeIds != null) 
     193                return false; 
     194        } else if (!recordTypeIds.equals(other.recordTypeIds)) 
     195            return false; 
    322196        if (recordTypeVersion == null) { 
    323197            if (other.recordTypeVersion != null) 
     
    325199        } else if (!recordTypeVersion.equals(other.recordTypeVersion)) 
    326200            return false; 
     201        if (recordTypeVersions == null) { 
     202            if (other.recordTypeVersions != null) 
     203                return false; 
     204        } else if (!recordTypeVersions.equals(other.recordTypeVersions)) 
     205            return false; 
    327206        if (version == null) { 
    328207            if (other.version != null) 
    329208                return false; 
    330209        } else if (!version.equals(other.version)) 
    331             return false; 
    332         if (versionableFields == null) { 
    333             if (other.versionableFields != null) 
    334                 return false; 
    335         } else if (!versionableFields.equals(other.versionableFields)) 
    336             return false; 
    337         if (versionableFieldsToDelete == null) { 
    338             if (other.versionableFieldsToDelete != null) 
    339                 return false; 
    340         } else if (!versionableFieldsToDelete.equals(other.versionableFieldsToDelete)) 
    341             return false; 
    342         if (versionableMutableFields == null) { 
    343             if (other.versionableMutableFields != null) 
    344                 return false; 
    345         } else if (!versionableMutableFields.equals(other.versionableMutableFields)) 
    346             return false; 
    347         if (versionableMutableFieldsToDelete == null) { 
    348             if (other.versionableMutableFieldsToDelete != null) 
    349                 return false; 
    350         } else if (!versionableMutableFieldsToDelete.equals(other.versionableMutableFieldsToDelete)) 
    351             return false; 
    352         if (versionableMutableRecordTypeId == null) { 
    353             if (other.versionableMutableRecordTypeId != null) 
    354                 return false; 
    355         } else if (!versionableMutableRecordTypeId.equals(other.versionableMutableRecordTypeId)) 
    356             return false; 
    357         if (versionableMutableRecordTypeVersion == null) { 
    358             if (other.versionableMutableRecordTypeVersion != null) 
    359                 return false; 
    360         } else if (!versionableMutableRecordTypeVersion.equals(other.versionableMutableRecordTypeVersion)) 
    361             return false; 
    362         if (versionableRecordTypeId == null) { 
    363             if (other.versionableRecordTypeId != null) 
    364                 return false; 
    365         } else if (!versionableRecordTypeId.equals(other.versionableRecordTypeId)) 
    366             return false; 
    367         if (versionableRecordTypeVersion == null) { 
    368             if (other.versionableRecordTypeVersion != null) 
    369                 return false; 
    370         } else if (!versionableRecordTypeVersion.equals(other.versionableRecordTypeVersion)) 
    371210            return false; 
    372211        return true; 
     
    376215    public String toString() { 
    377216        return "RecordImpl [id=" + id + ", version=" + version + ", recordTypeId=" + recordTypeId 
    378                         + ", recordTypeVersion=" + recordTypeVersion + ", nonVersionableRecordTypeId=" 
    379                         + nonVersionableRecordTypeId + ", nonVersionableRecordTypeVersion=" 
    380                         + nonVersionableRecordTypeVersion + ", versionableMutableRecordTypeId=" 
    381                         + versionableMutableRecordTypeId + ", versionableMutableRecordTypeVersion=" 
    382                         + versionableMutableRecordTypeVersion + ", versionableRecordTypeId=" + versionableRecordTypeId 
    383                         + ", versionableRecordTypeVersion=" + versionableRecordTypeVersion + ", nonVersionableFields=" 
    384                         + nonVersionableFields + ", nonVersionableFieldsToDelete=" + nonVersionableFieldsToDelete 
    385                         + ", versionableFields=" + versionableFields + ", versionableFieldsToDelete=" 
    386                         + versionableFieldsToDelete + ", versionableMutableFields=" + versionableMutableFields 
    387                         + ", versionableMutableFieldsToDelete=" + versionableMutableFieldsToDelete + "]"; 
     217                        + ", recordTypeVersion=" + recordTypeVersion + ", recordTypeIds=" + recordTypeIds 
     218                        + ", recordTypeVersions=" + recordTypeVersions + ", fields=" + fields + ", fieldsToDelete=" 
     219                        + fieldsToDelete + "]"; 
    388220    } 
    389221} 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/RecordTypeImpl.java

    r3978 r3981  
    1616package org.lilycms.repository.impl; 
    1717 
     18import java.util.HashMap; 
     19import java.util.Map; 
     20 
    1821import org.lilycms.repository.api.RecordType; 
    1922import org.lilycms.repository.api.TypeManager; 
     
    2427    private final String id; 
    2528    private Long version; 
    26     private String nonVersionableFieldGroupId; 
    27     private String versionableFieldGroupId; 
    28     private String versionableMutableFieldGroupId; 
    29     private Long nonVersionableFieldGroupVersion; 
    30     private Long versionableFieldGroupVersion; 
    31     private Long versionableMutableFieldGroupVersion; 
     29    private Map<Scope, String> fieldGroupIds; 
     30    private Map<Scope, Long> fieldGroupVersions; 
     31    private Map<String, Long> mixins; 
    3232 
    3333    /** 
     
    3737    public RecordTypeImpl(String id) { 
    3838        this.id = id; 
     39        fieldGroupIds = new HashMap<Scope, String>(); 
     40        fieldGroupIds.put(Scope.NON_VERSIONABLE, null); 
     41        fieldGroupIds.put(Scope.VERSIONABLE, null); 
     42        fieldGroupIds.put(Scope.VERSIONABLE_MUTABLE, null); 
     43        fieldGroupVersions = new HashMap<Scope, Long>(); 
     44        fieldGroupVersions.put(Scope.NON_VERSIONABLE, null); 
     45        fieldGroupVersions.put(Scope.VERSIONABLE, null); 
     46        fieldGroupVersions.put(Scope.VERSIONABLE_MUTABLE, null); 
     47        mixins = new HashMap<String, Long>(); 
    3948    } 
    4049     
     
    5261 
    5362    public String getFieldGroupId(Scope scope) { 
    54         switch (scope) { 
    55         case NON_VERSIONABLE: 
    56             return nonVersionableFieldGroupId; 
    57         case VERSIONABLE: 
    58             return versionableFieldGroupId; 
    59         case VERSIONABLE_MUTABLE: 
    60             return versionableMutableFieldGroupId; 
    61         default: 
    62             return null; 
    63         } 
     63        return fieldGroupIds.get(scope); 
    6464    } 
    6565 
    6666    public Long getFieldGroupVersion(Scope scope) { 
    67         switch (scope) { 
    68         case NON_VERSIONABLE: 
    69             return nonVersionableFieldGroupVersion; 
    70         case VERSIONABLE: 
    71             return versionableFieldGroupVersion; 
    72         case VERSIONABLE_MUTABLE: 
    73             return versionableMutableFieldGroupVersion; 
    74         default: 
    75             return null; 
    76         } 
     67        return fieldGroupVersions.get(scope); 
    7768    } 
    7869 
    7970    public void setFieldGroupId(Scope scope, String id) { 
    80         switch (scope) { 
    81         case NON_VERSIONABLE: 
    82             nonVersionableFieldGroupId = id; 
    83             break; 
    84         case VERSIONABLE: 
    85             versionableFieldGroupId = id; 
    86             break; 
    87         case VERSIONABLE_MUTABLE: 
    88             versionableMutableFieldGroupId = id; 
    89             break; 
    90         default: 
    91             break; 
    92         } 
     71        fieldGroupIds.put(scope, id); 
    9372    } 
    9473 
    9574    public void setFieldGroupVersion(Scope scope, Long version) { 
    96         switch (scope) { 
    97         case NON_VERSIONABLE: 
    98             nonVersionableFieldGroupVersion = version; 
    99             break; 
    100         case VERSIONABLE: 
    101             versionableFieldGroupVersion = version; 
    102             break; 
    103         case VERSIONABLE_MUTABLE: 
    104             versionableMutableFieldGroupVersion = version; 
    105             break; 
    106         default: 
    107             break; 
    108         } 
     75        fieldGroupVersions.put(scope, version); 
     76    } 
     77     
     78    public void addMixin(String recordTypeId, Long recordTypeVersion) { 
     79        mixins.put(recordTypeId, recordTypeVersion); 
     80    } 
     81     
     82    public void removeMixin(String recordTypeId) { 
     83        mixins.remove(recordTypeId); 
     84    } 
     85     
     86    public Map<String, Long> getMixins() { 
     87        return mixins; 
    10988    } 
    11089 
     
    11291        RecordTypeImpl clone = new RecordTypeImpl(this.id); 
    11392        clone.version = this.version; 
    114         clone.nonVersionableFieldGroupId = this.nonVersionableFieldGroupId; 
    115         clone.nonVersionableFieldGroupVersion = this.nonVersionableFieldGroupVersion; 
    116         clone.versionableFieldGroupId = this.versionableFieldGroupId; 
    117         clone.versionableFieldGroupVersion = this.versionableFieldGroupVersion; 
    118         clone.versionableMutableFieldGroupId = this.versionableMutableFieldGroupId; 
    119         clone.versionableMutableFieldGroupVersion = this.versionableMutableFieldGroupVersion; 
     93        clone.fieldGroupIds.putAll(fieldGroupIds); 
     94        clone.fieldGroupVersions.putAll(fieldGroupVersions); 
     95        clone.mixins.putAll(mixins); 
    12096        return clone; 
    12197    } 
     
    125101        final int prime = 31; 
    126102        int result = 1; 
     103        result = prime * result + ((fieldGroupIds == null) ? 0 : fieldGroupIds.hashCode()); 
     104        result = prime * result + ((fieldGroupVersions == null) ? 0 : fieldGroupVersions.hashCode()); 
    127105        result = prime * result + ((id == null) ? 0 : id.hashCode()); 
    128         result = prime * result + ((nonVersionableFieldGroupId == null) ? 0 : nonVersionableFieldGroupId.hashCode()); 
    129         result = prime * result 
    130                         + ((nonVersionableFieldGroupVersion == null) ? 0 : nonVersionableFieldGroupVersion.hashCode()); 
     106        result = prime * result + ((mixins == null) ? 0 : mixins.hashCode()); 
    131107        result = prime * result + ((version == null) ? 0 : version.hashCode()); 
    132         result = prime * result + ((versionableFieldGroupId == null) ? 0 : versionableFieldGroupId.hashCode()); 
    133         result = prime * result 
    134                         + ((versionableFieldGroupVersion == null) ? 0 : versionableFieldGroupVersion.hashCode()); 
    135         result = prime * result 
    136                         + ((versionableMutableFieldGroupId == null) ? 0 : versionableMutableFieldGroupId.hashCode()); 
    137         result = prime 
    138                         * result 
    139                         + ((versionableMutableFieldGroupVersion == null) ? 0 : versionableMutableFieldGroupVersion 
    140                                         .hashCode()); 
    141108        return result; 
    142109    } 
     
    151118            return false; 
    152119        RecordTypeImpl other = (RecordTypeImpl) obj; 
     120        if (fieldGroupIds == null) { 
     121            if (other.fieldGroupIds != null) 
     122                return false; 
     123        } else if (!fieldGroupIds.equals(other.fieldGroupIds)) 
     124            return false; 
     125        if (fieldGroupVersions == null) { 
     126            if (other.fieldGroupVersions != null) 
     127                return false; 
     128        } else if (!fieldGroupVersions.equals(other.fieldGroupVersions)) 
     129            return false; 
    153130        if (id == null) { 
    154131            if (other.id != null) 
     
    156133        } else if (!id.equals(other.id)) 
    157134            return false; 
    158         if (nonVersionableFieldGroupId == null) { 
    159             if (other.nonVersionableFieldGroupId != null) 
     135        if (mixins == null) { 
     136            if (other.mixins != null) 
    160137                return false; 
    161         } else if (!nonVersionableFieldGroupId.equals(other.nonVersionableFieldGroupId)) 
    162             return false; 
    163         if (nonVersionableFieldGroupVersion == null) { 
    164             if (other.nonVersionableFieldGroupVersion != null) 
    165                 return false; 
    166         } else if (!nonVersionableFieldGroupVersion.equals(other.nonVersionableFieldGroupVersion)) 
     138        } else if (!mixins.equals(other.mixins)) 
    167139            return false; 
    168140        if (version == null) { 
     
    171143        } else if (!version.equals(other.version)) 
    172144            return false; 
    173         if (versionableFieldGroupId == null) { 
    174             if (other.versionableFieldGroupId != null) 
    175                 return false; 
    176         } else if (!versionableFieldGroupId.equals(other.versionableFieldGroupId)) 
    177             return false; 
    178         if (versionableFieldGroupVersion == null) { 
    179             if (other.versionableFieldGroupVersion != null) 
    180                 return false; 
    181         } else if (!versionableFieldGroupVersion.equals(other.versionableFieldGroupVersion)) 
    182             return false; 
    183         if (versionableMutableFieldGroupId == null) { 
    184             if (other.versionableMutableFieldGroupId != null) 
    185                 return false; 
    186         } else if (!versionableMutableFieldGroupId.equals(other.versionableMutableFieldGroupId)) 
    187             return false; 
    188         if (versionableMutableFieldGroupVersion == null) { 
    189             if (other.versionableMutableFieldGroupVersion != null) 
    190                 return false; 
    191         } else if (!versionableMutableFieldGroupVersion.equals(other.versionableMutableFieldGroupVersion)) 
    192             return false; 
    193145        return true; 
    194146    } 
     
    196148    @Override 
    197149    public String toString() { 
    198         return "RecordTypeImpl [id=" + id + ", version=" + version + ", nonVersionableFieldGroupId=" 
    199                         + nonVersionableFieldGroupId + ", nonVersionableFieldGroupVersion=" 
    200                         + nonVersionableFieldGroupVersion + ", versionableFieldGroupId=" + versionableFieldGroupId 
    201                         + ", versionableFieldGroupVersion=" + versionableFieldGroupVersion 
    202                         + ", versionableMutableFieldGroupId=" + versionableMutableFieldGroupId 
    203                         + ", versionableMutableFieldGroupVersion=" + versionableMutableFieldGroupVersion + "]"; 
     150        return "RecordTypeImpl [id=" + id + ", version=" + version + ", fieldGroupIds=" + fieldGroupIds 
     151                        + ", fieldGroupVersions=" + fieldGroupVersions + ", mixins=" + mixins + "]"; 
    204152    } 
     153 
    205154} 
  • projects/lily/trunk/repository/impl/src/test/java/org/lilycms/repository/impl/test/HBaseRepositoryTest.java

    r3979 r3981  
    8181 
    8282    private static void setupFieldDescriptors() throws Exception { 
    83         fieldDescriptor1 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD1", typeManager.getValueType("STRING", false, false), "GN1")); 
    84         fieldDescriptor1B = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD1B", typeManager.getValueType("STRING", false, false), "GN1B")); 
    85         fieldDescriptor2 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD2", typeManager.getValueType("INTEGER", false, false), "GN2")); 
    86         fieldDescriptor3 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD3", typeManager.getValueType("BOOLEAN", false, false), "GN3")); 
     83        fieldDescriptor1 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("STRING", false, false), "field1")); 
     84        fieldDescriptor1B = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("STRING", false, false), "field1B")); 
     85        fieldDescriptor2 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("INTEGER", false, false), "field2")); 
     86        fieldDescriptor3 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("BOOLEAN", false, false), "field3")); 
    8787    } 
    8888 
     
    176176         
    177177        assertEquals(Long.valueOf(1), createdRecord.getVersion()); 
    178         assertEquals("value1", createdRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
    179         assertEquals(123, createdRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    180         assertTrue((Boolean)createdRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId())); 
     178        assertEquals("value1", createdRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     179        assertEquals(123, createdRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     180        assertTrue((Boolean)createdRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName())); 
    181181        assertEquals(recordType1.getId(), createdRecord.getRecordTypeId()); 
    182182        assertEquals(Long.valueOf(1), createdRecord.getRecordTypeVersion()); 
     
    194194        Record record = repository.newRecord(recordId); 
    195195        record.setRecordType(recordType1.getId(), recordType1.getVersion()); 
    196         record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value1"); 
    197         record.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 123); 
    198         record.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), true); 
     196        record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value1"); 
     197        record.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 123); 
     198        record.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), true); 
    199199        return repository.create(record); 
    200200    } 
     
    227227        Record record = repository.newRecord(idGenerator.newRecordId()); 
    228228        record.setRecordType(recordType1.getId(), null); 
    229         record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value1"); 
     229        record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value1"); 
    230230        Record createdRecord = repository.create(record); 
    231231        assertEquals(recordType1.getId(), createdRecord.getRecordTypeId()); 
     
    249249        Record variant = repository.newRecord(idGenerator.newRecordId(record.getId(), variantProperties )); 
    250250        variant.setRecordType(recordType1.getId(), null); 
    251         variant.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    252         variant.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 567); 
    253         variant.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     251        variant.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     252        variant.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 567); 
     253        variant.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    254254         
    255255        Record createdVariant = repository.create(variant); 
    256256         
    257257        assertEquals(Long.valueOf(1), createdVariant.getVersion()); 
    258         assertEquals("value2", createdVariant.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
    259         assertEquals(567, createdVariant.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    260         assertFalse((Boolean)createdVariant.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId())); 
     258        assertEquals("value2", createdVariant.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     259        assertEquals(567, createdVariant.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     260        assertFalse((Boolean)createdVariant.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName())); 
    261261         
    262262        assertEquals(createdVariant, repository.read(variant.getId())); 
     
    267267        Record record = createDefaultRecord(idGenerator.newRecordId()); 
    268268        Record updateRecord = record.clone(); 
    269         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    270         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    271         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     269        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     270        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     271        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    272272         
    273273        Record updatedRecord = repository.update(updateRecord); 
    274274         
    275275        assertEquals(Long.valueOf(2), updatedRecord.getVersion()); 
    276         assertEquals("value2", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
    277         assertEquals(789, updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    278         assertEquals(false, updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId())); 
     276        assertEquals("value2", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     277        assertEquals(789, updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     278        assertEquals(false, updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName())); 
    279279         
    280280        assertEquals(updatedRecord, repository.read(record.getId())); 
     
    286286        Record updateRecord = repository.newRecord(record.getId()); 
    287287        updateRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    288         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
     288        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
    289289         
    290290        Record updatedRecord = repository.update(updateRecord); 
    291291         
    292292        assertEquals(Long.valueOf(1), updatedRecord.getVersion()); 
    293         assertEquals("value2", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
     293        assertEquals("value2", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     294        try { 
     295            updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName()); 
     296            fail(); 
     297        } catch (FieldNotFoundException expected) { 
     298        } 
     299        try { 
     300            updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName()); 
     301            fail(); 
     302        } catch (FieldNotFoundException expected) { 
     303        } 
     304         
     305        updatedRecord = repository.read(record.getId()); 
     306        assertEquals("value2", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     307        assertEquals(123, updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     308        assertEquals(true, updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName())); 
     309    } 
     310     
     311    @Test 
     312    public void testEmptyUpdate() throws Exception { 
     313        Record record = createDefaultRecord(idGenerator.newRecordId()); 
     314        Record updateRecord = repository.newRecord(record.getId()); 
     315        updateRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
     316         
     317        Record updatedRecord = repository.update(updateRecord); 
     318         
     319        assertEquals(Long.valueOf(1), updatedRecord.getVersion()); 
     320        try { 
     321            updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId()); 
     322            fail(); 
     323        } catch (FieldNotFoundException expected) { 
     324        } 
    294325        try { 
    295326            updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId()); 
     
    303334        } 
    304335         
    305         updatedRecord = repository.read(record.getId()); 
    306         assertEquals("value2", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
    307         assertEquals(123, updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    308         assertEquals(true, updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId())); 
    309     } 
    310      
    311     @Test 
    312     public void testEmptyUpdate() throws Exception { 
    313         Record record = createDefaultRecord(idGenerator.newRecordId()); 
    314         Record updateRecord = repository.newRecord(record.getId()); 
    315         updateRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
     336        assertEquals(record, repository.read(record.getId())); 
     337    } 
     338     
     339    @Test 
     340    public void testIdempotentUpdate() throws Exception { 
     341        Record record = createDefaultRecord(idGenerator.newRecordId()); 
     342        Record updateRecord = record.clone(); 
    316343         
    317344        Record updatedRecord = repository.update(updateRecord); 
    318345         
    319346        assertEquals(Long.valueOf(1), updatedRecord.getVersion()); 
    320         try { 
    321             updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId()); 
    322             fail(); 
    323         } catch (FieldNotFoundException expected) { 
    324         } 
    325         try { 
    326             updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId()); 
    327             fail(); 
    328         } catch (FieldNotFoundException expected) { 
    329         } 
    330         try { 
    331             updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId()); 
    332             fail(); 
    333         } catch (FieldNotFoundException expected) { 
    334         } 
    335          
    336         assertEquals(record, repository.read(record.getId())); 
    337     } 
    338      
    339     @Test 
    340     public void testIdempotentUpdate() throws Exception { 
    341         Record record = createDefaultRecord(idGenerator.newRecordId()); 
    342         Record updateRecord = record.clone(); 
    343          
    344         Record updatedRecord = repository.update(updateRecord); 
    345          
    346         assertEquals(Long.valueOf(1), updatedRecord.getVersion()); 
    347         assertEquals("value1", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
    348         assertEquals(123, updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    349         assertEquals(true, updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId())); 
     347        assertEquals("value1", updatedRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     348        assertEquals(123, updatedRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     349        assertEquals(true, updatedRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName())); 
    350350         
    351351        assertEquals(record, repository.read(record.getId())); 
     
    357357        Record updateRecord = record.clone(); 
    358358        updateRecord.setVersion(Long.valueOf(99)); 
    359         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
     359        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
    360360         
    361361        Record updatedRecord = repository.update(updateRecord); 
     
    371371        Record updateRecord = repository.newRecord(record.getId()); 
    372372        updateRecord.setRecordType(record.getRecordTypeId(), null); 
    373         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "aNewValue"); 
     373        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "aNewValue"); 
    374374        repository.update(updateRecord); 
    375375         
    376376        Record readRecord = repository.read(record.getId()); 
    377377        assertEquals(Long.valueOf(1), readRecord.getVersion()); 
    378         assertEquals("aNewValue", readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
     378        assertEquals("aNewValue", readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
    379379    } 
    380380     
     
    384384        Record record = createDefaultRecord(idGenerator.newRecordId()); 
    385385        Record updateRecord = record.clone(); 
    386         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    387         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    388         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     386        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     387        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     388        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    389389         
    390390        repository.update(updateRecord); 
    391391         
    392         record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
     392        record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
    393393        assertEquals(record, repository.read(record.getId(), Long.valueOf(1))); 
    394394    } 
     
    426426        Record updateRecord = repository.newRecord(record.getId()); 
    427427        updateRecord.setRecordType(recordType1B.getId(), recordType1B.getVersion()); 
    428         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    429         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    430         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     428        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     429        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     430        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    431431         
    432432        Record updatedRecord = repository.update(updateRecord); 
     
    456456        Record updateRecord = repository.newRecord(record.getId()); 
    457457        updateRecord.setRecordType(recordType1B.getId(), recordType1B.getVersion()); 
    458         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
     458        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
    459459         
    460460        Record updatedRecord = repository.update(updateRecord); 
     
    480480        Record updateRecord = repository.newRecord(record.getId()); 
    481481        updateRecord.setRecordType(recordType2.getId(), recordType2.getVersion()); 
    482         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor2.getId(), 789); 
    483         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor3.getId(), false); 
    484         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getId(), "value2"); 
     482        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor2.getName(), 789); 
     483        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor3.getName(), false); 
     484        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getName(), "value2"); 
    485485         
    486486        Record updatedRecord = repository.update(updateRecord); 
     
    503503        assertEquals(2, readRecord.getFields(Scope.VERSIONABLE).size()); 
    504504        assertEquals(2, readRecord.getFields(Scope.VERSIONABLE_MUTABLE).size()); 
    505         assertEquals("value1", readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId())); 
    506         assertEquals(789, readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor2.getId())); 
    507         assertEquals(123, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    508         assertFalse((Boolean)readRecord.getField(Scope.VERSIONABLE,fieldDescriptor3.getId())); 
    509         assertTrue((Boolean)readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId())); 
    510         assertEquals("value2", readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getId())); 
    511  
     505        assertEquals("value1", readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName())); 
     506        assertEquals(789, readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor2.getName())); 
     507        assertEquals(123, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     508        assertFalse((Boolean)readRecord.getField(Scope.VERSIONABLE,fieldDescriptor3.getName())); 
     509        assertTrue((Boolean)readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName())); 
     510        assertEquals("value2", readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getName())); 
    512511    } 
    513512     
     
    517516        Record deleteRecord = repository.newRecord(record.getId()); 
    518517        deleteRecord.setRecordType(record.getRecordTypeId(), null); 
    519         deleteRecord.addFieldsToDelete(Scope.NON_VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor1.getId()})); 
    520         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getId()})); 
    521         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE,Arrays.asList(new String[]{fieldDescriptor3.getId()})); 
     518        deleteRecord.addFieldsToDelete(Scope.NON_VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor1.getName()})); 
     519        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getName()})); 
     520        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE,Arrays.asList(new String[]{fieldDescriptor3.getName()})); 
    522521         
    523522        repository.update(deleteRecord); 
     
    533532        Record updateRecord = repository.newRecord(record.getId()); 
    534533        updateRecord.setRecordType(recordType2.getId(), recordType2.getVersion()); 
    535         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor2.getId(), 789); 
    536         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor3.getId(), false); 
    537         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getId(), "value2"); 
     534        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor2.getName(), 789); 
     535        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor3.getName(), false); 
     536        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getName(), "value2"); 
    538537         
    539538        repository.update(updateRecord); 
    540539         
    541540        Record deleteRecord = repository.newRecord(record.getId()); 
    542         deleteRecord.setRecordType(recordType2.getId(), recordType2.getVersion()); 
    543         deleteRecord.addFieldsToDelete(Scope.NON_VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor1.getId()})); 
     541        deleteRecord.setRecordType(recordType1.getId(), recordType1.getVersion()); 
     542        deleteRecord.addFieldsToDelete(Scope.NON_VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor1.getName()})); 
    544543        repository.update(deleteRecord); 
    545544         
     
    548547        assertEquals(1, readRecord.getFields(Scope.NON_VERSIONABLE).size()); 
    549548        try { 
    550             readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId()); 
    551             fail(); 
    552         } catch (FieldNotFoundException expected) { 
    553         } 
    554         assertEquals("value2", readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getId())); 
    555         assertEquals(789, readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor2.getId())); 
    556          
    557         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getId()})); 
    558         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE, Arrays.asList(new String[]{fieldDescriptor3.getId()})); 
     549            readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName()); 
     550            fail(); 
     551        } catch (FieldNotFoundException expected) { 
     552        } 
     553        assertEquals("value2", readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getName())); 
     554        assertEquals(789, readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor2.getName())); 
     555         
     556        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getName()})); 
     557        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE, Arrays.asList(new String[]{fieldDescriptor3.getName()})); 
    559558        repository.update(deleteRecord); 
    560559         
     
    564563        assertEquals(1, readRecord.getFields(Scope.VERSIONABLE).size()); 
    565564        assertEquals(1, readRecord.getFields(Scope.VERSIONABLE_MUTABLE).size()); 
    566         assertEquals(789, readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor2.getId())); 
    567         assertEquals(false, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor3.getId())); 
    568         assertEquals("value2", readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getId())); 
     565        assertEquals(789, readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor2.getName())); 
     566        assertEquals(false, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor3.getName())); 
     567        assertEquals("value2", readRecord.getField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getName())); 
    569568    } 
    570569     
     
    574573        Record deleteRecord = repository.newRecord(record.getId()); 
    575574        deleteRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    576         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getId()})); 
     575        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getName()})); 
    577576        repository.update(deleteRecord); 
    578577         
    579578        Record updateRecord = repository.newRecord(record.getId()); 
    580579        updateRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    581         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
     580        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
    582581        repository.update(updateRecord); 
    583582         
    584583        Record readRecord = repository.read(record.getId()); 
    585584        assertEquals(Long.valueOf(3), readRecord.getVersion()); 
    586         assertEquals(789, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
     585        assertEquals(789, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
    587586         
    588587        readRecord = repository.read(record.getId(), Long.valueOf(2)); 
    589588        try { 
    590             readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId()); 
     589            readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName()); 
    591590            fail(); 
    592591        } catch (FieldNotFoundException expected) { 
     
    594593         
    595594        readRecord = repository.read(record.getId(), Long.valueOf(1)); 
    596         assertEquals(123, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
     595        assertEquals(123, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
    597596    } 
    598597     
     
    602601        Record updateRecord = repository.newRecord(record.getId()); 
    603602        updateRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    604         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 999); 
    605         updateRecord.addFieldsToDelete(Scope.NON_VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor1.getId()})); 
     603        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 999); 
     604        updateRecord.addFieldsToDelete(Scope.NON_VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor1.getName()})); 
    606605        repository.update(updateRecord); 
    607606         
    608607        Record readRecord = repository.read(record.getId()); 
    609         assertEquals(999, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getId())); 
    610         try { 
    611             readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId()); 
     608        assertEquals(999, readRecord.getField(Scope.VERSIONABLE,fieldDescriptor2.getName())); 
     609        try { 
     610            readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName()); 
    612611            fail(); 
    613612        } catch (FieldNotFoundException expected) { 
     
    616615        readRecord = repository.read(record.getId(), Long.valueOf(1)); 
    617616        try { 
    618             readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId()); 
     617            readRecord.getField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName()); 
    619618            fail(); 
    620619        } catch (FieldNotFoundException expected) { 
     
    628627        Record updateRecord = repository.newRecord(record.getId()); 
    629628        updateRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    630         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    631         updateRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getId()})); 
     629        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     630        updateRecord.addFieldsToDelete(Scope.VERSIONABLE,Arrays.asList(new String[]{fieldDescriptor2.getName()})); 
    632631        repository.update(updateRecord); 
    633632         
    634633        try { 
    635             repository.read(record.getId()).getField(Scope.VERSIONABLE,fieldDescriptor2.getId()); 
     634            repository.read(record.getId()).getField(Scope.VERSIONABLE,fieldDescriptor2.getName()); 
    636635            fail(); 
    637636        } catch (FieldNotFoundException expected) { 
     
    654653        Record record = createDefaultRecord(idGenerator.newRecordId()); 
    655654        Record updateRecord = record.clone(); 
    656         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    657         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    658         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     655        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     656        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     657        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    659658        repository.update(updateRecord); 
    660659         
     
    663662         
    664663        Record readRecord = repository.read(record.getId(), Long.valueOf(1)); 
    665         assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getId()));  
    666         assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getId()));  
    667         assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId()));  
     664        assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getName()));  
     665        assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getName()));  
     666        assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName()));  
    668667    } 
    669668     
     
    672671        Record record = createDefaultRecord(idGenerator.newRecordId()); 
    673672        Record updateRecord = record.clone(); 
    674         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    675         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    676         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     673        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     674        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     675        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    677676        repository.update(updateRecord); 
    678677         
     
    680679        updateMutableRecord.setVersion(Long.valueOf(1)); 
    681680        updateMutableRecord.setRecordType(recordType2.getId(), recordType2.getVersion()); 
    682         updateMutableRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor2.getId(), 789); 
    683         updateMutableRecord.setField(Scope.VERSIONABLE,fieldDescriptor3.getId(), false); 
    684         updateMutableRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getId(), "value3"); 
     681        updateMutableRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor2.getName(), 789); 
     682        updateMutableRecord.setField(Scope.VERSIONABLE,fieldDescriptor3.getName(), false); 
     683        updateMutableRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor1.getName(), "value3"); 
    685684        assertEquals(Long.valueOf(1), repository.updateMutableFields(updateMutableRecord).getVersion()); 
    686685         
    687686        Record readRecord = repository.read(record.getId(), Long.valueOf(1)); 
    688687        assertEquals(Long.valueOf(1), readRecord.getVersion()); 
    689         assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getId()));  
    690         assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getId()));  
    691         assertEquals(true, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId()));  
    692         assertEquals("value3", readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor1.getId())); 
    693         try { 
    694             readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor2.getId()); 
    695             fail(); 
    696         } catch (FieldNotFoundException expected) { 
    697         } 
    698         try { 
    699             readRecord.getField(Scope.VERSIONABLE, fieldDescriptor3.getId()); 
     688        assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getName()));  
     689        assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getName()));  
     690        assertEquals(true, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName()));  
     691        assertEquals("value3", readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor1.getName())); 
     692        try { 
     693            readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor2.getName()); 
     694            fail(); 
     695        } catch (FieldNotFoundException expected) { 
     696        } 
     697        try { 
     698            readRecord.getField(Scope.VERSIONABLE, fieldDescriptor3.getName()); 
    700699            fail(); 
    701700        } catch (FieldNotFoundException expected) { 
     
    708707        readRecord = repository.read(record.getId()); 
    709708        assertEquals(Long.valueOf(2), readRecord.getVersion()); 
    710         assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getId()));  
    711         assertEquals(789, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getId()));  
    712         assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId()));  
    713         assertEquals("value3", readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor1.getId())); 
     709        assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getName()));  
     710        assertEquals(789, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getName()));  
     711        assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName()));  
     712        assertEquals("value3", readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor1.getName())); 
    714713        assertEquals(recordType1.getId(), readRecord.getRecordTypeId()); 
    715714        assertEquals(recordType1.getId(), readRecord.getRecordTypeId(Scope.NON_VERSIONABLE)); 
     
    722721        Record record = createDefaultRecord(idGenerator.newRecordId()); 
    723722        Record updateRecord = record.clone(); 
    724         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    725         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
    726         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     723        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     724        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
     725        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    727726        repository.update(updateRecord); 
    728727         
     
    730729        deleteRecord.setVersion(Long.valueOf(1)); 
    731730        deleteRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    732         deleteRecord.addFieldsToDelete(Scope.NON_VERSIONABLE, Arrays.asList(new String[]{fieldDescriptor1.getId()})); 
    733         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE, Arrays.asList(new String[]{fieldDescriptor2.getId()})); 
    734         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE, Arrays.asList(new String[]{fieldDescriptor3.getId()})); 
     731        deleteRecord.addFieldsToDelete(Scope.NON_VERSIONABLE, Arrays.asList(new String[]{fieldDescriptor1.getName()})); 
     732        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE, Arrays.asList(new String[]{fieldDescriptor2.getName()})); 
     733        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE, Arrays.asList(new String[]{fieldDescriptor3.getName()})); 
    735734         
    736735        repository.updateMutableFields(deleteRecord); 
    737736         
    738737        Record readRecord = repository.read(record.getId(), Long.valueOf(1)); 
    739         assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getId()));  
    740         assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getId()));  
    741         try { 
    742             readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId()); 
     738        assertEquals("value2", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getName()));  
     739        assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getName()));  
     740        try { 
     741            readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName()); 
    743742            fail(); 
    744743        } catch (FieldNotFoundException expected) { 
     
    746745 
    747746        readRecord = repository.read(record.getId()); 
    748         assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId())); 
     747        assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName())); 
    749748    } 
    750749     
     
    753752        Record record = createDefaultRecord(idGenerator.newRecordId()); 
    754753        Record updateRecord = record.clone(); 
    755         updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getId(), "value2"); 
    756         updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getId(), 789); 
     754        updateRecord.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "value2"); 
     755        updateRecord.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 789); 
    757756        updateRecord = repository.update(updateRecord); // Leave mutable field same on first update 
    758757 
    759         updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getId(), false); 
     758        updateRecord.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), false); 
    760759        updateRecord = repository.update(updateRecord); 
    761760         
     
    763762        deleteRecord.setVersion(Long.valueOf(1)); 
    764763        deleteRecord.setRecordType(record.getRecordTypeId(), record.getRecordTypeVersion()); 
    765         deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE, Arrays.asList(new String[]{fieldDescriptor3.getId()})); 
     764        deleteRecord.addFieldsToDelete(Scope.VERSIONABLE_MUTABLE, Arrays.asList(new String[]{fieldDescriptor3.getName()})); 
    766765         
    767766        repository.updateMutableFields(deleteRecord); 
     
    769768        Record readRecord = repository.read(record.getId(), Long.valueOf(1)); 
    770769        try { 
    771             readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId()); 
     770            readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName()); 
    772771            fail(); 
    773772        } catch (FieldNotFoundException expected) { 
     
    775774 
    776775        readRecord = repository.read(record.getId(), Long.valueOf(2)); 
    777         assertEquals(true, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId())); 
     776        assertEquals(true, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName())); 
    778777         
    779778        readRecord = repository.read(record.getId()); 
    780         assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getId())); 
     779        assertEquals(false, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName())); 
     780    } 
     781     
     782    @Test 
     783    public void testMixin() throws Exception { 
     784        FieldDescriptor fieldDescriptor4 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("STRING", false, false), "field4")); 
     785        FieldGroup fieldGroup4 = typeManager.newFieldGroup("FG4"); 
     786        fieldGroup4.setFieldGroupEntry(typeManager.newFieldGroupEntry(fieldDescriptor4.getId(), fieldDescriptor4.getVersion(), false, "alias4")); 
     787        fieldGroup4 = typeManager.createFieldGroup(fieldGroup4); 
     788        RecordType recordType4 = typeManager.newRecordType("RT4"); 
     789        recordType4.setFieldGroupId(Scope.VERSIONABLE,fieldGroup4.getId()); 
     790        recordType4.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup4.getVersion()); 
     791        recordType4.addMixin(recordType1.getId(), recordType1.getVersion()); 
     792        recordType4 = typeManager.createRecordType(recordType4); 
     793         
     794        Record record = repository.newRecord(idGenerator.newRecordId()); 
     795        record.setRecordType(recordType4.getId(), recordType4.getVersion()); 
     796        record.setField(Scope.NON_VERSIONABLE,fieldDescriptor1.getName(), "foo"); 
     797        record.setField(Scope.VERSIONABLE,fieldDescriptor2.getName(), 555); 
     798        record.setField(Scope.VERSIONABLE, fieldDescriptor4.getName(), "bar"); 
     799        record.setField(Scope.VERSIONABLE_MUTABLE,fieldDescriptor3.getName(), true); 
     800        record = repository.create(record); 
     801         
     802        Record readRecord = repository.read(record.getId()); 
     803        assertEquals(Long.valueOf(1), readRecord.getVersion()); 
     804        assertEquals("foo", readRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor1.getName())); 
     805        assertEquals(555, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getName())); 
     806        assertEquals("bar", readRecord.getField(Scope.VERSIONABLE, fieldDescriptor4.getName())); 
     807        assertEquals(true, readRecord.getField(Scope.VERSIONABLE_MUTABLE, fieldDescriptor3.getName())); 
     808    } 
     809     
     810    @Test 
     811    public void testUpdateNameFieldDescriptor() throws Exception { 
     812        // TODO : store fieldDescriptorVersion together with fieldValue 
     813         
     814//        FieldDescriptor updatedFieldDescriptor = fieldDescriptor2.clone(); 
     815//        updatedFieldDescriptor.setName("newName"); 
     816//        updatedFieldDescriptor = typeManager.updateFieldDescriptor(updatedFieldDescriptor); 
     817//         
     818//        FieldGroup fieldGroup5 = typeManager.newFieldGroup("FG5"); 
     819//        fieldGroup5.setFieldGroupEntry(typeManager.newFieldGroupEntry(updatedFieldDescriptor.getId(), updatedFieldDescriptor.getVersion(), false, "alias5")); 
     820//        fieldGroup5 = typeManager.createFieldGroup(fieldGroup5); 
     821//        RecordType recordType5 = typeManager.newRecordType("RT5"); 
     822//        recordType5.setFieldGroupId(Scope.VERSIONABLE,fieldGroup5.getId()); 
     823//        recordType5.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup5.getVersion()); 
     824//        recordType5 = typeManager.createRecordType(recordType5); 
     825//         
     826//        Record record = createDefaultRecord(idGenerator.newRecordId()); 
     827//        Record record2 = repository.newRecord(record.getId()); 
     828//        record2.setRecordType(recordType5.getId(), recordType5.getVersion()); 
     829//        record2.setField(Scope.VERSIONABLE, "newName", 54321); 
     830//        repository.update(record2); 
     831//         
     832//        Record readRecord = repository.read(record.getId()); 
     833//        assertEquals(1, readRecord.getFields(Scope.VERSIONABLE).size()); 
     834//        assertEquals(54321, readRecord.getField(Scope.VERSIONABLE, "newName")); 
     835//         
     836//        readRecord = repository.read(record.getId(), Long.valueOf(1)); 
     837//        assertEquals(1, readRecord.getFields(Scope.VERSIONABLE).size()); 
     838//        assertEquals(123, readRecord.getField(Scope.VERSIONABLE, fieldDescriptor2.getName())); 
    781839    } 
    782840} 
  • projects/lily/trunk/repository/impl/src/test/java/org/lilycms/repository/impl/test/TypeManagerFieldDescriptorTest.java

    r3977 r3981  
    1717 
    1818 
     19import static org.junit.Assert.*; 
     20 
    1921import org.apache.hadoop.hbase.HBaseTestingUtility; 
    2022import org.junit.After; 
    2123import org.junit.AfterClass; 
    22 import static org.junit.Assert.*; 
    2324import org.junit.Before; 
    2425import org.junit.BeforeClass; 
    2526import org.junit.Test; 
    2627import org.lilycms.repository.api.FieldDescriptor; 
    27 import org.lilycms.repository.api.FieldDescriptorExistsException; 
    2828import org.lilycms.repository.api.FieldDescriptorNotFoundException; 
    2929import org.lilycms.repository.api.FieldDescriptorUpdateException; 
    3030import org.lilycms.repository.api.TypeManager; 
    3131import org.lilycms.repository.api.ValueType; 
    32 import org.lilycms.repository.impl.FieldDescriptorImpl; 
    3332import org.lilycms.repository.impl.HBaseTypeManager; 
    3433import org.lilycms.repository.impl.IdGeneratorImpl; 
    35 import org.lilycms.repository.impl.RecordTypeImpl; 
    3634import org.lilycms.testfw.TestHelper; 
    3735 
     
    6462    @Test 
    6563    public void testCreate() throws Exception { 
    66         String id = "testCreate"; 
     64        String name = "testCreate"; 
    6765        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    68         FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    69         typeManager.createFieldDescriptor(fieldDescriptor); 
    70         fieldDescriptor.setVersion(Long.valueOf(1)); 
     66        FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(valueType , name); 
     67        fieldDescriptor = typeManager.createFieldDescriptor(fieldDescriptor); 
     68        assertEquals(Long.valueOf(1), fieldDescriptor.getVersion()); 
    7169        assertEquals(fieldDescriptor, typeManager.getFieldDescriptor(fieldDescriptor.getId(), null)); 
    7270    } 
     
    7472    @Test 
    7573    public void testCreateIgnoresVersion() throws Exception { 
    76         String id = "testCreateIgnoresVersion"; 
     74        String name = "testCreateIgnoresVersion"; 
    7775        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    78         FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
     76        FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(valueType , name); 
    7977        fieldDescriptor.setVersion(Long.valueOf(5)); 
    80         typeManager.createFieldDescriptor(fieldDescriptor); 
    81         fieldDescriptor.setVersion(Long.valueOf(1)); 
     78        fieldDescriptor = typeManager.createFieldDescriptor(fieldDescriptor); 
     79        assertEquals(Long.valueOf(1), fieldDescriptor.getVersion()); 
    8280        assertEquals(fieldDescriptor, typeManager.getFieldDescriptor(fieldDescriptor.getId(), null)); 
    8381    } 
    8482     
    8583    @Test 
    86     public void testCreateExistingFails() throws Exception { 
     84    public void testCreateIgnoresGivenId() throws Exception { 
    8785        String id = "testCreateExistingFails"; 
    8886        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    8987        FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    90         typeManager.createFieldDescriptor(fieldDescriptor); 
    91         try { 
    92             typeManager.createFieldDescriptor(fieldDescriptor); 
    93             fail("Creating an existing fieldDescriptor is not allowed. Use update instead."); 
    94         } catch (FieldDescriptorExistsException expected) { 
    95         } 
     88        fieldDescriptor = typeManager.createFieldDescriptor(fieldDescriptor); 
     89        assertFalse(fieldDescriptor.getId().equals(typeManager.createFieldDescriptor(fieldDescriptor.clone()))); 
    9690    } 
    9791 
    9892    @Test 
    9993    public void testUpdate() throws Exception { 
    100         String id = "testUpdate"; 
     94        String name = "testUpdate"; 
    10195        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    102         FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    103         typeManager.createFieldDescriptor(fieldDescriptorCreate); 
     96        FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(valueType , name); 
     97        fieldDescriptorCreate = typeManager.createFieldDescriptor(fieldDescriptorCreate); 
    10498         
    105         FieldDescriptor fieldDescriptorGlobalName = typeManager.newFieldDescriptor(id, valueType , "newGlobalName"); 
    106         typeManager.updateFieldDescriptor(fieldDescriptorGlobalName); 
    107         fieldDescriptorGlobalName.setVersion(Long.valueOf(2)); 
    108         assertEquals(fieldDescriptorGlobalName, typeManager.getFieldDescriptor(id, null)); 
     99        FieldDescriptor fieldDescriptorNewName = typeManager.newFieldDescriptor(fieldDescriptorCreate.getId(), valueType , "newName"); 
     100        fieldDescriptorNewName = typeManager.updateFieldDescriptor(fieldDescriptorNewName); 
     101        assertEquals(fieldDescriptorCreate.getId(), fieldDescriptorNewName.getId()); 
     102        assertEquals(Long.valueOf(2), fieldDescriptorNewName.getVersion()); 
     103        assertEquals(fieldDescriptorNewName, typeManager.getFieldDescriptor(fieldDescriptorCreate.getId(), null)); 
    109104         
    110105    } 
     
    112107    @Test 
    113108    public void testUpdateVersions() throws Exception { 
    114         String id = "testUpdateVersions"; 
     109        String name = "testUpdateVersions"; 
    115110        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    116         FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    117         typeManager.createFieldDescriptor(fieldDescriptorCreate); 
     111        FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(valueType , name); 
     112        fieldDescriptorCreate = typeManager.createFieldDescriptor(fieldDescriptorCreate); 
    118113         
    119         FieldDescriptor fieldDescriptorGlobalName = typeManager.newFieldDescriptor(id, valueType , "newGlobalName"); 
     114        FieldDescriptor fieldDescriptorNewName = typeManager.newFieldDescriptor(fieldDescriptorCreate.getId(), valueType , "newName"); 
    120115        // Update should ignore version 
    121         fieldDescriptorGlobalName.setVersion(Long.valueOf(99)); 
    122         FieldDescriptor updatedFieldDescriptor = typeManager.updateFieldDescriptor(fieldDescriptorGlobalName); 
     116        fieldDescriptorNewName.setVersion(Long.valueOf(99)); 
     117        FieldDescriptor updatedFieldDescriptor = typeManager.updateFieldDescriptor(fieldDescriptorNewName); 
    123118        assertEquals(Long.valueOf(2), updatedFieldDescriptor.getVersion()); 
    124         fieldDescriptorGlobalName.setVersion(Long.valueOf(2)); 
    125         assertEquals(fieldDescriptorGlobalName, typeManager.getFieldDescriptor(id, null)); 
     119        assertEquals(updatedFieldDescriptor, typeManager.getFieldDescriptor(fieldDescriptorCreate.getId(), null)); 
    126120 
    127121    } 
     
    129123    @Test 
    130124    public void testRetrieveOlderVersions() throws Exception { 
    131         String id = "testRetrieveOlderVersions"; 
     125        String name = "testRetrieveOlderVersions"; 
    132126        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    133         FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    134         typeManager.createFieldDescriptor(fieldDescriptorCreate); 
    135         FieldDescriptor fieldDescriptorGlobalName = typeManager.newFieldDescriptor(id, valueType , "newGlobalName"); 
    136         typeManager.updateFieldDescriptor(fieldDescriptorGlobalName); 
     127        FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(valueType , name); 
     128        fieldDescriptorCreate = typeManager.createFieldDescriptor(fieldDescriptorCreate); 
     129        FieldDescriptor fieldDescriptorNewName = typeManager.newFieldDescriptor(fieldDescriptorCreate.getId(), valueType , "newName"); 
     130        fieldDescriptorNewName = typeManager.updateFieldDescriptor(fieldDescriptorNewName); 
    137131         
    138         fieldDescriptorGlobalName.setVersion(Long.valueOf(2)); 
    139         assertEquals(fieldDescriptorGlobalName, typeManager.getFieldDescriptor(id, Long.valueOf(2))); 
     132        assertEquals(Long.valueOf(2), fieldDescriptorNewName.getVersion()); 
     133        assertEquals(fieldDescriptorNewName, typeManager.getFieldDescriptor(fieldDescriptorCreate.getId(), Long.valueOf(2))); 
    140134 
    141         fieldDescriptorCreate.setVersion(Long.valueOf(1)); 
    142         assertEquals(fieldDescriptorCreate, typeManager.getFieldDescriptor(id, Long.valueOf(1))); 
     135        assertEquals(fieldDescriptorCreate, typeManager.getFieldDescriptor(fieldDescriptorCreate.getId(), Long.valueOf(1))); 
    143136    } 
    144137     
    145138    @Test 
    146139    public void testRetrieveTooRecentVersionFails() throws Exception { 
    147         String id = "testRetrieveTooRecentVersionFails"; 
     140        String name = "testRetrieveTooRecentVersionFails"; 
    148141        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    149         FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    150         typeManager.createFieldDescriptor(fieldDescriptorCreate); 
    151         FieldDescriptor fieldDescriptorGlobalName = typeManager.newFieldDescriptor(id, valueType , "newGlobalName"); 
    152         typeManager.updateFieldDescriptor(fieldDescriptorGlobalName); 
     142        FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(valueType , name); 
     143        fieldDescriptorCreate = typeManager.createFieldDescriptor(fieldDescriptorCreate); 
     144        FieldDescriptor fieldDescriptorNewName = typeManager.newFieldDescriptor(fieldDescriptorCreate.getId(), valueType , "newName"); 
     145        typeManager.updateFieldDescriptor(fieldDescriptorNewName); 
    153146         
    154147        try { 
    155             typeManager.getFieldDescriptor(id, Long.valueOf(3)); 
     148            typeManager.getFieldDescriptor(fieldDescriptorCreate.getId(), Long.valueOf(3)); 
    156149            fail("Retrieving a too recent/non-existing version should fail."); 
    157150        } catch (FieldDescriptorNotFoundException expected) { 
     
    162155    @Test 
    163156    public void testIdempotentUpdateReturnsLatestVersionNumber() throws Exception { 
    164         String id = "testIdempotentUpdateReturnsLatestVersionNumber"; 
     157        String name = "testIdempotentUpdateReturnsLatestVersionNumber"; 
    165158        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    166         FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    167         typeManager.createFieldDescriptor(fieldDescriptorCreate); 
     159        FieldDescriptor fieldDescriptorCreate = typeManager.newFieldDescriptor(valueType , name); 
     160        fieldDescriptorCreate = typeManager.createFieldDescriptor(fieldDescriptorCreate); 
    168161         
    169         FieldDescriptor fieldDescriptorGlobalName = typeManager.newFieldDescriptor(id, valueType , "newGlobalName"); 
    170         typeManager.updateFieldDescriptor(fieldDescriptorGlobalName); 
     162        FieldDescriptor fieldDescriptorNewName = typeManager.newFieldDescriptor(fieldDescriptorCreate.getId(), valueType , "newName"); 
     163        typeManager.updateFieldDescriptor(fieldDescriptorNewName); 
    171164         
    172         FieldDescriptor idempotentUpdate = typeManager.updateFieldDescriptor(fieldDescriptorGlobalName); 
     165        FieldDescriptor idempotentUpdate = typeManager.updateFieldDescriptor(fieldDescriptorNewName); 
    173166        assertEquals(Long.valueOf(2), idempotentUpdate.getVersion()); 
    174         fieldDescriptorGlobalName.setVersion(Long.valueOf(2)); 
    175         assertEquals(fieldDescriptorGlobalName, typeManager.getFieldDescriptor(id, null)); 
     167        assertEquals(idempotentUpdate, typeManager.getFieldDescriptor(fieldDescriptorCreate.getId(), null)); 
    176168    } 
    177169     
    178170    @Test 
    179171    public void testUpdateValueTypeFails() throws Exception { 
    180         String id = "testUpdateValueTypeFails"; 
     172        String name = "testUpdateValueTypeFails"; 
    181173        ValueType valueType = typeManager.getValueType("STRING", false, false); 
    182         FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(id, valueType , "aGlobalName"); 
    183         typeManager.createFieldDescriptor(fieldDescriptor); 
     174        FieldDescriptor fieldDescriptor = typeManager.newFieldDescriptor(valueType , name); 
     175        fieldDescriptor = typeManager.createFieldDescriptor(fieldDescriptor); 
    184176         
    185177        fieldDescriptor.setValueType(typeManager.getValueType("INTEGER", false, false)); 
  • projects/lily/trunk/repository/impl/src/test/java/org/lilycms/repository/impl/test/TypeManagerFieldGroupTest.java

    r3977 r3981  
    2020 
    2121import java.util.Arrays; 
     22import java.util.UUID; 
    2223 
    2324import org.apache.hadoop.hbase.HBaseTestingUtility; 
     
    5657     
    5758    private static void setupFieldDescriptors() throws Exception { 
    58         fieldDescriptor1 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD1", typeManager.getValueType("STRING", false, false), "GN1")); 
    59         fieldDescriptor2 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD2", typeManager.getValueType("STRING", false, false), "GN2")); 
    60         fieldDescriptor3 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor("FD3", typeManager.getValueType("STRING", false, false), "GN3")); 
    61         fieldDescriptor3B = typeManager.updateFieldDescriptor(typeManager.newFieldDescriptor("FD3", typeManager.getValueType("STRING", false, false), "GN3B")); 
     59        fieldDescriptor1 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("STRING", false, false), "name1")); 
     60        fieldDescriptor2 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("STRING", false, false), "name2")); 
     61        fieldDescriptor3 = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType("STRING", false, false), "name3")); 
     62        fieldDescriptor3B = typeManager.updateFieldDescriptor(typeManager.newFieldDescriptor(fieldDescriptor3.getId(), typeManager.getValueType("STRING", false, false), "name3B")); 
    6263    } 
    6364 
     
    122123        FieldGroup actualFieldGroup = typeManager.getFieldGroup(id, null); 
    123124        assertEquals(fieldGroup, actualFieldGroup); 
    124         assertEquals(Long.valueOf(1), actualFieldGroup.getFieldGroupEntry("FD3").getFieldDescriptorVersion()); 
     125        assertEquals(Long.valueOf(1), actualFieldGroup.getFieldGroupEntry(fieldDescriptor3.getId()).getFieldDescriptorVersion()); 
    125126    } 
    126127     
     
    197198        String id = "testFieldDescriptorExistsOnCreate"; 
    198199        FieldGroup fieldGroup = typeManager.newFieldGroup(id); 
    199         FieldGroupEntry fieldGroupEntry = typeManager.newFieldGroupEntry("nonExistingFD", null, false, "alias1"); 
     200        FieldGroupEntry fieldGroupEntry = typeManager.newFieldGroupEntry(UUID.randomUUID().toString(), null, false, "alias1"); 
    200201        fieldGroup.setFieldGroupEntry(fieldGroupEntry); 
    201202        try { 
     
    224225        FieldGroup fieldGroup = typeManager.newFieldGroup(id); 
    225226        typeManager.createFieldGroup(fieldGroup); 
    226         FieldGroupEntry fieldGroupEntry = typeManager.newFieldGroupEntry("nonExistingFD", null, false, "alias1"); 
     227        FieldGroupEntry fieldGroupEntry = typeManager.newFieldGroupEntry(UUID.randomUUID().toString(), null, false, "alias1"); 
    227228        fieldGroup.setFieldGroupEntry(fieldGroupEntry); 
    228229        try { 
     
    254255        fieldGroup.setFieldGroupEntry(fieldGroupEntry); 
    255256        FieldGroup createdFieldgroup = typeManager.createFieldGroup(fieldGroup); 
    256         assertEquals(fieldDescriptor1.getVersion(), createdFieldgroup.getFieldGroupEntry("FD1").getFieldDescriptorVersion()); 
     257        assertEquals(fieldDescriptor1.getVersion(), createdFieldgroup.getFieldGroupEntry(fieldDescriptor1.getId()).getFieldDescriptorVersion()); 
    257258         
    258259        fieldGroupEntry = typeManager.newFieldGroupEntry(fieldDescriptor2.getId(), null, false, "alias2"); 
    259260        fieldGroup.setFieldGroupEntry(fieldGroupEntry); 
    260261        FieldGroup updatedFieldgroup = typeManager.updateFieldGroup(fieldGroup); 
    261         assertEquals(fieldDescriptor2.getVersion(), updatedFieldgroup.getFieldGroupEntry("FD2").getFieldDescriptorVersion()); 
     262        assertEquals(fieldDescriptor2.getVersion(), updatedFieldgroup.getFieldGroupEntry(fieldDescriptor2.getId()).getFieldDescriptorVersion()); 
    262263         
    263264        fieldGroupEntry = typeManager.newFieldGroupEntry(fieldDescriptor3.getId(), null, false, "alias3"); 
    264265        fieldGroup.setFieldGroupEntry(fieldGroupEntry); 
    265266        updatedFieldgroup = typeManager.updateFieldGroup(fieldGroup); 
    266         assertEquals(fieldDescriptor3B.getVersion(), updatedFieldgroup.getFieldGroupEntry("FD3").getFieldDescriptorVersion()); 
     267        assertEquals(fieldDescriptor3B.getVersion(), updatedFieldgroup.getFieldGroupEntry(fieldDescriptor3.getId()).getFieldDescriptorVersion()); 
    267268    } 
    268269     
  • projects/lily/trunk/repository/impl/src/test/java/org/lilycms/repository/impl/test/TypeManagerRecordTypeTest.java

    r3978 r3981  
    1919import static junit.framework.Assert.*; 
    2020 
    21 import org.apache.commons.lang.NotImplementedException; 
     21import java.util.Map; 
     22 
    2223import org.apache.hadoop.hbase.HBaseTestingUtility; 
    2324import org.junit.After; 
     
    425426    } 
    426427     
     428    @Test 
     429    public void testMixin() throws Exception { 
     430        String id = "testMixin"; 
     431        RecordType mixinType = typeManager.newRecordType(id+"MIX"); 
     432        mixinType.setFieldGroupId(Scope.NON_VERSIONABLE,fieldGroup1.getId()); 
     433        mixinType.setFieldGroupVersion(Scope.NON_VERSIONABLE,fieldGroup1.getVersion()); 
     434        mixinType.setFieldGroupId(Scope.VERSIONABLE,fieldGroup2.getId()); 
     435        mixinType.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup2.getVersion()); 
     436        mixinType.setFieldGroupId(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getId()); 
     437        mixinType.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getVersion()); 
     438        mixinType = typeManager.createRecordType(mixinType); 
     439         
     440        RecordType recordType = typeManager.newRecordType(id+"RT"); 
     441        recordType.addMixin(mixinType.getId(), mixinType.getVersion()); 
     442        assertEquals(Long.valueOf(1), typeManager.createRecordType(recordType).getVersion()); 
     443        recordType.setVersion(Long.valueOf(1)); 
     444        assertEquals(recordType, typeManager.getRecordType(recordType.getId(), null)); 
     445    } 
     446     
     447    @Test 
     448    public void testMixinUpdate() throws Exception { 
     449        String id = "testMixinUpdate"; 
     450        RecordType mixinType1 = typeManager.newRecordType(id+"MIX"); 
     451        mixinType1.setFieldGroupId(Scope.NON_VERSIONABLE,fieldGroup1.getId()); 
     452        mixinType1.setFieldGroupVersion(Scope.NON_VERSIONABLE,fieldGroup1.getVersion()); 
     453        mixinType1.setFieldGroupId(Scope.VERSIONABLE,fieldGroup2.getId()); 
     454        mixinType1.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup2.getVersion()); 
     455        mixinType1.setFieldGroupId(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getId()); 
     456        mixinType1.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getVersion()); 
     457        mixinType1 = typeManager.createRecordType(mixinType1); 
     458        RecordType mixinType2 = typeManager.newRecordType(id+"MIX2"); 
     459        mixinType2.setFieldGroupId(Scope.NON_VERSIONABLE,fieldGroup1.getId()); 
     460        mixinType2.setFieldGroupVersion(Scope.NON_VERSIONABLE,fieldGroup1.getVersion()); 
     461        mixinType2.setFieldGroupId(Scope.VERSIONABLE,fieldGroup2.getId()); 
     462        mixinType2.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup2.getVersion()); 
     463        mixinType2.setFieldGroupId(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getId()); 
     464        mixinType2.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getVersion()); 
     465        mixinType2 = typeManager.createRecordType(mixinType2); 
     466         
     467        RecordType recordType = typeManager.newRecordType(id+"RT"); 
     468        recordType.addMixin(mixinType1.getId(), mixinType1.getVersion()); 
     469        typeManager.createRecordType(recordType); 
     470         
     471        recordType.addMixin(mixinType2.getId(), mixinType2.getVersion()); 
     472        assertEquals(Long.valueOf(2), typeManager.updateRecordType(recordType).getVersion()); 
     473        recordType.setVersion(Long.valueOf(2)); 
     474        assertEquals(recordType, typeManager.getRecordType(recordType.getId(), null)); 
     475    } 
     476     
     477    @Test 
     478    public void testMixinRemove() throws Exception { 
     479        String id = "testMixinRemove"; 
     480        RecordType mixinType1 = typeManager.newRecordType(id+"MIX"); 
     481        mixinType1.setFieldGroupId(Scope.NON_VERSIONABLE,fieldGroup1.getId()); 
     482        mixinType1.setFieldGroupVersion(Scope.NON_VERSIONABLE,fieldGroup1.getVersion()); 
     483        mixinType1.setFieldGroupId(Scope.VERSIONABLE,fieldGroup2.getId()); 
     484        mixinType1.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup2.getVersion()); 
     485        mixinType1.setFieldGroupId(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getId()); 
     486        mixinType1.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getVersion()); 
     487        mixinType1 = typeManager.createRecordType(mixinType1); 
     488        RecordType mixinType2 = typeManager.newRecordType(id+"MIX2"); 
     489        mixinType2.setFieldGroupId(Scope.NON_VERSIONABLE,fieldGroup1.getId()); 
     490        mixinType2.setFieldGroupVersion(Scope.NON_VERSIONABLE,fieldGroup1.getVersion()); 
     491        mixinType2.setFieldGroupId(Scope.VERSIONABLE,fieldGroup2.getId()); 
     492        mixinType2.setFieldGroupVersion(Scope.VERSIONABLE,fieldGroup2.getVersion()); 
     493        mixinType2.setFieldGroupId(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getId()); 
     494        mixinType2.setFieldGroupVersion(Scope.VERSIONABLE_MUTABLE,fieldGroup3.getVersion()); 
     495        mixinType2 = typeManager.createRecordType(mixinType2); 
     496         
     497        RecordType recordType = typeManager.newRecordType(id+"RT"); 
     498        recordType.addMixin(mixinType1.getId(), mixinType1.getVersion()); 
     499        typeManager.createRecordType(recordType); 
     500         
     501        recordType.addMixin(mixinType2.getId(), mixinType2.getVersion()); 
     502        recordType.removeMixin(mixinType1.getId()); 
     503        assertEquals(Long.valueOf(2), typeManager.updateRecordType(recordType).getVersion()); 
     504        RecordType readRecordType = typeManager.getRecordType(recordType.getId(), null); 
     505        Map<String, Long> mixins = readRecordType.getMixins(); 
     506        assertEquals(1, mixins.size()); 
     507        assertEquals(Long.valueOf(1), mixins.get(mixinType2.getId())); 
     508    } 
     509     
    427510//    @Test 
    428511//    public void testCreateWithDuplicateFieldGroupFails() throws Exception { 
  • projects/lily/trunk/repository/impl/src/test/java/org/lilycms/repository/impl/test/ValueTypeTest.java

    r3978 r3981  
    120120    private void testType(String recordTypeId, String valueTypeString, boolean multivalue, boolean hierarchical, 
    121121                    Object fieldValue) throws Exception { 
    122         String fieldDescriptorId = valueTypeString+"FieldId"+multivalue+hierarchical; 
    123         FieldDescriptor fieldDescriptor = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(fieldDescriptorId, typeManager.getValueType( 
    124                         valueTypeString, multivalue, hierarchical), "aGlobalName")); 
     122        String name = valueTypeString+"FieldId"+multivalue+hierarchical; 
     123        FieldDescriptor fieldDescriptor = typeManager.createFieldDescriptor(typeManager.newFieldDescriptor(typeManager.getValueType( 
     124                        valueTypeString, multivalue, hierarchical), name)); 
    125125        String fieldGroupId = valueTypeString+"FieldGroupId"+multivalue+hierarchical; 
    126126        FieldGroup fieldGroup = typeManager.newFieldGroup(fieldGroupId); 
     
    134134        Record record = repository.newRecord(idGenerator.newRecordId()); 
    135135        record.setRecordType(recordType.getId(), recordType.getVersion()); 
    136         record.setField(Scope.NON_VERSIONABLE, fieldDescriptorId, fieldValue); 
     136        record.setField(Scope.NON_VERSIONABLE, fieldDescriptor.getName(), fieldValue); 
    137137        repository.create(record); 
    138138 
    139139        Record actualRecord = repository.read(record.getId()); 
    140         assertEquals(fieldValue, actualRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptorId)); 
     140        assertEquals(fieldValue, actualRecord.getField(Scope.NON_VERSIONABLE, fieldDescriptor.getName())); 
    141141    } 
    142142 
Note: See TracChangeset for help on using the changeset viewer.