Github user Graeme-Miller commented on a diff in the pull request:

    https://github.com/apache/brooklyn-server/pull/818#discussion_r138817948
  
    --- Diff: 
core/src/main/java/org/apache/brooklyn/core/objs/AbstractEntityAdjunct.java ---
    @@ -568,6 +570,98 @@ public void setUniqueTag(String uniqueTag) {
             return highlightsToReturn;
         }
     
    +    /** Records a named highlight against this object, for persistence and 
API access.
    +     * See common highlights including {@link #HIGHLIGHT_NAME_LAST_ACTION} 
and
    +     * {@link #HIGHLIGHT_NAME_LAST_CONFIRMATION}.
    +     * Also see convenience methods eg  {@link #highlightOngoing(String, 
String)} and {@link #highlight(String, String, Task)}
    +     * and {@link HighlightTuple}. 
    +     */
    +    protected void setHighlight(String name, HighlightTuple tuple) {
    +        highlights.put(name, tuple);
    +    }
    +
    +    /** As {@link #setHighlight(String, HighlightTuple)}, convenience for 
recording an item which is intended to be ongoing. */
    +    protected void highlightOngoing(String name, String description) {
    +        highlights.put(name, new HighlightTuple(description, 0, null));
    +    }
    +    /** As {@link #setHighlight(String, HighlightTuple)}, convenience for 
recording an item with the current time. */
    +    protected void highlightNow(String name, String description) {
    +        highlights.put(name, new HighlightTuple(description, 
System.currentTimeMillis(), null));
    +    }
    +    /** As {@link #setHighlight(String, HighlightTuple)}, convenience for 
recording an item with the current time and given task. */
    +    protected void highlight(String name, String description, @Nullable 
Task<?> t) {
    +        highlights.put(name, new HighlightTuple(description, 
System.currentTimeMillis(), t!=null ? t.getId() : null));
    +    }
    +    
    +    /** As {@link #setHighlight(String, HighlightTuple)} for {@link 
#HIGHLIGHT_NAME_TRIGGERS} (as ongoing). */
    +    protected void highlightTriggers(String description) {
    +        highlightOngoing(HIGHLIGHT_NAME_TRIGGERS, description);
    +    }
    +    protected <T> void highlightTriggers(Sensor<?> s, Object source) {
    +        highlightTriggers(Collections.singleton(s), 
Collections.singleton(source));
    +    }
    +    protected <T> void highlightTriggers(Iterable<? extends Sensor<? 
extends T>> s, Object source) {
    +        highlightTriggers(s, (Iterable<?>) (source instanceof Iterable ? 
(Iterable<?>)source : Collections.singleton(source)));
    +    }
    +    protected <U> void highlightTriggers(Sensor<?> s, Iterable<U> sources) 
{
    +        highlightTriggers(Collections.singleton(s), sources);
    +    }
    +    protected <T,U> void highlightTriggers(Iterable<? extends Sensor<? 
extends T>> sensors, Iterable<U> sources) {
    +        StringBuilder msg = new StringBuilder("Listening for ");
    +        boolean firstWord = true;
    +        if (sensors!=null) for (Object s: sensors) {
    +            if (s==null) continue;
    +            if (!firstWord) { msg.append(", "); } else { firstWord = 
false; }
    +            // s is normally a sensor but forgive other things if caller 
cheated generics
    +            msg.append(s instanceof Sensor ? ((Sensor<?>)s).getName() : 
s.toString());
    +        }
    +        if (firstWord) msg.append("<nothing>");
    +        
    +        firstWord = true;
    --- End diff --
    
    @grkvlt very interesting, didn't know about Collectors.joining(", "), 
that's very handy.
    
    re. the second clause in the if. My understanding of Alex's code is that, 
if there is only one entry, and that entry is self, then we shouldn't add 
"on...". The second clause in the if is to guard against that. Maybe Alex can 
clarify?



---

Reply via email to