Jazz Forum Welcome to the Jazz Community Forum Connect and collaborate with IBM Engineering experts and users

Copy Builds and BuildDefinition via api, question. RESOLVED

 Unfortunately I am working on a copyproject function. one element is the build engines and builds. 

I now can loop thru the data on the source server, and am starting to replicate the data (which there appears to be a LOT of). 

Buildengine has a copyEngine() and BuildDef has a copyDefintion() functions.  These appear to be deep copy, but of course embedded handles are copied intact.  those handles of course are useless on the new repository. 

Is there any documented tree of the objects down from build engine, that shows (object) handle relationships?
(that I can look at?)

oh, and I want to say, there is a very dangerous issue with adding a Builddef to a build engine supported list. 
assuming that the list<> object is persistent outside the object is really nasty.  (not to mention hard to learn)
buildEngine_new.getSupportedBuildDefinitions().add(bd_new);

one is depending that the value returned by getSupportedBuildDefinitions() is passed by reference and not by value.
this should have been encapsulated in the BuildEngine object with an addSupportedBuildDef(bd) method.
(and this design should be consistent across all the objects.. matching get/set methods). 

0 votes


Accepted answer

Permanent link
as a followon question (have to put this in an 'answer' cause of the size.)
I am successfully creating build engines and build definitions. 
BuildDef only has the overview page successfully built. 
if you add the schedule info the build def, it shows!!. doah!.. corrected below in bold 
you have to copy the properties too!.  corrected below in bold

I process all the data for schedules and all the other tabs, but that data is not saved in the buildDef..  

I looked thru the Eclipse UI code for creating engines and defs and don't 'see' anything special about the sub pages. 

I do not 'initialize' the builddef, cause I don't know what template it came from, I just copy data from the prod server instance to the dev server instance. 
 
here is my clone builddef function

private static IBuildDefinition cloneBuildDef(ITeamRepository devrepo, IBuildDefinition oldbuildDef, IProcessAreaHandle new_project)
{
ITeamBuildClient  buildClientdev = (ITeamBuildClient) devrepo
.getClientLibrary(ITeamBuildClient.class);
// create a new build definition connected to the new project area
IBuildDefinition newbuildDef = BuildItemFactory.createBuildDefinition((IProcessArea) new_project);
try {
newbuildDef.setId(oldbuildDef.getId()); // worked
newbuildDef.setDescription(oldbuildDef.getDescription()); // worked
newbuildDef.setIgnoreWarnings(oldbuildDef.isIgnoreWarnings());
// process the build pruning info 
IBuildResultPruningPolicy ppp = BuildItemFactory.createBuildResultPruningPolicy();
ppp.setEnabled(oldbuildDef.getBuildResultPruningPolicy().isEnabled());
ppp.setFailedResultsToKeep(oldbuildDef.getBuildResultPruningPolicy().getFailedResultsToKeep());
ppp.setSuccessfulResultsToKeep(oldbuildDef.getBuildResultPruningPolicy().getSuccessfulResultsToKeep());
newbuildDef.setBuildResultPruningPolicy(ppp);
// process the build schedule info
IBuildSchedule pppp = BuildItemFactory.createBuildSchedule();
pppp.setScheduleEnabled(oldbuildDef.getBuildSchedule().isScheduleEnabled());
ArrayList<IBuildScheduleEntry> entrylist = new ArrayList<IBuildScheduleEntry>();
for(IBuildScheduleEntry ppppp: (List<IBuildScheduleEntry>)oldbuildDef.getBuildSchedule().getBuildScheduleEntries())
{
IBuildScheduleEntry newschedentry = BuildItemFactory.createBuildScheduleEntry();
newschedentry.setBuildHour(ppppp.getBuildHour());
newschedentry.setBuildInterval(ppppp.getBuildInterval());
newschedentry.setBuildMinute(ppppp.getBuildMinute());
newschedentry.setBuildOnMonday(ppppp.isBuildOnMonday());
newschedentry.setBuildOnTuesday(ppppp.isBuildOnTuesday());
newschedentry.setBuildOnWednesday(ppppp.isBuildOnWednesday());
newschedentry.setBuildOnThursday(ppppp.isBuildOnThursday());
newschedentry.setBuildOnFriday(ppppp.isBuildOnFriday());
newschedentry.setBuildOnSaturday(ppppp.isBuildOnSaturday());
newschedentry.setBuildOnSunday(ppppp.isBuildOnSunday());
System.out.println("build schedule entry time="+newschedentry.getBuildHour()+":"+newschedentry.getBuildMinute());
entrylist.add(newschedentry);
}
pppp.setBuildScheduleEntries(entrylist);
newbuildDef.setBuildSchedule(pppp);

// process the build configuration data
for(IBuildConfigurationElement buildConfElem:(List<IBuildConfigurationElement>)oldbuildDef.getConfigurationElements())
{

System.out.println("\t\tBuild Config element name="+buildConfElem.getName());
IBuildConfigurationElement newconfElem = BuildItemFactory. createBuildConfigurationElement();
newconfElem.setDescription(buildConfElem.getDescription());
newconfElem.setName(buildConfElem.getName());
newconfElem.setElementId(buildConfElem.getElementId());
newconfElem.setLicenseId(buildConfElem.getLicenseId());
newconfElem.setVariableSubstitutionAllowed(buildConfElem.isVariableSubstitutionAllowed());
for (IConfigurationProperty buildConfigProperty : (List <IConfigurationProperty>) buildConfElem.getConfigurationProperties())
{
String name = buildConfigProperty.getName();
String value = buildConfigProperty.getValue();
IConfigurationProperty new_ibcp = BuildItemFactory.createConfigurationProperty(name, value);
newconfElem.getConfigurationProperties().add(new_ibcp);
System.out.println("\t\t\tname:" + name + "---value:" + value);
System.out.println("there are now "+newconfElem.getConfigurationProperties().size()+" properties");
       }
newbuildDef.getConfigurationElements().add(newconfElem);
}
// copy all the properties
for(IBuildProperty bdp :(List<IBuildProperty>)oldbuildDef.getProperties())
{
newbuildDef.setProperty(bdp.getName(), bdp.getValue());
}
// save the new build definition
newbuildDef=buildClientdev.save(newbuildDef,null);
catch (Exception e) 
{
// TODO Auto-generated catch block
System.out.println("clone definition error = "+e.getMessage());
}
return newbuildDef;
}
Ralph Schoon selected this answer as the correct answer

1 vote

Comments

also, how do you know  what timezone a buildscheduleentry is using? local or GMT?


when I pull the data out, it shows 
build schedule entry time=8:15
build schedule entry time=18:15
but in the build def UI it shows 3:15am(8-5=3) and 1:15pm(18-5=13=1pm)

never mind, doesn't matter if u save the data!


One other answer

Permanent link
 can someone mark this resolved.. accept my answer with the code sample..

thx

0 votes

Your answer

Register or log in to post your answer.

Dashboards and work items are no longer publicly available, so some links may be invalid. We now provide similar information through other means. Learn more here.

Search context
Follow this question

By Email: 

Once you sign in you will be able to subscribe for any updates here.

By RSS:

Answers
Answers and Comments
Question details
× 10,938

Question asked: Jan 08 '14, 3:25 p.m.

Question was seen: 4,336 times

Last updated: Jan 09 '14, 9:11 p.m.

Confirmation Cancel Confirm