1402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/*******************************************************************************
2402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Copyright (c) 2000, 2006 IBM Corporation and others.
3402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * All rights reserved. This program and the accompanying materials
4402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * are made available under the terms of the Eclipse Public License v1.0
5402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * which accompanies this distribution, and is available at
6402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * http://www.eclipse.org/legal/epl-v10.html
7402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *
8402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Contributors:
9402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *     IBM Corporation - initial API and implementation
10402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll *******************************************************************************/
11402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpackage org.eclipse.releng;
12402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
13402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.BuildException;
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.Task;
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.StringTokenizer;
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Vector;
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Enumeration;
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.*;
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll/**
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * Uses an ElementParser to read a list of feature.xml files and to determine
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * if all plugins defined in the features are present.
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class FetchValidator extends Task {
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//directory containing of build source, parent of features and plugins
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String install = "";
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Comma separated list of features to parse
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String list;
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//Elements to check for post fetch (use name of project in dev.eclipse.org)
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private Vector features;
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private Vector plugins;
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//keeps track of missing elements
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private Vector missingPlugins;
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private Vector missingFeatures;
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//parser
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	ElementParser parser;
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//test
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public static void main(String args[]) {
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		FetchValidator validator = new FetchValidator();
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		validator.install = "l:/vabase/team/sonia";
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		validator.list =
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			"org.eclipse.platform-feature,org.eclipse.platform.win32-feature,org.eclipse.platform.linux.motif-feature";
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		validator.getListOfFeatures(validator.list);
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		validator.execute();
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// entry point
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void execute() throws BuildException {
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		getListOfFeatures(list);
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (!allPresent()) {
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String missingFeaturesDesc="";
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String missingPluginsDesc="";
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (missingFeatures.size() > 0) {
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				for (int i = 0; i < missingFeatures.size(); i++) {
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					missingFeaturesDesc+="\n\r"+missingFeatures.get(i).toString();
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (missingPlugins.size() > 0) {
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				for (int i = 0; i < missingPlugins.size(); i++) {
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					missingPluginsDesc+="\n\t"+missingPlugins.get(i).toString();
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			throw new BuildException("The following projects did not get fetched: \n"+missingFeaturesDesc+missingPluginsDesc+"\n"
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			+"\n\nPossible causes of missing source files include an incorrect Tag entry in a .map file or problems with CVS repositories.");
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		System.out.println("Fetch Complete.");
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public FetchValidator() {
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		parser = new ElementParser();
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		missingPlugins = new Vector();
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		missingFeatures = new Vector();
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void getListOfFeatures(String list) {
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		StringTokenizer tokenizer = new StringTokenizer(list, ",");
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (tokenizer.hasMoreTokens()) {
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			parser.parse(
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				install,
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				"feature",
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				(String) tokenizer.nextToken().trim());
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		features = parser.getFeatures();
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		plugins = parser.getPlugins();
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private boolean allPresent() {
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// verify presence of all source projects for the build.
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// collect a list of missing plugins (or fragments), and features
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		boolean allPresent = true;
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Enumeration enumeration = plugins.elements();
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (enumeration.hasMoreElements()) {
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String plugin = (String) enumeration.nextElement();
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (new File(install + "/plugins/" + plugin).exists())
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				continue;
114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else {
115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				missingPlugins.add(plugin);
116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				allPresent = false;
117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		enumeration = features.elements();
121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		while (enumeration.hasMoreElements()) {
123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String feature = (String) enumeration.nextElement();
124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (new File(install + "/features/" + feature).exists())
125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				continue;
126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			else {
127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				missingFeatures.add(feature);
128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				allPresent = false;
129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return allPresent;
133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the install.
137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getInstall() {
140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return install;
141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the list.
145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getList() {
148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return list;
149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the install.
153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param install The install to set
154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setInstall(String install) {
156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.install = install;
157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the list.
161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param list The list to set
162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setList(String list) {
164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.list = list;
165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
168