Changeset 3789


Ignore:
Timestamp:
Sep 26, 2007, 10:54:39 AM (15 years ago)
Author:
Johan Enell
Message:

Merged the 2.4.3 release log:branches/2.4-stable#3771:3788

Location:
trunk
Files:
14 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/core/net/sf/basedb/core/InvalidPathException.java

    r3679 r3789  
    4343  public InvalidPathException(String path)
    4444  {
    45     super("Invalid path: " + path);
     45    super(path);
    4646  }
    4747
  • trunk/src/core/net/sf/basedb/core/ItemContext.java

    r3679 r3789  
    898898    // Tempoarary storage for all associations that must be left joined
    899899    Set<String> leftJoins = autoLeftJoin ? new HashSet<String>() : null;
     900    Set<String> sortedProperties = autoLeftJoin ? new HashSet<String>() : null;
    900901   
    901902    // Add sort order information
     
    930931          if (dotIndex >= 0)
    931932          {
    932             leftJoins.add(sortProperty.substring(0, dotIndex));
     933            String toJoin = sortProperty.substring(0, dotIndex);
     934            leftJoins.add(toJoin);
     935            sortedProperties.add(toJoin);
    933936          }
    934937        }
     
    995998    {
    996999      int i = 0;
     1000      // Use fetch joins for columns appearing in the ORDER BY clause
     1001      // if the query is distinct and the database requires it
     1002      boolean selectOrderBy = query.isDistinct() &&
     1003        HibernateUtil.getDbEngine().selectOrderByColumnsIfDistinct();
    9971004      for (String property : leftJoins)
    9981005      {
     1006        boolean fetch = selectOrderBy && sortedProperties.contains(property);
    9991007        if (property.startsWith("@")) property = property.substring(1);
    10001008        i++;
    1001         query.join(Hql.leftJoin(property, "alj"+i));
     1009        query.join(Hql.leftJoin(null, property, "alj"+i, null, fetch));
    10021010      }
    10031011    }
  • trunk/src/core/net/sf/basedb/core/Job.java

    r3719 r3789  
    997997    throws InvalidDataException, PermissionDeniedException, BaseException
    998998  {
     999    checkPermission(Permission.WRITE);
     1000    if (name == null) throw new InvalidUseOfNullException("name");
    9991001    if (getStatus() == Status.EXECUTING)
    10001002    {
     
    10021004    }
    10031005    getData().setStatus(Status.WAITING.getValue());
    1004     setParameterValuesInternal(name, label, description, parameterType, Arrays.asList(value));
     1006    setParameterValuesInternal(name, label, description, parameterType, Arrays.asList(value), true);
    10051007  }
    10061008 
     
    10461048    throws InvalidDataException, PermissionDeniedException, BaseException
    10471049  {
     1050    checkPermission(Permission.WRITE);
     1051    if (name == null) throw new InvalidUseOfNullException("name");
    10481052    if (getStatus() == Status.EXECUTING)
    10491053    {
     
    10511055    }
    10521056    getData().setStatus(Status.WAITING.getValue());
    1053     setParameterValuesInternal(name, label, description, parameterType, values);
     1057    setParameterValuesInternal(name, label, description, parameterType, values, true);
    10541058  }
    10551059 
     
    11111115    @param values A list containing the new values, null or empty to remove the
    11121116      configuration values
     1117    @param validate If validation by {@link ParameterType#validate(String, List)}
     1118      is needed or not
    11131119    @throws PermissionDeniedException If the logged in user doesn't have
    11141120      write permission
     
    11171123    @throws BaseException If there is another error
    11181124  */
    1119   void setParameterValuesInternal(String name, String label, String description, ParameterType<?> parameterType, List<?> values)
     1125  void setParameterValuesInternal(String name, String label, String description,
     1126    ParameterType<?> parameterType, List<?> values, boolean validate)
    11201127    throws InvalidDataException, PermissionDeniedException, BaseException
    11211128  {
    1122     checkPermission(Permission.WRITE);
    1123     if (name == null) throw new InvalidUseOfNullException("name");
    11241129    ParameterValueData old = null;
    11251130    if (values == null || values.size() == 0)
     
    11301135    {
    11311136      if (parameterType == null) throw new InvalidUseOfNullException("parameterType");
    1132       parameterType.validate(name, values);
     1137      if (validate) parameterType.validate(name, values);
    11331138      ParameterValueData<?> parameterValue = parameterType.newParameterValueData();
    11341139      parameterValue.setLabel(label);
  • trunk/src/core/net/sf/basedb/core/ParameterType.java

    r3679 r3789  
    218218      if (!items.contains(value))
    219219      {
    220         throw new InvalidDataException("The value '" + value + "' isn't in the list of allowed values.");
     220        throw new InvalidDataException("The value '" + value + "' isn't in the list of allowed values for parameter '" + name + "'.");
    221221      }
    222222    }
  • trunk/src/core/net/sf/basedb/core/ParameterValuesImpl.java

    r3679 r3789  
    161161    if (writeProtected)
    162162    {
    163       throw new PermissionDeniedException(Permission.WRITE, "Job parameter: "+name);
    164     }
     163      throw new PermissionDeniedException(Permission.WRITE, "Parameter: "+name);
     164    }
     165    if (name == null) throw new InvalidUseOfNullException("name");
     166    if (type == null) throw new InvalidUseOfNullException("type[name=" + name + "]");
    165167    if (value == null && type.getNotNull()) value = type.getDefaultValue();
     168    type.validate(name, value);
    166169    List<T> l = new ArrayList<T>(1);
    167170    l.add(value);
     
    176179    if (writeProtected)
    177180    {
    178       throw new PermissionDeniedException(Permission.WRITE, "Job parameter: "+name);
    179     }
     181      throw new PermissionDeniedException(Permission.WRITE, "Parameter: "+name);
     182    }
     183    if (name == null) throw new InvalidUseOfNullException("name");
     184    if (type == null) throw new InvalidUseOfNullException("type[name=" + name + "]");
    180185    if ((values == null || values.size() == 0) && type.getNotNull() && type.getDefaultValue() != null)
    181186    {
    182187      values = Arrays.asList(type.getDefaultValue());
    183188    }
     189    type.validate(name, values);
    184190    parameters.put(name, values);
    185191    parameterTypes.put(name, type);
     
    203209      if (pp == null)
    204210      {
    205         job.setParameterValuesInternal(name, null, null, parameterTypes.get(name), parameters.get(name));
     211        job.setParameterValuesInternal(name, null, null,
     212          parameterTypes.get(name), parameters.get(name), false);
    206213      }
    207214      else
    208215      {
    209         job.setParameterValuesInternal(name, pp.getLabel(), pp.getDescription(), parameterTypes.get(name), parameters.get(name));
     216        job.setParameterValuesInternal(name, pp.getLabel(), pp.getDescription(),
     217          parameterTypes.get(name), parameters.get(name), false);
    210218      }
    211219    }
     
    223231      if (pp == null)
    224232      {
    225         config.setParameterValues(name, null, null, parameterTypes.get(name), parameters.get(name));
     233        config.setParameterValuesInternal(name, null, null,
     234          parameterTypes.get(name), parameters.get(name), false);
    226235      }
    227236      else
    228237      {
    229         config.setParameterValues(name, pp.getLabel(), pp.getDescription(), parameterTypes.get(name), parameters.get(name));
     238        config.setParameterValuesInternal(name, pp.getLabel(), pp.getDescription(),
     239          parameterTypes.get(name), parameters.get(name), false);
    230240      }
    231241    }
  • trunk/src/core/net/sf/basedb/core/Path.java

    r3679 r3789  
    143143      }
    144144      filename = parts[parts.length-1];
     145      if (!Path.isValidName(filename))
     146      {
     147        throw new InvalidPathException("Path contains invalid characters ("+Path.INVALID_CHARACTERS+"): "+path);
     148      }
    145149      parts[parts.length-1] = "";
    146150    }
  • trunk/src/core/net/sf/basedb/core/PathParameterType.java

    r3675 r3789  
    8787    Checks if the value is a valif {@link Path} value.
    8888    @param value The value to test
    89     @throws InvalidDataException If the value is not a string or too long
     89    @throws InvalidDataException If the value is not a valid path
    9090  */
    9191  void validateValue(String name, String value)
    9292    throws InvalidDataException
    9393  {
    94     new Path(value, pathType);
     94    try
     95    {
     96      new Path(value, pathType);
     97    }
     98    catch (InvalidPathException ex)
     99    {
     100      throw new InvalidPathException("Path for parameter '"+ name + "' is invalid: " + ex.getMessage());
     101    }
    95102  }
    96103  /**
  • trunk/src/core/net/sf/basedb/core/PluginConfiguration.java

    r3775 r3789  
    428428    checkPermission(Permission.WRITE);
    429429    if (name == null) throw new InvalidUseOfNullException("name");
    430    
     430    setParameterValuesInternal(name, label, description, parameterType, values, true);
     431  }
     432
     433  /**
     434    Set the values of a configuration parameter.
     435    @param name The name of the configuration parameter
     436    @param label The label of the parameter (optional)
     437    @param description A description of the parameter (optional)
     438    @param parameterType The type of the parameter
     439    @param values A list containing the new values, null or empty to remove the
     440      configuration values
     441    @param validate If validation by {@link ParameterType#validate(String, List)}
     442      is needed or not
     443    @throws PermissionDeniedException If the logged in user doesn't have
     444      write permission
     445    @throws InvalidDataException If name is null or the new value doesn't
     446      validate against the parameter type
     447    @throws BaseException If there is another error
     448  */
     449  void setParameterValuesInternal(String name, String label, String description,
     450    ParameterType<?> parameterType, List<?> values, boolean validate)
     451    throws InvalidDataException, PermissionDeniedException, BaseException
     452  {
     453
    431454    VersionedParameter param = new VersionedParameter(name, getNewParameterVersion());
    432    
    433455    if (values == null || values.size() == 0)
    434456    {
     
    438460    {
    439461      if (parameterType == null) throw new InvalidUseOfNullException("parameterType");
    440       parameterType.validate(name, values);
     462      if (validate) parameterType.validate(name, values);
    441463      ParameterValueData<?> parameterValue = parameterType.newParameterValueData();
    442464      parameterValue.setLabel(label);
     
    446468    }
    447469  }
    448 
     470 
    449471  /**
    450472    Copy all parameter values from another plugin configuration. This method
  • trunk/src/core/net/sf/basedb/util/overview/ExperimentOverview.java

    r3675 r3789  
    283283   
    284284    // Load 'Required for MIAME' annotation types (parameter='false' must also be set)
    285     ItemQuery<AnnotationType> query = initQuery(AnnotationType.getQuery(null), "name");
     285    ItemQuery<AnnotationType> query = initQuery(AnnotationType.getQuery(null), null, "name");
    286286    query.restrict(
    287287      Restrictions.eq(
     
    556556    Node efNode = new Node("experimental.factors", "Experimental factors", rootNode);
    557557    Experiment experiment = (Experiment)rootNode.getItem();
    558     ItemQuery<AnnotationType> efQuery = initQuery(experiment.getExperimentalFactors(), "name");
     558    ItemQuery<AnnotationType> efQuery = initQuery(experiment.getExperimentalFactors(), null, "name");
    559559    for (AnnotationType ef : efQuery.list(dc))
    560560    {
     
    574574    Node rawBioAssaysNode = new Node("rawbioassays", "Raw bioassays", rootNode);
    575575    Experiment experiment = (Experiment)rootNode.getItem();
    576     ItemQuery<RawBioAssay> rbaQuery = initQuery(experiment.getRawBioAssays(), "name");
     576    ItemQuery<RawBioAssay> rbaQuery = initQuery(experiment.getRawBioAssays(), null, "name");
    577577    Set<BasicItem> arrayDesigns = new HashSet<BasicItem>();
    578578    for (RawBioAssay rba : rbaQuery.list(dc))
     
    801801    Node imagesNode = new Node("images", "Images", scanNode);
    802802    Scan scan = (Scan)scanNode.getItem();
    803     ItemQuery<Image> imageQuery = initQuery(scan.getImages(), "name");
     803    ItemQuery<Image> imageQuery = initQuery(scan.getImages(), null, "name");
    804804    for (Image image : imageQuery.list(dc))
    805805    {
     
    831831    Hybridization hyb = (Hybridization)hybNode.getItem();
    832832    ItemQuery<LabeledExtract> leQuery =
    833       (ItemQuery<LabeledExtract>)initQuery(hyb.getCreationEvent().getSources(), "label.name");
     833      (ItemQuery<LabeledExtract>)initQuery(hyb.getCreationEvent().getSources(), null, "label.name");
    834834    int added = 0;
    835835    int channels = experiment.getRawDataType().getChannels();
     
    935935   
    936936    ItemQuery<LabeledExtract> sourceQuery =
    937       initQuery((ItemQuery<LabeledExtract>)product.getCreationEvent().getSources(), "name");
     937      initQuery((ItemQuery<LabeledExtract>)product.getCreationEvent().getSources(), null, "name");
    938938   
    939939    int added = 0;
     
    10581058   
    10591059    ItemQuery<Extract> sourceQuery =
    1060       initQuery((ItemQuery<Extract>)product.getCreationEvent().getSources(), "name");
     1060      initQuery((ItemQuery<Extract>)product.getCreationEvent().getSources(), null, "name");
    10611061   
    10621062    int added = 0;
     
    11621162   
    11631163    ItemQuery<Sample> sourceQuery =
    1164       initQuery((ItemQuery<Sample>)product.getCreationEvent().getSources(), "name");
     1164      initQuery((ItemQuery<Sample>)product.getCreationEvent().getSources(), null, "name");
    11651165   
    11661166    int added = 0;
     
    15341534    AnnotationSet as = annotatable != null && annotatable.isAnnotated() ?
    15351535        annotatable.getAnnotationSet() : null;
    1536     ItemQuery<AnnotationType> parameterQuery = initQuery(protocol.getParameters(), "name");
     1536    ItemQuery<AnnotationType> parameterQuery = initQuery(protocol.getParameters(), null, "name");
    15371537    List<AnnotationType> parameters = parameterQuery.list(dc);
    15381538    Node parameterNode = null;
     
    15821582      annotationsNode = new Node("annotations", "Annotations", parentNode);
    15831583      AnnotationSet as = parent.getAnnotationSet();
    1584       ItemQuery<Annotation> annotationQuery = initQuery(as.getAnnotations(), "annotationType.name");
     1584      ItemQuery<Annotation> annotationQuery = initQuery(as.getAnnotations(), null, "annotationType.name");
    15851585   
    15861586      for (Annotation a : annotationQuery.list(dc))
     
    16621662      annotationTypes.clear();
    16631663      AnnotationSet as = parent.getAnnotationSet();
    1664       ItemQuery<Annotation> annotationQuery = initQuery(as.getAllInheritedAnnotations(), "annotationType.name");
     1664      ItemQuery<Annotation> annotationQuery = initQuery(as.getAllInheritedAnnotations(), "at", "name");
     1665      annotationQuery.join(Hql.innerJoin(null, "annotationType", "at", true));
    16651666      List<Annotation> inherited = annotationQuery.list(dc);
    16661667      if (inherited.size() > 0)
     
    17271728    Set include options and sorting order for a query.
    17281729  */
    1729   private <T extends BasicItem> ItemQuery<T> initQuery(ItemQuery<T> query, String sortProperty)
     1730  private <T extends BasicItem> ItemQuery<T> initQuery(ItemQuery<T> query, String sortAlias, String sortProperty)
    17301731  {
    17311732    query.include(Include.MINE, Include.IN_PROJECT, Include.SHARED, Include.OTHERS);
    1732     query.order(Orders.asc(Hql.property(sortProperty)));
     1733    query.order(Orders.asc(Hql.property(sortAlias, sortProperty)));
    17331734    return query;
    17341735  }
  • trunk/src/plugins/core/net/sf/basedb/plugins/Base1PluginExecuter.java

    r3775 r3789  
    13771377        if (bas == null)
    13781378        {
    1379           bas = t.newProduct(null, "new", false);
     1379          bas = t.newProduct("new", "new", false);
    13801380        }
    13811381        spotBatcher = bas.getSpotBatcher();
  • trunk/src/plugins/core/net/sf/basedb/plugins/PackedFileExporter.java

    r3675 r3789  
    376376    // Prepare for compression
    377377    String rootPath = rootDir.getPath().toString();
     378    if (!rootPath.endsWith("/")) rootPath += "/";
    378379    out.setMimeType(packer.getMimeType());
    379380    out.setFilename(generateDefaultName(packer, rootDir, itemsToPack));
     
    405406     
    406407      // Remove rootPath from entryPath
    407       entryPath = entryPath.substring(rootPath.length()+1);
     408      entryPath = entryPath.substring(rootPath.length());
    408409     
    409410      // Update progress
     
    657658  private String generateDefaultPath(FilePacker packer, Directory rootDir, Collection<Nameable> selectedItems)
    658659  {
    659     String defaultPath = rootDir == null ? "~/" : rootDir.getPath().toString() + "/";
     660    String defaultPath = rootDir == null ? "~/" : rootDir.getPath().toString();
     661    if (!defaultPath.endsWith("/")) defaultPath += "/";
    660662    defaultPath +=  generateDefaultName(packer, rootDir, selectedItems);
    661663    return defaultPath;
  • trunk/src/test/TestAnnotation.java

    r3679 r3789  
    2626
    2727import net.sf.basedb.core.*;
     28import net.sf.basedb.core.query.Hql;
     29import net.sf.basedb.core.query.Orders;
    2830
    2931import java.util.Date;
     
    8183    // Test: list inherited annotations and annotation sets
    8284    test_list_inherited_annotations(rawBioAssayId, 2);
     85    test_list_allinherited_annotations(rawBioAssayId, 9);
    8386    test_list_inherited_annotationsets(rawBioAssayId, 1);
    8487    test_list_inheriting_annotationsets(arrayDesignId, 1);
     
    342345    }
    343346  }
     347 
     348  static void test_list_allinherited_annotations(int rawBioAssayId, int expectedResults)
     349  {
     350    if (rawBioAssayId == 0) return;
     351    DbControl dc = null;
     352    try
     353    {
     354      dc = TestUtil.getDbControl();
     355      RawBioAssay rba = RawBioAssay.getById(dc, rawBioAssayId);
     356      ItemQuery<Annotation> query = rba.getAnnotationSet().getAllInheritedAnnotations();
     357      query.join(Hql.innerJoin(null, "annotationType", "at", true));
     358      query.order(Orders.asc(Hql.property("at", "name")));
     359      List<Annotation> l = query.list(dc);
     360      for (int i = 0; i<l.size(); i++)
     361      {
     362        write_item(i, l.get(i));
     363      }
     364      if (expectedResults >= 0 && expectedResults != l.size())
     365      {
     366        throw new BaseException("Expected "+expectedResults+" results, not "+l.size());
     367      }
     368      write("--List all inherited annotations OK ("+l.size()+")");
     369    }
     370    catch (Throwable ex)
     371    {
     372      write("--List all inherited annotations FAILED");
     373      ex.printStackTrace();
     374      ok = false;
     375    }
     376    finally
     377    {
     378      if (dc != null) dc.close();
     379    }
     380  }
    344381
    345382  static void test_list_inherited_annotationsets(int rawBioAssayId, int expectedResults)
  • trunk/src/test/TestPath.java

    r3679 r3789  
    4242  {
    4343    write("++Testing path");
    44     test_create("/filename", Path.Type.FILE);
    45     test_create("/directory/filename", Path.Type.FILE);
    46     test_create("/directory/subdirectory/filename", Path.Type.FILE);
    47     test_create("~userlogin/filename", Path.Type.FILE);
    48     test_create("~userlogin/directory/filename", Path.Type.FILE);
    49     test_create("~userlogin/directory/subdirectory/filename", Path.Type.FILE);
    50     test_create("~/filename", Path.Type.FILE);
    51     test_create("~/directory/filename", Path.Type.FILE);
    52     test_create("~/directory/subdirectory/filename", Path.Type.FILE);
     44    test_create("/filename", Path.Type.FILE, false);
     45    test_create("/directory/filename", Path.Type.FILE, false);
     46    test_create("/directory/subdirectory/filename", Path.Type.FILE, false);
     47    test_create("~userlogin/filename", Path.Type.FILE, false);
     48    test_create("~userlogin/directory/filename", Path.Type.FILE, false);
     49    test_create("~userlogin/directory/subdirectory/filename", Path.Type.FILE, false);
     50    test_create("~/filename", Path.Type.FILE, false);
     51    test_create("~/directory/filename", Path.Type.FILE, false);
     52    test_create("~/directory/subdirectory/filename", Path.Type.FILE, false);
    5353
    54     test_create("/", Path.Type.DIRECTORY);
    55     test_create("/directory", Path.Type.DIRECTORY);
    56     test_create("/directory/subdirectory", Path.Type.DIRECTORY);
    57     test_create("/directory/subdirectory/subsub", Path.Type.DIRECTORY);
    58     test_create("~userlogin", Path.Type.DIRECTORY);
    59     test_create("~userlogin/directory", Path.Type.DIRECTORY);
    60     test_create("~userlogin/directory/subdirectory", Path.Type.DIRECTORY);
    61     test_create("~userlogin/directory/subdirectory/subsub", Path.Type.DIRECTORY);
    62     test_create("~", Path.Type.DIRECTORY);
    63     test_create("~/directory", Path.Type.DIRECTORY);
    64     test_create("~/directory/subdirectory", Path.Type.DIRECTORY);
    65     test_create("~/directory/subdirectory/subsub", Path.Type.DIRECTORY);
     54    test_create("/", Path.Type.DIRECTORY, false);
     55    test_create("/directory", Path.Type.DIRECTORY, false);
     56    test_create("/directory/subdirectory", Path.Type.DIRECTORY, false);
     57    test_create("/directory/subdirectory/subsub", Path.Type.DIRECTORY, false);
     58    test_create("~userlogin", Path.Type.DIRECTORY, false);
     59    test_create("~userlogin/directory", Path.Type.DIRECTORY, false);
     60    test_create("~userlogin/directory/subdirectory", Path.Type.DIRECTORY, false);
     61    test_create("~userlogin/directory/subdirectory/subsub", Path.Type.DIRECTORY, false);
     62    test_create("~", Path.Type.DIRECTORY, false);
     63    test_create("~/directory", Path.Type.DIRECTORY, false);
     64    test_create("~/directory/subdirectory", Path.Type.DIRECTORY, false);
     65    test_create("~/directory/subdirectory/subsub", Path.Type.DIRECTORY, false);
    6666
    6767    test_valid_name("abc", true);
     
    7777    test_valid_name("|abc", false);
    7878   
     79    test_create("/file<name>", Path.Type.FILE, true);
     80    test_create("/dire<ctory>/filename", Path.Type.FILE, true);
     81    test_create("/directory/file<name>", Path.Type.FILE, true);
     82    test_create("/sub<dir>", Path.Type.DIRECTORY, true);
     83    test_create("/directory/sub<dir>", Path.Type.DIRECTORY, true);
     84   
    7985    test_replace_invalid("abc", ".", "abc");
    8086    test_replace_invalid("~abc", ".", ".abc");
     
    8591  }
    8692 
    87   static void test_create(String path, Path.Type type)
     93  static void test_create(String path, Path.Type type, boolean shouldFail)
    8894  {
    8995    try
     
    95101        throw new Exception("Original path ("+path+") is different from path: "+pp);
    96102      }
    97       write("--Path " + p.getType() + ": '"+p+"' OK");
     103      if (shouldFail)
     104      {
     105        write("--Path '"+path+"' FAILED");
     106        new Throwable("Expected test to fail but it didn't.").printStackTrace();
     107        ok = false;
     108      }
     109      else
     110      {
     111        write("--Path " + p.getType() + ": '"+p+"' OK");
     112      }
    98113    }
    99114    catch (Throwable ex)
    100115    {
    101       write("--Path '"+path+"' FAILED");
    102       ex.printStackTrace();
    103       ok = false;
     116      if (!shouldFail)
     117      {
     118        write("--Path '"+path+"' FAILED");
     119        ex.printStackTrace();
     120        ok = false;
     121      }
     122      else
     123      {
     124        write("--Path " + type + ": '"+path+"' OK");
     125      }
    104126    }
    105127  }
  • trunk/www/common/annotations/list_annotations.jsp

    r3679 r3789  
    8383  {
    8484    ItemQuery<Annotation> inheritedQuery = as.getAllInheritedAnnotations();
     85    // Need FETCH JOIN because Postgres don't like the DISTINCT keyword
     86    // if we sort on a non-selected column See ticket #731
     87    inheritedQuery.join(Hql.innerJoin(null, "annotationType", "at", true));
    8588    inheritedQuery.order(Orders.asc(Hql.property("annotationSet")));
    86     inheritedQuery.order(Orders.asc(Hql.property("annotationType.name")));
     89    inheritedQuery.order(Orders.asc(Hql.property("at", "name")));
    8790    inheritedAnnotations = inheritedQuery.list(dc);
    8891  }
Note: See TracChangeset for help on using the changeset viewer.