Changeset 4070


Ignore:
Timestamp:
2010-06-09 16:34:25 (3 years ago)
Author:
bruno
Message:

Link value type: use a Link object as value rather than RecordId?. The Link object allows to specify relative links to records, that are to be resolved against the record in which they occur.
There are still some TODO's, especially (de)coding of special/reserved characters in the string representation of the link.

Location:
projects/lily/trunk
Files:
2 added
10 edited

Legend:

Unmodified
Added
Removed
  • projects/lily/trunk/indexer/src/main/java/org/lilycms/indexer/conf/DerefValue.java

    r4065 r4070  
    9898 
    9999            Object value = record.getField(fieldType.getId()); 
    100             if (value instanceof RecordId) { 
    101                 IdRecord linkedRecord = resolveRecordId((RecordId)value, vtag, repository); 
     100            if (value instanceof Link) { 
     101                RecordId recordId = ((Link)value).resolve(record, repository.getIdGenerator()); 
     102                IdRecord linkedRecord = resolveRecordId(recordId, vtag, repository); 
    102103                return linkedRecord == null ? null : Collections.singletonList(linkedRecord); 
    103             } else if (value instanceof List && ((List)value).size() > 0 && ((List)value).get(0) instanceof RecordId) { 
     104            } else if (value instanceof List && ((List)value).size() > 0 && ((List)value).get(0) instanceof Link) { 
    104105                List list = (List)value; 
    105106                List<IdRecord> result = new ArrayList<IdRecord>(list.size()); 
    106                 for (Object recordId : list) { 
    107                     IdRecord linkedRecord = resolveRecordId((RecordId)recordId, vtag, repository); 
     107                for (Object link : list) { 
     108                    RecordId recordId = ((Link)link).resolve(record, repository.getIdGenerator()); 
     109                    IdRecord linkedRecord = resolveRecordId(recordId, vtag, repository); 
    108110                    if (linkedRecord != null) { 
    109111                        result.add(linkedRecord); 
  • projects/lily/trunk/indexer/src/test/java/org/lilycms/indexer/test/IndexerTest.java

    r4065 r4070  
    4848    private static SolrTestingUtility SOLR_TEST_UTIL; 
    4949    private static TestLilyQueue queue; 
    50     private static Repository repository; 
     50    private static HBaseRepository repository; 
    5151    private static TypeManager typeManager; 
    5252    private static IdGenerator idGenerator; 
     
    114114    @AfterClass 
    115115    public static void tearDownAfterClass() throws Exception { 
    116         indexer.stop();         
     116        indexer.stop(); 
     117        repository.stop(); 
    117118 
    118119        TEST_UTIL.shutdownMiniCluster(); 
     
    303304            Record record2 = repository.newRecord(); 
    304305            record2.setRecordType("NVRecordType1", null); 
    305             record2.setField(nvLinkField1.getName(), record1.getId()); 
     306            record2.setField(nvLinkField1.getName(), new Link(record1.getId())); 
    306307            record2 = repository.create(record2); 
    307308            sendEvent(EVENT_RECORD_CREATED, record2.getId(), nvLinkField1.getId()); 
     
    357358            Record record2 = repository.newRecord(); 
    358359            record2.setRecordType("NVRecordType1", null); 
    359             record2.setField(nvLinkField1.getName(), record1.getId()); 
     360            record2.setField(nvLinkField1.getName(), new Link(record1.getId())); 
    360361            record2.setField(nvfield1.getName(), "mushroom"); 
    361362            record2 = repository.create(record2); 
     
    514515            Record record2 = repository.newRecord(); 
    515516            record2.setRecordType("VRecordType1", null); 
    516             record2.setField(vLinkField1.getName(), record1.getId()); 
     517            record2.setField(vLinkField1.getName(), new Link(record1.getId())); 
    517518            record2.setField(liveTag.getName(), Long.valueOf(1)); 
    518519            record2 = repository.create(record2); 
     
    642643            Record record2 = repository.newRecord(); 
    643644            record2.setRecordType("VRecordType1", null); 
    644             record2.setField(nvLinkField2.getName(), record1.getId()); 
     645            record2.setField(nvLinkField2.getName(), new Link(record1.getId())); 
    645646            record2 = repository.create(record2); 
    646647            sendEvent(EVENT_RECORD_CREATED, record2.getId(), nvLinkField2.getId()); 
     
    707708            Record record2 = repository.newRecord(); 
    708709            record2.setRecordType("VRecordType1", null); 
    709             record2.setField(vLinkField1.getName(), record1.getId()); 
     710            record2.setField(vLinkField1.getName(), new Link(record1.getId())); 
    710711            record2.setField(liveTag.getName(), 1L); 
    711712            record2 = repository.create(record2); 
     
    714715            Record record3 = repository.newRecord(); 
    715716            record3.setRecordType("VRecordType1", null); 
    716             record3.setField(nvLinkField2.getName(), record2.getId()); 
     717            record3.setField(nvLinkField2.getName(), new Link(record2.getId())); 
    717718            record3 = repository.create(record3); 
    718719            sendEvent(EVENT_RECORD_CREATED, record3.getId(), (Long)null, null, nvLinkField2.getId()); 
  • projects/lily/trunk/linkindex/src/main/java/org/lilycms/linkindex/LinkIndexUpdater.java

    r4042 r4070  
    180180            } else { 
    181181                LinkCollector collector = new LinkCollector(); 
    182                 RecordLinkExtractor.extract(versionRecord, collector, typeManager); 
     182                RecordLinkExtractor.extract(versionRecord, collector, repository); 
    183183                links = collector.getLinks(); 
    184184            } 
  • projects/lily/trunk/linkindex/src/main/java/org/lilycms/linkindex/RecordLinkExtractor.java

    r4042 r4070  
    1313     * be "fully loaded" (= contain all fields). 
    1414     */ 
    15     public static void extract(IdRecord record, LinkCollector collector, TypeManager typeManager) throws RepositoryException { 
     15    public static void extract(IdRecord record, LinkCollector collector, Repository repository) throws RepositoryException { 
    1616        for (Map.Entry<String, Object> field : record.getFieldsById().entrySet()) { 
    1717            FieldType fieldType; 
    1818            try { 
    19                 fieldType = typeManager.getFieldTypeById(field.getKey()); 
     19                fieldType = repository.getTypeManager().getFieldTypeById(field.getKey()); 
    2020            } catch (FieldTypeNotFoundException e) { 
    2121                // Can not do anything with a field if we cannot load its type 
     
    2626 
    2727            if (valueType.getPrimitive().getName().equals("LINK")) { 
    28                 extract(value, collector, fieldType.getId()); 
     28                extract(value, collector, fieldType.getId(), record.getId(), repository.getIdGenerator()); 
    2929            } else if (valueType.getPrimitive().getName().equals("BLOB")) { 
    3030                // TODO implement link extraction from blob fields 
     
    3333    } 
    3434 
    35     private static void extract(Object value, LinkCollector collector, String fieldTypeId) { 
     35    private static void extract(Object value, LinkCollector collector, String fieldTypeId, RecordId ctx, 
     36            IdGenerator idGenerator) { 
    3637        if (value instanceof List) { 
    3738            List list = (List)value; 
    3839            for (Object item : list) { 
    39                 extract(item, collector, fieldTypeId); 
     40                extract(item, collector, fieldTypeId, ctx, idGenerator); 
    4041            } 
    4142        } else if (value instanceof HierarchyPath) { 
    4243            HierarchyPath path = (HierarchyPath)value; 
    4344            for (Object item : path.getElements()) { 
    44                 extract(item, collector, fieldTypeId); 
     45                extract(item, collector, fieldTypeId, ctx, idGenerator); 
    4546            } 
    46         } else if (value instanceof RecordId) { 
    47             collector.addLink((RecordId)value, fieldTypeId); 
     47        } else if (value instanceof Link) { 
     48            RecordId recordId = ((Link)value).resolve(ctx, idGenerator); 
     49            collector.addLink(recordId, fieldTypeId); 
    4850        } else { 
    49             throw new RuntimeException("Encountered an unexpected kind of object from a link field: " + value.getClass().getName()); 
     51            throw new RuntimeException("Encountered an unexpected kind of object from a link field: " + 
     52                    value.getClass().getName()); 
    5053        } 
    5154    } 
  • projects/lily/trunk/linkindex/src/test/java/org/lilycms/linkindex/test/LinkIndexTest.java

    r4021 r4070  
    141141            Record record = repository.newRecord(); 
    142142            record.setRecordType(recordType.getId(), null); 
    143             record.setField(nonVersionedFt.getName(), ids.newRecordId("foo1")); 
     143            record.setField(nonVersionedFt.getName(), new Link(ids.newRecordId("foo1"))); 
    144144            record = repository.create(record); 
    145145 
     
    157157 
    158158            // Now perform an update so that there is a version 
    159             record.setField(versionedFt.getName(), Arrays.asList(ids.newRecordId("foo2"), ids.newRecordId("foo3"))); 
     159            record.setField(versionedFt.getName(), Arrays.asList(new Link(ids.newRecordId("foo2")), new Link(ids.newRecordId("foo3")))); 
    160160            record = repository.update(record); 
    161161 
  • projects/lily/trunk/repository-api-tutorial/src/test/java/org/lilycms/repository/api/tutorial/Tutorial.java

    r4060 r4070  
    1616import org.junit.BeforeClass; 
    1717import org.junit.Test; 
    18 import org.lilycms.repository.api.Blob; 
    19 import org.lilycms.repository.api.FieldType; 
    20 import org.lilycms.repository.api.IdGenerator; 
    21 import org.lilycms.repository.api.QName; 
    22 import org.lilycms.repository.api.Record; 
    23 import org.lilycms.repository.api.RecordId; 
    24 import org.lilycms.repository.api.RecordType; 
    25 import org.lilycms.repository.api.Repository; 
    26 import org.lilycms.repository.api.Scope; 
    27 import org.lilycms.repository.api.TypeManager; 
    28 import org.lilycms.repository.api.ValueType; 
     18import org.lilycms.repository.api.*; 
    2919import org.lilycms.repository.impl.DFSBlobStoreAccess; 
    3020import org.lilycms.repository.impl.HBaseRepository; 
     
    299289        record2.setRecordType("Book", null); 
    300290        record2.setField(new QName(NS, "title"), "Fishing 2"); 
    301         record2.setField(new QName(NS, "sequel_to"), record1.getId()); 
     291        record2.setField(new QName(NS, "sequel_to"), new Link(record1.getId())); 
    302292        record2 = repository.create(record2); 
    303293 
    304294        // (3) 
    305         RecordId sequelTo = (RecordId)record2.getField(new QName(NS, "sequel_to")); 
     295        Link sequelToLink = (Link)record2.getField(new QName(NS, "sequel_to")); 
     296        RecordId sequelTo = sequelToLink.resolve(record2.getId(), repository.getIdGenerator()); 
    306297        Record linkedRecord = repository.read(sequelTo); 
    307298        System.out.println(linkedRecord.getField(new QName(NS, "title"))); 
  • projects/lily/trunk/repository/api/src/main/java/org/lilycms/repository/api/TypeManager.java

    r4042 r4070  
    162162     * <tr><td>LONG</td>     <td>java.lang.Long</td></tr> 
    163163     * <tr><td>BOOLEAN</td>  <td>java.lang.Boolean</td></tr> 
    164      * <tr><td>DATE</td>     <td>java.util.Date</td></tr> 
     164     * <tr><td>DATE</td>     <td>org.joda.time.LocalDate</td></tr> 
     165     * <tr><td>DATETIME</td> <td>org.joda.time.DateTime</td></tr> 
    165166     * <tr><td>BLOB</td>     <td>org.lilycms.repository.api.Blob</td></tr> 
    166      * <tr><td>LINK</td>     <td>org.lilycms.repository.api.RecordId</td></tr> 
     167     * <tr><td>LINK</td>     <td>org.lilycms.repository.api.Link</td></tr> 
    167168     * </tbody> 
    168169     * </table> 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/AbstractTypeManager.java

    r4064 r4070  
    5757    // TODO get this from some configuration file 
    5858    protected void registerDefaultValueTypes() { 
     59        // 
     60        // Important: 
     61        // 
     62        // When adding a type below, please update the list of built-in 
     63        // types in the javadoc of the method TypeManager.getValueType. 
     64        // 
     65 
    5966        registerPrimitiveValueType(new StringValueType()); 
    6067        registerPrimitiveValueType(new IntegerValueType()); 
  • projects/lily/trunk/repository/impl/src/main/java/org/lilycms/repository/impl/primitivevaluetype/LinkValueType.java

    r3985 r4070  
    1717 
    1818import org.lilycms.repository.api.IdGenerator; 
     19import org.lilycms.repository.api.Link; 
    1920import org.lilycms.repository.api.PrimitiveValueType; 
    2021import org.lilycms.repository.api.RecordId; 
     
    3738    } 
    3839 
    39     public RecordId fromBytes(byte[] bytes) { 
    40         return idGenerator.fromBytes(bytes); 
     40    public Link fromBytes(byte[] bytes) { 
     41        return Link.fromBytes(bytes, idGenerator); 
    4142    } 
    4243 
    4344    public byte[] toBytes(Object value) { 
    44         return ((RecordId)value).toBytes(); 
     45        return ((Link)value).toBytes(); 
    4546    } 
    4647 
  • projects/lily/trunk/repository/impl/src/test/java/org/lilycms/repository/impl/test/ValueTypeTest.java

    r4067 r4070  
    2929import org.junit.BeforeClass; 
    3030import org.junit.Test; 
    31 import org.lilycms.repository.api.Blob; 
    32 import org.lilycms.repository.api.BlobStoreAccessFactory; 
    33 import org.lilycms.repository.api.FieldType; 
    34 import org.lilycms.repository.api.HierarchyPath; 
    35 import org.lilycms.repository.api.PrimitiveValueType; 
    36 import org.lilycms.repository.api.QName; 
    37 import org.lilycms.repository.api.Record; 
    38 import org.lilycms.repository.api.RecordType; 
    39 import org.lilycms.repository.api.Scope; 
     31import org.lilycms.repository.api.*; 
    4032import org.lilycms.repository.impl.AbstractTypeManager; 
    4133import org.lilycms.repository.impl.DFSBlobStoreAccess; 
     
    117109    @Test 
    118110    public void testLinkType() throws Exception { 
    119         runValueTypeTests("linkRecordTypeId", "LINK", idGenerator.newRecordId(), idGenerator.newRecordId(), idGenerator.newRecordId()); 
     111        runValueTypeTests("linkRecordTypeId", "LINK", new Link(idGenerator.newRecordId()), new Link(idGenerator.newRecordId()), new Link(idGenerator.newRecordId())); 
    120112    } 
    121113 
Note: See TracChangeset for help on using the changeset viewer.