View Javadoc

1   /*
2    * Copyright 2007-2008 the original author or authors.
3    * 
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    * 
8    *      http://www.apache.org/licenses/LICENSE-2.0
9    * 
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13   * See the License for the specific language governing permissions and
14   * limitations under the License.
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   * @author Marco Ruiz
51   * @since Feb 25, 2009
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 //		InputStream fis = new FileInputStream("/Users/admin/work/eclipse-ws/gwe-core/src/temp/order.xml");
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 		// Load dependencies content
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 }