Changeset 6939


Ignore:
Timestamp:
Aug 21, 2015, 2:32:11 PM (6 years ago)
Author:
Nicklas Nordborg
Message:

References #1941: Store experimental factor values as part experiments

Updated "Item overview" functionality to become compatible with cloned annotations. There may still be some issues with suggested fixes related to inherited annotations since it is not yet clear how those will be managed.

Location:
trunk
Files:
10 edited

Legend:

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

    r6937 r6939  
    671671  /**
    672672    Comparator implementation for sorting snapshots
    673     by name of annotation type.
     673    by name of annotation type. If the names are
     674    sorted by source type of the annotation and then
     675    on the id of the annotation.
    674676  */
    675677  static class AnnotationTypeComparator
     
    690692     
    691693      int result = n1.compareTo(n2);
    692       return result == 0 ? o2.getAnnotationTypeId() - o1.getAnnotationTypeId() : result;
    693     }
    694    
     694      if (result == 0)
     695      {
     696        result = o1.getSource().ordinal() - o2.getSource().ordinal();
     697        if (result == 0)
     698        {
     699          result = o1.getThisAnnotationId() - o2.getThisAnnotationId();
     700        }
     701      }
     702      return result;
     703    }
    695704  }
    696705}
  • trunk/src/core/net/sf/basedb/util/overview/Fix.java

    r6127 r6939  
    2323
    2424
     25import net.sf.basedb.core.Annotation;
    2526import net.sf.basedb.core.AnnotationType;
    2627import net.sf.basedb.core.BasicItem;
     
    4243  private BasicItem item;
    4344  private AnnotationType annotationType;
     45  private Annotation annotation;
    4446  private boolean fromInherited;
    4547  private FileSetMember member;
     
    7476  }
    7577
     78  /**
     79    Create a new suggested fix for the annotation of an item.
     80    @param message A message explaining what needs to be fixed
     81    @param item The item that needs to be edited by this fix
     82    @param annotation The annotation that needs to be edited by this fix
     83   
     84    @since 3.6
     85  */
     86  public Fix(String message, BasicItem item, Annotation annotation)
     87  {
     88    this.message = message;
     89    this.item = item;
     90    this.annotation = annotation;
     91    this.annotationType = annotation.getAnnotationType();
     92    this.fromInherited = annotation.getSource() != Annotation.Source.PRIMARY;
     93  }
     94
     95 
    7696  public Fix(String message, BasicItem item, FileSetMember member)
    7797  {
     
    115135
    116136  /**
     137    Get the annotation that needs to be edited for this fix.
     138    @return An annotation or null if this is not a fix for annotations
     139    @since 3.6
     140  */
     141  public Annotation getAnnotation()
     142  {
     143    return annotation;
     144  }
     145 
     146  /**
    117147    If this fix involves editing an annotation or not.
    118148    @see #isFromInherited()
  • trunk/src/core/net/sf/basedb/util/overview/OverviewUtil.java

    r6132 r6939  
    133133            Validator.ANNOTATION_INVALID_ITEM,
    134134            Validator.ANNOTATION_INHERIT_FROM_NONPARENT,
     135            Validator.ANNOTATION_CLONED_FROM_UNKNOWNPARENT,
    135136            Validator.ANNOTATION_INHERIT_FROM_DENIEDPARENT,
    136137            Validator.ANNOTATION_INHERIT_MULTIPLE
  • trunk/src/core/net/sf/basedb/util/overview/Validator.java

    r6098 r6939  
    763763 
    764764  /**
     765    Validator rule that checks if a cloned annotation value has lost
     766    the reference to the parent item. Default severity level is WARNING.
     767    @since 3.6
     768  */
     769  public static final Validator ANNOTATION_CLONED_FROM_UNKNOWNPARENT = new Validator(
     770      "annotation.clonedfromunknownparent", "Cloned annotation from unknown parent",
     771      "Checks if an item has a cloned annotation that no longer has a " +
     772      "link back to the parent item.",
     773      "Cloned annotation from unknown parent", Severity.WARNING
     774    );
     775
     776 
     777  /**
    765778    Validator rule that checks if the logged in user has access to
    766779    the parent item of an inherited annotation value. Default severity
  • trunk/src/core/net/sf/basedb/util/overview/loader/AnnotationLoader.java

    r5574 r6939  
    2222package net.sf.basedb.util.overview.loader;
    2323
     24import java.util.Collections;
    2425import java.util.List;
    2526
     
    8182      folderNode = new Node("annotations", "Annotations", parentNode, ChildNodeDirection.NONE);
    8283      SnapshotManager snapshotManager = context.getSnapshotManager();
    83            
     84     
    8485      List<AnnotationSnapshot> all = snapshotManager.findAnnotations(dc, parent, null, true);
     86      Collections.sort(all, AnnotationSnapshot.sortByAnnotationType(dc));
    8587      for (AnnotationSnapshot a : all)
    8688      {
    87         Annotation ann = a.getAnnotation(dc);
     89        Annotation ann = a.getThisAnnotation(dc);
    8890        // Annotations that are protocol parameters are handled by ProtocolParameterLoader       
    89         if (!a.isInherited() && protocol != null && protocol.isParameter(ann))
     91        if (a.getSource() == Annotation.Source.PRIMARY && protocol != null && protocol.isParameter(a.getAnnotationType(dc)))
    9092        {
    9193          /* #### CONTINUE-STATEMENT #### */
     
    9496        createItemNode(nf, ann, null, false, folderNode, ChildNodeDirection.NONE);
    9597      }
    96       folderNode.sortChildren(null);
     98      //folderNode.sortChildren(null);
    9799    }
    98100    postValidateFolder(nf, folderNode, parentNode, false);
  • trunk/src/core/net/sf/basedb/util/overview/validator/AnnotationValidator.java

    r6024 r6939  
    2222package net.sf.basedb.util.overview.validator;
    2323
     24import java.util.HashMap;
    2425import java.util.HashSet;
    2526import java.util.List;
     27import java.util.Map;
    2628import java.util.Set;
    2729
     
    9597    List<AnnotationSnapshot> snapshots = manager.findAnnotations(dc, parent, new AnnotationFilter(a), false);
    9698    AnnotationSnapshot snapshot = snapshots.size() > 0 ? snapshots.get(0) : null;
    97     boolean isPrimary = snapshot != null && !snapshot.isInherited();
     99    boolean isPrimary = snapshot != null && snapshot.getSource() == Annotation.Source.PRIMARY;
    98100
    99101    AnnotationType at = null;
     
    107109        context.createFailure(Validator.ANNOTATION_IS_PARAMETER, node,
    108110          "Annotation '" + at.getName() + "' is a protocol parameter",
    109           new Fix("Remove annotation value", (BasicItem)parent, at, false),
     111          new Fix("Remove annotation value", (BasicItem)parent, a),
    110112          new Fix("Change 'parameter' flag of annotation type", at)
    111113        );
     
    117119        context.createFailure(Validator.ANNOTATION_INVALID_ITEM, node,
    118120          "Annotation '" + at.getName() + "' is invalid for item type: " + parentItemType,
    119           new Fix("Remove annotation value", (BasicItem)parent, at, false),
     121          new Fix("Remove annotation value", (BasicItem)parent, a),
    120122          new Fix("Add '" + parentItemType.name() + "' to annotation type", at)
    121123        );
     
    127129        try
    128130        {
    129           List<?> values = snapshot.getValues();
     131          List<?> values = snapshot.getActualValues();
    130132          if (values != null)
    131133          {
     
    135137                "Annotation '" + at.getName() +  "' have " + values.size() +
    136138                " values but only " + at.getMultiplicity() + " are allowed",
    137                 new Fix("Remove annotation values", (BasicItem)parent, at, false),
     139                new Fix("Remove annotation values", (BasicItem)parent, a),
    138140                new Fix("Increase the 'multiplity' option for the annotation type", at)
    139141              );
     
    149151        {
    150152          context.createFailure(Validator.ANNOTATION_INVALID_VALUE, node, ex.getMessage(),
    151             new Fix("Change annotation value", (BasicItem)parent, at, false),
     153            new Fix("Change annotation value", (BasicItem)parent, a),
    152154            new Fix("Change annotation type restrictions", at)
    153155          );
     
    163165
    164166    // If the annotation is inherited from a 'parent item', verify that
    165     // it is a reachable parent
     167    // it is a reachable/existing parent
    166168    if (!isPrimary)
    167169    {
     
    169171      try
    170172      {
    171         Annotatable inheritedFrom = a.getAnnotationSet().getItem();
    172         if (!reachableParents.contains(inheritedFrom))
    173         {
    174           context.createFailure(Validator.ANNOTATION_INHERIT_FROM_NONPARENT, node,
     173        Annotation inherited = a.getInheritedFrom();
     174        if (inherited == null)
     175        {
     176          context.createFailure(Validator.ANNOTATION_CLONED_FROM_UNKNOWNPARENT, node,
     177            "Cloned annotation '" + (at != null ?
     178            at.getName() : a.getValueType().toString()) + "' from unknown parent",
     179            new Fix("Clone from another item", (BasicItem)parent, a)
     180          );
     181        }
     182        else
     183        {
     184          Annotatable inheritedFrom = inherited.getAnnotationSet().getItem();
     185          if (!reachableParents.contains(inheritedFrom))
     186          {
     187            context.createFailure(Validator.ANNOTATION_INHERIT_FROM_NONPARENT, node,
    175188              "Inheriting annotation '" + (at != null ?
    176                 at.getName() : a.getValueType().toString()) + "' from non-parent",
    177               new Fix("Inherit from another item", (BasicItem)parent, at, true)
     189              at.getName() : a.getValueType().toString()) + "' from non-parent",
     190              new Fix("Inherit from another item", (BasicItem)parent, a)
    178191            );
     192          }
    179193        }
    180194      }
     
    184198            "Inheriting annotation '" + (at != null ?
    185199              at.getName() : a.getValueType().toString()) + "' from denied parent",
    186             new Fix("Inherit from another item", (BasicItem)parent, at, true)
     200            new Fix("Inherit from another item", (BasicItem)parent, a)
    187201          );
    188202      }
     
    199213    Set<AnnotationType> miame = OverviewUtil.getMiameAnnotationTypes(dc, context, parentNode.getItemType());
    200214    Set<AnnotationType> all = new HashSet<AnnotationType>();
    201     Set<AnnotationType> duplicates = new HashSet<AnnotationType>();
     215    Map<AnnotationType, Annotation> duplicates = new HashMap<AnnotationType, Annotation>();
    202216    if (folderNode != null && folderNode.numChildren() > 0)
    203217    {
     
    208222        {
    209223          AnnotationType at = a.getAnnotationType();
    210           if (!all.add(at)) duplicates.add(at);
     224          if (!all.add(at)) duplicates.put(at, a);
    211225        }
    212226        catch (PermissionDeniedException ex)
     
    218232    if (duplicates.size() > 0)
    219233    {
    220       for (AnnotationType dup : duplicates)
     234      for (Map.Entry<AnnotationType, Annotation> dup : duplicates.entrySet())
    221235      {
    222236        context.createFailure(Validator.ANNOTATION_INHERIT_MULTIPLE, parentNode,
    223           "Duplicate annotations of type '" + dup.getName() + "'",
    224           new Fix("Modify inherited annotations", parentNode.getItem(), dup, true)
     237          "Duplicate annotations of type '" + dup.getKey().getName() + "'",
     238          new Fix("Modify annotations", parentNode.getItem(), dup.getValue())
    225239        );
    226240      }
  • trunk/src/core/net/sf/basedb/util/overview/validator/ProtocolParameterValidator.java

    r6921 r6939  
    106106      {
    107107        context.createFailure(Validator.ANNOTATION_INVALID_VALUE, parentItemNode, ex.getMessage(),
    108           new Fix("Change parameter value", parentItem, parameter, false),
     108          new Fix("Change parameter value", parentItem, a),
    109109          new Fix("Change parameter restrictions", parameter)
    110110        );
  • trunk/www/common/annotations/list_annotations.jsp

    r6938 r6939  
    197197    }
    198198   
    199     .edit-annotation:before
    200     {
    201       display: inline-block;
    202       content: "∙";
    203       color: #999999;
    204       padding-right: 0.25em;
    205       padding-left: 1px;
    206       text-decoration: none;
     199    .edit-annotation
     200    {
     201      float: right;
    207202    }
    208203  </style>
     
    287282              if (a != null)
    288283              {
    289                 Annotation ann = a.getAnnotation(dc);
    290                 values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
     284                Annotation ann = a.getThisAnnotation(dc);
     285                values = a.getActualValues(ann.getUnitConverter(null), ann.getValueType());
    291286                formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
    292287              }
     
    316311                    tooltip="This item has been scheduled for deletion"
    317312                    visible="<%=at.isRemoved()%>"
    318                   /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
    319                   <tbl:cell column="values"><%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
    320                     <%
    321                     if (writePermission)
    322                     {
    323                       %><base:icon image="edit.png" subclass="edit-annotation auto-init link"
    324                         data-auto-init="edit-annotation"
    325                         data-annotation="<%=a!=null ? a.getThisAnnotationId() : 0 %>"
    326                         data-annotation-type="<%=at.getId()%>"
    327                         data-item-type="<%=itemType.name()%>"
    328                         data-item-id="<%=itemId %>"
    329                         tooltip="Modify the values of this annotation"
    330                       />
    331                       <%
    332                     }
    333                     %>
     313                    /><%=Base.getLinkedName(ID, at, false, true)%></tbl:cell>
     314                  <tbl:cell column="values">
     315                    <%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
     316                    <base:icon image="edit.png" subclass="edit-annotation auto-init link"
     317                      data-auto-init="edit-annotation"
     318                      data-annotation="<%=a!=null ? a.getThisAnnotationId() : 0 %>"
     319                      data-annotation-type="<%=at.getId()%>"
     320                      data-item-type="<%=itemType.name()%>"
     321                      data-item-id="<%=itemId %>"
     322                      tooltip="Modify the values of this annotation"
     323                      visible="<%=writePermission %>"
     324                    />
    334325                  </tbl:cell>
    335326                  <tbl:cell column="lastModified" value="<%=a == null ? null : a.getThisLastUpdate() %>" />
     
    411402                if (a != null)
    412403                {
    413                   Annotation ann = a.getAnnotation(dc);
    414                   values = a.getValues(ann.getUnitConverter(null), ann.getValueType());
     404                  Annotation ann = a.getThisAnnotation(dc);
     405                  values = a.getActualValues(ann.getUnitConverter(null), ann.getValueType());
    415406                  formatter = FormatterFactory.getAnnotationFormatter(sc, ann, null);
    416407                }
     
    426417                    <tbl:cell column="values">
    427418                      <%=values == null || values.size() == 0 ? "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
    428                       <%
    429                       if (writePermission)
    430                       {
    431                         %><base:icon image="edit.png" subclass="edit-annotation auto-init link"
    432                           data-auto-init="edit-annotation"
     419                      <base:icon image="edit.png" subclass="edit-annotation auto-init link"
     420                        data-auto-init="edit-annotation"
    433421                          data-annotation="<%=a!=null ? a.getThisAnnotationId() : 0 %>"
    434422                          data-annotation-type="<%=at.getId()%>"
     
    436424                          data-item-id="<%=itemId %>"
    437425                          tooltip="Modify the values of this protocol parameter"
    438                         />
    439                         <%
    440                       }
    441                       %>
     426                        visible="<%=writePermission %>"
     427                      />
    442428                    </tbl:cell>
    443429                    <tbl:cell column="lastModified" value="<%=a == null ? null : a.getThisLastUpdate() %>" />
     
    491477          />
    492478          <tbl:columndef
    493             id="source"
    494             title="Cloned"
    495           />
    496           <tbl:columndef
    497479            id="item"
    498             title="From item"
     480            title="Parent item"
     481          />
     482          <tbl:columndef
     483            id="note"
     484            title="Note"
    499485          />
    500486          <tbl:columndef
     
    568554              <tbl:row>
    569555                <tbl:cell column="annotation"><%=Base.getLinkedName(ID, at, at == null, true)%></tbl:cell>
    570                 <tbl:cell column="source"><%=a.getSource() == Annotation.Source.CLONED ? "Yes" + (isUpToDate ? "; up-to-date" : "; modified") : "" %></tbl:cell>
    571                 <tbl:cell column="item"><%=from == null ? "<i>- missing -</i>" : Base.getLinkedName(ID, fromItem, fromItem == null, true)%><%=fromItem != null ? " <span class=\"itemsubtype\">("+fromType+")</span>" : ""%></tbl:cell>
    572556                <tbl:cell column="values">
    573557                  <%=values == null || values.size() == 0 ?
    574558                    "<i>- no values -</i>" : Values.getString(values, ", ", true, formatter)%>
    575                   <%
    576                   if (writePermission)
    577                   {
    578                     %><base:icon image="edit.png" subclass="edit-annotation auto-init link"
    579                       data-auto-init="edit-annotation"
    580                       data-annotation="<%= a.getThisAnnotationId()%>"
    581                       data-annotation-type="<%=at.getId()%>"
    582                       data-item-type="<%=itemType.name()%>"
    583                       data-item-id="<%=itemId %>"
    584                       tooltip="Modify the values of this annotation"
    585                     />
    586                     <%
    587                   }
    588                   %>
     559                  <base:icon image="edit.png" subclass="edit-annotation auto-init link"
     560                    data-auto-init="edit-annotation"
     561                    data-annotation="<%= a.getThisAnnotationId()%>"
     562                    data-annotation-type="<%=at.getId()%>"
     563                    data-item-type="<%=itemType.name()%>"
     564                    data-item-id="<%=itemId %>"
     565                    tooltip="Modify the values of this annotation"
     566                    visible="<%=writePermission %>"
     567                  />
    589568                </tbl:cell>
     569                <tbl:cell column="item"><%=from == null ? "<i>- missing -</i>" : Base.getLinkedName(ID, fromItem, fromItem == null, true)%><%=fromItem != null ? " <span class=\"itemsubtype\">("+fromType+")</span>" : ""%></tbl:cell>
     570                <tbl:cell column="note"><%=a.getSource() == Annotation.Source.CLONED ? "Cloned" + (isUpToDate ? "; up-to-date" : "; modified") : "" %></tbl:cell>
    590571                <tbl:cell column="lastModified" value="<%=lastModified %>"></tbl:cell>
    591572                <tbl:cell column="description"><%=description%></tbl:cell>
  • trunk/www/common/overview/info.js

    r6400 r6939  
    6767    var itemType = Data.get(target, 'item-type');
    6868    var itemId = Data.get(target, 'item-id');
     69    var annotationId = Data.get(target, 'annotation-id');
    6970    var annotationTypeId = Data.get(target, 'annotation-type-id');
    7071    var url = App.getRoot() + 'common/annotations/annotate.jsp?ID='+App.getSessionId();
     
    7273    url += '&item_id=' + itemId;
    7374    url += '&annotationtype_id='+annotationTypeId;
     75    url += '&annotation_id='+annotationId;
    7476    url += '&standalone=1';
    7577    Dialogs.openPopup(url, 'EditAnnotation', 750, 500);
  • trunk/www/common/overview/info.jsp

    r6382 r6939  
    3535  import="net.sf.basedb.core.AnyToAny"
    3636  import="net.sf.basedb.core.Protocol"
     37  import="net.sf.basedb.core.Unit"
    3738  import="net.sf.basedb.core.FileStoreEnabled"
    3839  import="net.sf.basedb.core.FileSetMember"
     
    5657  import="net.sf.basedb.util.Values"
    5758  import="net.sf.basedb.util.NestedIterator"
     59  import="net.sf.basedb.util.units.UnitConverter"
    5860  import="net.sf.basedb.util.formatter.Formatter"
    5961  import="net.sf.basedb.util.overview.GenericOverview"
     
    6870  import="net.sf.basedb.util.extensions.ExtensionsInvoker"
    6971  import="java.util.ArrayList"
     72  import="java.util.Date"
    7073  import="java.util.List"
    7174  import="java.util.LinkedList"
     
    134137  List<Failure> failures = overview.getFailures();
    135138  if (failures == null) failures = new LinkedList<Failure>();
     139 
     140  Formatter<Date> dateTimeFormatter = FormatterFactory.getDateTimeFormatter(sc);
     141
    136142  %>
    137143  <base:page title="" type="iframe">
     
    143149  {
    144150    color: #777777;
     151  }
     152  .edit-annotation
     153  {
     154    float: right;
    145155  }
    146156  </style>
     
    390400      if (annotations != null && annotations.size() > 0)
    391401      {
     402        Collections.sort(annotations, AnnotationSnapshot.sortByAnnotationType(dc));
    392403        %>
    393404        <base:section
     
    398409        <tbl:table id="annotations">
    399410          <tbl:columndef id="annotation" title="Annotation/parameter" />
    400           <tbl:columndef id="owner" title="Owner" />
    401           <tbl:columndef id="values" title="Value" />
    402           <tbl:columndef id="edit" title="" />
     411          <tbl:columndef id="values" title="Values" />
     412          <tbl:columndef
     413            id="item"
     414            title="Parent item"
     415          />
     416          <tbl:columndef
     417            id="note"
     418            title="Note"
     419          />
     420          <tbl:columndef
     421            id="lastModified"
     422            title="Last modified"
     423            formatter="<%=dateTimeFormatter %>"
     424          />
    403425          <tbl:data>
    404426            <tbl:headers>
     
    411433              for (AnnotationSnapshot snapshot : annotations)
    412434              {
    413                 Annotation a = snapshot.getAnnotation(dc);
    414435                AnnotationType at = snapshot.getAnnotationType(dc);
    415                 Formatter formatter = FormatterFactory.getAnnotationFormatter(sc, a, null);
    416                 Annotatable annotationOwner = null;
    417                 try
     436               
     437                // Unit and formatter for the values
     438                Formatter formatter = FormatterFactory.getTypeFormatter(sc, at.getValueType());
     439                Unit unit = snapshot.getActualUnit(dc);
     440                UnitConverter converter = null;
     441                if (unit != null)
    418442                {
    419                   annotationOwner = snapshot.getItem(dc);
     443                  converter = unit.getUnitConverter(at.getDefaultUnit());
     444                  formatter = unit.getFormatter(formatter);
    420445                }
    421                 catch (Throwable t)
    422                 {}
    423                 String icon = at != null && at.isProtocolParameter() ?
    424                     "parameter.png" : "annotation.png";
    425                 String autoInit = null;
    426                 String editTooltip = null;
    427                 if (annotatable != null && annotatable.hasPermission(Permission.WRITE))
     446                // Get values
     447                List<?> values = snapshot.getActualValues(converter, at.getValueType());
     448
     449                // Inheritance information
     450                Date lastModified = snapshot.getThisLastUpdate();
     451                boolean isUpToDate = true;
     452                AnnotationSnapshot inherited = snapshot.getInheritedFrom();
     453                Annotatable inheritedFrom = null;
     454                if (inherited != null)
    428455                {
    429                   if (annotatable.equals(annotationOwner))
     456                  if (lastModified == null)
    430457                  {
    431                     autoInit = "edit-annotation";
    432                     editTooltip = "Edit the values of this annotation";
     458                    lastModified = inherited.getThisLastUpdate();
    433459                  }
    434460                  else
    435461                  {
    436                     autoInit = "edit-inherited-annotation";
    437                     editTooltip = "Inherit this annotation from another item";
     462                    isUpToDate = !lastModified.before(inherited.getThisLastUpdate());
    438463                  }
     464                  try
     465                  {
     466                    inheritedFrom = inherited.getThisItem(dc);
     467                  }
     468                  catch (Throwable t)
     469                  {}
    439470                }
     471               
     472                String icon = at != null && at.isProtocolParameter() ?
     473                    "parameter.png" : "annotation.png";
     474                boolean editPermission = annotatable.hasPermission(Permission.WRITE);
    440475                %>
    441476                <tbl:row>
     
    443478                    <%=Base.getLinkedName(ID, at, false, true)%>
    444479                  </tbl:cell>
    445                   <tbl:cell column="owner">
     480                  <tbl:cell column="values">
     481                    <%=Values.getString(values, ", ", true, formatter)%>
     482                    <base:icon id="<%=Integer.toString(snapshot.getThisAnnotationId())%>"
     483                      image="edit.png" subclass="edit-annotation auto-init" data-auto-init="edit-annotation"
     484                      data-item-type="<%=annotatable.getType().name()%>"
     485                      data-item-id="<%=annotatable.getId()%>"
     486                      data-annotation-type-id="<%=at.getId()%>"
     487                      data-annotation-id="<%=snapshot.getThisAnnotationId()%>"
     488                      tooltip="Edit this annotation" visible="<%=editPermission %>"/>
     489                  </tbl:cell>
     490                  <tbl:cell column="item">
    446491                    <%
    447                     if (annotationOwner != null && !annotationOwner.equals(annotatable))
     492                    if (inheritedFrom != null)
    448493                    {
    449                       String ownerName = annotationOwner instanceof Nameable ?
    450                           ((Nameable)annotationOwner).getName() : annotationOwner.toString();
     494                      String ownerName = inheritedFrom instanceof Nameable ?
     495                          ((Nameable)inheritedFrom).getName() : inheritedFrom.toString();
    451496                      %>
    452                       <%=Base.getLink(ID, ownerName, annotationOwner.getType(), annotationOwner.getId(), annotationOwner.hasPermission(Permission.WRITE)) %>
     497                      <%=Base.getLink(ID, ownerName, inheritedFrom.getType(), inheritedFrom.getId(), inheritedFrom.hasPermission(Permission.WRITE)) %>
     498                      <%
     499                    }
     500                    else if (snapshot.getSource() == Annotation.Source.CLONED)
     501                    {
     502                      %>
     503                      <i>- missing -</i>
    453504                      <%
    454505                    }
    455506                    %>
    456507                  </tbl:cell>
    457                   <tbl:cell column="values"><%=Values.getString(a.getValues(null), ", ", true, formatter)%></tbl:cell>
    458                   <tbl:cell column="edit"><base:icon id="<%=Integer.toString(a.getId())%>" image="edit.png" subclass="auto-init" data-auto-init="<%=autoInit %>"
    459                     data-item-type="<%=annotatable.getType().name()%>"
    460                     data-item-id="<%=annotatable.getId()%>"
    461                     data-annotation-type-id="<%=at.getId()%>"
    462                     tooltip="<%=editTooltip%>" visible="<%=autoInit != null %>"/></tbl:cell>
     508                  <tbl:cell column="note"><%=snapshot.getSource() == Annotation.Source.CLONED ? "Cloned" + (isUpToDate ? "; up-to-date" : "; modified") : "" %></tbl:cell>
     509                  <tbl:cell column="lastModified" value="<%=lastModified %>" />
    463510                </tbl:row>
    464511                <%
     
    508555                    boolean enabled = fixItem.hasPermission(Permission.WRITE);
    509556                    AnnotationType at = fix.getAnnotationType();
     557                    Annotation a = fix.getAnnotation();
    510558                    String autoInit = "";
    511559                    if (enabled)
     
    513561                      if (fix.isAnnotationFix())
    514562                      {
    515                         autoInit = fix.isFromInherited() ? "edit-inherited-annotation" : "edit-annotation";
     563                        autoInit = "edit-annotation";
    516564                      }
    517565                      else if (fix.isDataFileFix())
     
    534582                      data-item-id="<%=fixItem.getId()%>"
    535583                      data-annotation-type-id="<%=at != null ? at.getId() : ""%>"
     584                      data-annotation-id="<%=a != null ? a.getId() : "" %>"
    536585                      tooltip="<%=enabled ? "Edit this item to fix the problem" : "You do not have permission to modify this item" %>"
    537586                    ><%=HTML.encodeTags(fix.getMessage())%></base:icon><br>
Note: See TracChangeset for help on using the changeset viewer.