/*
* Software Name : ATK
*
* Copyright (C) 2007 - 2012 France Télé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.
*
* ------------------------------------------------------------------
* File Name : Campaign.java
*
* Created : 16/02/2007
* Author(s) : Nicolas MOTEAU
*/
package com.orange.atk.atkUI.corecli;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.SortedSet;
import javax.swing.JOptionPane;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import com.orange.atk.atkUI.corecli.Step.Verdict;
import com.orange.atk.atkUI.corecli.utils.XMLParser;
import com.orange.atk.atkUI.coregui.CheckListTable;
import com.orange.atk.atkUI.coregui.CoreGUIPlugin;
import com.orange.atk.launcher.LaunchJATK;
import com.orange.atk.phone.DefaultPhone;
import com.orange.atk.phone.PhoneInterface;
import com.orange.atk.phone.detection.AutomaticPhoneDetection;
/**
* A campaign is a kind of Step list.
*
* @author Nicolas MOTEAU
* @since JDK5.0
*/
public class Campaign extends ArrayList<Step> {
private static final long serialVersionUID = 1L;
// Allows to call the read method on specified Campaign object
// (JavaCampaign, FlashCampaign...)
public static ArrayList<Campaign> campaignsList = new ArrayList<Campaign>();
private String name = null;
private String author = null;
private String date = null;
public static boolean isExecute() {
return execute;
}
public static void setExecute(boolean execute) {
Campaign.execute = execute;
}
private static boolean execute = false;
private static boolean firstloop = true;
private static int loop = 1;
public static int getTemploop() {
return temploop;
}
public static void setTemploop(int temploop) {
Campaign.temploop = temploop;
}
private static int temploop = 1;
private static boolean executeloop = false;
private String description = null;
public static LaunchJATK exec;
public static boolean isExecuteloop() {
return executeloop;
}
public static void setExecuteloop(boolean executeloop) {
Campaign.executeloop = executeloop;
}
public static LaunchJATK getLaunchExec() {
return Campaign.exec;
}
public static void setLaunchExec(LaunchJATK exec) {
Campaign.exec = exec;
}
public void setName(String s) {
if (!isEmpty(s))
name = s.trim();
}
public void setAuthor(String s) {
if (!isEmpty(s))
author = s.trim();
}
public void setDate(String s) {
if (!isEmpty(s))
date = s.trim();
}
public void setDescription(String s) {
if (!isEmpty(s))
description = s.trim();
}
private boolean isEmpty(String s) {
return (s == null) || (s.trim().length() == 0);
}
public static int getLoop() {
return loop;
}
public static void setLoop(int loop) {
Campaign.loop = loop;
}
/**
* Runs the analysis method on each step of this campaign (in sequence)
*
* @return the analysis's verdict for this campaign.
* @throws LicenceException
* if a problem is detected with the licence.
*/
public Verdict analyse() {
return analyse(null, null);
}
/**
* Runs the analysis method on each step of this campaign (in sequence)
*
* @param profileName
* @param destDir
* directory to place generated analysis reports. May be null (in
* this case, the temporary directory will be used)
* @param mon
* a monitor that allow to be informed of the analysis's progress
* and to interrupt it.
* @return the analysis's verdict for this campaign.
* @throws LicenceException
* if a problem is detected with the licence.
*/
// public Verdict analyse(StatusBar statusBar,String profileName, File
// destDir, IAnalysisMonitor mon) throws LicenceException {
public Verdict analyse(File destDir, IAnalysisMonitor mon) {
Verdict campVerdict = Verdict.NONE;
boolean stop = false;
boolean initFailed = false;
setExecute(true);
Iterator<Step> it = this.iterator();
if (AutomaticPhoneDetection.getInstance().getDevice() instanceof DefaultPhone) {
JOptionPane.showMessageDialog(CoreGUIPlugin.mainFrame, "Can't Detect device");
initFailed = true;
} else
if (AutomaticPhoneDetection.getInstance().getDevice().getCnxStatus() != PhoneInterface.CNX_STATUS_AVAILABLE) {
JOptionPane.showMessageDialog(CoreGUIPlugin.mainFrame, "Can't Detect device");
initFailed = true;
}
while (it.hasNext() && !stop) {
Step step = it.next();
Verdict step_verdict;
if ((null == step.getXmlfilepath())
|| (step.getXmlfilepath().contains(CheckListTable.NOT_SELECTED))) {
JOptionPane.showMessageDialog(CoreGUIPlugin.mainFrame,
"You must select the phone monitoring configuration for the test.");
initFailed = true;
}
if (destDir != null) {
// step.setOutFilePath(destDir+File.separator+name);
step.setOutFilePath(destDir.getAbsolutePath());
}
// Verdict step_verdict = step.analyse(statusBar,profileName, mon);
if (!initFailed) {
step_verdict = step.analyse(mon);
} else {
step_verdict = Verdict.INITFAILED;
step.setVerdict(step_verdict);
}
// yvain
campVerdict = step_verdict;
switch (campVerdict) {
case NONE :
campVerdict = step_verdict;
break;
case SKIPPED :
if (step_verdict == Verdict.FAILED) {
campVerdict = step_verdict;
}
break;
case INITFAILED :
case FAILED :
CoreGUIPlugin.mainFrame.statusBar.setStop();
break;
case PASSED :
if ((step_verdict != Verdict.PASSED) && (step_verdict != Verdict.NONE)) {
campVerdict = step_verdict;
}
break;
default :
break;
}
if (mon != null) {
stop = mon.isStop();
mon.notifyStepAnalysed(step);
}
}
setExecute(false);
if (mon != null) {
mon.notifyAllAnalysisDone();
}
CoreGUIPlugin.mainFrame.statusBar.stopJob();
return campVerdict;
}
/**
* Read a campaign file, and return a simplified representation of what is
* to be done (abstraction of a campaign).
*
* @param campaignFile
* The campaign file to read.
* @return A campaign structure
*/
public static Campaign readCampaign(File campaignFile) throws Alert {
XMLParser campaignParser = new XMLParser(campaignFile, null, null);
Campaign camp = new Campaign();
camp.readCampaign(campaignParser);
return camp;
}
/**
* Populates this campaign using the given XMLParser
*
* @param parser
* the XML parser to use
* @return this campaign
*/
public Campaign readCampaign(XMLParser parser) {
Element root = parser.getRoot();
// parser.getElements(e, name)
setName(root.attributeValue("name"));
setAuthor(root.attributeValue("author"));
setDate(root.attributeValue("date"));
setDescription(root.attributeValue("description"));
// Read the different type of campaign
for (Campaign defCamp : campaignsList) {
addAll(defCamp.readCampaign(parser));
}
return this;
}
/**
* Initializes the "outputFile" field of the "CmdLine" object with testing
* its validity.
*
* @param step
* the command line to update
* @param stepName
* the name of the step
* @param stepNumber
* the number of the step
* @throws Alert
*/
protected static void initOutputFile(Step step, String stepName, int stepNumber) throws Alert {
try {
new URI(stepName);
step.setOutFilePath(stepName + ".html");
} catch (URISyntaxException e) {
Alert.raise(e, "Campaign step number " + stepNumber + ", invalid step name: "
+ stepName + ". Can't create an output file based on that name.");
}
}
/**
* Save current campaign in .mcl file
*
* @param clFileName
* @throws IOException
*/
public static void save(String clFileName, Campaign camp) {
Document document = DocumentHelper.createDocument();
Element root = document.addElement("campaign");
if (camp.getName() != null)
root.addAttribute("name", camp.getName());
if (camp.getAuthor() != null)
root.addAttribute("author", camp.getAuthor());
if (camp.getDate() != null)
root.addAttribute("date", camp.getDate());
if (camp.getDescription() != null)
root.addAttribute("description", camp.getDescription());
int stepNumber = 0;
for (Step step : camp) {
step.save(root, stepNumber);
stepNumber++;
}
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = null;
try {
writer = new XMLWriter(new FileWriter(clFileName), format);
writer.write(document);
writer.close();
} catch (IOException e) {
Alert.raise(e, "Unable to save check-list in a file.");
}
}
public void movesample(SortedSet<Integer> srcrow, int dest) {
Campaign temptoadd = new Campaign();
// Logger.getLogger(this.getClass() ).debug("src"+srcrow.first());
// Logger.getLogger(this.getClass() ).debug("dest"+dest);
Iterator<Integer> it = srcrow.iterator();
int index = 0;
while (it.hasNext()) {
int numToRemove = it.next();
temptoadd.add(this.get(numToRemove + index));
this.remove(numToRemove + index);
index--;
}
// copy to selected location
if (dest < srcrow.first()) {
this.addAll(dest, temptoadd);
} else {
this.addAll(dest - srcrow.size() + 1, temptoadd);
}
}
public String getAuthor() {
return author;
}
public String getDate() {
return date;
}
public String getDescription() {
return description;
}
public String getName() {
return name;
}
public static void setFirstloop(boolean firstloop) {
Campaign.firstloop = firstloop;
}
public static boolean isFirstloop() {
return firstloop;
}
}