164c71966SSteve Yin /**************************************************************
264c71966SSteve Yin  *
364c71966SSteve Yin  * Licensed to the Apache Software Foundation (ASF) under one
464c71966SSteve Yin  * or more contributor license agreements.  See the NOTICE file
564c71966SSteve Yin  * distributed with this work for additional information
664c71966SSteve Yin  * regarding copyright ownership.  The ASF licenses this file
764c71966SSteve Yin  * to you under the Apache License, Version 2.0 (the
864c71966SSteve Yin  * "License"); you may not use this file except in compliance
964c71966SSteve Yin  * with the License.  You may obtain a copy of the License at
1064c71966SSteve Yin  *
1164c71966SSteve Yin  *   http://www.apache.org/licenses/LICENSE-2.0
1264c71966SSteve Yin  *
1364c71966SSteve Yin  * Unless required by applicable law or agreed to in writing,
1464c71966SSteve Yin  * software distributed under the License is distributed on an
1564c71966SSteve Yin  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1664c71966SSteve Yin  * KIND, either express or implied.  See the License for the
1764c71966SSteve Yin  * specific language governing permissions and limitations
1864c71966SSteve Yin  * under the License.
1964c71966SSteve Yin  *
2064c71966SSteve Yin  *************************************************************/
2164c71966SSteve Yin 
2264c71966SSteve Yin /**
2364c71966SSteve Yin  *
2464c71966SSteve Yin  */
2564c71966SSteve Yin package bvt.gui;
2664c71966SSteve Yin 
2764c71966SSteve Yin import static org.openoffice.test.common.Testspace.*;
2864c71966SSteve Yin import static testlib.gui.AppTool.*;
2964c71966SSteve Yin import static testlib.gui.UIMap.*;
3064c71966SSteve Yin 
3164c71966SSteve Yin import java.io.*;
3264c71966SSteve Yin import java.util.ArrayList;
3364c71966SSteve Yin import java.util.Arrays;
3464c71966SSteve Yin import java.util.List;
3564c71966SSteve Yin import java.util.ListIterator;
3664c71966SSteve Yin import java.util.concurrent.TimeoutException;
3764c71966SSteve Yin import java.io.File;
3864c71966SSteve Yin import java.io.FileNotFoundException;
3964c71966SSteve Yin import java.io.IOException;
4064c71966SSteve Yin import java.io.Reader;
4164c71966SSteve Yin import java.io.InputStreamReader;
4264c71966SSteve Yin import java.lang.RuntimeException;
4364c71966SSteve Yin 
4464c71966SSteve Yin import org.junit.After;
4564c71966SSteve Yin import org.junit.AfterClass;
4664c71966SSteve Yin import org.junit.Before;
4764c71966SSteve Yin import org.junit.BeforeClass;
4864c71966SSteve Yin import org.junit.Rule;
4964c71966SSteve Yin import org.junit.Test;
5064c71966SSteve Yin import org.openoffice.test.common.Condition;
5164c71966SSteve Yin import org.openoffice.test.common.DataSheet;
5264c71966SSteve Yin import org.openoffice.test.common.FileUtil;
5364c71966SSteve Yin import org.openoffice.test.common.Logger;
5464c71966SSteve Yin import org.openoffice.test.common.Testspace;
5564c71966SSteve Yin import org.openoffice.test.vcl.widgets.VclDialog;
5664c71966SSteve Yin 
5764c71966SSteve Yin 
58*9c5183b9Sdamjan public class FileExport {
59*9c5183b9Sdamjan 	private static class TestType {
60*9c5183b9Sdamjan 
TestType(boolean doc, boolean spread, boolean slide)61*9c5183b9Sdamjan 		public TestType(boolean doc, boolean spread, boolean slide) {
62*9c5183b9Sdamjan 			documentT = doc;
63*9c5183b9Sdamjan 			spreadsheetT = spread;
64*9c5183b9Sdamjan 			slideT = slide;
65*9c5183b9Sdamjan 		}
6664c71966SSteve Yin 
67*9c5183b9Sdamjan 		public boolean documentT;
68*9c5183b9Sdamjan 		public boolean spreadsheetT;
69*9c5183b9Sdamjan 		public boolean slideT;
70*9c5183b9Sdamjan 	};
7164c71966SSteve Yin 
72*9c5183b9Sdamjan 	private static class ContinuePoint {
73*9c5183b9Sdamjan 		public String path;
74*9c5183b9Sdamjan 		public int i;
7564c71966SSteve Yin 
ContinuePoint()76*9c5183b9Sdamjan 		ContinuePoint() {
77*9c5183b9Sdamjan 			path = "";
78*9c5183b9Sdamjan 			i = 0;
79*9c5183b9Sdamjan 		}
8064c71966SSteve Yin 	}
8164c71966SSteve Yin 
8264c71966SSteve Yin 	// for example
8364c71966SSteve Yin 	// the path is "D:\\aoo\\utaoo\\testspace\\ooxmlsamples"
8464c71966SSteve Yin 	String samplespath = "";// a dir
8564c71966SSteve Yin 	String outpath = ""; // a dir
8664c71966SSteve Yin 	static double timeout = 100;
8764c71966SSteve Yin 	static double interval = 0.1;
8864c71966SSteve Yin 	double sleeptime = 1;
8964c71966SSteve Yin 	boolean bContinue = false;// if failed,next execute from the continue point
9064c71966SSteve Yin 	TestType atest = new TestType(true, true, true);// doc,spreadsheet,slide
9164c71966SSteve Yin 	ContinuePoint thepoint = null;
9264c71966SSteve Yin 	BufferedWriter fwContinue = null;
9364c71966SSteve Yin 	String testedlogfile = "";
9464c71966SSteve Yin 
9564c71966SSteve Yin 	private static DataSheet result;
9664c71966SSteve Yin 	private String scenario = null;
9764c71966SSteve Yin 	private File sourceFile = null;
9864c71966SSteve Yin 
9964c71966SSteve Yin 	public static final VclDialog passwdDlg = dialog("");
10064c71966SSteve Yin 
recursionfiles(File path, List<String> resultFileName)10164c71966SSteve Yin 	public List<String> recursionfiles(File path, List<String> resultFileName) {
10264c71966SSteve Yin 		File[] files = path.listFiles();
10364c71966SSteve Yin 		if (files == null)
10464c71966SSteve Yin 			return resultFileName;
10564c71966SSteve Yin 		for (File f : files) {
10664c71966SSteve Yin 			if (f.isDirectory()) {// a path
10764c71966SSteve Yin 				if (!f.isHidden() && !f.getName().startsWith(".")) {
10864c71966SSteve Yin 					sampledirs.add(f.getPath());
10964c71966SSteve Yin 					recursionfiles(f, resultFileName);
11064c71966SSteve Yin 				}
11164c71966SSteve Yin 			} else {// a file
11264c71966SSteve Yin 				if (!f.isHidden() && !f.getName().startsWith(".")) {
11364c71966SSteve Yin 					String apath = f.getPath();
11464c71966SSteve Yin 
11512694156Sdamjan 					int sepIndex = apath.indexOf(File.separatorChar);
11664c71966SSteve Yin 					String userpath = apath.substring(sepIndex);
11764c71966SSteve Yin 					String newpath = outpath + userpath;
11864c71966SSteve Yin 
11964c71966SSteve Yin 					File file = new File(newpath);
12064c71966SSteve Yin 					File parent = file.getParentFile();
12164c71966SSteve Yin 					if (parent != null && !parent.exists()) {
12264c71966SSteve Yin 						parent.mkdirs();
12364c71966SSteve Yin 					}
12464c71966SSteve Yin 					resultFileName.add(f.getPath());
12564c71966SSteve Yin 				}
12664c71966SSteve Yin 			}
12764c71966SSteve Yin 		}
12864c71966SSteve Yin 		return resultFileName;
12964c71966SSteve Yin 	}
13064c71966SSteve Yin 
getrealoutpath(String p)13164c71966SSteve Yin 	private String getrealoutpath(String p) {
13264c71966SSteve Yin 		String apath = p;
13364c71966SSteve Yin 
13412694156Sdamjan 		int sepIndex = apath.indexOf(File.separatorChar);
13512694156Sdamjan 		int sepIndexLast = apath.lastIndexOf(File.separatorChar);
13664c71966SSteve Yin 		String userpath = apath.substring(sepIndex, sepIndexLast);
13764c71966SSteve Yin 		String newpath = outpath + userpath;
13864c71966SSteve Yin 		File tempFolderFile = new File(newpath);
13964c71966SSteve Yin 		if (!tempFolderFile.exists()) {
14064c71966SSteve Yin 			tempFolderFile.mkdirs();
14164c71966SSteve Yin 		}
14264c71966SSteve Yin 		return newpath;
14364c71966SSteve Yin 	}
14464c71966SSteve Yin 
14564c71966SSteve Yin 	private List<String> samplelist = null;
14664c71966SSteve Yin 	private List<String> sampledirs = null;
14764c71966SSteve Yin 
14864c71966SSteve Yin 	@Rule
14964c71966SSteve Yin 	public Logger log = Logger.getLogger(this);
15064c71966SSteve Yin 
15164c71966SSteve Yin 	@BeforeClass
beforeClass()15264c71966SSteve Yin 	public static void beforeClass() {
15364c71966SSteve Yin 		app.clean();
15464c71966SSteve Yin 	}
15564c71966SSteve Yin 
15664c71966SSteve Yin 	@AfterClass
afterClass()15764c71966SSteve Yin 	public static void afterClass() {
15864c71966SSteve Yin 		app.stop();
15964c71966SSteve Yin 	}
16064c71966SSteve Yin 
16164c71966SSteve Yin 	@Before
before()16264c71966SSteve Yin 	public void before() {
16364c71966SSteve Yin 
16464c71966SSteve Yin 	}
16564c71966SSteve Yin 
16664c71966SSteve Yin 	@After
after()16764c71966SSteve Yin 	public void after() throws Exception {
16864c71966SSteve Yin 		app.stop();
16964c71966SSteve Yin 	}
17064c71966SSteve Yin 
getcontinuepoint()17164c71966SSteve Yin 	void getcontinuepoint() {
17264c71966SSteve Yin 
17364c71966SSteve Yin 		if (bContinue == false) {
17464c71966SSteve Yin 			thepoint.path = "";
17564c71966SSteve Yin 			thepoint.i = 0;
17664c71966SSteve Yin 			return;
17764c71966SSteve Yin 		}
17864c71966SSteve Yin 		File ftestedlog = new File(testedlogfile);
17964c71966SSteve Yin 		Reader reader = null;
18064c71966SSteve Yin 		try {
18164c71966SSteve Yin 			reader = new InputStreamReader(new FileInputStream(ftestedlog));
18264c71966SSteve Yin 		} catch (FileNotFoundException e1) {
18364c71966SSteve Yin 			// TODO Auto-generated catch block
18464c71966SSteve Yin 			e1.printStackTrace();
18564c71966SSteve Yin 		}
18664c71966SSteve Yin 
18764c71966SSteve Yin 		BufferedReader br = new BufferedReader(reader);
18864c71966SSteve Yin 
18964c71966SSteve Yin 		String line = null;
19064c71966SSteve Yin 		int countline = 0;
19164c71966SSteve Yin 		int m = 0;
19264c71966SSteve Yin 		try {
19364c71966SSteve Yin 			if ((line = br.readLine()) != null) {
19464c71966SSteve Yin 				if (countline == 0) {
19564c71966SSteve Yin 					thepoint.path = line;
19664c71966SSteve Yin 				} else {
19764c71966SSteve Yin 
19864c71966SSteve Yin 					m = Integer.parseInt(line);
19964c71966SSteve Yin 					if (m > 0)
20064c71966SSteve Yin 						thepoint.i = m;
20164c71966SSteve Yin 				}
20264c71966SSteve Yin 			}
20364c71966SSteve Yin 		} catch (NumberFormatException e1) {
20464c71966SSteve Yin 			// TODO Auto-generated catch block
20564c71966SSteve Yin 			e1.printStackTrace();
20664c71966SSteve Yin 		} catch (IOException e1) {
20764c71966SSteve Yin 			// TODO Auto-generated catch block
20864c71966SSteve Yin 			e1.printStackTrace();
20964c71966SSteve Yin 		}
21064c71966SSteve Yin 	}
21164c71966SSteve Yin 
21264c71966SSteve Yin 	/**
21364c71966SSteve Yin 	 * Test Open/SaveAs ooxml file by Aoo
21464c71966SSteve Yin 	 *
21564c71966SSteve Yin 	 * @throws Exception
21664c71966SSteve Yin 	 */
21764c71966SSteve Yin 	@Test
testSaveAs()21864c71966SSteve Yin 	public void testSaveAs() throws Exception {
21964c71966SSteve Yin 		samplelist = new ArrayList<String>();
22064c71966SSteve Yin 		sampledirs = new ArrayList<String>();
22164c71966SSteve Yin 		thepoint = new ContinuePoint();
22212694156Sdamjan 		File spacepath = new File(Testspace.getPath());
22312694156Sdamjan 		File absspath = spacepath.getAbsoluteFile();
22412694156Sdamjan 		String abspre = absspath.getParent();
22564c71966SSteve Yin 
22612694156Sdamjan 		result = new DataSheet(getFile("outputlog" + File.separatorChar
22764c71966SSteve Yin 				+ FileExport.class.getName() + ".xml"));
22864c71966SSteve Yin 		result.addRow("data", "File Path", "File Size", "Scenario",
22964c71966SSteve Yin 				"Exported File Path", "Exported File Size", "Result", "Error");
23064c71966SSteve Yin 
23112694156Sdamjan 		testedlogfile = abspre + "testgui" + File.separatorChar + "cases_tested.txt";
23264c71966SSteve Yin 		samplespath = "samples";
23364c71966SSteve Yin 
23464c71966SSteve Yin 		if (outpath.length() == 0) {
23564c71966SSteve Yin 			File workspacepath = Testspace.getFile("output");// ..\\testspace\\output
23664c71966SSteve Yin 			outpath = workspacepath.getAbsolutePath();
23764c71966SSteve Yin 
23864c71966SSteve Yin 			// outpath = "D:\\AOOautomation\\Docs sample files\\out";
23964c71966SSteve Yin 		}
24064c71966SSteve Yin 
24164c71966SSteve Yin 		if (bContinue)
24264c71966SSteve Yin 			getcontinuepoint();
24364c71966SSteve Yin 
24464c71966SSteve Yin 		File samplesDir = Testspace.getFile(samplespath);
24564c71966SSteve Yin 		recursionfiles(samplesDir, samplelist);
24664c71966SSteve Yin 		ListIterator<String> it = sampledirs.listIterator();
24764c71966SSteve Yin 
24864c71966SSteve Yin 		boolean bstartfromthis = false;
24964c71966SSteve Yin 		while (it.hasNext()) {
25064c71966SSteve Yin 
25164c71966SSteve Yin 			String str = (String) it.next();
25264c71966SSteve Yin 			if (!bContinue) {
25364c71966SSteve Yin 				File afiledir = new File(str);
25464c71966SSteve Yin 				dotest(afiledir);
25564c71966SSteve Yin 			} else {
25664c71966SSteve Yin 				File file = new File(thepoint.path);
25764c71966SSteve Yin 				File parent = file.getParentFile();
25864c71966SSteve Yin 				if (parent != null) {
25964c71966SSteve Yin 					String pathbegin = parent.getAbsolutePath();
26064c71966SSteve Yin 					if (pathbegin.equalsIgnoreCase(str)) {
26164c71966SSteve Yin 						bstartfromthis = true;
26264c71966SSteve Yin 
26364c71966SSteve Yin 					}
26464c71966SSteve Yin 				}
26564c71966SSteve Yin 				if (bstartfromthis == true) {
26664c71966SSteve Yin 					File afiledir = new File(str);
26764c71966SSteve Yin 					dotest(afiledir);
26864c71966SSteve Yin 				}
26964c71966SSteve Yin 			}
27064c71966SSteve Yin 		}
27164c71966SSteve Yin 	}
27264c71966SSteve Yin 
dotest(File samplesDir)27364c71966SSteve Yin 	public void dotest(File samplesDir) throws Exception {
27464c71966SSteve Yin 		FilenameFilter testFilter = new FilenameFilter() {
27564c71966SSteve Yin 			public boolean accept(File file, String name) {
27664c71966SSteve Yin 				if (name.endsWith(".doc") || name.endsWith(".docx")
27764c71966SSteve Yin 						|| name.endsWith(".dot") || name.endsWith(".xls")
27864c71966SSteve Yin 						|| name.endsWith(".xlsx") || name.endsWith(".ods")
27964c71966SSteve Yin 						|| name.endsWith(".ppt") || name.endsWith(".pptx")
28064c71966SSteve Yin 						|| name.endsWith(".odp")) {
28164c71966SSteve Yin 					// filters files
28264c71966SSteve Yin 					return true;
28364c71966SSteve Yin 				} else {
28464c71966SSteve Yin 					return false;
28564c71966SSteve Yin 				}
28664c71966SSteve Yin 			}
28764c71966SSteve Yin 		};
28864c71966SSteve Yin 		File[] files = samplesDir.listFiles(testFilter);
28964c71966SSteve Yin 		Arrays.sort(files);
29064c71966SSteve Yin 		int nfiles = files.length;
29164c71966SSteve Yin 		if (nfiles == 0)
29264c71966SSteve Yin 			return;
29364c71966SSteve Yin 
29464c71966SSteve Yin 		int i = thepoint.i;
29564c71966SSteve Yin 		for (; i < nfiles; i++) {
29664c71966SSteve Yin 			File afile = files[i];
29764c71966SSteve Yin 			String path = afile.getAbsolutePath();
29864c71966SSteve Yin 
29964c71966SSteve Yin 			String extName = FileUtil.getFileExtName(path).toLowerCase();
30064c71966SSteve Yin 			boolean bShouldTest = false;
30164c71966SSteve Yin 			if (extName.equals("doc") || extName.equals("docx")
30264c71966SSteve Yin 					|| extName.equals("odt")) {
30364c71966SSteve Yin 				bShouldTest = true;
30464c71966SSteve Yin 				if (atest.documentT == false)
30564c71966SSteve Yin 					continue;
30664c71966SSteve Yin 			}
30764c71966SSteve Yin 			if (extName.equals("ppt") || extName.equals("pptx")
30864c71966SSteve Yin 					|| extName.equals("odp")) {
30964c71966SSteve Yin 				bShouldTest = true;
31064c71966SSteve Yin 				if (atest.slideT == false)
31164c71966SSteve Yin 					continue;
31264c71966SSteve Yin 			}
31364c71966SSteve Yin 			if (extName.equals("xls") || extName.equals("xlsx")
31464c71966SSteve Yin 					|| extName.equals("ods")) {
31564c71966SSteve Yin 				bShouldTest = true;
31664c71966SSteve Yin 				if (atest.spreadsheetT == false)
31764c71966SSteve Yin 					continue;
31864c71966SSteve Yin 			}
31964c71966SSteve Yin 			if (!bShouldTest)
32064c71966SSteve Yin 				continue;
32164c71966SSteve Yin 			String exportname = "aoo_" + afile.getName();
32264c71966SSteve Yin 
32364c71966SSteve Yin 			sourceFile = new File(path);
32464c71966SSteve Yin 
32564c71966SSteve Yin 			app.stop();
32664c71966SSteve Yin 			app.start();
32764c71966SSteve Yin 
32864c71966SSteve Yin 			if(!Open(path)){
32964c71966SSteve Yin 				continue;
33064c71966SSteve Yin 			}
33164c71966SSteve Yin 
33264c71966SSteve Yin 			String newpath = getrealoutpath(path);
33364c71966SSteve Yin 
33464c71966SSteve Yin 			// do testing
33564c71966SSteve Yin 			if (!savetosameformat(exportname, newpath)) {
33664c71966SSteve Yin 				continue;
33764c71966SSteve Yin 			}
33864c71966SSteve Yin 
33964c71966SSteve Yin 			if(!Open(path)) {
34064c71966SSteve Yin 				continue;
34164c71966SSteve Yin 
34264c71966SSteve Yin 			}
34364c71966SSteve Yin 			if (!savetodiffformat(exportname, newpath)) {
34464c71966SSteve Yin 				continue;
34564c71966SSteve Yin 			}
34664c71966SSteve Yin 
34764c71966SSteve Yin 			if(!Open(path)) {
34864c71966SSteve Yin 				continue;
34964c71966SSteve Yin 
35064c71966SSteve Yin 			}
35164c71966SSteve Yin 
35264c71966SSteve Yin 			if (!savetopdfformat(exportname, newpath)) {
35364c71966SSteve Yin 				continue;
35464c71966SSteve Yin 			}
35564c71966SSteve Yin 		}
35664c71966SSteve Yin 	}
35764c71966SSteve Yin 
Open(String path)35864c71966SSteve Yin 	private boolean Open(String path) throws Exception {
35964c71966SSteve Yin 		try {
36064c71966SSteve Yin 			open(path);
36164c71966SSteve Yin 			if (!app.exists())
36264c71966SSteve Yin 				throw new RuntimeException();
36364c71966SSteve Yin 			HandleBlockers(false);
36464c71966SSteve Yin 			if(statusBar.exists(timeout))
36564c71966SSteve Yin 				statusBar.waitForEnabled(timeout, interval);
36664c71966SSteve Yin 			else
36764c71966SSteve Yin 				throw new TimeoutException("time out");
36864c71966SSteve Yin 			HandleBlockers(false);
36964c71966SSteve Yin 			if (!app.exists())
37064c71966SSteve Yin 				throw new RuntimeException();
37164c71966SSteve Yin 			return true;
37264c71966SSteve Yin 		} catch (Exception e) {
37364c71966SSteve Yin 			try {
37464c71966SSteve Yin 				String reason = e.getMessage();
37564c71966SSteve Yin 				if (reason == null || reason.isEmpty())
37664c71966SSteve Yin 					reason = "Opening";
37764c71966SSteve Yin 				result.addRow("data", sourceFile.getCanonicalPath(),
37864c71966SSteve Yin 						sourceFile.length(), scenario, "", "", "Fail", reason);
37964c71966SSteve Yin 			} catch (IOException e1) {
38064c71966SSteve Yin 				// TODO Auto-generated catch block
38164c71966SSteve Yin 				e1.printStackTrace();
38264c71966SSteve Yin 			}
38364c71966SSteve Yin 			return false;
38464c71966SSteve Yin 		}
38564c71966SSteve Yin 	}
38664c71966SSteve Yin 
savetosameformat(String file, String outpath)38764c71966SSteve Yin 	private boolean savetosameformat(String file, String outpath) {
38864c71966SSteve Yin 		try {
38964c71966SSteve Yin 			File reportDir = Testspace.getFile(outpath);
39064c71966SSteve Yin 
39164c71966SSteve Yin 			String extName = FileUtil.getFileExtName(file).toLowerCase();
39264c71966SSteve Yin 
39364c71966SSteve Yin 			boolean formatchanged = false;
39464c71966SSteve Yin 			if (extName.equals("docx")) {
39564c71966SSteve Yin 				extName = "doc";
39664c71966SSteve Yin 				formatchanged = true;
39764c71966SSteve Yin 			} else if (extName.equals("pptx")) {
39864c71966SSteve Yin 				extName = "ppt";
39964c71966SSteve Yin 				formatchanged = true;
40064c71966SSteve Yin 			} else if (extName.equals("xlsx")) {
40164c71966SSteve Yin 				extName = "xls";
40264c71966SSteve Yin 				formatchanged = true;
40364c71966SSteve Yin 			}
40464c71966SSteve Yin 
40564c71966SSteve Yin 			scenario = FileUtil.getFileExtName(file).toLowerCase() + " to " + extName;
40664c71966SSteve Yin 
40764c71966SSteve Yin 			int dotIndex = file.lastIndexOf(".");
40864c71966SSteve Yin 			String pre = file.substring(0, dotIndex + 1);
40964c71966SSteve Yin 			String newfile = pre + extName;
41064c71966SSteve Yin 
41112694156Sdamjan 			String saveTo = reportDir + File.separator + file;
41264c71966SSteve Yin 			if (formatchanged)
41312694156Sdamjan 				saveTo = reportDir + File.separator + newfile;
41464c71966SSteve Yin 			// Save the text document
41564c71966SSteve Yin 			deleteFile(saveTo);
41664c71966SSteve Yin 			SaveAs(saveTo);
41764c71966SSteve Yin 			Close();
41864c71966SSteve Yin 			if(!Open(saveTo))
41964c71966SSteve Yin 				return false;
42064c71966SSteve Yin 
42164c71966SSteve Yin 			String exception = "";
42264c71966SSteve Yin 			String resultflag = "";
42364c71966SSteve Yin 			try {
42464c71966SSteve Yin 				Close();
42564c71966SSteve Yin 				resultflag = "Pass";
42664c71966SSteve Yin 			} catch (Exception e) {
42764c71966SSteve Yin 				exception = e.getMessage();
42864c71966SSteve Yin 				resultflag = "Fail";
42964c71966SSteve Yin 			}
43064c71966SSteve Yin 
43164c71966SSteve Yin 			File targetFile = new File(saveTo);
43264c71966SSteve Yin 			result.addRow("data", sourceFile.getCanonicalPath(),
43364c71966SSteve Yin 					sourceFile.length(), scenario, saveTo, targetFile.length(),
43464c71966SSteve Yin 					resultflag, exception);
43564c71966SSteve Yin 
43664c71966SSteve Yin 			return true;
43764c71966SSteve Yin 		} catch (Exception e) {
43864c71966SSteve Yin 			try {
43964c71966SSteve Yin 				String exception = e.getMessage();
44064c71966SSteve Yin 				if (exception == null || exception.isEmpty())
44164c71966SSteve Yin 					exception = "Saving to the same format";
44264c71966SSteve Yin 				result.addRow("data", sourceFile.getCanonicalPath(),
44364c71966SSteve Yin 						sourceFile.length(), scenario, "", "", "Fail", exception);
44464c71966SSteve Yin 			} catch (IOException e1) {
44564c71966SSteve Yin 				// TODO Auto-generated catch block
44664c71966SSteve Yin 				e1.printStackTrace();
44764c71966SSteve Yin 			}
44864c71966SSteve Yin 
44964c71966SSteve Yin 			return false;
45064c71966SSteve Yin 		}
45164c71966SSteve Yin 	}
45264c71966SSteve Yin 
savetodiffformat(String file, String outpath)45364c71966SSteve Yin 	private boolean savetodiffformat(String file, String outpath) {
45464c71966SSteve Yin 		try {
45564c71966SSteve Yin 			File reportDir = Testspace.getFile(outpath);
45664c71966SSteve Yin 
45764c71966SSteve Yin 			String extName = FileUtil.getFileExtName(file).toLowerCase();
45864c71966SSteve Yin 
45964c71966SSteve Yin 			String targetExtName = null;
46064c71966SSteve Yin 
46164c71966SSteve Yin 			if (extName.equals("doc") || extName.equals("docx"))
46264c71966SSteve Yin 				targetExtName = "odt";
46364c71966SSteve Yin 			else if (extName.equals("ppt") || extName.equals("pptx"))
46464c71966SSteve Yin 				targetExtName = "odp";
46564c71966SSteve Yin 			else if (extName.equals("xls") || extName.equals("xlsx"))
46664c71966SSteve Yin 				targetExtName = "ods";
46764c71966SSteve Yin 			else if (extName.equals("odt"))
46864c71966SSteve Yin 				targetExtName = "doc";
46964c71966SSteve Yin 			else if (extName.equals("odp"))
47064c71966SSteve Yin 				targetExtName = "ppt";
47164c71966SSteve Yin 			else if (extName.equals("ods"))
47264c71966SSteve Yin 				targetExtName = "xls";
47364c71966SSteve Yin 
47464c71966SSteve Yin 			scenario = extName + " to " + targetExtName;
47564c71966SSteve Yin 
47664c71966SSteve Yin 			int dotIndex = file.lastIndexOf(".");
47764c71966SSteve Yin 			String pre = file.substring(0, dotIndex + 1);
47812694156Sdamjan 			String saveTo = reportDir + File.separator + pre + targetExtName;
47964c71966SSteve Yin 			deleteFile(saveTo);
48064c71966SSteve Yin 			// long base = System.currentTimeMillis();
48164c71966SSteve Yin 			SaveAs(saveTo);
48264c71966SSteve Yin 			Close();
48364c71966SSteve Yin 			if(!Open(saveTo))
48464c71966SSteve Yin 				return false;
48564c71966SSteve Yin 
48664c71966SSteve Yin 			String exception = "";
48764c71966SSteve Yin 			String resultflag = "";
48864c71966SSteve Yin 			try {
48964c71966SSteve Yin 				Close();
49064c71966SSteve Yin 				resultflag = "Pass";
49164c71966SSteve Yin 			} catch (Exception e) {
49264c71966SSteve Yin 				exception = e.getMessage();
49364c71966SSteve Yin 				resultflag = "Fail";
49464c71966SSteve Yin 			}
49564c71966SSteve Yin 
49664c71966SSteve Yin 			File targetFile = new File(saveTo);
49764c71966SSteve Yin 			result.addRow("data", sourceFile.getCanonicalPath(),
49864c71966SSteve Yin 					sourceFile.length(), scenario, saveTo, targetFile.length(),
49964c71966SSteve Yin 					resultflag, exception);
50064c71966SSteve Yin 
50164c71966SSteve Yin 			return true;
50264c71966SSteve Yin 		} catch (Exception e) {
50364c71966SSteve Yin 			try {
50464c71966SSteve Yin 				String exception = e.getMessage();
50564c71966SSteve Yin 				if (exception == null || exception.isEmpty())
50664c71966SSteve Yin 					exception = "Saving to a different format";
50764c71966SSteve Yin 				result.addRow("data", sourceFile.getCanonicalPath(),
50864c71966SSteve Yin 						sourceFile.length(), scenario, "", "", "Fail", exception);
50964c71966SSteve Yin 			} catch (IOException e1) {
51064c71966SSteve Yin 				// TODO Auto-generated catch block
51164c71966SSteve Yin 				e1.printStackTrace();
51264c71966SSteve Yin 			}
51364c71966SSteve Yin 
51464c71966SSteve Yin 			return false;
51564c71966SSteve Yin 		}
51664c71966SSteve Yin 
51764c71966SSteve Yin 	}
51864c71966SSteve Yin 
Close()51964c71966SSteve Yin 	private void Close() throws Exception {
52064c71966SSteve Yin 		close();
52164c71966SSteve Yin 		HandleBlockers(false);
52264c71966SSteve Yin 	}
52364c71966SSteve Yin 
HandleBlockers(final boolean Positive)52464c71966SSteve Yin 	public static void HandleBlockers(final boolean Positive) throws Exception {
52564c71966SSteve Yin 		new Condition() {
52664c71966SSteve Yin 			@Override
52764c71966SSteve Yin 			public boolean value() {
52864c71966SSteve Yin 				while (activeMsgBox.exists()) {
52964c71966SSteve Yin 
53064c71966SSteve Yin 					String context = activeMsgBox.getMessage();
53164c71966SSteve Yin 					if (context.toLowerCase().indexOf("has been modified") >= 0
53264c71966SSteve Yin 							&& context.toLowerCase().indexOf(
53364c71966SSteve Yin 									"do you want to save your changes") >= 0)
53464c71966SSteve Yin 						throw new RuntimeException("A wrong dirty flag");
53564c71966SSteve Yin 					if (context.toLowerCase().indexOf("read-error") >= 0)
53664c71966SSteve Yin 						throw new RuntimeException("Read Error");
53764c71966SSteve Yin 					if (context.toLowerCase().indexOf("does not exist") >= 0)
53864c71966SSteve Yin 						throw new RuntimeException("File not exist");
53964c71966SSteve Yin 
54064c71966SSteve Yin 					try {
54164c71966SSteve Yin 						if (Positive)
54264c71966SSteve Yin 							activeMsgBox.ok();
54364c71966SSteve Yin 						else
54464c71966SSteve Yin 							activeMsgBox.no();
54564c71966SSteve Yin 					} catch (Exception e) {
54664c71966SSteve Yin 						try {
54764c71966SSteve Yin 							if (Positive)
54864c71966SSteve Yin 								activeMsgBox.yes();
54964c71966SSteve Yin 							else
55064c71966SSteve Yin 								activeMsgBox.no();
55164c71966SSteve Yin 						} catch (Exception e1) {
55264c71966SSteve Yin 							try {
55364c71966SSteve Yin 								activeMsgBox.doDefault();
55464c71966SSteve Yin 							} catch (Exception e2) {
55564c71966SSteve Yin 								try {
55664c71966SSteve Yin 									activeMsgBox.ok();
55764c71966SSteve Yin 								} catch (Exception e3) {
55864c71966SSteve Yin 									activeMsgBox.yes();
55964c71966SSteve Yin 								}
56064c71966SSteve Yin 							}
56164c71966SSteve Yin 						}
56264c71966SSteve Yin 					}
56364c71966SSteve Yin 				}
56464c71966SSteve Yin 				if (passwdDlg.exists()) {
56564c71966SSteve Yin 					String caption = passwdDlg.getCaption();
56664c71966SSteve Yin 					if (caption.toLowerCase().indexOf(
56764c71966SSteve Yin 							"enter password to open file") >= 0)
56864c71966SSteve Yin 						throw new RuntimeException("A password protected file");
56964c71966SSteve Yin 					if (caption.toLowerCase().indexOf("properties") >= 0)
57064c71966SSteve Yin 						throw new RuntimeException("An unsupported format");
57164c71966SSteve Yin 					if (SupportedFormats(caption))
57264c71966SSteve Yin 						throw new RuntimeException("An unreadable file");
57364c71966SSteve Yin 				}
57464c71966SSteve Yin 				return true;
57564c71966SSteve Yin 			}
57664c71966SSteve Yin 
57764c71966SSteve Yin 		}.test(timeout, interval);
57864c71966SSteve Yin 	}
57964c71966SSteve Yin 
SupportedFormats(String filename)58064c71966SSteve Yin 	private static boolean SupportedFormats(String filename) {
58164c71966SSteve Yin 		if (filename.endsWith(".doc") || filename.endsWith(".docx")
58264c71966SSteve Yin 				|| filename.endsWith(".dot") || filename.endsWith(".xls")
58364c71966SSteve Yin 				|| filename.endsWith(".xlsx") || filename.endsWith(".ods")
58464c71966SSteve Yin 				|| filename.endsWith(".ppt") || filename.endsWith(".pptx")
58564c71966SSteve Yin 				|| filename.endsWith(".odp")) {
58664c71966SSteve Yin 			return true;
58764c71966SSteve Yin 		} else {
58864c71966SSteve Yin 			return false;
58964c71966SSteve Yin 		}
59064c71966SSteve Yin 	}
59164c71966SSteve Yin 
SaveAs(String newfile)59264c71966SSteve Yin 	private void SaveAs(String newfile) throws Exception {
59364c71966SSteve Yin 		saveAs(newfile);
59464c71966SSteve Yin 		HandleBlockers(true);
59564c71966SSteve Yin 		if(statusBar.exists(timeout))
59664c71966SSteve Yin 			statusBar.waitForEnabled(timeout, interval);
59764c71966SSteve Yin 		else
59864c71966SSteve Yin 			throw new TimeoutException("time out");
59964c71966SSteve Yin 	}
60064c71966SSteve Yin 
savetopdfformat(String file, String outpath)60164c71966SSteve Yin 	private boolean savetopdfformat(String file, String outpath) {
60264c71966SSteve Yin 		try {
60364c71966SSteve Yin 			File reportDir = Testspace.getFile(outpath);
60464c71966SSteve Yin 			String extName = "pdf";
60564c71966SSteve Yin 
60664c71966SSteve Yin 			int dotIndex = file.lastIndexOf(".");
60764c71966SSteve Yin 			String pre = file.substring(0, dotIndex + 1);
60864c71966SSteve Yin 			String newfile = pre + extName;
60964c71966SSteve Yin 
61064c71966SSteve Yin 			scenario = FileUtil.getFileExtName(file).toLowerCase() + " to pdf";
61164c71966SSteve Yin 
61212694156Sdamjan 			String saveTo = reportDir + File.separator + newfile;
61364c71966SSteve Yin 			// Save the text document
61464c71966SSteve Yin 			app.dispatch(".uno:ExportToPDF");
61564c71966SSteve Yin 			pdfGeneralPage.ok();
61664c71966SSteve Yin 
61764c71966SSteve Yin 			submitSaveDlg(saveTo);
61864c71966SSteve Yin 			HandleBlockers(true);
61964c71966SSteve Yin 
62064c71966SSteve Yin 			if(statusBar.exists(timeout))
62164c71966SSteve Yin 				statusBar.waitForEnabled(timeout, interval);
62264c71966SSteve Yin 			else
62364c71966SSteve Yin 				throw new TimeoutException("time out");
62464c71966SSteve Yin 
62564c71966SSteve Yin 			String outcome = "Pass";
62664c71966SSteve Yin 			try {
62764c71966SSteve Yin 				Close();
62864c71966SSteve Yin 			} catch (Exception e) {
62964c71966SSteve Yin 				if (!e.getMessage().matches("A wrong dirty flag"))
63064c71966SSteve Yin 					outcome = e.getMessage();
63164c71966SSteve Yin 				else
63264c71966SSteve Yin 					throw e;
63364c71966SSteve Yin 			}
63464c71966SSteve Yin 
63564c71966SSteve Yin 
63664c71966SSteve Yin 			File targetFile = new File(saveTo);
63764c71966SSteve Yin 			result.addRow("data", sourceFile.getCanonicalPath(),
63864c71966SSteve Yin 					sourceFile.length(), scenario, saveTo, targetFile.length(),
63964c71966SSteve Yin 					outcome);
64064c71966SSteve Yin 
64164c71966SSteve Yin 			return true;
64264c71966SSteve Yin 		} catch (Exception e) {
64364c71966SSteve Yin 			try {
64464c71966SSteve Yin 				String reason = e.getMessage();
64564c71966SSteve Yin 				if (reason == null || reason.isEmpty())
64664c71966SSteve Yin 					reason = "Exporting to pdf format";
64764c71966SSteve Yin 				result.addRow("data", sourceFile.getCanonicalPath(),
64864c71966SSteve Yin 						sourceFile.length(), scenario, "", "", "Fail", reason);
64964c71966SSteve Yin 			} catch (IOException e1) {
65064c71966SSteve Yin 				// TODO Auto-generated catch block
65164c71966SSteve Yin 				e1.printStackTrace();
65264c71966SSteve Yin 			}
65364c71966SSteve Yin 
65464c71966SSteve Yin 			return false;
65564c71966SSteve Yin 		}
65664c71966SSteve Yin 	}
65764c71966SSteve Yin 
65864c71966SSteve Yin }
659