summaryrefslogtreecommitdiffstats
path: root/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/CodanApplication.java
blob: 188be3c1d523d5eb8ddcafbdd4e18a1efcd11ffb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*******************************************************************************
 * Copyright (c) 2010 Alena Laskavaia and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     Alena Laskavaia - initial API and implementation
 *******************************************************************************/
package org.eclipse.cdt.codan.internal.core;

import java.util.ArrayList;
import java.util.Collection;

import org.eclipse.cdt.codan.core.CodanRuntime;
import org.eclipse.cdt.codan.core.Messages;
import org.eclipse.cdt.codan.internal.core.model.CodanMarkerProblemReporter;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.eclipse.osgi.util.NLS;

/**
 * Application to support headless build
 * 
 * @noextend This class is not intended to be extended by clients.
 * @noinstantiate This class is not intended to be instantiated by clients.
 */
public class CodanApplication implements IApplication {
	private Collection<String> projects = new ArrayList<String>();
	private boolean verbose = false;
	private boolean all = false;

	public Object start(IApplicationContext context) throws Exception {
		String[] args = (String[]) context.getArguments().get(
				"application.args"); //$NON-NLS-1$
		if (args == null || args.length == 0) {
			help();
			return EXIT_OK;
		}
		extractArguments(args);
		CodanBuilder codanBuilder = new CodanBuilder();
		CodanRuntime runtime = CodanRuntime.getInstance();
		runtime.setProblemReporter(new CodanMarkerProblemReporter() {
			@Override
			public void reportProblem(String id, String markerType,
					int severity, IResource file, int lineNumber,
					int startChar, int endChar, String message) {
				System.out.println(file.getLocation() + ":" + lineNumber + ": " //$NON-NLS-1$ //$NON-NLS-2$
						+ message);
			}
		});
		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
		if (all) {
			log(Messages.CodanApplication_LogRunWorkspace);
			codanBuilder.processResource(root, new NullProgressMonitor());
		} else {
			for (String project : projects) {
				log(Messages.CodanApplication_LogRunProject + project);
				IProject wProject = root.getProject(project);
				if (!wProject.exists()) {
					System.err
							.println( //
							NLS.bind(
									Messages.CodanApplication_Error_ProjectDoesNotExists,
									project));
					continue;
				}
				codanBuilder.processResource(wProject,
						new NullProgressMonitor());
			}
		}
		return EXIT_OK;
	}

	/**
	 * @param string
	 */
	private void log(String string) {
		if (verbose)
			System.err.println(string);
	}

	/**
	 * @param args
	 */
	private void extractArguments(String[] args) {
		for (int i = 0; i < args.length; i++) {
			String string = args[i];
			if (string.equals("-verbose")) { //$NON-NLS-1$
				verbose = true;
			} else if (string.equals("-all")) { //$NON-NLS-1$
				all = true;
			} else {
				projects.add(string);
			}
		}
	}

	/**
	 * 
	 */
	private void help() {
		System.out.println(Messages.CodanApplication_Usage);
		System.out.println(Messages.CodanApplication_Options);
		System.out.println(Messages.CodanApplication_all_option);
		System.out.println(Messages.CodanApplication_verbose_option);
	}

	public void stop() {
		// nothing
	}
}