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.
Es gibt einen JTS (Jazz Team Server), dieser Teil wurde in RTC 3.0.1 abgespaltet und übernimmt allgemeine Aufgaben für alle Applikationen. Ich denke das ist oben gemeint.
Die CCM Applikation wird als synonym für RTC verstanden.
Hi Ralph,
danke dir für den Hinweis, der Artikel ist schon einige Jahre alt, ich sollte ihn vielleicht einmal den aktuellen Situation anpassen und entsprechend überarbeiten.