Über mich und meine Erfahrungen
Tag Archives: RTC
Erweiterung von RTC um Fokusierung

Nachdem ich seit einiger Zeit bei einem Kunden das IBM Rational Team Concert einsetze, privat aber auch mit Subversion und Mylyn gearbeitet habe, habe ich mich gefragt, warum es zu dem „Add SVN Revision…“ bei der Erstellung von Links zu Work Items, kein Pendant für das CCM existiert.

Es ist zwar möglich mit „Add Related Artefakt…“ auf eine entsprechende Artefakt — dieses könnte eine Datei oder etwas ähnliches sein — zu verweisen, aber diese Navigation ist manuell einzugeben.

Insbesondere existiert diese Beziehung zwischen Work Item und Resource oder Artefakt sobald

ein Changeset erzeugt wird. Dieses Changeset kann dann auch genutzt werden, um eine entsprechende Navigation vom Work Item zu dem Artefakt zu erhalten.

Für mich geht es hierbei um die Frage, ob man das entwicklerfokusierte Arbeiten, welches mit Mylyn in eclipse einzug gehalten hat, nicht auch auf den RTC übertragen kann. Sofern jemand Mylyn kennt, weiß er, dass Mylyn aus der Disseration von Mik Kersten stammt, der mit IBM RTC Mylyn Connector bei seiner Firma Tasktop eine entsprechende Implementierung umgesetzt hat. Soweit so gut, denkt man sich, das Problem ist somit gelöst.

Es ist möglich diese Integration zu erwerben, um damit den RTC effizienter einzusetzen. Allerdings verstehe ich es als meine Aufgabe, mich mit den Tools auseinander zu setzen, und nicht nur mit Ihnen zu arbeiten. Warum also nicht eine spezifische Ergänzung entwicklen, die es mit wenigen Klicks möglich macht, das in bezug stehende Artefakt automatisch hinzufügen zu können? Ein schöner Gedanke, ich lasse diese Idee einmal reifen, und lasse mich überraschen, ob sie Früchte trägt.

Entwicklen und Debuggen für RTC

Basierend auf den vorhandenen Beschreibungen zum RTC 2.0 für das Entwickeln und Debuggen habe ich eine virtuelle Maschine aufgesetzt, in der ich für und unter dem RTC 3.0 entwickeln kann. Das Umsetzen eines OperationAdvisors war recht einfach, und dauert eigentlich nur recht kurz. Nachdem nun einige Zeit vergangen ist, habe ich das Vorgehen für den RTC 5.0 angepasst. Auch hier konnte ich einen Ansatzpunkt finden, aber auch dieser bezieht sich auf die veraltete Version 4.0 und ist unter Rational Team Concert Extensions Workshop zu finden, daneben existiert auch eine entsprechende Aktualisierung auf Running The RTC 4.x Extensions Workshop With RTC 5.0.x.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
package de.malime.rtc.operationadvisor;
 
import java.util.List;
 
import org.eclipse.core.runtime.IProgressMonitor;
 
import com.ibm.team.links.common.IItemReference;
import com.ibm.team.links.common.IReference;
import com.ibm.team.process.common.IProcessConfigurationElement;
import com.ibm.team.process.common.advice.AdvisableOperation;
import com.ibm.team.process.common.advice.IAdvisorInfo;
import com.ibm.team.process.common.advice.IAdvisorInfoCollector;
import com.ibm.team.process.common.advice.runtime.IOperationAdvisor;
import com.ibm.team.repository.common.IItemHandle;
import com.ibm.team.repository.common.TeamRepositoryException;
import com.ibm.team.workitem.common.IAuditableCommon;
import com.ibm.team.workitem.common.ISaveParameter;
import com.ibm.team.workitem.common.model.IApprovalDescriptor;
import com.ibm.team.workitem.common.model.IApprovals;
import com.ibm.team.workitem.common.model.IWorkItem;
import com.ibm.team.workitem.common.model.IWorkItemHandle;
import com.ibm.team.workitem.common.model.IWorkItemReferences;
import com.ibm.team.workitem.common.model.WorkItemEndPoints;
 
