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 Moll/**
14402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * A custom Ant task that finds compile logs containing compile
15402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * errors.  The compile logs with errors are sent as email attachments using
16402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll * information in monitor.properties.
17402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll */
18402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
19402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.BufferedReader;
20402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.File;
21402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileNotFoundException;
22402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.FileReader;
23402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.io.IOException;
24402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Enumeration;
25402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport java.util.Vector;
26402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
27402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.ParserConfigurationException;
28402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.SAXParser;
29402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport javax.xml.parsers.SAXParserFactory;
30402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
31402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.BuildException;
32402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.apache.tools.ant.Task;
33402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.Attributes;
34402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.InputSource;
35402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.SAXException;
36402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollimport org.xml.sax.helpers.DefaultHandler;
37402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
38402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Mollpublic class CompileErrorCheck extends Task {
39402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
40402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private static final class CompilerErrorCheckerHandler extends DefaultHandler {
41402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		boolean hasErrors = false;
42402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
43402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public void startElement(String uri, String localName,
44402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				String name, Attributes attributes) throws SAXException {
45402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (this.hasErrors) return;
46402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if ("problem_summary".equals(name)) {
47402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				// problem_summary name
48402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				String value = attributes.getValue("errors");
49402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				this.hasErrors = value != null && !value.equals("0");
50402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
51402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
52402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		public boolean hasErrors() {
53402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return this.hasErrors;
54402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
55402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
56402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
57402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//directory containing of build source, parent of features and plugins
58402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private String install = "";
59402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
60402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	//keep track of compile logs containing errors
61402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private Vector logsWithErrors;
62402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
63402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// keep track of the factory to use
64402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private SAXParser parser;
65402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
66402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public CompileErrorCheck() {
67402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.logsWithErrors = new Vector();
68402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		SAXParserFactory factory = SAXParserFactory.newInstance();
69402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.parser = null;
70402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
71402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
72402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			this.parser = factory.newSAXParser();
73402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (ParserConfigurationException e) {
74402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
75402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (SAXException e) {
76402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
77402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
78402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
79402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
80402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void execute() throws BuildException {
81402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (parser == null) return;
82402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		findLogs(new File(install));
83402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		sendNotice();
84402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
85402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
86402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	// test
87402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public static void main(String[] args) {
88402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		CompileErrorCheck checker = new CompileErrorCheck();
89402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		checker.install="d:/compilelogs";
90402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		checker.execute();
91402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
92402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
93402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void findLogs(File aFile) {
94402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (!aFile.exists()) return;
95402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		// basis case
96402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (aFile.isFile()) {
97402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			String absolutePath = aFile.getAbsolutePath();
98402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (absolutePath.endsWith(".xml")) {
99402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				parse(aFile);
100402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} else if (absolutePath.endsWith(".jar.bin.log")||absolutePath.endsWith("dot.bin.log")){
101402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				read(aFile);
102402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
103402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} else {
104402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			//recurse into directories looking for and reading compile logs
105402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			File files[] = aFile.listFiles();
106402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
107402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (files != null) {
108402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				for (int i = 0, max = files.length; i < max; i++) {
109402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					findLogs(files[i]);
110402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
111402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
112402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
113402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
114402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
115402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void read(File file) {
116402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//read the contents of the log file, and return contents as a String
117402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (file.length()==0)
118402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			return;
119402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
120402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		BufferedReader in = null;
121402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		String aLine;
122402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
123402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
124402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			in = new BufferedReader(new FileReader(file));
125402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (FileNotFoundException e) {
126402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
127402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
128402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
129402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
130402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			while ((aLine = in.readLine()) != null) {
131402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				int statusSummaryIndex=aLine.indexOf("problem (");
132402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (statusSummaryIndex==-1)
133402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					statusSummaryIndex=aLine.indexOf("problems (");
134402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
135402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				if (statusSummaryIndex!=-1&&(aLine.indexOf("error", statusSummaryIndex) != -1)){
136402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					logsWithErrors.add(file);
137402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					System.out.println(file.getName()+" has compile errors.");
138402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					return;
139402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
140402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
141402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
142402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
143402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} finally {
144402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// make sure we don't leave any file handle open
145402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (in != null) {
146402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				try {
147402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					in.close();
148402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} catch (IOException e) {
149402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// ignore
150402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
151402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
152402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
153402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
154402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
155402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void parse(File file) {
156402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		BufferedReader reader = null;
157402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
158402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			reader = new BufferedReader(new FileReader(file));
159402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (FileNotFoundException e) {
160402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
161402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
162402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
163402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		InputSource inputSource = new InputSource(reader);
164402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
165402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		CompilerErrorCheckerHandler compilerErrorCheckerHandler = new CompilerErrorCheckerHandler();
166402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		try {
167402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			parser.parse(inputSource, compilerErrorCheckerHandler);
168402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (SAXException e) {
169402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
170402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} catch (IOException e) {
171402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			e.printStackTrace();
172402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		} finally {
173402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			// make sure we don't leave any file handle open
174402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			if (reader != null) {
175402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				try {
176402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					reader.close();
177402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				} catch (IOException e) {
178402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					// ignore
179402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
180402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
181402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
182402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
183402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (compilerErrorCheckerHandler.hasErrors()) {
184402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			logsWithErrors.add(new File(file.getParentFile(),file.getName().replaceAll(".xml", ".html")));
185402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			System.out.println(file.getName()+" has compile errors.");
186402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
187402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
188402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
189402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	private void sendNotice() {
190402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//send email notification that there are compile errors in the build
191402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		//send the logs as attachments
192402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		Enumeration enumeration = logsWithErrors.elements();
193402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
194402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		if (logsWithErrors.size() > 0) {
195402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			try{
196402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
197402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				Mailer mailer = new Mailer();
198402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				String [] logFiles = new String [logsWithErrors.size()];
199402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
200402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				int i=0;
201402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
202402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				while (enumeration.hasMoreElements()) {
203402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					logFiles[i++]=((File) enumeration.nextElement()).getAbsolutePath();
204402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
205402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
206402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				mailer.sendMultiPartMessage("Compile errors in build", "Compile errors in build.  See attached compile logs.", logFiles);
207402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			} catch (NoClassDefFoundError e){
208402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				while (enumeration.hasMoreElements()) {
209402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					String path=((File) enumeration.nextElement()).getAbsolutePath();
210402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					String nameWithPlugin=path.substring(path.indexOf("plugins"),path.length());
211402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll					System.out.println("Compile errors detected in "+nameWithPlugin);
212402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				}
213402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
214402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				System.out.println("Unable to send email notice of compile errors.");
215402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll				System.out.println("The j2ee.jar may not be on the Ant classpath.");
216402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
217402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll			}
218402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
219402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		}
220402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
221402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
222402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
223402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
224402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Gets the install.
225402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @return Returns a String
226402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
227402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public String getInstall() {
228402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		return install;
229402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
230402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
231402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	/**
232402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * Sets the install.
233402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 * @param install The install to set
234402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	 */
235402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	public void setInstall(String install) {
236402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll		this.install = install;
237402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll	}
238402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll
239402794e73aed8611d62eb4b01cd155e2d76fcb87Raphael Moll}
240