RTC server side plugin : Getting null in operationData while creating baseline
Hi,
I want to apply some naming convention to baseline but when I am creating baseline of the component I am getting "null" in operationData.
Object operationData = operation.getOperationData();
But when I create snapshot I am getting the data.
I am not getting why operationData is getting null as a value when I create a baseline
Below is my code snippet,
/**
*
*/
package com.fcagroup.pmbd.plugin.namingconvention;
import org.eclipse.core.runtime.IProgressMonitor;
import com.fcagroup.pmbd.plugin.FCANamingConventionUtility;
import com.ibm.team.process.common.IProcessConfigurationElement;
import com.ibm.team.process.common.IProjectArea;
import com.ibm.team.process.common.IProjectAreaHandle;
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.TeamRepositoryException;
import com.ibm.team.repository.service.IRepositoryItemService;
import com.ibm.team.scm.common.process.IModifyStreamOperationData;
import com.ibm.team.scm.service.internal.AbstractScmService;
import com.ibm.team.scm.service.internal.ScmService;
/**
*
* Class created to validate name convention of Snapshot
* @author nileshp14
*
*/
public class FCASnapShotNameAdvisor extends AbstractScmService
implements IOperationAdvisor{
public void run(AdvisableOperation operation,
IProcessConfigurationElement advisorConfiguration,
IAdvisorInfoCollector collector, IProgressMonitor monitor)
throws TeamRepositoryException {
try
{
Object operationData = operation.getOperationData();
if(operationData == null)return;
if (!(operationData instanceof IModifyStreamOperationData)) {
throw new IllegalArgumentException("Wrong type of argument: " + operationData);
}
IModifyStreamOperationData opData = (IModifyStreamOperationData)operationData;
//8-- OP type tells that, it is modified for snapshot name change
if(opData.isOperationType(8))
{
String snapshotName = opData.getAddedBaselineSetName();
if(snapshotName != null && !"".equals(snapshotName.trim()))
{
IProjectAreaHandle projectAreaHandle = operation.getProcessArea().getProjectArea();
IRepositoryItemService repositoryItemService = getService(IRepositoryItemService.class);
IProjectArea projectArea = (IProjectArea) repositoryItemService.fetchItem(projectAreaHandle, IRepositoryItemService.COMPLETE);
String projectAreaName = projectArea.getName();
/*String machingPattern = projectAreaName + "_"+"[A-Z]*_[a-zA-Z0-9]{0,10}_[a-zA-Z0-9.a-zA-Z0-9]{0,10}_(Dev|RFI|Release)_[\\S]{0,15}_\\d*";*/
String matchingPattern = projectAreaName + "_"+"[a-zA-Z0-9]+{0,10}_[a-zA-Z0-9.a-zA-Z0-9]+{0,10}_(Dev|RFI|Release)_[a-zA-z0-9]+";
if(!FCANamingConventionUtility.isMatchingNamePattern(matchingPattern, snapshotName))
{
IAdvisorInfo createProblemInfo = collector.createProblemInfo("Save Operation failed.", "Incorrect naming convention for snapshot. '"+snapshotName+"' is not valid name.\n" +
"snapshot should match '<ProjectName>_<ModelYear>_<PhaseNumber>_<Dev|RFI|Release>_<ReasonForTheSnapshot>_<TaskType>' pattern, where \n"+
"1) ModelYear can be maximum 10 digit (alphanumerics) \n"+
"2) Phase Number can be maximum 10 characters \n"+
"3) Based on stream type choose Release/RFI/Dev (alphanumerics)\n"+
"4) Reason for creating snapshot \n"+
"5) TaskType is actual task number \n"+
"(PMBD_2019_1.0.0_Dev_TheActualReason_TaskType)"
, "error");
collector.addInfo(createProblemInfo);
}
}
else
{
IAdvisorInfo createProblemInfo = collector.createProblemInfo("Save Operation failed.", "Snapshot name can not be null or empty.", "error");
collector.addInfo(createProblemInfo);
}
}
}
catch (Exception e)
{
System.err.println("Error ");
e.printStackTrace();
}
}
}
A small piece of code would be helpful.
Thank you!
I want to apply some naming convention to baseline but when I am creating baseline of the component I am getting "null" in operationData.
Object operationData = operation.getOperationData();
But when I create snapshot I am getting the data.
I am not getting why operationData is getting null as a value when I create a baseline
Below is my code snippet,
/**
*
*/
package com.fcagroup.pmbd.plugin.namingconvention;
import org.eclipse.core.runtime.IProgressMonitor;
import com.fcagroup.pmbd.plugin.FCANamingConventionUtility;
import com.ibm.team.process.common.IProcessConfigurationElement;
import com.ibm.team.process.common.IProjectArea;
import com.ibm.team.process.common.IProjectAreaHandle;
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.TeamRepositoryException;
import com.ibm.team.repository.service.IRepositoryItemService;
import com.ibm.team.scm.common.process.IModifyStreamOperationData;
import com.ibm.team.scm.service.internal.AbstractScmService;
import com.ibm.team.scm.service.internal.ScmService;
/**
*
* Class created to validate name convention of Snapshot
* @author nileshp14
*
*/
public class FCASnapShotNameAdvisor extends AbstractScmService
implements IOperationAdvisor{
public void run(AdvisableOperation operation,
IProcessConfigurationElement advisorConfiguration,
IAdvisorInfoCollector collector, IProgressMonitor monitor)
throws TeamRepositoryException {
try
{
Object operationData = operation.getOperationData();
if(operationData == null)return;
if (!(operationData instanceof IModifyStreamOperationData)) {
throw new IllegalArgumentException("Wrong type of argument: " + operationData);
}
IModifyStreamOperationData opData = (IModifyStreamOperationData)operationData;
//8-- OP type tells that, it is modified for snapshot name change
if(opData.isOperationType(8))
{
String snapshotName = opData.getAddedBaselineSetName();
if(snapshotName != null && !"".equals(snapshotName.trim()))
{
IProjectAreaHandle projectAreaHandle = operation.getProcessArea().getProjectArea();
IRepositoryItemService repositoryItemService = getService(IRepositoryItemService.class);
IProjectArea projectArea = (IProjectArea) repositoryItemService.fetchItem(projectAreaHandle, IRepositoryItemService.COMPLETE);
String projectAreaName = projectArea.getName();
/*String machingPattern = projectAreaName + "_"+"[A-Z]*_[a-zA-Z0-9]{0,10}_[a-zA-Z0-9.a-zA-Z0-9]{0,10}_(Dev|RFI|Release)_[\\S]{0,15}_\\d*";*/
String matchingPattern = projectAreaName + "_"+"[a-zA-Z0-9]+{0,10}_[a-zA-Z0-9.a-zA-Z0-9]+{0,10}_(Dev|RFI|Release)_[a-zA-z0-9]+";
if(!FCANamingConventionUtility.isMatchingNamePattern(matchingPattern, snapshotName))
{
IAdvisorInfo createProblemInfo = collector.createProblemInfo("Save Operation failed.", "Incorrect naming convention for snapshot. '"+snapshotName+"' is not valid name.\n" +
"snapshot should match '<ProjectName>_<ModelYear>_<PhaseNumber>_<Dev|RFI|Release>_<ReasonForTheSnapshot>_<TaskType>' pattern, where \n"+
"1) ModelYear can be maximum 10 digit (alphanumerics) \n"+
"2) Phase Number can be maximum 10 characters \n"+
"3) Based on stream type choose Release/RFI/Dev (alphanumerics)\n"+
"4) Reason for creating snapshot \n"+
"5) TaskType is actual task number \n"+
"(PMBD_2019_1.0.0_Dev_TheActualReason_TaskType)"
, "error");
collector.addInfo(createProblemInfo);
}
}
else
{
IAdvisorInfo createProblemInfo = collector.createProblemInfo("Save Operation failed.", "Snapshot name can not be null or empty.", "error");
collector.addInfo(createProblemInfo);
}
}
}
catch (Exception e)
{
System.err.println("Error ");
e.printStackTrace();
}
}
}
A small piece of code would be helpful.
Thank you!
2 answers
Without the plugin.xml, the operation ID and debugging I don't know who should be able to answer here.
When you debug the code you can look at the AdvisableOperation and check what data you really get. If you can't debug with Jetty, you should go here https://rsjazz.wordpress.com/2015/09/30/learning-to-fly-getting-started-with-the-rtc-java-apis/ and follow the Extensions Workshop and learn it.
Comments
Thank you Ralph for your reply.
I am using tomcat server and I am able to debug the code.But the api itself returns null value in operationData when I create baseline of the component.
You should not debug on Tomcat, you should debug on Jetty. I have no example for what you do above and short of spending an hour and trying it myself, I can't help.
IModifyStreamOperationData javadoc explains the operation types available, which are:
/**
* Operation type constant that indicates that a stream is being created.
* The operation data for a create will contain property changes for the
* fields that are being set (e.g. name, owner, description) but the
* target workspace handle will be <code>null</code>.
*/
public static final int CREATE = 1;
/**
* Operation type constant that indicates that a stream is being delete.
* The operation data for a delete will not contain any property changes
* or component deltas.
*/
public static final int DELETE = 2;
/**
* Operation type that indicates that there are changes to properties of the stream.
*/
public static final int CHANGES = 4;
/**
* Operation type that indicates that a baseline has been created or moved to the stream
*/
public static final int ADD_BASELINE_SET = 8;
* Operation type constant that indicates that a stream is being created.
* The operation data for a create will contain property changes for the
* fields that are being set (e.g. name, owner, description) but the
* target workspace handle will be <code>null</code>.
*/
public static final int CREATE = 1;
/**
* Operation type constant that indicates that a stream is being delete.
* The operation data for a delete will not contain any property changes
* or component deltas.
*/
public static final int DELETE = 2;
/**
* Operation type that indicates that there are changes to properties of the stream.
*/
public static final int CHANGES = 4;
/**
* Operation type that indicates that a baseline has been created or moved to the stream
*/
public static final int ADD_BASELINE_SET = 8;
Note: Modifying or creating a baseline is not a 'property' of the stream, and thus it doesn't exist in the IModifyStreamOperationData.
Comments
Modifying or creating baseline is comes under which API?
The API for creating a baseline is IScmService.createBaseline(...)
The API for modifying a baseline name is IScmService.setBaselineName(...)
As mentioned in: https://jazz.net/forum/questions/258918/can-i-contribute-a-naming-convention-advisorparticipant-for-baselines-snapshots
, as of now (RTC 6.0.6.1), the 'modify baseline/snapshot' operation does not currently support advisors/participants (unlike the 'modify stream/component' operation). Please open an enhancement or RFE request if you want these operations to support advisors/participants.
Comments
Kajal Chaudhari
Dec 05 '18, 12:01 a.m.Optype for snapshot is 8 ..then what for baseline?