You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flex.apache.org by ah...@apache.org on 2012/05/03 00:45:08 UTC
svn commit: r1333232 [22/34] - in /incubator/flex/trunk: ./
frameworks/tests/ frameworks/tests/basicTests/
frameworks/tests/basicTests/dmv/ frameworks/tests/basicTests/dmv/scripts/
frameworks/tests/basicTests/dmv/views/ frameworks/tests/basicTests/fxg/...
Added: incubator/flex/trunk/mustella/java/src/mustella/CousinPreCompile.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/CousinPreCompile.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/CousinPreCompile.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/CousinPreCompile.java Wed May 2 22:44:38 2012
@@ -0,0 +1,266 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.BuildException;
+import java.io.File;
+import java.util.*;
+
+public class CousinPreCompile extends Task {
+
+
+ /**
+
+ Custom filtering mechanism.
+
+ looks for a file ("pre_compile.sh") in SWF directories, given a list of files/directories
+
+ by decree, the only shell script that should get executed in the SWFs directory
+ is the pre_compile.sh script. If something else turns up, we remove it.
+
+
+ **/
+
+
+
+ // this is a variable, though it seems needless at this point:
+ private String shellFile = "pre_compile.sh";
+
+
+ private final String swfDir1 = "../SWFs/";
+ private final String swfDir2 = "../swfs/";
+
+ public void setShellFile(String s) {
+ this.shellFile = s;
+ }
+
+ public String getShellFile() {
+ return shellFile;
+ }
+
+ private String property = null;
+
+ public String getProperty() {
+ return property;
+ }
+
+ public void setProperty (String prop) {
+ this.property = prop;
+ }
+
+
+ /// the contents of a fileset:
+ private String files = null;
+
+ public void setFiles(String target) {
+ this.files = target;
+ }
+
+ public String getFiles() {
+ return files;
+ }
+
+
+ private String root = "";
+
+ public void setRoot(String target) {
+ this.root = target;
+ }
+
+ public String getRoot() {
+ return root;
+ }
+
+
+ private HashMap rez = new HashMap();
+
+
+ /// we need to take build, passed to us, and
+ /// generate the id, setting that back in the project
+ public void execute() {
+
+
+ /// split into pieces:
+ String [] args = files.split(File.pathSeparator);
+ // System.out.println ("args length: " + args.length);
+ // System.out.println ("arg1: " + args[1]);
+
+
+
+
+ ArrayList actuals = new ArrayList();
+
+ StringBuffer result = new StringBuffer();
+ result.append("");
+
+ Object obj = null;
+
+
+ File tmp = null;
+
+ String use = null;
+
+
+ for (int i=0;i<args.length;i++) {
+
+
+ use = args[i].trim();
+ // System.out.println ("result0: " + use);
+
+ if ( use.startsWith(","))
+ use=use.substring(1).trim();
+
+ // System.out.println ("result1: " + use);
+
+ tmp = new File (use);
+
+ if (use == null || use.equals (""))
+ continue;
+
+
+ if (!tmp.isDirectory()) {
+ // if this is a file, see if we have to filter it
+ // if it lives in the SWFs directory, it can only be one name
+ if (tmp.getParent().toLowerCase().endsWith ("swfs")) {
+ // System.out.println ("NAME: " + tmp.getName());
+ if (!tmp.getName().equals ("pre_compile.sh")) {
+ // System.out.println ("SKIPPING " + tmp.getName());
+ continue;
+ } else {
+
+ try {
+ obj = rez.put (tmp.getCanonicalPath(), "");
+ if (obj==null)
+ actuals.add(0, tmp.getCanonicalPath());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ continue;
+
+ }
+ } else {
+ /// in this case, it's a file,
+ /// so, we strip the file and will search it later
+ // System.out.println ("Adding: " + tmp);
+ try {
+ obj = rez.put (tmp.getCanonicalPath(), "");
+ if (obj==null)
+ actuals.add(tmp.getCanonicalPath());
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ // System.out.println ("working NOW with: " + tmp.getParent());
+ args[i] = tmp.getParent();
+ }
+ }
+
+ if (!tmp.exists()) {
+ args[i] = root + "/" + args[i];
+ // System.out.println ("morphed to: " + args[i]);
+ }
+
+
+ if (new File ( args[i] + "/" + swfDir1 + shellFile ).exists() ) {
+
+ try {
+ obj = (Object) rez.put (new File ( args[i] + "/" + swfDir1 + shellFile).getCanonicalPath(), "");
+ if (obj==null)
+ actuals.add(0, new File ( args[i] + "/" + swfDir1 + shellFile).getCanonicalPath());
+ // System.out.println ("got one off: " + new File ( args[i] + "/" + swfDir1 + shellFile).getCanonicalPath());
+ }catch (Exception e) {}
+ continue;
+ } else if (new File ( args[i] + "/" + swfDir2 + shellFile ).exists() ) {
+ try {
+ obj = (Object)rez.put (new File ( args[i] + "/" + swfDir2 + shellFile).getCanonicalPath(), "");
+ if (obj==null)
+ actuals.add(0, new File ( args[i] + "/" + swfDir2 + shellFile).getCanonicalPath());
+ // System.out.println ("got one off: " + new File ( args[i] + "/" + swfDir2 + shellFile).getCanonicalPath());
+ }catch (Exception e) {}
+ continue;
+ } else if (new File (tmp.getParent() + "/" + swfDir1 + shellFile ).exists() ) {
+ try {
+ obj = (Object) rez.put (new File (tmp.getParent() + "/" + swfDir1 + shellFile ).getCanonicalPath(), "");
+ if (obj==null)
+ actuals.add(0, new File (tmp.getParent() + "/" + swfDir1 + shellFile ).getCanonicalPath());
+ // System.out.println ("got one off: " + new File (tmp.getParent() + "/" + swfDir1 + shellFile ).getCanonicalPath());
+ }catch (Exception e) {}
+ continue;
+ } else if (new File (tmp.getParent() + "/" + swfDir2 + shellFile ).exists() ) {
+ try {
+ obj = (Object) rez.put (new File (tmp.getParent() + "/" + swfDir2 + shellFile ).getCanonicalPath(), "");
+ if (obj==null)
+ actuals.add(0, new File (tmp.getParent() + "/" + swfDir2 + shellFile ).getCanonicalPath());
+ // System.out.println ("got one off: " + new File (tmp.getParent() + "/" + swfDir2 + shellFile ).getCanonicalPath());
+ }catch (Exception e) {}
+ continue;
+ }
+
+ // System.out.println ("bottom of loop");
+ }
+
+
+
+ // System.out.println ("rez: " + rez.toString());
+
+ // Iterator it = actuals.iterator();
+
+
+ String tmp1 = null;
+
+ /// use CANONICAL!
+
+ for (int i=0;i<actuals.size();i++) {
+
+
+ tmp1 = (String)actuals.get(i);
+ if (tmp1.endsWith(".sh"))
+ result.append (tmp1);
+
+ if (i<(actuals.size()-1))
+ result.append (File.pathSeparator);
+
+ }
+
+ // System.out.println ("result: " + result.toString());
+
+ /*
+ while (it.hasNext()) {
+ tmp1 = (String) it.next();
+ try {
+ } catch (Exception e) {
+ e.printStackTrace();}
+ result.append (tmp1);
+ if (it.hasNext())
+ result.append (File.pathSeparator);
+ // System.out.println ("result: " + tmp1.toString());
+ }
+ */
+
+ Project project = getProject();
+ project.setProperty(property, result.toString());
+
+
+
+ }
+
+
+
+}
Propchange: incubator/flex/trunk/mustella/java/src/mustella/CousinPreCompile.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/ExcludesAdjuster.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/ExcludesAdjuster.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/ExcludesAdjuster.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/ExcludesAdjuster.java Wed May 2 22:44:38 2012
@@ -0,0 +1,137 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+import java.io.*;
+import java.util.ArrayList;
+
+
+
+/**
+ * Read in a local file to add to the list of excludes for a test run
+ * meant as a workaround for insurmountable configuration differences.
+ * details:
+ *
+ * The file should reside in the qa/sdk/testsuites/mustella/tests directory.
+ * It's name should be "MachineSpecificExcludes.txt". It should not be checked in.
+ * Its format should be one of two styles:
+ * it can be in failures output format (from mini run), like this:
+ *
+ * gumbo/components/List/events/VItemRendRET_event_tester VRendRET_List_scrollPosition6
+ *
+ * or already in exclude format:
+ *
+ * gumbo/components/List/events/VItemRendRET_event_tester$VRendRET_List_scrollPosition6
+
+ *
+ */
+public class ExcludesAdjuster {
+
+
+ /**
+ * name of the file we'll read
+ */
+ public static String excludesAdjustfile= "MachineSpecificExcludes.txt";
+
+ /**
+ * Directory we'll read this from. This is ${sdk.mustella.dir},
+ * so we get it pushed from the excludes task (which has the project)
+ */
+ public static String testsDir = null;
+
+
+ public static void setDir (String dir) {
+ testsDir = dir;
+ }
+
+ public static String getDir (String dir) {
+ return testsDir;
+ }
+
+
+ public static ArrayList theExcludes = new ArrayList();
+
+
+ public static void readFile () {
+
+ if (testsDir == null) {
+ System.out.println ("Must feed a directory to the ExcludesAdjuster class!");
+ return;
+ }
+
+ BufferedReader br = null;
+
+ String tmp = null;
+
+
+ String lastTmp = null;
+
+
+ try {
+
+ br = new BufferedReader (new FileReader ( testsDir + File.separator + excludesAdjustfile ));
+
+ while ( (tmp=br.readLine()) != null) {
+
+ if (tmp.length() <= 1)
+ continue;
+
+ if (tmp.indexOf (" ") != -1)
+ tmp = tmp.replace (' ', '$');
+
+ /// our guys get inserted at the top of the excludes
+ /// so it's okay if they end with "," I guess
+ tmp = tmp + ",";
+
+ theExcludes.add (tmp);
+
+ }
+
+
+ } catch (Exception e) {
+ System.out.println ("No machine-based excludes");
+
+ // e.printStackTrace();
+ }
+ }
+
+
+ public static ArrayList getExcludes () {
+
+ readFile();
+
+ return theExcludes;
+
+
+ }
+
+
+ public static void main (String [] args) throws Exception {
+
+
+ ArrayList al = getExcludes();
+
+ for (int i=0;i<al.size();i++) {
+
+ System.out.println ("ex+ " + al.get(i));
+
+ }
+
+ }
+
+}
Propchange: incubator/flex/trunk/mustella/java/src/mustella/ExcludesAdjuster.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/GetExcIncCase.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/GetExcIncCase.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/GetExcIncCase.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/GetExcIncCase.java Wed May 2 22:44:38 2012
@@ -0,0 +1,612 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+
+import java.sql.*;
+import java.io.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+
+public class GetExcIncCase {
+
+
+ /**
+
+ Write excludes.
+
+ type can be "class" or "text". If class, it wraps the list in a
+ package & class structure.
+
+ text, just write the values
+
+ **/
+
+
+ public static String testcaseTableName = "test_cases";
+
+ public static String branch = null;
+ public static String browser = null;
+ public static String os = null;
+ public static String runtime = null;
+ public static String outfile = null;
+ public static String untilTime = null;
+ public static String type = "class";
+ public static String bugByPass = null;
+
+
+ public static String exclude_config_id_str;
+
+
+ public static void setPassedExcludeId (String s) {
+
+ if (!s.equals("")) {
+ exclude_config_id_str = s;
+ }
+ }
+
+ public static void setBranch (String b) {
+ branch = b;
+ }
+
+ /// the cutoff for excludes in this run. a time stamp
+ public static void setUntilTime (String b) {
+ untilTime = b;
+ System.out.println ("until time is: " + b);
+ }
+
+
+ public static void setBugByPass (String b) {
+ bugByPass = b;
+ }
+
+ public static void setOs (String b) {
+ os = b;
+ }
+
+ public static void setType (String b) {
+ type = b;
+ }
+
+ public static void setRuntime (String b) {
+ runtime = b;
+ }
+
+ public static void setExcludeConfigId (String s) {
+ exclude_config_id_str = s;
+ }
+
+ public static void setBrowser (String b) {
+ browser = b;
+ if (browser.indexOf ("/") != -1) {
+ browser = browser.substring (browser.lastIndexOf ("/")+1);
+ } else if (browser.indexOf (File.separator) != -1) {
+ browser = browser.substring (browser.lastIndexOf (File.separator)+1);
+ }
+
+ browser = browser.toLowerCase();
+ }
+
+ public static void createAndWrite (String filename, String branchl, String browserl, String runtimel, String osl) throws Exception {
+
+ outfile = filename;
+ branch = branchl;
+ browser = browserl;
+ runtime = runtimel;
+ os = osl;
+
+
+ if (browser.indexOf ("/") != -1) {
+ browser = browser.substring (browser.lastIndexOf ("/")+1);
+ } else if (browser.indexOf (File.separator) != -1) {
+ browser = browser.substring (browser.lastIndexOf (File.separator)+1);
+ }
+
+ browser = browser.toLowerCase();
+
+
+ // System.out.println ("resulting browser: " + browser);
+
+
+ /// set
+ if (exclude_config_id_str == null) {
+ // System.out.println ("---->>>>> Calling getExcludeConfigs");
+ exclude_config_id_str = getExcludeConfigs();
+ }
+
+
+ ArrayList al = getExcludes();
+ ArrayList al2 = ExcludesAdjuster.getExcludes();
+ if (!al2.isEmpty())
+ al.addAll (0, al2);
+
+
+ System.out.println ("excludes count: " + (al.size()));
+
+ writeToFile (al, filename);
+
+
+ }
+
+ public static void createAndWrite (String filename, String exclude_config) {
+
+ exclude_config_id_str = exclude_config;
+
+ try {
+
+ ArrayList al = getExcludes();
+ ArrayList al2 = ExcludesAdjuster.getExcludes();
+
+ if (!al2.isEmpty())
+ al.addAll (0, al2);
+
+ writeToFile (al, filename);
+
+ } catch (Exception e) {
+
+ e.printStackTrace();
+
+ }
+
+
+ }
+
+
+
+ private static final String sep = "$";
+ private static final String comma = ",";
+ private static final String colon1 = ": 1";
+ private static final String tabs = " ";
+ private static final String newline = System.getProperties().getProperty ("line.separator");
+
+ public static ArrayList getExcludes() throws Exception {
+
+ System.err.println ("This should no longer be called");
+
+ /* AJH
+ Connection con = null;
+
+ try {
+ con = GetConnection.get();
+ } catch (Exception e) {
+ System.err.println ("Could not make database connection, no fetch of excludes");
+ return new ArrayList();
+ }
+
+ Statement stmt = con.createStatement();
+ */
+
+ /*
+ need to make this a transaction !!
+
+ */
+
+
+ ArrayList al = new ArrayList();
+
+ /* AJH
+ ResultSet rs =stmt.executeQuery ( getExcludeStmt () );
+
+ String tmpdir = null;
+ String tmps = null;
+ String tmpt = null;
+
+ StringBuffer sb = new StringBuffer();
+
+ while (rs.next()) {
+ tmpdir = rs.getString(1);
+ tmps = rs.getString(2);
+ tmpt = rs.getString(3);
+ sb.append (tmpdir);
+ sb.append (tmps);
+ sb.append (sep);
+ sb.append (tmpt);
+ if (type.equals("class"))
+ sb.append (colon1);
+
+ if (!rs.isLast())
+ sb.append (comma);
+
+ al.add (sb.toString());
+ sb.delete (0, sb.length());
+ }
+ */
+
+ return al;
+
+ }
+
+ public static final String qt = "'";
+
+ public static String getExcludeCountStmt() {
+
+
+ String s = "select count(test_file) from test_cases, excludes where test_cases.id = excludes.testcase_id and (excludes.date_end = '0000-00-00 00:00:00' or excludes.date_end > '" + untilTime +"' ) and excludes.exclude_config_id in " + exclude_config_id_str;
+ /// add untilTime
+
+ return s;
+
+ }
+
+
+ /// neeed to check if the date_end is > than some value we pass in;
+ // that would be a not-yet vetted exclude
+
+ public static String getExcludeStmt() {
+
+ String s = null;
+
+ if (bugByPass != null && bugByPass.length() > 0) {
+ // System.out.println ("Here's bug by pass: " + bugByPass + " length: " + bugByPass.length());
+ s = "select test_files.dir_name, test_file, test_id from test_cases, excludes, test_files where test_cases.id = excludes.testcase_id and test_files.id = test_cases.test_dir and (excludes.date_end = '0000-00-00 00:00:00' or excludes.date_end > '" + untilTime +"' ) and excludes.exclude_config_id in " + exclude_config_id_str + " and (excludes.bug_id != '" + bugByPass + "' or excludes.bug_id is null)";
+ } else {
+ s = "select test_files.dir_name, test_file, test_id from test_cases, excludes, test_files where test_cases.id = excludes.testcase_id and test_files.id = test_cases.test_dir and (excludes.date_end = '0000-00-00 00:00:00' or excludes.date_end > '" + untilTime +"' ) and excludes.exclude_config_id in " + exclude_config_id_str;
+
+ }
+
+ // System.out.println (s);
+
+ return s;
+
+ }
+
+ public static String getExcludeConfigStmt() {
+ String s = null;
+ if (!browser.equals ("")) {
+
+ s = "select id from exclude_config where (os= '" +
+ os+"' or os= 'any' ) and (branch= '" +
+ branch+"' or branch= 'any' )and (runtime= '" +
+ runtime+"' or runtime= 'any' ) and (browser= '" +
+ browser+"' or browser= 'any') " ;
+
+ } else {
+
+ s = "select id from exclude_config where (os= '" +
+ os+"' or os= 'any' ) and (branch= '" +
+ branch+"' or branch= 'any' )and (runtime= '" +
+ runtime+"' or runtime= 'any' )";
+
+
+ }
+
+ // System.out.println (s);
+
+ return s;
+
+ }
+
+
+ public static String getExcludeConfigs() throws Exception {
+
+ System.err.println ("This should not be called");
+
+ /* AJH
+ Connection con = null;
+
+ try {
+ con = GetConnection.get();
+ } catch (Exception e) {
+ System.err.println ("Could not make database connection, no fetch of excludes");
+ return null;
+ }
+
+ Statement stmt = con.createStatement();
+ */
+
+ StringBuffer sb = new StringBuffer();
+
+ /* AJH
+ sb.append ("(");
+
+
+ ResultSet rs =stmt.executeQuery ( getExcludeConfigStmt () );
+
+ String tmps = null;
+ String tmpt = null;
+
+
+ while (rs.next()) {
+ tmps = rs.getString(1);
+
+ sb.append (tmps);
+
+ if (!rs.isLast())
+ sb.append (comma);
+
+ }
+
+ sb.append (")");
+
+ */
+
+ return sb.toString();
+
+
+ }
+
+ public static void close () {
+
+ /* AJH
+ try {
+ GetConnection.get().close();
+ } catch (Exception e) {
+ }
+ */
+ }
+
+
+ static String topFileExc1="package {\n\nimport flash.display.DisplayObject;\n\n[Mixin]\n\n/**\n\n* A hash table of tests not to run. as of ";
+ static String topFileExc2= "\n*/\n\npublic class CurrentExcludeList\n\n {\n\n public static function init(root:DisplayObject):void\n\n {\n\n UnitTester.excludeList = {\n\n";
+
+ static String topFileInc="package {\n\nimport flash.display.DisplayObject;\n\n[Mixin]\n\n/**\n\n* A hash table of tests to run.\n*/\n\npublic class CurrentIncludeList\n\n {\n\n public static function init(root:DisplayObject):void\n\n {\n\n UnitTester.includeList = {\n\n";
+
+ static String bottomFile = " };\n\n}\n }\n}\n";
+
+
+ /**
+ * writes to an as file, to be compiled as a swc
+ * writes the top,
+ * then the arraylist contents, then the bottom
+ */
+ public static void writeToFile (ArrayList al, String filename) {
+ writeToFile (al, filename, true);
+ }
+
+
+ public static ResultSet doQuery (String s) {
+ /* AJH
+ Connection con = null;
+
+ try {
+ con = GetConnection.get();
+ } catch (Exception e) {
+ System.err.println ("Could not make database connection, no fetch of excludes");
+ return null;
+ }
+ */
+
+ ResultSet rs = null;
+
+ /* AJH
+ try {
+ Statement stmt = con.createStatement();
+
+ rs = stmt.executeQuery(s);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ */
+
+ return rs;
+
+ }
+
+
+
+ public static void writeToFileTransform (ArrayList al, String filename, HashMap tellFiles) throws Exception {
+
+
+ FileOutputStream fos = null;
+
+ String tmp = null;
+ String last_tmp = null;
+
+ String file_portion = null;
+
+ try {
+
+ fos = new FileOutputStream (filename);
+
+
+ if (type.equals ("class")) {
+
+ fos.write (topFileInc.getBytes(), 0, topFileInc.length());
+ }
+
+
+
+ for (int i=0;i<al.size();i++) {
+
+ tmp = (String) al.get (i);
+
+ file_portion = tmp.substring (0, tmp.indexOf ("$"));
+
+ file_portion = file_portion + qt;
+
+
+
+ if (!file_portion.equals (last_tmp)) {
+
+
+ fos.write (tabs.getBytes(), 0, tabs.length());
+ fos.write (file_portion.getBytes(), 0, file_portion.length());
+ fos.write (":1".getBytes(), 0, ":1".length());
+ fos.write (comma.getBytes(), 0, comma.length());
+ fos.write (newline.getBytes(), 0, newline.length());
+ last_tmp = file_portion;
+ tellFiles.put (file_portion, "1");
+ }
+
+ if (type.equals("class"))
+ fos.write (tabs.getBytes(), 0, tabs.length());
+ fos.write (tmp.getBytes(), 0, tmp.length());
+
+ if (i<al.size()-1)
+ fos.write (comma.getBytes(), 0, comma.length());
+
+ fos.write (newline.getBytes(), 0, newline.length());
+ fos.flush();
+ }
+
+ if (type.equals ("class"))
+ fos.write (bottomFile.getBytes(), 0, bottomFile.length());
+
+
+ fos.flush();
+ fos.close();
+
+ } catch (Exception e) {
+
+ e.printStackTrace ();
+
+ try {
+ fos.close();
+ } catch (Exception e2) { }
+
+ throw e;
+
+ }
+ }
+
+ public static void writeToFile (ArrayList al, String filename, boolean exclude) {
+
+
+ // System.out.println ("this is the file I'll write: " + filename);
+
+ /// (the unusual) case of nothing to write
+ /// skip out of here
+ /*
+ if (al.size()==0) {
+ /// not sure the wisdom
+ System.out.println ("EMPTY SET FOR EXCLUDES. No write");
+ return;
+ }
+ */
+
+ FileOutputStream fos = null;
+
+ String tmp = null;
+
+ try {
+
+ fos = new FileOutputStream (filename);
+
+
+ if (type.equals ("class")) {
+
+ if (exclude) {
+ fos.write (topFileExc1.getBytes(), 0, topFileExc1.length());
+ fos.write (untilTime.getBytes(), 0, untilTime.length());
+ fos.write (topFileExc2.getBytes(), 0, topFileExc2.length());
+ } else
+ fos.write (topFileInc.getBytes(), 0, topFileInc.length());
+ }
+
+
+
+ for (int i=0;i<al.size();i++) {
+
+ tmp = (String) al.get (i);
+ if (type.equals("class"))
+ fos.write (tabs.getBytes(), 0, tabs.length());
+ fos.write (tmp.getBytes(), 0, tmp.length());
+ fos.write (newline.getBytes(), 0, newline.length());
+ fos.flush();
+ }
+
+ if (type.equals ("class"))
+ fos.write (bottomFile.getBytes(), 0, bottomFile.length());
+
+
+ fos.flush();
+ fos.close();
+
+ } catch (Exception e) {
+
+ e.printStackTrace ();
+
+ try {
+ fos.close();
+ } catch (Exception e2) { }
+
+ }
+
+
+ }
+
+
+
+
+ public static void main (String [] args) throws Exception {
+
+ // System.out.println (System.getProperties());
+
+ // String outfile = "tmp.run";
+
+ /* testing
+ ArrayList al = new ArrayList();
+
+ al.add ("CBTester$myButtonTest1: 1,");
+ al.add ("CBTester$myHeadTest1: 1");
+
+ writeToFile (al, "tmp1.test");
+ */
+
+
+ if (args.length == 0) {
+ System.err.println ("Required: NEED FILENAME TO WRITE EXCLUDES");
+ }
+
+
+ for (int i=0;i<args.length;i++)
+ System.out.println (i + " " +args[i]);
+
+
+ ///kind of silly but it's all positional
+ ///
+ String outfile = args[0];
+ String branch = args[1];
+ String use_apollo = args[2];
+ String use_browser = args[3];
+ String browser = args[4];
+ String os = args[5];
+ try {
+ untilTime = args[6];
+ } catch (Exception e ) {
+ /// transform to now
+ untilTime = null;
+ }
+
+ String runtime = "";
+
+ if (use_apollo.equals("true"))
+ runtime = "apollo";
+ else if (use_browser.equals ("true"))
+ runtime = "browser";
+ else
+ runtime = "Standalone";
+
+ if (runtime.equals ("apollo"))
+ browser = "";
+
+
+ createAndWrite (outfile, branch, browser, runtime, os);
+
+
+ // System.out.println ("new run id: " + get ("999999"));
+
+
+
+ }
+
+
+
+}
Propchange: incubator/flex/trunk/mustella/java/src/mustella/GetExcIncCase.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/GetUserArgs.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/GetUserArgs.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/GetUserArgs.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/GetUserArgs.java Wed May 2 22:44:38 2012
@@ -0,0 +1,150 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+import utils.*;
+import utils.FileUtils;
+
+import java.io.File;
+import java.util.regex.*;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileInputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.*;
+
+/**
+ * User: bolaghlin
+ */
+public class GetUserArgs {
+
+ private static final String compile_arg_ending = ".compile";
+
+ public String checkAndAddUserArgs (String mxml, String args) {
+
+ String comp_mxml = transformName(mxml, compile_arg_ending);
+
+ Map.Entry me = null;
+
+ if (new File(comp_mxml).exists()) {
+ System.out.println ("Saw the .compile file");
+
+ Properties p = new Properties();
+ try {
+ // Since we may get duplicate compile key directives, we
+ // have to combine them.
+ // can't really use load
+
+ String line = null;
+ String key = null;
+ String val = null;
+ String tmp = null;
+ BufferedReader be = new BufferedReader (new FileReader (comp_mxml));
+
+ /// Simplified version: just throw the arg on there, as is
+ while ( (line=be.readLine()) != null) {
+ if (!line.startsWith ("#"))
+ args += " "+ doSubstitute(line);
+ }
+
+ be.close();
+
+
+ } catch (Exception e) {
+ System.err.println ("Exception on trying to load user .compile file, maybe ok");
+ // e.printStackTrace();
+
+
+ }
+ }
+
+ return args;
+
+
+ }
+
+ public static String transformName (String mxml, String addition) {
+
+ if (mxml.indexOf (".") != -1) {
+ return mxml.substring (0, mxml.lastIndexOf (".")) + addition;
+
+ }
+
+ return mxml;
+
+ }
+
+
+ public static String transformName (String mxml) {
+
+ return transformName (mxml, "");
+
+ }
+
+ public String doSubstitute (String line) {
+
+ String sdk_dir=System.getProperty("sdk.dir");
+
+ String fwk_dir=System.getProperty("framework.dir");
+
+ String mustella_dir = System.getProperty ("mustella.dir");
+
+ if (sdk_dir != null && !sdk_dir.equals("")) {
+
+ if ( line.indexOf ("${sdk.dir}") != -1) {
+ line = line.replaceAll ("\\$\\{sdk.dir\\}", FileUtils.normalizeDir(sdk_dir));
+ }
+ }
+
+
+ if (mustella_dir != null && !mustella_dir.equals("")) {
+ if ( line.indexOf ("${mustella.dir}") != -1) {
+ line = line.replaceAll ("\\$\\{mustella.dir\\}", FileUtils.normalizeDir(mustella_dir));
+ }
+
+ }
+
+ if (fwk_dir != null && !fwk_dir.equals("")) {
+ if ( line.indexOf ("${framework.dir}") != -1) {
+ line = line.replaceAll ("\\$\\{framework.dir\\}", FileUtils.normalizeDir(fwk_dir));
+ }
+
+ }
+
+
+ return line;
+
+ }
+
+
+ public static void main (String[] args) {
+
+
+ GetUserArgs g = new GetUserArgs ();
+
+ String s = g.checkAndAddUserArgs(args[0], "");
+
+ System.out.println ("user args: " + s);
+ }
+
+
+
+}
Propchange: incubator/flex/trunk/mustella/java/src/mustella/GetUserArgs.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/HtmlTestAdapter.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/HtmlTestAdapter.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/HtmlTestAdapter.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/HtmlTestAdapter.java Wed May 2 22:44:38 2012
@@ -0,0 +1,484 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+import utils.*;
+import utils.FileUtils;
+
+import java.io.File;
+import java.util.regex.*;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.FileInputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.*;
+
+/**
+ * User: bolaghlin
+ * invoked by Runner when doing a browser run
+ * Writes the html file that will get invoked
+ */
+public class HtmlTestAdapter {
+
+
+ // These are the default dimensions.
+ public static final String standard_height= "375";
+ public static final String standard_width= "500";
+
+ private static final String property_arg_ending = ".htmlvars";
+
+ String real_mxml_file = null;
+
+ String html_file = null;
+
+ ParseMxmlHeader pml = null;
+
+ String extra_args = "";
+
+ ByteArrayOutputStream baos = null;
+
+ public static String sdk_dir=null;
+ public static String htmlDir=null;
+ // public static String htmlDirEnd = "/templates/client-side-detection-with-history/";
+ public static String htmlDirEnd = "/templates/swfobject/";
+
+ static {
+ try {
+ if (System.getProperty ("sdk.dir")!=null && !System.getProperty ("sdk.dir").equals(""))
+ sdk_dir = System.getProperty ("sdk.dir");
+ } catch (Exception e) {
+ }
+
+ try {
+ if (System.getProperty ("htmlDir")!=null && !System.getProperty ("htmlDir").equals("")) {
+ htmlDir = System.getProperty ("htmlDir");
+ System.out.println ("incoming htmlDir: " + htmlDir);
+ } else {
+ htmlDir = sdk_dir + htmlDirEnd;
+ System.out.println ("non incoming htmlDir: " + htmlDir);
+ }
+
+ if (!htmlDir.endsWith("/"))
+ htmlDir = htmlDir + "/";
+
+ System.out.println ("result htmlDir: " + htmlDir);
+ } catch (Exception e) {
+ }
+ }
+
+
+ public HtmlTestAdapter (String swfFile, String loaderSwf) throws Exception {
+
+
+ real_mxml_file = transformName(swfFile, ".mxml");
+ html_file = transformName(swfFile, ".html");
+
+
+ System.out.println ("Here is the real mxml file: " + real_mxml_file);
+
+
+ pml = new ParseMxmlHeader();
+ pml.setWidthAndHeight (real_mxml_file);
+
+ System.out.println ("here's the size: " + pml);
+
+
+ GetUserArgs gu = new GetUserArgs();
+ extra_args = gu.checkAndAddUserArgs (real_mxml_file, extra_args);
+
+
+
+ createHtmlShell (html_file);
+
+ }
+
+
+ /// given the htmlvars file,
+ public static String populateKeyValuePairs (String mxmlFile) {
+
+
+ String fileName = transformName (mxmlFile, property_arg_ending);
+
+ String tmp = null;
+
+ Properties p = new Properties();
+
+ if (new File(fileName).exists()) {
+
+ try {
+
+ BufferedReader br = new BufferedReader (new FileReader(fileName));
+
+ while ( (tmp=br.readLine()) != null) {
+
+ if (tmp.startsWith("flashvars="))
+ tmp = tmp.substring (10);
+
+ split (tmp, p);
+
+ }
+
+ br.close();
+ } catch (Exception e) {
+
+ e.printStackTrace();
+ }
+ }
+
+ // roll through these and make them flashvars.key=val; strings
+ Iterator it = p.entrySet().iterator();
+
+ Map.Entry me = null;
+
+ StringBuffer bs = new StringBuffer();
+
+ while (it.hasNext()) {
+
+ me = (Map.Entry) it.next();
+
+ bs.append ("flashvars.");
+ bs.append ((String)me.getKey());
+ bs.append ("=");
+ bs.append ("\"");
+ bs.append ((String)me.getValue());
+ bs.append ("\"");
+ bs.append (";");
+ }
+
+ return bs.toString();
+ }
+
+
+ public static void split (String line, Properties p) {
+
+ String key = null;
+ String entry = null;
+
+ String tmp = null;
+
+ // two way split,
+ StringTokenizer st = new StringTokenizer(line, "&");
+
+ while (st.hasMoreTokens()) {
+
+ tmp = st.nextToken();
+
+ key = tmp.substring (0, tmp.indexOf ("="));
+ entry = tmp.substring (tmp.indexOf ("=")+1);
+ p.put (key, entry);
+ }
+
+
+ }
+
+
+ public static Properties populatePropertiesFile (String mxmlFile) {
+
+ Properties p = new Properties();
+
+ String fileName = transformName (mxmlFile, property_arg_ending);
+
+ if (new File(fileName).exists()) {
+
+ try {
+ p.load (new FileInputStream (fileName));
+
+ } catch (Exception e) {
+
+ e.printStackTrace();
+ }
+ }
+
+ return p;
+ }
+
+ public static String height = "375";
+ public static String width = "500";
+
+
+ /*
+ public void setWidthAndHeight(String mxml) {
+
+ try {
+
+ String line = null;
+ BufferedReader br = new BufferedReader (new FileReader (mxml));
+ /// we will not go far into a file to get this
+ int count = 0 ;
+
+ int loc = -1;
+ int loc_end = -1;
+
+ boolean begun = false;
+
+ boolean set1 = false;
+ boolean set2 = false;
+
+ while ( (line=br.readLine()) != null) {
+ if ( (loc = line.indexOf("Application")) != -1)
+ begun= true;
+
+
+
+ if (begun) {
+ if (line.indexOf ("height=")!=-1) {
+ height = line.substring (line.indexOf ("height=")+8);
+ System.out.println ("inter h: " + height);
+ height = height.substring (0, height.indexOf ("\""));
+ set1 = true;
+
+ }
+
+ if (line.indexOf ("width=")!=-1) {
+ width = line.substring (line.indexOf ("width=")+7);
+ System.out.println ("inter w: " + width);
+ if (width.indexOf ("\"") != -1)
+ width = width.substring (0, width.indexOf ("\""));
+ set2 = true;
+ }
+ }
+
+ if (set1 && set2) {
+ br.close();
+ break;
+ }
+
+ if ( begun && (loc_end = line.indexOf(">")) != -1) {
+ br.close();
+ break;
+ }
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ }
+
+ */
+
+ public void createHtmlShell(String mxml) {
+
+
+ System.out.println ("Creating the HTML files!!!! with " + mxml);
+
+
+ mxml=FileUtils.normalizeDir(mxml);
+
+ Properties p = populatePropertiesFile (mxml);
+ String pVals = populateKeyValuePairs (mxml);
+ System.out.println ("Properties file contained: " + pVals);
+
+ // ParseMxmlHeader pml = new ParseMxmlHeader();
+ // pml.setWidthAndHeight (mxml);
+
+ String dir=mxml.substring(0,mxml.lastIndexOf("/"));
+ String file=mxml.substring(mxml.lastIndexOf("/")+1);
+ String name=file.substring(0,file.lastIndexOf("."));
+ String swf=name+".swf";
+
+
+ try {
+
+ System.out.println ("Copying from: " + htmlDir + "history to: " + dir + "/history");
+ FileUtils.copyDir(htmlDir + "history", dir + "/history");
+ /// addded
+ // was: AC_OETags.js
+ System.out.println ("Copying from: " + htmlDir + "swfobject.js");
+ FileUtils.copyFile( htmlDir + "swfobject.js", dir+"/swfobject.js" );
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ try {
+ // new load, edit, write.
+ BufferedInputStream bis = new BufferedInputStream (new FileInputStream ( htmlDir + "index.template.html"));
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+ int av = 0;
+ byte [] b = null;
+
+ String contents = null;
+
+ while ((av = bis.available()) > 0) {
+ b = new byte[av];
+ bis.read (b, 0, av);
+ bos.write (b, 0, av);
+
+ }
+
+ contents = bos.toString();
+
+ // replace our targets.
+ contents = contents.replaceAll ("\\$\\{useBrowserHistory\\}", "--");
+ contents = contents.replaceAll ("\\$\\{application\\}", name);
+ contents = contents.replaceAll ("\\$\\{title\\}", name);
+
+ // contents = contents.replaceAll ("\\$\\{height\\}", height);
+ // contents = contents.replaceAll ("\\$\\{width\\}", width);
+ System.out.println ("HTML SHELL, width and height: " + pml.width + " " + pml.height);
+ contents = contents.replaceAll ("\\$\\{height\\}", pml.height);
+ contents = contents.replaceAll ("\\$\\{width\\}", pml.width);
+ contents = contents.replaceAll ("\\$\\{bgcolor\\}", "0x000000");
+ contents = contents.replaceAll ("\\$\\{version_major\\}", "9");
+ contents = contents.replaceAll ("\\$\\{version_minor\\}", "0");
+ contents = contents.replaceAll ("\\$\\{version_revision\\}", "0");
+ contents = contents.replaceAll ("\\$\\{swf\\}", name );
+
+ /// push FlashVars if we've got any
+ if (p.getProperty("flashvars") != null && (p.getProperty("flashvars").length() > 0)) {
+ /// teh second one has an equals sign
+ contents = contents.replaceAll ("height=", "FlashVars=\"" + p.getProperty ("flashvars") + "\" " + "height=");
+ // the first one doesn't
+ contents = contents.replaceAll ("\"height\"", "\"FlashVars\", \"" + p.getProperty ("flashvars") + "\", " + "\"height\"");
+ contents = contents.replaceAll ("var flashvars = \\{\\};", "var flashvars = \\{\\}; " + pVals);
+
+ }
+
+ /// write it to our target html file.
+ String fileTo = dir + "/" + name + ".html";
+ System.out.println ("WRITING " + fileTo);
+ BufferedOutputStream bus = new BufferedOutputStream (new FileOutputStream(fileTo));
+
+ bus.write (contents.getBytes(), 0, contents.length());
+ bus.flush();
+ bus.close();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+
+
+
+
+
+ }
+
+ private static final String compile_arg_ending = ".compile";
+
+ public String checkAndAddUserArgs (String mxml, String args) {
+
+ String comp_mxml = transformName(mxml, compile_arg_ending);
+
+ Map.Entry me = null;
+
+ if (new File(comp_mxml).exists()) {
+ System.out.println ("Saw the .compile file");
+
+ Properties p = new Properties();
+ try {
+ // Since we may get duplicate compile key directives, we
+ // have to combine them.
+ // can't really use load
+
+ String line = null;
+ String key = null;
+ String val = null;
+ String tmp = null;
+ BufferedReader be = new BufferedReader (new FileReader (comp_mxml));
+
+ /// Simplified version: just throw the arg on there, as is
+ while ( (line=be.readLine()) != null) {
+ if (!line.startsWith ("#"))
+ args += " "+ doSubstitute(line);
+ }
+
+ be.close();
+
+
+ } catch (Exception e) {
+ System.err.println ("Exception on trying to load user .compile file, maybe ok");
+ // e.printStackTrace();
+
+
+ }
+ }
+
+ return args;
+
+
+ }
+
+
+ public static String transformName (String file, String addition) {
+
+ if (file.indexOf (".") != -1) {
+ return file.substring (0, file.lastIndexOf (".")) + addition;
+
+ }
+
+ return file;
+
+
+ }
+
+ public String doSubstitute (String line) {
+
+ String sdk_dir=System.getProperty("sdk.dir");
+
+ String fwk_dir=System.getProperty("framework.dir");
+
+ String mustella_dir = System.getProperty ("mustella.dir");
+
+ if (sdk_dir != null && !sdk_dir.equals("")) {
+
+ if ( line.indexOf ("${sdk.dir}") != -1) {
+ line = line.replaceAll ("\\$\\{sdk.dir\\}", FileUtils.normalizeDir(sdk_dir));
+ }
+ }
+
+
+ if (mustella_dir != null && !mustella_dir.equals("")) {
+ if ( line.indexOf ("${mustella.dir}") != -1) {
+ line = line.replaceAll ("\\$\\{mustella.dir\\}", FileUtils.normalizeDir(mustella_dir));
+ }
+
+ }
+
+ if (fwk_dir != null && !fwk_dir.equals("")) {
+ if ( line.indexOf ("${framework.dir}") != -1) {
+ line = line.replaceAll ("\\$\\{framework.dir\\}", FileUtils.normalizeDir(fwk_dir));
+ }
+
+ }
+
+
+ return line;
+
+ }
+
+
+ public static void main (String[] args) throws Exception {
+
+
+
+ }
+
+
+
+}
Propchange: incubator/flex/trunk/mustella/java/src/mustella/HtmlTestAdapter.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/MobileConfigWriter.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/MobileConfigWriter.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/MobileConfigWriter.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/MobileConfigWriter.java Wed May 2 22:44:38 2012
@@ -0,0 +1,245 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+
+import java.awt.image.*;
+import java.io.*;
+import java.lang.reflect.*;
+import java.net.*;
+import java.util.*;
+import java.text.SimpleDateFormat;
+
+import javax.imageio.*;
+//import javax.mail.*;
+//import javax.mail.internet.*;
+
+import utils.MobileUtil;
+import utils.FileUtils;
+//import utils.HtmlNotify;
+import utils.StringUtils;
+import utils.P12Reader;
+import com.adobe.air.apk.APKPackager;
+import com.adobe.air.Listener;
+import com.adobe.air.Message;
+import com.adobe.air.SDK;
+
+public class MobileConfigWriter {
+
+ private static final String MOBILE_DIR = "mustella/tests/mobile";
+ private static final String AS_CLASS = "MobileConfig";
+ private static int adl_extras_XscreenDPI = -1;
+ private static String[] adl_extras = null;
+
+ static {
+ try {
+ adl_extras = System.getProperty( "adl_extras" ).split( " " );
+
+ for( int i = 0; i < adl_extras.length; ++i ){
+ if( adl_extras[ i ].compareToIgnoreCase( "-XscreenDPI" ) == 0 ){
+ adl_extras_XscreenDPI = new Integer( adl_extras[ i + 1 ] ).intValue();
+ }
+ }
+
+ } catch (Exception e) {
+ adl_extras_XscreenDPI = -1;
+ e.printStackTrace();
+ }
+
+ //System.out.println("adl_extras_XscreenDPI: " + adl_extras_XscreenDPI);
+ }
+
+ public MobileConfigWriter(){
+ }
+
+
+ static public String write( String device_name, String target_os, String os_version, String frameworksDir, int run_id, String exclude_filename ){
+ File theFile = null;
+ File theDir = null;
+ File excludeFile = null;
+ File[] files = null;
+ String theClassString = null;
+ String theFileString = null;
+ String theDirString = null;
+ Calendar cal = null;
+ FileWriter fw = null;
+ String classContents = null;
+ String ret = null;
+ int i = 0;
+
+ try {
+ theClassString = AS_CLASS;
+ theFileString = theClassString + ".as";
+ theDirString = frameworksDir;
+
+ theFile = new File( theDirString + File.separator + theFileString);
+ theDir = new File( theDirString );
+
+ // Delete any old ones.
+ MobileConfigWriterFilter filter = new MobileConfigWriterFilter();
+ filter.fileToKeep = theFileString;
+ files = theDir.listFiles( filter );
+
+ if( files != null ){
+ for( i = 0; i < Array.getLength( files ); ++i ){
+ // System.out.println("deleting " + files[i].getCanonicalPath());
+ files[ i ].delete();
+ }
+ }
+
+ try{
+ excludeFile = new File( exclude_filename );
+ }catch(Exception e){
+ e.printStackTrace();
+ }
+
+ // Put the contents of the class to create in a string.
+ classContents = constructClass( device_name, target_os, os_version, theClassString, excludeFile, run_id );
+
+ // Write it.
+ fw = new FileWriter ( theFile );
+ fw.write ( classContents, 0, classContents.length());
+ fw.flush();
+ fw.close();
+ System.out.println ( "created " + theFile.toString() );
+
+ ret = theClassString;
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ return ret;
+ }
+
+
+ /**
+ * Returns a string which contains the text which will be written to the class.
+ **/
+ static private String constructClass( String device_name, String target_os, String os_version, String className, File excludeFile, int run_id ){
+ int i = 0;
+
+ String ret = "package {\n";
+ ret += "import flash.display.DisplayObject;\n";
+ ret += "import flash.system.Capabilities;\n";
+
+ if( target_os.compareToIgnoreCase( MobileUtil.IOS ) == 0 ||
+ target_os.compareToIgnoreCase( MobileUtil.QNX ) == 0) {
+ ret += "import flash.filesystem.*;\n";
+ }
+
+ ret += "[Mixin]\n";
+ ret += "/**\n";
+ ret += "* By including this mixin via CompileMustellaSwfs, we\n";
+ ret += "* can set up some variables for UnitTester to use for\n";
+ ret += "* an Android run.\n";
+ ret += "*/\n";
+ ret += "public class " + className + "\n";
+ ret += "{\n";
+ ret += " public static function init(root:DisplayObject):void\n";
+ ret += " {\n";
+
+ // ConditionalValue stuff
+ ret += " if( UnitTester.cv == null ){\n";
+ ret += " UnitTester.cv = new ConditionalValue();\n";
+ ret += " }";
+ ret += " UnitTester.cv.device = \"" + device_name + "\";\n";
+ ret += " UnitTester.cv.os = \"" + target_os + "\";\n";
+ ret += " UnitTester.cv.osVersion = \"" + os_version + "\";\n";
+ // If device, get the proper dpi bucket (160/240/320) for the device.
+ if( (target_os.compareToIgnoreCase(MobileUtil.MAC) == 0) || (target_os.compareToIgnoreCase(MobileUtil.WIN) == 0) ){
+ if( adl_extras_XscreenDPI == -1 ){
+ ret += " UnitTester.cv.deviceDensity = flash.system.Capabilities.screenDPI;\n";
+ }else{
+ ret += " UnitTester.cv.deviceDensity = Util.roundDeviceDensity( flash.system.Capabilities.screenDPI );\n";
+ }
+ }else{
+ ret += " UnitTester.cv.deviceDensity = " + Integer.toString(MobileUtil.getDeviceDensity(device_name)) + ";\n";
+ }
+
+ // Don't get this confused with the above. Maybe the above needs to be changed. The variable below always
+ // uses Capabilities.screenDPI.
+ ret += " UnitTester.cv.screenDPI = flash.system.Capabilities.screenDPI;\n";
+
+ ret += " //UnitTester.cv.deviceWidth = set by MultiResult;\n";
+ ret += " //UnitTester.cv.deviceHeight = set by MultiResult;\n";
+ ret += " //UnitTester.cv.color = this is not defined yet, but there are rumours it might be.\n";
+
+ // Other stuff
+ ret += " UnitTester.run_id = \"" + run_id + "\";\n";
+ ret += " UnitTester.excludeFile = \"" + excludeFile.getName() + "\";\n";
+
+ for( i = 0; i < Array.getLength( MobileUtil.DEVICES_USING_SDCARD ); ++i){
+ if( device_name.compareToIgnoreCase( MobileUtil.DEVICES_USING_SDCARD[ i ] ) == 0 ){
+ ret += " UnitTester.mustellaWriteLocation = \"" + MobileUtil.SDCARD_DIR + "\";\n";
+ ret += " UnitTester.writeBaselinesToDisk = true;\n";
+ }
+ }
+
+ if( target_os.compareToIgnoreCase( MobileUtil.IOS ) == 0 ){
+ ret += " UnitTester.mustellaWriteLocation = File.documentsDirectory.nativePath;\n";
+ ret += " UnitTester.writeBaselinesToDisk = true;\n";
+ }
+
+ if( target_os.compareToIgnoreCase( MobileUtil.QNX ) == 0 ){
+ ret += " UnitTester.mustellaWriteLocation = File.applicationStorageDirectory.nativePath;\n";
+ ret += " UnitTester.writeBaselinesToDisk = true;\n";
+ }
+
+ ret += " }\n";
+ ret += "}\n";
+ ret += "}\n";
+
+ return ret;
+ }
+
+
+ /**
+ * This is a filter which deletes extra .as files which this class creates.
+ **/
+ public static class MobileConfigWriterFilter implements FilenameFilter{
+
+ /**
+ * SWF to test
+ **/
+ public String fileToKeep = "";
+
+ /**
+ * constructor
+ **/
+ public void MobileConfigWriterFilter(){}
+
+ /**
+ * This is the one method to implement for the interface.
+ **/
+ public boolean accept( File dir, String name ){
+
+ File f = new File( dir, name );
+
+ if( (name.indexOf( AS_CLASS ) > -1) &&
+ (name.indexOf( ".as" ) > -1) &&
+ (name.compareToIgnoreCase( fileToKeep ) != 0 ) ){
+ return true;
+ }else{
+ return false;
+ }
+ }
+
+ } // end APKPackagerFilenameFilter class
+
+} // End MobileConfigWriter class
+
Propchange: incubator/flex/trunk/mustella/java/src/mustella/MobileConfigWriter.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/NanoHTTPD.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/NanoHTTPD.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/NanoHTTPD.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/NanoHTTPD.java Wed May 2 22:44:38 2012
@@ -0,0 +1,805 @@
+package mustella;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.PrintWriter;
+import java.net.ServerSocket;
+import java.net.Socket;
+import java.net.URLEncoder;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.StringTokenizer;
+import java.util.TimeZone;
+
+/**
+ * A simple, tiny, nicely embeddable HTTP 1.0 server in Java
+ *
+ * <p> NanoHTTPD version 1.14,
+ * Copyright © 2001,2005-2010 Jarno Elonen (elonen@iki.fi, http://iki.fi/elonen/)
+ *
+ * <p><b>Features + limitations: </b><ul>
+ *
+ * <li> Only one Java file </li>
+ * <li> Java 1.1 compatible </li>
+ * <li> Released as open source, Modified BSD licence </li>
+ * <li> No fixed config files, logging, authorization etc. (Implement yourself if you need them.) </li>
+ * <li> Supports parameter parsing of GET and POST methods </li>
+ * <li> Supports both dynamic content and file serving </li>
+ * <li> Never caches anything </li>
+ * <li> Doesn't limit bandwidth, request time or simultaneous connections </li>
+ * <li> Default code serves files and shows all HTTP parameters and headers</li>
+ * <li> File server supports directory listing, index.html and index.htm </li>
+ * <li> File server does the 301 redirection trick for directories without '/'</li>
+ * <li> File server supports simple skipping for files (continue download) </li>
+ * <li> File server uses current directory as a web root </li>
+ * <li> File server serves also very long files without memory overhead </li>
+ * <li> Contains a built-in list of most common mime types </li>
+ * <li> All header names are converted lowercase so they don't vary between browsers/clients </li>
+ *
+ * </ul>
+ *
+ * <p><b>Ways to use: </b><ul>
+ *
+ * <li> Run as a standalone app, serves files from current directory and shows requests</li>
+ * <li> Subclass serve() and embed to your own program </li>
+ * <li> Call serveFile() from serve() with your own base directory </li>
+ *
+ * </ul>
+ *
+ * See the end of the source file for distribution license
+ * (Modified BSD licence)
+ */
+public class NanoHTTPD
+{
+ // ==================================================
+ // API parts
+ // ==================================================
+
+
+ public static String docroot = "c:/depot/flex/qa/sdk/testsuites/mustella/tests/";
+
+ public static boolean callExit = false;
+
+ public static void setRoot (String root) {
+ docroot = root;
+ }
+
+ static {
+
+ try {
+ String tmp = System.getProperty ("mustella.dir");
+ if (tmp != null && !tmp.startsWith ("${"))
+ docroot = tmp + "/tests";
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+
+
+ }
+
+ /**
+ * Override this to customize the server.<p>
+ *
+ * (By default, this delegates to serveFile() and allows directory listing.)
+ *
+ * @parm uri Percent-decoded URI without parameters, for example "/index.cgi"
+ * @parm method "GET", "POST" etc.
+ * @parm parms Parsed, percent decoded parameters from URI and, in case of POST, data.
+ * @parm header Header entries, percent decoded
+ * @return HTTP response, see class Response for details
+ */
+ public Response serve( String uri, String method, Properties header, Properties parms )
+ {
+ System.out.println( method + " '" + uri + "' " );
+
+ Enumeration e = header.propertyNames();
+ while ( e.hasMoreElements())
+ {
+ String value = (String)e.nextElement();
+ // System.out.println( " HDR: '" + value + "' = '" + header.getProperty( value ) + "'" );
+ }
+ e = parms.propertyNames();
+ while ( e.hasMoreElements())
+ {
+ String value = (String)e.nextElement();
+ // System.out.println( " PRM: '" + value + "' = '" + parms.getProperty( value ) + "'" );
+ }
+
+ // Fix this, always calling from here, call from
+ // mustella.dir/tests
+ // take that as a static
+ return serveFile( uri, header, new File(docroot), true );
+ }
+
+ /**
+ * HTTP response.
+ * Return one of these from serve().
+ */
+ public class Response
+ {
+ /**
+ * Default constructor: response = HTTP_OK, data = mime = 'null'
+ */
+ public Response()
+ {
+ this.status = HTTP_OK;
+ }
+
+ /**
+ * Basic constructor.
+ */
+ public Response( String status, String mimeType, InputStream data )
+ {
+ this.status = status;
+ this.mimeType = mimeType;
+ this.data = data;
+ }
+
+ /**
+ * Convenience method that makes an InputStream out of
+ * given text.
+ */
+ public Response( String status, String mimeType, String txt )
+ {
+ this.status = status;
+ this.mimeType = mimeType;
+ this.data = new ByteArrayInputStream( txt.getBytes());
+ }
+
+ /**
+ * Adds given line to the header.
+ */
+ public void addHeader( String name, String value )
+ {
+ header.put( name, value );
+ }
+
+ /**
+ * HTTP status code after processing, e.g. "200 OK", HTTP_OK
+ */
+ public String status;
+
+ /**
+ * MIME type of content, e.g. "text/html"
+ */
+ public String mimeType;
+
+ /**
+ * Data of the response, may be null.
+ */
+ public InputStream data;
+
+ /**
+ * Headers for the HTTP response. Use addHeader()
+ * to add lines.
+ */
+ public Properties header = new Properties();
+ }
+
+ /**
+ * Some HTTP response status codes
+ */
+ public static final String
+ HTTP_OK = "200 OK",
+ HTTP_REDIRECT = "301 Moved Permanently",
+ HTTP_FORBIDDEN = "403 Forbidden",
+ HTTP_NOTFOUND = "404 Not Found",
+ HTTP_BADREQUEST = "400 Bad Request",
+ HTTP_INTERNALERROR = "500 Internal Server Error",
+ HTTP_NOTIMPLEMENTED = "501 Not Implemented";
+
+ /**
+ * Common mime types for dynamic content
+ */
+ public static final String
+ MIME_PLAINTEXT = "text/plain",
+ MIME_HTML = "text/html",
+ MIME_DEFAULT_BINARY = "application/octet-stream";
+
+ // ==================================================
+ // Socket & server code
+ // ==================================================
+
+ public boolean running = true;
+
+ /**
+ * Starts a HTTP server to given port.<p>
+ * Throws an IOException if the socket is already in use
+ */
+ public NanoHTTPD( int port ) throws IOException
+ {
+ myTcpPort = port;
+ myServerSocket = new ServerSocket( myTcpPort );
+ System.out.println ("Server up on " + myTcpPort);
+ myThread = new Thread( new Runnable()
+
+
+ {
+ public void run()
+ {
+ try
+ {
+ while( running )
+ new HTTPSession( myServerSocket.accept());
+ }
+ catch ( IOException ioe )
+ {}
+ }
+ });
+ myThread.setDaemon( true );
+ myThread.start();
+ }
+
+ /**
+ * Stops the server.
+ */
+ public void stop()
+ {
+ running = false;
+ try
+ {
+ myServerSocket.close();
+ myThread.join();
+ }
+ catch ( Exception ioe ) {
+ ioe.printStackTrace();
+ }
+
+ /// force it to open the socket, just in case
+ System.out.println ("Server coming down on " + myTcpPort);
+ if (callExit) {
+ System.out.println ("Calling exit");
+ System.exit (0);
+ }
+ }
+
+
+ /**
+ * Starts as a standalone file server and waits for Enter.
+ */
+ public static void main( String[] args )
+ {
+
+ callExit = true;
+ // System.out.println( "NanoHTTPD 1.14 (C) 2001,2005-2010 Jarno Elonen\n" + "(Command line options: [port] [--licence])\n" );
+
+ // Show licence if requested
+ int lopt = -1;
+ for ( int i=0; i<args.length; ++i )
+ if ( args[i].toLowerCase().endsWith( "licence" ))
+ {
+ lopt = i;
+ System.out.println( LICENCE + "\n" );
+ }
+
+ // Change port if requested
+ int port = 80;
+ if ( args.length > 0 && lopt != 0 )
+ port = Integer.parseInt( args[0] );
+
+ if ( args.length > 1 &&
+ args[1].toLowerCase().endsWith( "licence" ))
+ System.out.println( LICENCE + "\n" );
+
+ NanoHTTPD nh = null;
+ try
+ {
+ nh = new NanoHTTPD( port );
+ }
+ catch( IOException ioe )
+ {
+ System.err.println( "Couldn't start server:\n" + ioe );
+ System.exit( -1 );
+ }
+ nh.myFileDir = new File("");
+
+ System.out.println( "Now serving files on port " + port + " from \"" + new File(docroot) + "\"" );
+ System.out.println( "Hit Enter to stop.\n" );
+
+ try { System.in.read(); } catch( Throwable t ) {};
+ }
+
+ /**
+ * Handles one session, i.e. parses the HTTP request
+ * and returns the response.
+ */
+ private class HTTPSession implements Runnable
+ {
+ public HTTPSession( Socket s )
+ {
+ mySocket = s;
+ Thread t = new Thread( this );
+ t.setDaemon( true );
+ t.start();
+ }
+
+ public void run()
+ {
+ try
+ {
+ InputStream is = mySocket.getInputStream();
+ if ( is == null) return;
+ BufferedReader in = new BufferedReader( new InputStreamReader( is ));
+
+ // Read the request line
+ String inLine = in.readLine();
+ if (inLine == null) return;
+ StringTokenizer st = new StringTokenizer( inLine );
+ if ( !st.hasMoreTokens())
+ sendError( HTTP_BADREQUEST, "BAD REQUEST: Syntax error. Usage: GET /example/file.html" );
+
+ String method = st.nextToken();
+
+ if ( !st.hasMoreTokens())
+ sendError( HTTP_BADREQUEST, "BAD REQUEST: Missing URI. Usage: GET /example/file.html" );
+
+ String uri = st.nextToken();
+
+ // Decode parameters from the URI
+ Properties parms = new Properties();
+ int qmi = uri.indexOf( '?' );
+ if ( qmi >= 0 )
+ {
+ decodeParms( uri.substring( qmi+1 ), parms );
+ uri = decodePercent( uri.substring( 0, qmi ));
+ }
+ else uri = decodePercent(uri);
+
+
+ // If there's another token, it's protocol version,
+ // followed by HTTP headers. Ignore version but parse headers.
+ // NOTE: this now forces header names uppercase since they are
+ // case insensitive and vary by client.
+ Properties header = new Properties();
+ if ( st.hasMoreTokens())
+ {
+ String line = in.readLine();
+ while ( line.trim().length() > 0 )
+ {
+ int p = line.indexOf( ':' );
+ header.put( line.substring(0,p).trim().toLowerCase(), line.substring(p+1).trim());
+ line = in.readLine();
+ }
+ }
+
+ // If the method is POST, there may be parameters
+ // in data section, too, read it:
+ if ( method.equalsIgnoreCase( "POST" ))
+ {
+ long size = 0x7FFFFFFFFFFFFFFFl;
+ String contentLength = header.getProperty("content-length");
+ if (contentLength != null)
+ {
+ try { size = Integer.parseInt(contentLength); }
+ catch (NumberFormatException ex) {}
+ }
+ String postLine = "";
+ char buf[] = new char[512];
+ int read = in.read(buf);
+ while ( read >= 0 && size > 0 && !postLine.endsWith("\r\n") )
+ {
+ size -= read;
+ postLine += String.valueOf(buf, 0, read);
+ if ( size > 0 )
+ read = in.read(buf);
+ }
+ postLine = postLine.trim();
+ decodeParms( postLine, parms );
+ }
+
+ // Ok, now do the serve()
+ Response r = serve( uri, method, header, parms );
+ if ( r == null )
+ sendError( HTTP_INTERNALERROR, "SERVER INTERNAL ERROR: Serve() returned a null response." );
+ else
+ sendResponse( r.status, r.mimeType, r.header, r.data );
+
+ in.close();
+ }
+ catch ( IOException ioe )
+ {
+ try
+ {
+ sendError( HTTP_INTERNALERROR, "SERVER INTERNAL ERROR: IOException: " + ioe.getMessage());
+ }
+ catch ( Throwable t ) {}
+ }
+ catch ( InterruptedException ie )
+ {
+ // Thrown by sendError, ignore and exit the thread.
+ }
+ }
+
+ /**
+ * Decodes the percent encoding scheme. <br/>
+ * For example: "an+example%20string" -> "an example string"
+ */
+ private String decodePercent( String str ) throws InterruptedException
+ {
+ try
+ {
+ StringBuffer sb = new StringBuffer();
+ for( int i=0; i<str.length(); i++ )
+ {
+ char c = str.charAt( i );
+ switch ( c )
+ {
+ case '+':
+ sb.append( ' ' );
+ break;
+ case '%':
+ sb.append((char)Integer.parseInt( str.substring(i+1,i+3), 16 ));
+ i += 2;
+ break;
+ default:
+ sb.append( c );
+ break;
+ }
+ }
+ return new String( sb.toString().getBytes());
+ }
+ catch( Exception e )
+ {
+ sendError( HTTP_BADREQUEST, "BAD REQUEST: Bad percent-encoding." );
+ return null;
+ }
+ }
+
+ /**
+ * Decodes parameters in percent-encoded URI-format
+ * ( e.g. "name=Jack%20Daniels&pass=Single%20Malt" ) and
+ * adds them to given Properties. NOTE: this doesn't support multiple
+ * identical keys due to the simplicity of Properties -- if you need multiples,
+ * you might want to replace the Properties with a Hastable of Vectors or such.
+ */
+ private void decodeParms( String parms, Properties p )
+ throws InterruptedException
+ {
+ if ( parms == null )
+ return;
+
+ StringTokenizer st = new StringTokenizer( parms, "&" );
+ while ( st.hasMoreTokens())
+ {
+ String e = st.nextToken();
+ int sep = e.indexOf( '=' );
+ if ( sep >= 0 )
+ p.put( decodePercent( e.substring( 0, sep )).trim(),
+ decodePercent( e.substring( sep+1 )));
+ }
+ }
+
+ /**
+ * Returns an error message as a HTTP response and
+ * throws InterruptedException to stop furhter request processing.
+ */
+ private void sendError( String status, String msg ) throws InterruptedException
+ {
+ sendResponse( status, MIME_PLAINTEXT, null, new ByteArrayInputStream( msg.getBytes()));
+ throw new InterruptedException();
+ }
+
+ /**
+ * Sends given response to the socket.
+ */
+ private void sendResponse( String status, String mime, Properties header, InputStream data )
+ {
+ try
+ {
+ if ( status == null )
+ throw new Error( "sendResponse(): Status can't be null." );
+
+ OutputStream out = mySocket.getOutputStream();
+ PrintWriter pw = new PrintWriter( out );
+ pw.print("HTTP/1.0 " + status + " \r\n");
+
+ if ( mime != null )
+ pw.print("Content-Type: " + mime + "\r\n");
+
+ if ( header == null || header.getProperty( "Date" ) == null )
+ pw.print( "Date: " + gmtFrmt.format( new Date()) + "\r\n");
+
+ if ( header != null )
+ {
+ Enumeration e = header.keys();
+ while ( e.hasMoreElements())
+ {
+ String key = (String)e.nextElement();
+ String value = header.getProperty( key );
+ pw.print( key + ": " + value + "\r\n");
+ }
+ }
+
+ pw.print("\r\n");
+ pw.flush();
+
+ if ( data != null )
+ {
+ byte[] buff = new byte[2048];
+ while (true)
+ {
+ int read = data.read( buff, 0, 2048 );
+ if (read <= 0)
+ break;
+ out.write( buff, 0, read );
+ }
+ }
+ out.flush();
+ out.close();
+ if ( data != null )
+ data.close();
+ }
+ catch( IOException ioe )
+ {
+ // Couldn't write? No can do.
+ try { mySocket.close(); } catch( Throwable t ) {}
+ }
+ }
+
+ private Socket mySocket;
+ };
+
+ /**
+ * URL-encodes everything between "/"-characters.
+ * Encodes spaces as '%20' instead of '+'.
+ */
+ private String encodeUri( String uri )
+ {
+ String newUri = "";
+ StringTokenizer st = new StringTokenizer( uri, "/ ", true );
+ while ( st.hasMoreTokens())
+ {
+ String tok = st.nextToken();
+ if ( tok.equals( "/" ))
+ newUri += "/";
+ else if ( tok.equals( " " ))
+ newUri += "%20";
+ else
+ {
+ newUri += URLEncoder.encode( tok );
+ // For Java 1.4 you'll want to use this instead:
+ // try { newUri += URLEncoder.encode( tok, "UTF-8" ); } catch ( UnsupportedEncodingException uee )
+ }
+ }
+ return newUri;
+ }
+
+ private int myTcpPort;
+ private final ServerSocket myServerSocket;
+ private Thread myThread;
+
+ File myFileDir;
+
+ // ==================================================
+ // File server code
+ // ==================================================
+
+ /**
+ * Serves file from homeDir and its' subdirectories (only).
+ * Uses only URI, ignores all headers and HTTP parameters.
+ */
+ public Response serveFile( String uri, Properties header, File homeDir,
+ boolean allowDirectoryListing )
+ {
+
+ if (uri.equals ("/shutdown")) {
+ callExit =true;
+ stop();
+ }
+
+ System.out.println ("serveFile with: " + homeDir);
+ // Make sure we won't die of an exception later
+ if ( !homeDir.isDirectory())
+ return new Response( HTTP_INTERNALERROR, MIME_PLAINTEXT,
+ "INTERNAL ERRROR: serveFile(): given homeDir is not a directory." );
+
+ // Remove URL arguments
+ uri = uri.trim().replace( File.separatorChar, '/' );
+ if ( uri.indexOf( '?' ) >= 0 )
+ uri = uri.substring(0, uri.indexOf( '?' ));
+
+ // Prohibit getting out of current directory
+ if ( uri.startsWith( ".." ) || uri.endsWith( ".." ) || uri.indexOf( "../" ) >= 0 )
+ return new Response( HTTP_FORBIDDEN, MIME_PLAINTEXT,
+ "FORBIDDEN: Won't serve ../ for security reasons." );
+
+ File f = new File( homeDir, uri );
+ if ( !f.exists())
+ return new Response( HTTP_NOTFOUND, MIME_PLAINTEXT,
+ "Error 404, file not found." );
+
+ // List the directory, if necessary
+ if ( f.isDirectory())
+ {
+ // Browsers get confused without '/' after the
+ // directory, send a redirect.
+ if ( !uri.endsWith( "/" ))
+ {
+ uri += "/";
+ Response r = new Response( HTTP_REDIRECT, MIME_HTML,
+ "<html><body>Redirected: <a href=\"" + uri + "\">" +
+ uri + "</a></body></html>");
+ r.addHeader( "Location", uri );
+ return r;
+ }
+
+ // First try index.html and index.htm
+ if ( new File( f, "index.html" ).exists())
+ f = new File( homeDir, uri + "/index.html" );
+ else if ( new File( f, "index.htm" ).exists())
+ f = new File( homeDir, uri + "/index.htm" );
+
+ // No index file, list the directory
+ else if ( allowDirectoryListing )
+ {
+ String[] files = f.list();
+ String msg = "<html><body><h1>Directory " + uri + "</h1><br/>";
+
+ if ( uri.length() > 1 )
+ {
+ String u = uri.substring( 0, uri.length()-1 );
+ int slash = u.lastIndexOf( '/' );
+ if ( slash >= 0 && slash < u.length())
+ msg += "<b><a href=\"" + uri.substring(0, slash+1) + "\">..</a></b><br/>";
+ }
+
+ for ( int i=0; i<files.length; ++i )
+ {
+ File curFile = new File( f, files[i] );
+ boolean dir = curFile.isDirectory();
+ if ( dir )
+ {
+ msg += "<b>";
+ files[i] += "/";
+ }
+
+ msg += "<a href=\"" + encodeUri( uri + files[i] ) + "\">" +
+ files[i] + "</a>";
+
+ // Show file size
+ if ( curFile.isFile())
+ {
+ long len = curFile.length();
+ msg += " <font size=2>(";
+ if ( len < 1024 )
+ msg += curFile.length() + " bytes";
+ else if ( len < 1024 * 1024 )
+ msg += curFile.length()/1024 + "." + (curFile.length()%1024/10%100) + " KB";
+ else
+ msg += curFile.length()/(1024*1024) + "." + curFile.length()%(1024*1024)/10%100 + " MB";
+
+ msg += ")</font>";
+ }
+ msg += "<br/>";
+ if ( dir ) msg += "</b>";
+ }
+ return new Response( HTTP_OK, MIME_HTML, msg );
+ }
+ else
+ {
+ return new Response( HTTP_FORBIDDEN, MIME_PLAINTEXT,
+ "FORBIDDEN: No directory listing." );
+ }
+ }
+
+ try
+ {
+ // Get MIME type from file name extension, if possible
+ String mime = null;
+ int dot = f.getCanonicalPath().lastIndexOf( '.' );
+ if ( dot >= 0 )
+ mime = (String)theMimeTypes.get( f.getCanonicalPath().substring( dot + 1 ).toLowerCase());
+ if ( mime == null )
+ mime = MIME_DEFAULT_BINARY;
+
+ // Support (simple) skipping:
+ long startFrom = 0;
+ String range = header.getProperty( "range" );
+ if ( range != null )
+ {
+ if ( range.startsWith( "bytes=" ))
+ {
+ range = range.substring( "bytes=".length());
+ int minus = range.indexOf( '-' );
+ if ( minus > 0 )
+ range = range.substring( 0, minus );
+ try {
+ startFrom = Long.parseLong( range );
+ }
+ catch ( NumberFormatException nfe ) {}
+ }
+ }
+
+ FileInputStream fis = new FileInputStream( f );
+ fis.skip( startFrom );
+ Response r = new Response( HTTP_OK, mime, fis );
+ r.addHeader( "Content-length", "" + (f.length() - startFrom));
+ r.addHeader( "Content-range", "" + startFrom + "-" +
+ (f.length()-1) + "/" + f.length());
+ return r;
+ }
+ catch( IOException ioe )
+ {
+ return new Response( HTTP_FORBIDDEN, MIME_PLAINTEXT, "FORBIDDEN: Reading file failed." );
+ }
+ }
+
+ /**
+ * Hashtable mapping (String)FILENAME_EXTENSION -> (String)MIME_TYPE
+ */
+ private static Hashtable theMimeTypes = new Hashtable();
+ static
+ {
+ StringTokenizer st = new StringTokenizer(
+ "htm text/html "+
+ "html text/html "+
+ "txt text/plain "+
+ "asc text/plain "+
+ "gif image/gif "+
+ "jpg image/jpeg "+
+ "jpeg image/jpeg "+
+ "png image/png "+
+ "mp3 audio/mpeg "+
+ "m3u audio/mpeg-url " +
+ "pdf application/pdf "+
+ "doc application/msword "+
+ "ogg application/x-ogg "+
+ "zip application/octet-stream "+
+ "exe application/octet-stream "+
+ "class application/octet-stream " );
+ while ( st.hasMoreTokens())
+ theMimeTypes.put( st.nextToken(), st.nextToken());
+ }
+
+ /**
+ * GMT date formatter
+ */
+ private static java.text.SimpleDateFormat gmtFrmt;
+ static
+ {
+ gmtFrmt = new java.text.SimpleDateFormat( "E, d MMM yyyy HH:mm:ss 'GMT'", Locale.US);
+ gmtFrmt.setTimeZone(TimeZone.getTimeZone("GMT"));
+ }
+
+ /**
+ * The distribution licence
+ */
+ private static final String LICENCE =
+ "Copyright (C) 2001,2005-2010 by Jarno Elonen <el...@iki.fi>\n"+
+ "\n"+
+ "Redistribution and use in source and binary forms, with or without\n"+
+ "modification, are permitted provided that the following conditions\n"+
+ "are met:\n"+
+ "\n"+
+ "Redistributions of source code must retain the above copyright notice,\n"+
+ "this list of conditions and the following disclaimer. Redistributions in\n"+
+ "binary form must reproduce the above copyright notice, this list of\n"+
+ "conditions and the following disclaimer in the documentation and/or other\n"+
+ "materials provided with the distribution. The name of the author may not\n"+
+ "be used to endorse or promote products derived from this software without\n"+
+ "specific prior written permission. \n"+
+ " \n"+
+ "THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n"+
+ "IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n"+
+ "OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n"+
+ "IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n"+
+ "INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n"+
+ "NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n"+
+ "DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n"+
+ "THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n"+
+ "(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n"+
+ "OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.";
+}
+
Propchange: incubator/flex/trunk/mustella/java/src/mustella/NanoHTTPD.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: incubator/flex/trunk/mustella/java/src/mustella/ParseMxmlHeader.java
URL: http://svn.apache.org/viewvc/incubator/flex/trunk/mustella/java/src/mustella/ParseMxmlHeader.java?rev=1333232&view=auto
==============================================================================
--- incubator/flex/trunk/mustella/java/src/mustella/ParseMxmlHeader.java (added)
+++ incubator/flex/trunk/mustella/java/src/mustella/ParseMxmlHeader.java Wed May 2 22:44:38 2012
@@ -0,0 +1,117 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 mustella;
+import utils.*;
+import utils.FileUtils;
+
+import java.io.File;
+import java.util.regex.*;
+import java.io.BufferedReader;
+import java.io.FileReader;
+import java.io.FileInputStream;
+import java.io.BufferedInputStream;
+import java.io.BufferedOutputStream;
+import java.io.FileOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.util.*;
+
+/**
+ * User: bolaghlin,
+ */
+public class ParseMxmlHeader extends Thread {
+
+ public String height = "395";
+ public String width = "501";
+
+
+ public void setWidthAndHeight(String mxmlFile) {
+
+ try {
+
+ String line = null;
+ BufferedReader br = new BufferedReader (new FileReader (mxmlFile));
+ /// we will not go far into a file to get this
+ int count = 0 ;
+
+ int loc = -1;
+ int loc_end = -1;
+
+ boolean begun = false;
+
+ boolean setH = false;
+ boolean setW = false;
+
+ while ( (line=br.readLine()) != null) {
+ if ( (loc = line.indexOf("Application")) != -1)
+ begun= true;
+
+
+
+ if (begun) {
+ if (line.indexOf ("height=")!=-1) {
+ height = line.substring (line.indexOf ("height=")+8);
+ System.out.println ("inter h: " + height);
+ height = height.substring (0, height.indexOf ("\""));
+ setH = true;
+
+ }
+
+ if (line.indexOf ("width=")!=-1) {
+ width = line.substring (line.indexOf ("width=")+7);
+ System.out.println ("inter w: " + width);
+ if (width.indexOf ("\"") != -1)
+ width = width.substring (0, width.indexOf ("\""));
+ setW = true;
+ }
+ }
+
+ if (setH && setW) {
+ br.close();
+ break;
+ }
+
+ if ( begun && (loc_end = line.indexOf(">")) != -1) {
+ br.close();
+
+ if (!setH)
+ height=SwfLoaderTestAdapter.standard_height;
+ if (!setW)
+ width=SwfLoaderTestAdapter.standard_width;
+ break;
+ }
+ }
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+
+ }
+
+
+ public static void main (String[] args) {
+
+ ParseMxmlHeader p = new ParseMxmlHeader();
+ p.setWidthAndHeight(args[0]);
+
+ System.out.println ("width="+p.width + " height=" + p.height);
+ }
+
+
+}
Propchange: incubator/flex/trunk/mustella/java/src/mustella/ParseMxmlHeader.java
------------------------------------------------------------------------------
svn:eol-style = native