// Copyright (C) 2013 GerritForge www.gerritforge.com
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package mobi.jenkinsci.ci.model;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import mobi.jenkinsci.ci.client.ArtifactFingerprint;
import mobi.jenkinsci.model.Alignment;
import mobi.jenkinsci.model.HeaderNode;
import mobi.jenkinsci.model.ItemNode;
import mobi.jenkinsci.model.Layout;
import org.apache.log4j.Logger;
public class JobInstallPackage extends JobBuildDetail {
private static final Logger log = Logger.getLogger(JobInstallPackage.class);
private final JobArtifacts artifacts;
public JobInstallPackage(final Job job, final Build build, final boolean lazyLoad) {
super(job, build);
this.artifacts = new JobArtifacts(job, build);
this.lazyLoad = lazyLoad;
}
public JobInstallPackage(final Job job) {
this(job, job.lastCompletedBuild, false);
}
@Override
public ItemNode toAbstractNode(final String jenkinsUrl) throws IOException {
final ItemNode details = new ItemNode(Layout.LIST);
details.setTitle("Download and Install");
details.setIcon("?image=icons/download.png");
details.setPath(Job.Detail.INSTALL.toString().toLowerCase());
if (isAndroidCompatible()) {
final ItemNode upgradeAction = artifacts.toAbstractNode(jenkinsUrl).getPayload().get(0);
upgradeAction.setDescription("INSTALL");
upgradeAction.setDescriptionColor("#0042A0");
upgradeAction.setDescriptionAlign(Alignment.RIGHT);
upgradeAction.setIcon("?image=icons/android-install.png");
details.addNode(upgradeAction);
}
if(!lazyLoad) {
details.addNodes(getChanges(jenkinsUrl));
}
details.setLeaf(true);
return details;
}
public boolean isAndroidCompatible() {
return artifacts.isAndroidCompatible();
}
private List<ItemNode> getChanges(final String jenkinsUrl)
throws IOException {
final ArrayList<ItemNode> changes = new ArrayList<ItemNode>();
final int jobBuildNumber = build.number;
final HashMap<URL, ItemNode> ticketsMap = new HashMap<URL, ItemNode>();
final List<ItemNode> changesList = new ArrayList<ItemNode>();
int remoteBuildNumber = 0;
try {
final ArtifactFingerprint remoteBuildFingerprint =
client().getArtifactFromMD5(getApkMd5());
remoteBuildNumber = remoteBuildFingerprint.original.number;
} catch (final Exception e) {
log.error("Cannot lookup APK fingerprint from Jenkins: returning ONLY the latest build changes / issues");
remoteBuildNumber = build.number - 1;
}
for (final Build build : job.builds) {
if (build.number > remoteBuildNumber && build.number <= jobBuildNumber) {
for (final ChangeSetItem jobChange : client().getJobChanges(job.path,
build.number).items) {
if (jobChange.issue != null) {
final URL ticketUrl = jobChange.issue.linkUrl;
if (ticketsMap.get(ticketUrl) == null) {
final ItemNode ticket = client().account.getPluginNodeForUrl(
client().config.pluginConfig, ticketUrl);
ticketsMap.put(ticketUrl, ticket);
}
} else {
changesList.add(jobChange.toAbstractNode(jenkinsUrl));
}
}
}
}
if (!ticketsMap.isEmpty()) {
changes.add(new HeaderNode("New features / Fixed bugs"));
changes.addAll(ticketsMap.values());
}
if (!changesList.isEmpty()) {
changes.add(new HeaderNode("Code changes"));
changes.addAll(changesList);
}
return changes;
}
private String getApkMd5() {
// TODO Auto-generated method stub
return null;
}
}