public class ParentApprovalRequired implements IOperationAdvisor {
 
  public void run( AdvisableOperation operation, IProcessConfigurationElement advisorConfiguration, IAdvisorInfoCollector collector, IProgressMonitor monitor ) throws TeamRepositoryException {
    Object data= operation.getOperationData();
    if (data instanceof ISaveParameter) {
      if ( ( ( ISaveParameter ) data).getNewState() instanceof IWorkItem ) {
        IWorkItem workitem = ( IWorkItem )( ( ISaveParameter ) data).getNewState();
        parentIsApproved( ( IWorkItem )( ( ISaveParameter ) data).getNewState() );
        IAuditableCommon auditableCommon = ( ( ISaveParameter ) data ).getSaveOperationParameter().getAuditableCommon();
        IWorkItem parent = getParentWorkItem( ( ISaveParameter ) data, auditableCommon );
        if( parent != null ) {
          if( parentIsApproved( parent ) == false ) {
            IAdvisorInfo info = collector.createProblemInfo("Parental Approval", "The parent of the work item is not approved", "error");
            collector.addInfo( info );
          }
        }
      }
    }
  }
 
  private IWorkItem getParentWorkItem( ISaveParameter param, IAuditableCommon auditableCommon ) throws TeamRepositoryException {
    List<IReference> parentRefs= null;
    IWorkItemReferences refs= param.getNewReferences();
    if (refs.hasReferences(WorkItemEndPoints.PARENT_WORK_ITEM)) {                        
      parentRefs= refs.getReferences(WorkItemEndPoints.PARENT_WORK_ITEM);
    }
    if (parentRefs != null && !parentRefs.isEmpty()) {
      IReference parent= parentRefs.get(0);
      if (parent.isItemReference()) {
         IItemHandle refItem= ((IItemReference)parent).getReferencedItem();
         if (refItem instanceof IWorkItemHandle) {
           return (IWorkItem) auditableCommon.resolveAuditable((IWorkItemHandle) refItem, IWorkItem.FULL_PROFILE, null);
         }
      }
    }
    return null;
  }
 
  private boolean parentIsApproved( IWorkItem workitem ) {
    IApprovals approvals = workitem.getApprovals();
    if( approvals != null ){
      for (IApprovalDescriptor descriptor : approvals.getDescriptors()) {
        if( !"com.ibm.team.workitem.approvalState.approved".equals( descriptor.getCumulativeStateIdentifier() ) ) return false;
      } 
    }
    return true;
  }
 
}

Bei dem Entwickeln und Debuggen ist eigentlich nur zu Beachten, dass es jetzt nicht mehr einen jazz-Server, sondern stattdessen einen RTC- und einen CCM-Server gibt. Der OperationAdvisor gehört in den letzteren. Auch beim Entwicklen eines HTTPS Zugriffes, um auf Workitems zuzugreifen, ist dieses zu beachten. Ich war erfolgreich, nachdem ich zuerst den RTC-Server abgefragt habe, und dann mit den gefundenen Informationen auf den CCM-Server zugegriffen habe.

IBM Rational Team Concert 3.0

Endlich habe ich die Zeit gefunden mir eine virtuelle Maschine aufsetzen um meine Erfahrungen und Erkenntnisse zum Customizing des RTC zu erweitern. Viele Dinge, die auf jazz.net beschrieben sind, lassen sich auf den RTC 3.0 übertragen, auch wenn es kleinere Abweichungen gibt, bei denen man etwas aufpassen muss. Das nächste was ich sicherlich umsetzen werde, ist eine Erweiterung zum Workflow. Die Idee ist, wenn eine Story mehrere Tasks hat, und gleichzeitig wenigstens einen Approver besitzt, dass die Tasks nur beginnen dürfen, sofern alle Approver zugestimmt haben. Die Ergänzung zu dieser Idee ist, dass eine Story, sofern diese Tasks und Reviewer hat, die Reviewer nur dann ihr Review absegnen können, wenn alle Tasks abgeschlossen sind. Sicherlich eine kleinere Erweiterung, aber es hat ausreichende API Zugriffe, und wird weitere Erkenntnisse zum Debuggen und Profilen liefern.