/*
* ###
* Android Maven Plugin - android-maven-plugin
*
* Copyright (C) 1999 - 2012 Photon Infotech Inc.
*
* 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.
* ###
*/
/*
* Copyright (C) 2009 Jayway AB
*
* 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 com.photon.maven.plugins.android.standalonemojos;
import static com.photon.maven.plugins.android.common.AndroidExtension.APK;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import com.photon.phresco.plugin.commons.PluginUtils;
import org.apache.commons.io.FileUtils;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.codehaus.plexus.archiver.zip.ZipArchiver;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.photon.maven.plugins.android.AbstractAndroidMojo;
import com.photon.phresco.commons.BuildInfo;
/**
* Creates the apk file. By default signs it with debug keystore.<br/>
* Change that by setting configuration parameter
* <code><sign><debug>false</debug></sign></code>.
*
* @goal updatebuildinfo
* @phase package
* @requiresDependencyResolution apk
*/
public class UpdateBuildInfoMojo extends AbstractAndroidMojo {
/*
* <p>
* Additional source directories that contain resources to be packaged into
* the apk.
* </p>
* <p>
* These are not source directories, that contain java classes to be
* compiled. It corresponds to the -df option of the apkbuilder program. It
* allows you to specify directories, that contain additional resources to
* be packaged into the apk.
* </p>
* So an example inside the plugin configuration could be:
*
* <pre>
* <configuration>
* ...
* <sourceDirectories>
* <sourceDirectory>${project.basedir}/additionals</sourceDirectory>
* </sourceDirectories>
* ...
* </configuration>
* </pre>
*
* @parameter expression="${android.sourceDirectories}" default-value=""
*/
// private File[] sourceDirectories;
/**
* Build location
*
* @parameter expression="/do_not_checkin/build"
*/
private String buildDirectory;
private File buildDir;
private File buildInfoFile;
private List<BuildInfo> buildInfoList;
private int nextBuildNo;
private Date currentDate;
private String apkFileName;
private String deliverable;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
try {
buildInfoList = new ArrayList<BuildInfo>(); // initialization
// srcDir = new File(baseDir.getPath() + File.separator + sourceDirectory);
buildDir = new File(baseDir.getPath() + buildDirectory);
if (!buildDir.exists()) {
buildDir.mkdir();
getLog().info("Build directory created..." + buildDir.getPath());
}
buildInfoFile = new File(buildDir.getPath() + "/build.info");
nextBuildNo = generateNextBuildNo();
currentDate = Calendar.getInstance().getTime();
} catch (IOException e) {
throw new MojoFailureException("APK could not initialize " + e.getLocalizedMessage());
}
// Initialize apk build configuration
File outputFile = new File(project.getBuild().getDirectory(), project.getBuild().getFinalName() + '.' + APK);
if (outputFile.exists()) {
try {
getLog().info("APK created.. Copying to Build directory.....");
String buildName = project.getBuild().getFinalName() + '_' + getTimeStampForBuildName(currentDate);
File destFile = new File(buildDir, buildName + '.' + APK);
FileUtils.copyFile(outputFile, destFile);
getLog().info("copied to..." + destFile.getName());
apkFileName = destFile.getName();
getLog().info("Creating deliverables.....");
ZipArchiver zipArchiver = new ZipArchiver();
File inputFile = new File(apkFileName);
zipArchiver.addFile(destFile, destFile.getName());
File deliverableZip = new File(buildDir, buildName + ".zip");
zipArchiver.setDestFile(deliverableZip);
zipArchiver.createArchive();
deliverable = deliverableZip.getName();
getLog().info("Deliverables available at " + deliverableZip.getName());
writeBuildInfo(true);
} catch (IOException e) {
throw new MojoExecutionException("Error in writing output...");
}
}
}
private void writeBuildInfo(boolean isBuildSuccess) throws MojoExecutionException {
try {
PluginUtils pu = new PluginUtils();
BuildInfo buildInfo = new BuildInfo();
List<String> envList = pu.csvToList(environmentName);
buildInfo.setBuildNo(nextBuildNo);
buildInfo.setTimeStamp(getTimeStampForDisplay(currentDate));
if (isBuildSuccess) {
buildInfo.setBuildStatus("SUCCESS");
} else {
buildInfo.setBuildStatus("FAILURE");
}
buildInfo.setBuildName(apkFileName);
buildInfo.setDeliverables(deliverable);
buildInfo.setEnvironments(envList);
buildInfoList.add(buildInfo);
Gson gson = new Gson();
FileWriter writer = new FileWriter(buildInfoFile);
gson.toJson(buildInfoList, writer);
writer.close();
} catch (IOException e) {
throw new MojoExecutionException(e.getMessage(), e);
}
}
private String getTimeStampForDisplay(Date currentDate) {
SimpleDateFormat formatter = new SimpleDateFormat("dd/MMM/yyyy HH:mm:ss");
String timeStamp = formatter.format(currentDate.getTime());
return timeStamp;
}
private String getTimeStampForBuildName(Date currentDate) {
SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yyyy-HH-mm-ss");
String timeStamp = formatter.format(currentDate.getTime());
return timeStamp;
}
private int generateNextBuildNo() throws IOException {
int nextBuildNo = 1;
if (!buildInfoFile.exists()) {
return nextBuildNo;
}
BufferedReader read = new BufferedReader(new FileReader(buildInfoFile));
String content = read.readLine();
Gson gson = new Gson();
java.lang.reflect.Type listType = new TypeToken<List<BuildInfo>>() {
}.getType();
buildInfoList = (List<BuildInfo>) gson.fromJson(content, listType);
if (buildInfoList == null || buildInfoList.size() == 0) {
return nextBuildNo;
}
int buildArray[] = new int[buildInfoList.size()];
int count = 0;
for (BuildInfo buildInfo : buildInfoList) {
buildArray[count] = buildInfo.getBuildNo();
count++;
}
Arrays.sort(buildArray); // sort to the array to find the max build no
nextBuildNo = buildArray[buildArray.length - 1] + 1; // increment 1 to the max in the build list
return nextBuildNo;
}
}