示例#1
0
 /**
  * parsing record to extract indexed fields
  *
  * @param isNew record has never been parsed
  * @param record record to parse
  */
 private void indexRecord(boolean isNew, Record record) {
   for (Field field : mc.getIndexingField(record.getClass())) {
     try {
       // indexes can be shared by providing common key, or default key using field path is used
       String key = field.getAnnotation(FieldIndexing.class).value();
       String name = field.getName();
       if (key.length() == 0) {
         key = record.getClass().getName() + "." + name;
       }
       // reading field value to add to index list
       boolean status = field.isAccessible();
       field.setAccessible(true);
       Object fieldValue = field.get(record);
       field.setAccessible(status);
       // database access
       EntityManager em = mc.getTransactionEntityManager();
       RecordIndexPK pk = new RecordIndexPK(key, record.getId(), name);
       // forcing indexe deletion to preserve record batch save (npreveting select for each save)
       // Note : make sure the ModelController provides an entity manager with
       // setShouldPerformDeletesFirst(true)
       if (!isNew) {
         em.remove(em.getReference(RecordIndex.class, pk));
       }
       // mapping the index to the database
       Comparable converted = pm.getConverted(fieldValue);
       if (converted != null) {
         RecordIndex ri = new RecordIndex(pk);
         switch (pm.getType(field.getType())) {
           case DATE:
             ri.setDate((Date) converted);
             break;
           case STRING:
             ri.setValue((String) converted);
             break;
           case NUMERIC:
             ri.setNumeric((BigDecimal) converted);
             break;
         }
         // saving
         em.persist(ri);
       }
     } catch (IllegalArgumentException | IllegalAccessException ex) {
       // convet to runtime exception
       throw new RuntimeException(ex);
     }
   }
 }