public void started(AbstractBuild build) {
    String changes = getChanges(build);
    CauseAction cause = build.getAction(CauseAction.class);

    if (changes != null) {
      notifyStart(build, changes);
    } else if (cause != null) {
      MessageBuilder message = new MessageBuilder(notifier, build);
      message.append(cause.getShortDescription());
      notifyStart(build, message.appendOpenLink().toString());
    } else {
      notifyStart(build, getBuildStatusMessage(build));
    }
  }
 String getChanges(AbstractBuild r) {
   if (!r.hasChangeSetComputed()) {
     logger.info("No change set computed...");
     return null;
   }
   ChangeLogSet changeSet = r.getChangeSet();
   List<Entry> entries = new LinkedList<Entry>();
   Set<AffectedFile> files = new HashSet<AffectedFile>();
   for (Object o : changeSet.getItems()) {
     Entry entry = (Entry) o;
     logger.info("Entry " + o);
     entries.add(entry);
     files.addAll(entry.getAffectedFiles());
   }
   if (entries.isEmpty()) {
     logger.info("Empty change...");
     return null;
   }
   Set<String> authors = new HashSet<String>();
   for (Entry entry : entries) {
     authors.add(entry.getAuthor().getDisplayName());
   }
   MessageBuilder message = new MessageBuilder(notifier, r);
   message.append("Started by changes from ");
   message.append(StringUtils.join(authors, ", "));
   message.append(" (");
   message.append(files.size());
   message.append(" file(s) changed)");
   return message.appendOpenLink().toString();
 }
 String getBuildStatusMessage(AbstractBuild r) {
   MessageBuilder message = new MessageBuilder(notifier, r);
   message.appendStatusMessage();
   message.appendDuration();
   return message.appendOpenLink().toString();
 }