/*
* ###
* Xcodebuild Command-Line Wrapper
*
* 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) 2012 Photon infotech.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Photon Public License v1.0
* which accompanies this distribution, and is available at
* http://www.photon.in/legal/ppl-v10.html
*
* 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.
*
* Contributors:
* Photon infotech - initial API and implementation
******************************************************************************/
package com.photon.phresco.plugins.xcode;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import com.photon.phresco.plugins.xcode.utils.SdkVerifier;
import com.photon.phresco.plugins.xcode.utils.XcodeUtil;
/**
* APP deploy
* @goal deploy
* @phase deploy
*/
public class AppDeploy extends AbstractMojo {
/**
* command line tool for iphone simulator
* @parameter expression="${simulator.home}" default-value="/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator"
*/
private String simHome;
/**
*
* @parameter experssion="${simulator.deploy.dir}" default-value=""
*/
private String appDeployHome;
/**
* @parameter expression ="${action}" default-value="-SimulateApplication"
*
* The possible actions are SimulateDevice, SimulateRestart, SessionOnLaunch, currentSDKRoot
*/
private String action;
/**
* @parameter expression="${simulator.version}" default-value="5.0"
*/
private String simVersion;
/**
* @parameter expression="${application.path}"
*/
private String appPath;
/**
* @parameter expression="${device.deploy}"
*/
private boolean deviceDeploy;
/**
* @parameter expression="${application.name}"
*/
private String appName;
/**
* The maven project.
*
* @parameter expression="${project}"
* @required
* @readonly
*/
protected MavenProject project;
private File simHomeAppLocation;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
try {
if(!deviceDeploy && !SdkVerifier.isAvailable(simVersion)) {
throw new MojoExecutionException("Selected version " +simVersion +" is not available!");
}
} catch (IOException e2) {
throw new MojoExecutionException("SDK verification failed!");
} catch (InterruptedException e2) {
throw new MojoExecutionException("SDK verification interrupted!");
}
//get the correct simhome if xCode 4.3 is installed simhome is in /Application/Xcode.app/Contents
//Fix for artf462004
File simHomeFile = new File(simHome);
if(!simHomeFile.exists()) {
simHome = "/Applications/Xcode.app/Contents" + simHome;
}
getLog().info("Simulator home" + simHome);
if(!deviceDeploy) {
//copy the files into simulation directory
String home = System.getProperty("user.home");
getLog().info("Application.path = " + appPath);
appName = getAppFileName(appPath);
getLog().info("Application name = "+ appName);
String deployHome = "";
if(StringUtils.isNotBlank(appDeployHome)){
deployHome = appDeployHome;
} else {
deployHome = home + "/Library/Application Support/iPhone Simulator/" + simVersion +"/Applications";
}
simHomeAppLocation = new File(deployHome+File.separator+ project.getName()+File.separator+appName);
if(!simHomeAppLocation.exists()){
getLog().info("directory created");
simHomeAppLocation.mkdirs();
}
getLog().info("Desired location "+simHomeAppLocation.getAbsolutePath());
try {
String alignedPath = alignedPath(appPath);
getLog().info("path to copy source :" + alignedPath);
XcodeUtil.copyFolder(new File(alignedPath), simHomeAppLocation);
getLog().info("copy the application " + appPath +" to "+ simHomeAppLocation);
} catch (IOException e1) {
getLog().error("couldn't copy the application " + appPath +" to "+ simHomeAppLocation);
}
}
Runnable runnable = new Runnable() {
public void run() {
ProcessBuilder pb;
if(deviceDeploy){
pb = new ProcessBuilder("transporter_chief.rb");
pb.command().add(appPath);
} else {
pb = new ProcessBuilder(simHome);
// Include errors in output
pb.redirectErrorStream(true);
pb.command().add(action);
pb.command().add(simHomeAppLocation+File.separator+appName.substring(0, appName.indexOf('.')));
}
// pb.command().add(appName);
getLog().info("List of commands"+pb.command());
Process child;
try {
// if(ProcessHelper.isProcessRunning()) {
// ProcessHelper.killSimulatorProcess();
// }
child = pb.start();
// Consume subprocess output and write to stdout for debugging
InputStream is = new BufferedInputStream(child.getInputStream());
int singleByte = 0;
while ((singleByte = is.read()) != -1) {
System.out.write(singleByte);
}
} catch (IOException e) {
getLog().error("error occured in launching simulator ");
getLog().error(e);
}
}
};
Thread t = new Thread(runnable, "iPhoneSimulator");
t.start();
try {
t.join(5000);
} catch (InterruptedException e1) {
//Intentionally left blank.
}
}
private String getAppFileName(String appPath2) {
if(StringUtils.isNotBlank(appPath2)){
if(appPath2.endsWith("app")) {
return appPath2.substring(appPath2.lastIndexOf('/')+1);
} else {
File folder = new File(appPath2);
if(folder.exists()) {
File[] files = folder.listFiles();
for (int i = 0; i < files.length; i++) {
File file = files[i];
if(file.getName().endsWith("app")) {
return file.getName();
}
}
}
}
}
return appPath2;
}
private String alignedPath(String appPath2) {
if(StringUtils.isNotBlank(appPath2)){
if(appPath2.endsWith("app")) {
return appPath2;
} else {
return appPath2+File.separator+getAppFileName(appPath2);
}
}
return appPath2;
}
}