1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.gwe.app.explorer;
18
19 import java.io.FileInputStream;
20 import java.io.FileNotFoundException;
21 import java.io.InputStream;
22 import java.util.ArrayList;
23 import java.util.Collection;
24 import java.util.HashSet;
25 import java.util.List;
26 import java.util.Map;
27 import java.util.Set;
28 import java.util.TreeMap;
29 import java.util.TreeSet;
30
31 import org.gwe.p2elv2.functions.PFConst;
32 import org.gwe.p2elv2.functions.PFCount;
33 import org.gwe.p2elv2.functions.PFDir;
34 import org.gwe.p2elv2.functions.PFLines;
35 import org.gwe.p2elv2.functions.PFMD5Hex;
36 import org.gwe.p2elv2.functions.PFMath;
37 import org.gwe.p2elv2.functions.PFRange;
38 import org.gwe.p2elv2.functions.PFRegExp;
39 import org.gwe.p2elv2.functions.PFUUID;
40 import org.gwe.p2elv2.functions.PFXPath;
41 import org.gwe.p2elv2.model.PVariable;
42 import org.gwe.persistence.model.JobInfo;
43 import org.gwe.persistence.model.OrderInfo;
44 import org.gwe.persistence.model.order.p2el.POrderDescriptor;
45
46 import com.thoughtworks.xstream.XStream;
47 import com.thoughtworks.xstream.io.xml.DomDriver;
48
49
50
51
52
53 public class VarsModelRenderer {
54
55 public static int getVarIndex(String target, List<String> varNames) {
56 for (int idx = 0; idx < varNames.size(); idx++)
57 if (target.equals(varNames.get(idx)))
58 return idx;
59
60 return -1;
61 }
62
63 public String renderJS(OrderInfo order) {
64 StringBuffer result = new StringBuffer();
65 List<String> varNames = order.getDescriptor().getVarNames();
66 result.append(createJSArray("var varNames", varNames));
67 List<JobInfo> jobs = order.getJobs();
68 result.append("var varValues = [];\n");
69 for (JobInfo job : jobs) {
70 StringBuffer jobJSArray = createJSArray("varValues[" + (job.getJobNum() - 1) + "]", getValues(job, varNames));
71 result.append(jobJSArray);
72 }
73
74 result.append("var varDependencies = [];\n");
75 VarsDependencies varsDep = new VarsDependencies(order);
76 for (int idx = 0; idx < varNames.size(); idx++) {
77 String arrayName = "varDependencies[" + idx + "]";
78 StringBuffer jobJSArray = createJSArray(arrayName, varsDep.get(varNames.get(idx)), true);
79 result.append(jobJSArray);
80 }
81
82 return result.toString();
83 }
84
85 private List getValues(JobInfo job, List<String> varNames) {
86 List result = new ArrayList();
87 Map<String, Object> vars = job.getDescriptor().getPermutationValues();
88
89 for (String varName : varNames) {
90 Object varValue = vars.get(varName);
91 result.add(varValue == null ? "" : varValue);
92 }
93 return result;
94 }
95
96 private StringBuffer createJSArray(String arrayName, Collection elements) {
97 return createJSArray(arrayName, elements, false);
98 }
99
100 private StringBuffer createJSArray(String arrayName, Collection elements, boolean integers) {
101 StringBuffer result = new StringBuffer();
102 appendValues(result, elements, integers);
103 result.insert(0, arrayName + " = [");
104 result.append("];\n");
105 return result;
106 }
107
108 private void appendValues(StringBuffer result, Collection elements, boolean integers) {
109 boolean notFirstElement = false;
110 for (Object ele : elements) {
111 if (notFirstElement) result.append(",");
112 if (!integers) result.append("'");
113 result.append(ele);
114 if (!integers) result.append("'");
115 notFirstElement = true;
116 }
117 }
118
119 public static void main(String[] args) throws FileNotFoundException {
120 new PFConst();
121 new PFCount();
122 new PFDir();
123 new PFLines();
124 new PFMath();
125 new PFMD5Hex();
126 new PFRange();
127 new PFRegExp();
128 new PFUUID();
129 new PFXPath();
130
131
132 XStream result = new XStream(new DomDriver());
133 InputStream fis = new FileInputStream("/Users/admin/work/eclipse-ws/gwe-core/src/main/slider/order.xml");
134
135 OrderInfo order = (OrderInfo) result.fromXML(fis);
136
137 System.out.println(new VarsModelRenderer().renderJS(order));
138 }
139 }
140
141 class VarsDependencies extends TreeMap<String, Set<Integer>> {
142
143 public static Set<Integer> NON_PERMUTABLE = new TreeSet<Integer>();
144
145 static {
146 NON_PERMUTABLE.add(-1);
147 }
148
149 private List<String> varNames;
150 private List<PVariable> vars;
151
152 public VarsDependencies(OrderInfo order) {
153 varNames = order.getDescriptor().getVarNames();
154 vars = ((POrderDescriptor)order.getDescriptor()).getP2ELStatementObj().getVars();
155
156
157
158 for (PVariable var : vars)
159 put(var.getFullName(), getDependencies(var));
160
161 for (int idx = 0; idx < varNames.size(); idx++) {
162 String varName = varNames.get(idx);
163 put(varName, getDeepDependencies(varName));
164 }
165
166 for (PVariable var : vars)
167 if (!var.isPermutable()) put(var.getFullName(), NON_PERMUTABLE);
168 }
169
170 private Set<Integer> getDependencies(PVariable var) {
171 Set<Integer> result = new TreeSet<Integer>();
172 for (String dependency : var.getVarDependencyNames())
173 result.add(VarsModelRenderer.getVarIndex(dependency, varNames));
174
175 result.remove(-1);
176 return result;
177 }
178
179 private Set<Integer> getDeepDependencies(String varName) {
180 Set<Integer> result = get(varName);
181 if (result.isEmpty()) return result;
182 Set<Integer> deepDependencies = new HashSet<Integer>();
183 for (Integer depIndex : result)
184 deepDependencies.addAll(getDeepDependencies(varNames.get(depIndex)));
185
186 result.addAll(deepDependencies);
187 return result ;
188 }
189 }