summaryrefslogtreecommitdiffstats
path: root/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp')
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPAction.java32
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPProgressDialog.java47
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPThread.java92
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/ErrorCollectorThread.java19
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelArchGetter.java23
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelBranchesGetter.java28
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/MainPage.java498
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/OutputCollectorThread.java19
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/PropertiesPage.java498
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/QemuArchGetter.java27
-rw-r--r--plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/YoctoBSPWizard.java99
11 files changed, 1382 insertions, 0 deletions
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPAction.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPAction.java
new file mode 100644
index 0000000..171f181
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPAction.java
@@ -0,0 +1,32 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3/**
4 * Stores a list of items from the output of a background thread and the error message if something went wrong
5 * @author ioana.grigoropol
6 *
7 */
8public class BSPAction {
9 private String[] items;
10 private String message;
11
12 BSPAction(String[] items, String message){
13 this.setItems(items);
14 this.setMessage(message);
15 }
16
17 public String[] getItems() {
18 return items;
19 }
20
21 public void setItems(String[] items) {
22 this.items = items;
23 }
24
25 public String getMessage() {
26 return message;
27 }
28
29 public void setMessage(String message) {
30 this.message = message;
31 }
32} \ No newline at end of file
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPProgressDialog.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPProgressDialog.java
new file mode 100644
index 0000000..8d5864c
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPProgressDialog.java
@@ -0,0 +1,47 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3import org.eclipse.core.runtime.IProgressMonitor;
4import org.eclipse.jface.dialogs.ProgressMonitorDialog;
5import org.eclipse.jface.operation.IRunnableWithProgress;
6import org.eclipse.swt.widgets.Shell;
7
8/**
9 * Creates a progress monitor dialog that will run in the background a BSPThread and display a custom message
10 * @author ioana.grigoropol
11 *
12 */
13public class BSPProgressDialog extends ProgressMonitorDialog{
14 String displayMessage;
15 BSPThread getterThread;
16 Shell shell;
17
18
19 public BSPProgressDialog(Shell parent, BSPThread getterThread, String displayMessage) {
20 super(parent);
21 this.shell = parent;
22 this.getterThread = getterThread;
23 this.displayMessage = displayMessage;
24 }
25
26 public void run(boolean showProgressDialog){
27 try {
28 if (showProgressDialog)
29 super.run(true, true, new IRunnableWithProgress(){
30 @Override
31 public void run(IProgressMonitor monitor) {
32 monitor.beginTask(displayMessage + " ...", 100);
33 getterThread.run();
34 monitor.done();
35 }
36 });
37 else
38 getterThread.run();
39 } catch (Exception e) {
40 getterThread.getBspAction().setMessage(e.getMessage());
41 }
42 }
43
44 public BSPAction getBspAction() {
45 return getterThread.getBspAction();
46 }
47}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPThread.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPThread.java
new file mode 100644
index 0000000..f6b19ac
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/BSPThread.java
@@ -0,0 +1,92 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3import java.io.BufferedReader;
4import java.io.InputStreamReader;
5import java.util.ArrayList;
6
7/**
8 * Receives a command to be run on a separate thread in the background
9 * It contains an BSPAction object that will collect the output & error
10 * Output lines are processed and collected into the items of BSPAction
11 * @author ioana.grigoropol
12 *
13 */
14public abstract class BSPThread implements Runnable {
15 public static final String SUCCESS = "success";
16 public static final String ERROR = "error";
17
18 private BSPAction bspAction;
19 private String command;
20
21 /**
22 * Receives the command to be run in the background
23 * @param command
24 */
25 public BSPThread(String command) {
26 this.command = command;
27 this.bspAction = new BSPAction(null, null);
28 }
29
30 @Override
31 public void run() {
32 ArrayList<String> values = new ArrayList<String>();
33
34 try {
35 ProcessBuilder builder = new ProcessBuilder(new String[] {"bash", "-c", command});
36 // redirect error stream to collect both output & error
37 builder.redirectErrorStream(true);
38 Process process = builder.start();
39 BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream()));
40 String line = null;
41 String errorMessage = "";
42 while ( (line = br.readLine()) != null) {
43 String[] result = processLine(line);
44 String status = result[0];
45 String value = result[1];
46 if (status.equals(ERROR) && !value.isEmpty()) {
47 errorMessage += value;
48 continue;
49 }
50 if (!value.isEmpty())
51 values.add(value);
52 }
53 int exitVal = process.waitFor();
54
55 // if the background process did not exit with 0 code, we should set the status accordingly
56 if (exitVal != 0) {
57 bspAction.setMessage(errorMessage);
58 bspAction.setItems(null);
59 }
60 } catch (Exception e) {
61 bspAction.setMessage(e.getMessage());
62 bspAction.setItems(null);
63 }
64 if (!values.isEmpty()) {
65 bspAction.setMessage(null);
66 bspAction.setItems(values.toArray(new String[values.size()]));
67 }
68 }
69
70 /**
71 * Each command ran in the background will have a different output and a different way of processing it
72 * @param line
73 * @return
74 */
75 protected abstract String[] processLine(String line);
76
77 public BSPAction getBspAction() {
78 return bspAction;
79 }
80
81 public void setBspAction(BSPAction bspAction) {
82 this.bspAction = bspAction;
83 }
84
85 public String getCommand() {
86 return command;
87 }
88
89 public void setCommand(String command) {
90 this.command = command;
91 }
92}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/ErrorCollectorThread.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/ErrorCollectorThread.java
new file mode 100644
index 0000000..d39ac28
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/ErrorCollectorThread.java
@@ -0,0 +1,19 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3/**
4 * BSPThread that ignores the output of the process and returns an error if the process exits with non zero code
5 * @author ioana.grigoropol
6 *
7 */
8public class ErrorCollectorThread extends BSPThread{
9
10 public ErrorCollectorThread(String command) {
11 super(command);
12 }
13
14 @Override
15 protected String[] processLine(String line) {
16 return null;
17 }
18
19}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelArchGetter.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelArchGetter.java
new file mode 100644
index 0000000..833057a
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelArchGetter.java
@@ -0,0 +1,23 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3/**
4 * BSPThread that processes the output of "yocto-bsp list karch"
5 * @author ioana.grigoropol
6 *
7 */
8public class KernelArchGetter extends BSPThread{
9
10 public KernelArchGetter(String command) {
11 super(command);
12 }
13
14 @Override
15 protected String[] processLine(String line) {
16 if (line.contains(":"))
17 return new String[]{SUCCESS, ""};
18 line = line.replaceAll("^\\s+", "");
19 line = line.replaceAll("\\s+$", "");
20 return new String[]{SUCCESS, line};
21 }
22
23}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelBranchesGetter.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelBranchesGetter.java
new file mode 100644
index 0000000..4caea2c
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/KernelBranchesGetter.java
@@ -0,0 +1,28 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3/**
4 * BSPThread that processes the output lines from running command "yocto-bsp list" for the selected kernel
5 * @author ioana.grigoropol
6 *
7 */
8public class KernelBranchesGetter extends BSPThread {
9
10 public KernelBranchesGetter(String command) {
11 super(command);
12 }
13
14 @Override
15 protected String[] processLine(String line) {
16 // [TODO : Ioana]: find a better way to identify error lines
17 if (!line.startsWith("["))
18 return new String[]{ERROR, line + "\n"};
19
20 String[] items = line.split(",");
21
22 String value = items[0];
23 value = value.replace("[\"", "");
24 value = value.replaceAll("\"$", "");
25 return new String[]{SUCCESS, value};
26 }
27
28}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/MainPage.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/MainPage.java
new file mode 100644
index 0000000..ea6544f
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/MainPage.java
@@ -0,0 +1,498 @@
1/*******************************************************************************
2 * Copyright (c) 2012 Intel Corporation.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Intel - initial API and implementation
10 *******************************************************************************/
11package org.yocto.sdk.remotetools.wizards.bsp;
12
13import java.io.BufferedReader;
14import java.io.File;
15import java.io.InputStream;
16import java.io.InputStreamReader;
17
18import org.eclipse.core.runtime.IStatus;
19import org.eclipse.core.runtime.Status;
20import org.eclipse.jface.wizard.WizardPage;
21import org.eclipse.swt.SWT;
22import org.eclipse.swt.events.FocusEvent;
23import org.eclipse.swt.events.FocusListener;
24import org.eclipse.swt.events.ModifyEvent;
25import org.eclipse.swt.events.ModifyListener;
26import org.eclipse.swt.events.SelectionAdapter;
27import org.eclipse.swt.events.SelectionEvent;
28import org.eclipse.swt.layout.GridData;
29import org.eclipse.swt.layout.GridLayout;
30import org.eclipse.swt.widgets.Button;
31import org.eclipse.swt.widgets.Combo;
32import org.eclipse.swt.widgets.Composite;
33import org.eclipse.swt.widgets.Control;
34import org.eclipse.swt.widgets.DirectoryDialog;
35import org.eclipse.swt.widgets.Label;
36import org.eclipse.swt.widgets.Text;
37import org.eclipse.swt.widgets.Widget;
38import org.yocto.sdk.remotetools.YoctoBspElement;
39
40/**
41 *
42 * Setting up the parameters for creating the new Yocto BSP
43 *
44 * @author jzhang
45 */
46public class MainPage extends WizardPage {
47 public static final String PAGE_NAME = "Main";
48 private static final String KARCH_CMD = "yocto-bsp list karch";
49 private static final String QARCH_CMD = "yocto-bsp list qemu property qemuarch";
50 private static final String BSP_SCRIPT = "yocto-bsp";
51 private static final String PROPERTIES_CMD_PREFIX = "yocto-bsp list ";
52 private static final String PROPERTIES_CMD_SURFIX = " properties -o ";
53 private static final String PROPERTIES_FILE = "/tmp/properties.json";
54
55 private Button btnMetadataLoc;
56 private Text textMetadataLoc;
57 private Label labelMetadata;
58
59 private Button btnBspOutputLoc;
60 private Text textBspOutputLoc;
61 private Label labelBspOutput;
62
63 private Button btnBuildLoc;
64 private Text textBuildLoc;
65 private Label labelBuildLoc;
66
67 private boolean buildDirChecked;
68 private BuildLocationListener buildLocationListener;
69
70 private Text textBspName;
71 private Label labelBspName;
72
73 private Combo comboKArch;
74 private Label labelKArch;
75
76 private Combo comboQArch;
77 private Label labelQArch;
78
79 private YoctoBspElement bspElem;
80
81 public MainPage(YoctoBspElement element) {
82 super(PAGE_NAME, "yocto-bsp Main page", null);
83
84 setMessage("Enter the required fields(with *) to create new Yocto Project BSP!");
85 this.bspElem = element;
86 }
87
88 @Override
89 public void createControl(Composite parent) {
90 setErrorMessage(null);
91 Composite composite = new Composite(parent, SWT.NONE);
92 GridLayout layout = new GridLayout(2, false);
93 GridData gd = new GridData(SWT.FILL, SWT.CENTER, true, false);
94 composite.setLayout(layout);
95 gd.horizontalSpan = 2;
96 composite.setLayoutData(gd);
97
98 labelMetadata = new Label(composite, SWT.NONE);
99 labelMetadata.setText("Metadata location*: ");
100 Composite textContainer = new Composite(composite, SWT.NONE);
101 textContainer.setLayout(new GridLayout(2, false));
102 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
103 textMetadataLoc = (Text)addTextControl(textContainer, "");
104 textMetadataLoc.setEnabled(false);
105 textMetadataLoc.addModifyListener(new ModifyListener() {
106 @Override
107 public void modifyText(ModifyEvent e) {
108 controlChanged(e.widget);
109 }
110 });
111 setBtnMetadataLoc(addFileSelectButton(textContainer, textMetadataLoc));
112
113 labelBuildLoc = new Label(composite, SWT.NONE);
114 labelBuildLoc.setText("Build location: ");
115
116 textContainer = new Composite(composite, SWT.NONE);
117 textContainer.setLayout(new GridLayout(2, false));
118 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
119
120 textBuildLoc = (Text)addTextControl(textContainer, "");
121 buildLocationListener = new BuildLocationListener("");
122 textBuildLoc.addFocusListener(buildLocationListener);
123
124 setBtnBuilddirLoc(addFileSelectButton(textContainer, textBuildLoc));
125
126 labelBspName = new Label(composite, SWT.NONE);
127 labelBspName.setText("BSP Name*: ");
128
129 textContainer = new Composite(composite, SWT.NONE);
130 textContainer.setLayout(new GridLayout(2, false));
131 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
132
133 textBspName = (Text)addTextControl(textContainer, "");
134 textBspName.addModifyListener(new ModifyListener() {
135 @Override
136 public void modifyText(ModifyEvent e) {
137 controlChanged(e.widget);
138 }
139 });
140
141 labelBspOutput = new Label(composite, SWT.NONE);
142 labelBspOutput.setText("BSP output location: ");
143
144 textContainer = new Composite(composite, SWT.NONE);
145 textContainer.setLayout(new GridLayout(2, false));
146 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
147
148 textBspOutputLoc = (Text)addTextControl(textContainer, "");
149 textBspOutputLoc.addModifyListener(new ModifyListener() {
150 @Override
151 public void modifyText(ModifyEvent e) {
152 controlChanged(e.widget);
153 }
154 });
155 setBtnBspOutLoc(addFileSelectButton(textContainer, textBspOutputLoc));
156
157 labelKArch = new Label(composite, SWT.NONE);
158 labelKArch.setText("Kernel Architecture*: ");
159
160 textContainer = new Composite(composite, SWT.NONE);
161 textContainer.setLayout(new GridLayout(2, false));
162 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
163
164 comboKArch = new Combo(textContainer, SWT.READ_ONLY);
165 comboKArch.setLayout(new GridLayout(2, false));
166 comboKArch.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
167 comboKArch.setEnabled(false);
168 comboKArch.addModifyListener(new ModifyListener() {
169 @Override
170 public void modifyText(ModifyEvent e) {
171 controlChanged(e.widget);
172 }
173 });
174
175 labelQArch = new Label(composite, SWT.NONE);
176 labelQArch.setText("Qemu Architecture(* for karch as qemu): ");
177 labelQArch.setEnabled(false);
178
179 textContainer = new Composite(composite, SWT.NONE);
180 textContainer.setLayout(new GridLayout(2, false));
181 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
182
183 comboQArch = new Combo(textContainer, SWT.READ_ONLY);
184 comboQArch.setLayout(new GridLayout(2, false));
185 comboQArch.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
186 comboQArch.setEnabled(false);
187 comboQArch.addModifyListener(new ModifyListener() {
188 @Override
189 public void modifyText(ModifyEvent e) {
190 controlChanged(e.widget);
191 }
192 });
193
194 setControl(composite);
195 validatePage();
196 }
197
198 private Control addTextControl(final Composite parent, String value) {
199 final Text text;
200
201 text = new Text(parent, SWT.SINGLE | SWT.LEAD | SWT.BORDER);
202 text.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false));
203 text.setText(value);
204 text.setSize(10, 150);
205
206 return text;
207 }
208
209 private Button addFileSelectButton(final Composite parent, final Text text) {
210 Button button = new Button(parent, SWT.PUSH | SWT.LEAD);
211 button.setText("Browse...");
212 button.addSelectionListener(new SelectionAdapter() {
213 @Override
214 public void widgetSelected(SelectionEvent event) {
215 String dirName = new DirectoryDialog(parent.getShell()).open();
216 if (dirName != null) {
217 text.setText(dirName);
218 }
219 }
220 });
221 return button;
222 }
223
224 private void controlChanged(Widget widget) {
225 Status status = new Status(IStatus.OK, "not_used", 0, "", null);
226 setErrorMessage(null);
227 String metadataLoc = textMetadataLoc.getText();
228
229 if (widget == textMetadataLoc) {
230 resetKarchCombo();
231 if (metadataLoc.length() == 0) {
232 status = new Status(IStatus.ERROR, "not_used", 0, "Meta data location can't be empty!", null);
233 } else {
234 File meta_data = new File(metadataLoc);
235 if (!meta_data.exists() || !meta_data.isDirectory()) {
236 status = new Status(IStatus.ERROR, "not_used", 0,
237 "Invalid meta data location: Make sure it exists and is a directory!", null);
238 } else {
239 File bspScript = new File(metadataLoc + "/scripts/" + BSP_SCRIPT);
240 if (!bspScript.exists() || !bspScript.canExecute())
241 status = new Status(IStatus.ERROR, "not_used", 0,
242 "Make sure yocto-bsp exists under \"" + metadataLoc + "/scripts\" and is executable!", null);
243 else {
244 kernelArchesHandler();
245 }
246 }
247 }
248 } else if (widget == comboKArch) {
249 String selection = comboKArch.getText();
250 if (!bspElem.getKarch().contentEquals(selection))
251 bspElem = new YoctoBspElement();
252 if (selection.matches("qemu")) {
253 labelQArch.setEnabled(true);
254 comboQArch.setEnabled(true);
255 } else {
256 labelQArch.setEnabled(false);
257 comboQArch.setEnabled(false);
258 }
259 }
260
261 String buildDir = textBuildLoc.getText();
262 String outputDir = textBspOutputLoc.getText();
263 String bspName = textBspName.getText();
264
265 if (bspName.contains(" ")) {
266 status = new Status(IStatus.ERROR, "not_used", 0,
267 "BSP name contains space which is not allowed!", null);
268 }
269
270 if (!outputDir.isEmpty()){
271 if (outputDir.matches(buildDir)) {
272 status = new Status(IStatus.ERROR, "not_used", 0,
273 "You've set BSP output directory the same as build directory, please leave output directory empty for this scenario!", null);
274 } else {
275 File outputDirectory = new File(outputDir);
276 if (outputDirectory.exists()){
277 status = new Status(IStatus.ERROR, "not_used", 0,
278 "Your BSP output directory points to an exiting directory!", null);
279 }
280 }
281 } else if (buildDir.startsWith(metadataLoc) && !bspName.isEmpty()) {
282 String bspDirStr = metadataLoc + "/meta-" + bspName;
283 File bspDir = new File(bspDirStr);
284 if (bspDir.exists()) {
285 status = new Status(IStatus.ERROR, "not_used", 0,
286 "Your BSP with name: " + bspName + " already exist under directory: " + bspDirStr + ", please change your bsp name!", null);
287 }
288 }
289
290 if (status.getSeverity() == IStatus.ERROR)
291 setErrorMessage(status.getMessage());
292
293 getWizard().getContainer().updateButtons();
294 canFlipToNextPage();
295 }
296
297 private Status checkBuildDir() {
298
299 String metadataLoc = textMetadataLoc.getText();
300 String buildLoc = textBuildLoc.getText();
301
302 if (buildLoc.isEmpty()) {
303 buildLoc = metadataLoc + "/build";
304 return createBuildDir(buildLoc);
305 } else {
306 File buildLocDir = new File(buildLoc);
307 if (!buildLocDir.exists()) {
308 return createBuildDir(buildLoc);
309 } else if (buildLocDir.isDirectory()) {
310 return createBuildDir(buildLoc);
311 } else {
312 return new Status(IStatus.ERROR, "not_used", 0, "Invalid build location: Make sure the build location is a directory!", null);
313 }
314 }
315 }
316
317 private Status createBuildDir(String buildLoc) {
318 String metadataDir = textMetadataLoc.getText();
319
320 // if we do not change the directory to metadata location the script will be looked into the directory indicated by user.dir system property
321 // system.property usually points to the location from where eclipse was started
322 String createBuildDirCmd = "cd " + metadataDir + ";source " + metadataDir + "/oe-init-build-env " + buildLoc;
323
324 try {
325 ProcessBuilder builder = new ProcessBuilder(new String[] {"bash", "-c", createBuildDirCmd});
326 Process proc = builder.start();
327 InputStream errorStream = proc.getErrorStream();
328 InputStreamReader isr = new InputStreamReader(errorStream);
329 BufferedReader br = new BufferedReader(isr);
330 String line = null;
331 String status = "";
332 while ( (line = br.readLine()) != null) {
333 status += line;
334 }
335
336 if (proc.waitFor() != 0)
337 return new Status(IStatus.ERROR, "not_used", 0, status, null);;
338 return new Status(IStatus.OK, "not_used", 0, "", null);
339 } catch (Exception e) {
340 return new Status(IStatus.ERROR, "not_used", 0, e.getMessage(), null);
341 }
342 }
343
344 public YoctoBspElement getBSPElement() {
345 return this.bspElem;
346 }
347
348
349 private void resetKarchCombo() {
350 comboKArch.deselectAll();
351 comboQArch.deselectAll();
352 comboKArch.setEnabled(false);
353 labelQArch.setEnabled(false);
354 comboQArch.setEnabled(false);
355 }
356
357 private void kernelArchesHandler() {
358 BSPAction kArchesAction = getKArches();
359 if (kArchesAction.getMessage() == null && kArchesAction.getItems().length != 0) {
360 comboKArch.setItems(kArchesAction.getItems());
361 comboKArch.setEnabled(true);
362 } else if (kArchesAction.getMessage() != null){
363 setErrorMessage(kArchesAction.getMessage());
364 return;
365 }
366 BSPAction qArchesAction = getQArches();
367 if (qArchesAction.getMessage() == null && qArchesAction.getItems().length != 0) {
368 comboQArch.setItems(qArchesAction.getItems());
369 } else if (qArchesAction.getMessage() != null)
370 setErrorMessage(qArchesAction.getMessage());
371
372 }
373
374 @Override
375 public boolean canFlipToNextPage(){
376 String err = getErrorMessage();
377 if (err != null)
378 return false;
379 else if (!validatePage())
380 return false;
381 return true;
382 }
383
384
385 public boolean validatePage() {
386 String metadataLoc = textMetadataLoc.getText();
387 String bspname = textBspName.getText();
388 String karch = comboKArch.getText();
389 String qarch = comboQArch.getText();
390 if (metadataLoc.isEmpty() ||
391 bspname.isEmpty() ||
392 karch.isEmpty()) {
393 return false;
394 } else if (karch.matches("qemu") && qarch.isEmpty()) {
395 return false;
396 }
397
398 bspElem.setBspName(bspname);
399 if (!textBspOutputLoc.getText().isEmpty())
400 bspElem.setBspOutLoc(textBspOutputLoc.getText());
401 else
402 bspElem.setBspOutLoc("");
403 if (!textBuildLoc.getText().isEmpty()) {
404 checkBuildDir();
405 bspElem.setBuildLoc(textBuildLoc.getText());
406 } else {
407 bspElem.setBuildLoc(metadataLoc + "/build");
408 if (!buildDirChecked) {
409 checkBuildDir();
410 buildDirChecked = true;
411 }
412 }
413 bspElem.setMetadataLoc(metadataLoc);
414 bspElem.setKarch(karch);
415 bspElem.setQarch(qarch);
416
417
418 if (!bspElem.getValidPropertiesFile()) {
419 boolean validPropertiesFile = true;
420 BSPAction action = createPropertiesFile();
421 if (action.getMessage() != null) {
422 validPropertiesFile = false;
423 setErrorMessage(action.getMessage());
424 }
425 bspElem.setValidPropertiesFile(validPropertiesFile);
426 }
427 return true;
428 }
429
430 private BSPAction createPropertiesFile() {
431 String createPropertiesCmd = bspElem.getMetadataLoc() + "/scripts/" +
432 PROPERTIES_CMD_PREFIX + bspElem.getKarch() +
433 PROPERTIES_CMD_SURFIX + PROPERTIES_FILE;
434 BSPProgressDialog progressDialog = new BSPProgressDialog(getShell(), new ErrorCollectorThread(createPropertiesCmd), "Creating properties file ");
435 progressDialog.run(false);
436 return progressDialog.getBspAction();
437 }
438
439 private BSPAction getKArches() {
440 String getKArchCmd = textMetadataLoc.getText() + "/scripts/" + KARCH_CMD;
441 BSPProgressDialog progressDialog = new BSPProgressDialog(getShell(), new KernelArchGetter(getKArchCmd), "Loading kernel architectures ");
442 progressDialog.run(false);
443 return progressDialog.getBspAction();
444 }
445
446 private BSPAction getQArches() {
447 String getQArchCmd = textMetadataLoc.getText() + "/scripts/" + QARCH_CMD;
448 BSPProgressDialog progressDialog = new BSPProgressDialog(getShell(), new QemuArchGetter(getQArchCmd), "Loading Qemu architectures ");
449 progressDialog.run(false);
450 return progressDialog.getBspAction();
451 }
452
453 public Button getBtnMetadataLoc() {
454 return btnMetadataLoc;
455 }
456
457 public void setBtnMetadataLoc(Button btnMetadataLoc) {
458 this.btnMetadataLoc = btnMetadataLoc;
459 }
460
461 public Button getBtnBspOutLoc() {
462 return btnBspOutputLoc;
463 }
464
465 public void setBtnBspOutLoc(Button btnBspOutLoc) {
466 this.btnBspOutputLoc = btnBspOutLoc;
467 }
468
469 public Button getBtnBuilddirLoc() {
470 return btnBuildLoc;
471 }
472
473 public void setBtnBuilddirLoc(Button btnBuilddirLoc) {
474 this.btnBuildLoc = btnBuilddirLoc;
475 }
476
477 class BuildLocationListener implements FocusListener{
478 String value;
479 boolean changed;
480
481 BuildLocationListener(String value){
482 this.value = value;
483 }
484 @Override
485 public void focusGained(FocusEvent e) {
486 value = ((Text)e.getSource()).getText();
487 }
488
489 @Override
490 public void focusLost(FocusEvent e) {
491 if(!((Text)e.getSource()).getText().equals(value)) {
492 checkBuildDir();
493 buildDirChecked = true;
494 }
495 }
496
497 }
498}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/OutputCollectorThread.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/OutputCollectorThread.java
new file mode 100644
index 0000000..df5fba5
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/OutputCollectorThread.java
@@ -0,0 +1,19 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3/**
4 * BSPThread that returns all the output lines of the process execution
5 * @author ioana.grigoropol
6 *
7 */
8public class OutputCollectorThread extends BSPThread{
9
10 public OutputCollectorThread(String command) {
11 super(command);
12 }
13
14 @Override
15 protected String[] processLine(String line) {
16 return new String[]{SUCCESS, line};
17 }
18
19}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/PropertiesPage.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/PropertiesPage.java
new file mode 100644
index 0000000..18149e7
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/PropertiesPage.java
@@ -0,0 +1,498 @@
1/*******************************************************************************
2 * Copyright (c) 2012 Intel Corporation.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Intel - initial API and implementation
10 *******************************************************************************/
11package org.yocto.sdk.remotetools.wizards.bsp;
12
13import java.util.ArrayList;
14import java.util.Collections;
15import java.util.Enumeration;
16import java.util.HashSet;
17import java.util.Hashtable;
18import java.util.Iterator;
19
20import org.eclipse.jface.dialogs.MessageDialog;
21import org.eclipse.jface.wizard.WizardPage;
22import org.eclipse.swt.SWT;
23import org.eclipse.swt.custom.ScrolledComposite;
24import org.eclipse.swt.events.SelectionEvent;
25import org.eclipse.swt.events.SelectionListener;
26import org.eclipse.swt.layout.GridData;
27import org.eclipse.swt.layout.GridLayout;
28import org.eclipse.swt.widgets.Button;
29import org.eclipse.swt.widgets.Combo;
30import org.eclipse.swt.widgets.Composite;
31import org.eclipse.swt.widgets.Control;
32import org.eclipse.swt.widgets.Group;
33import org.eclipse.swt.widgets.Label;
34import org.eclipse.swt.widgets.Text;
35import org.eclipse.swt.widgets.Widget;
36import org.yocto.sdk.remotetools.YoctoBspElement;
37import org.yocto.sdk.remotetools.YoctoBspPropertyElement;
38import org.yocto.sdk.remotetools.YoctoJSONHelper;
39/**
40 *
41 * Setting up the parameters for creating the new Yocto BSP
42 *
43 * @author jzhang
44 */
45public class PropertiesPage extends WizardPage {
46 private static final String PAGE_NAME = "Properties";
47 private static final String VALUES_CMD_PREFIX = "yocto-bsp list ";
48 private static final String VALUES_CMD_SURFIX = " property ";
49 private static final String KERNEL_CHOICE = "kernel_choice";
50 private static final String DEFAULT_KERNEL = "use_default_kernel";
51 private static final String SMP_NAME = "smp";
52 private static final String EXISTING_KBRANCH_NAME = "existing_kbranch";
53 private static final String NEED_NEW_KBRANCH_NAME = "need_new_kbranch";
54 private static final String NEW_KBRANCH_NAME = "new_kbranch";
55 private static final String QARCH_NAME = "qemuarch";
56
57 private static final String KERNEL_CHOICES = "choices";
58 private static final String KERNEL_BRANCHES = "branches";
59
60 private Hashtable<YoctoBspPropertyElement, Control> propertyControlMap;
61 HashSet<YoctoBspPropertyElement> properties;
62
63 private ScrolledComposite composite;
64 private Composite controlContainer = null;
65
66 private YoctoBspElement bspElem = null;
67 private boolean kArchChanged = false;
68
69 private Combo kernelCombo;
70 private Combo branchesCombo;
71
72 private Button newBranchButton;
73 private Button existingBranchButton;
74
75 private Button smpButton;
76
77 private Group kGroup = null;
78 private Group kbGroup = null;
79// private Group otherSettingsGroup = null;
80 private Group propertyGroup = null;
81
82 public PropertiesPage(YoctoBspElement element) {
83 super(PAGE_NAME, "yocto-bsp Properties page", null);
84 this.bspElem = element;
85 }
86
87 public void onEnterPage(YoctoBspElement element) {
88 if (!element.getValidPropertiesFile()) {
89 setErrorMessage("There's no valid properties file created, please choose \"Back\" to reselect kernel architecture!");
90 return;
91 }
92
93 if (this.bspElem == null || this.bspElem.getKarch().isEmpty() || !this.bspElem.getKarch().contentEquals(element.getKarch())) {
94 kArchChanged = true;
95 } else
96 kArchChanged = false;
97
98 this.bspElem = element;
99 try {
100 if (kArchChanged) {
101 updateKernelValues(KERNEL_CHOICES, KERNEL_CHOICE);
102
103 if (propertyGroup != null) {
104 for (Control cntrl : propertyGroup.getChildren()) {
105 cntrl.dispose();
106 }
107 }
108
109 properties = YoctoJSONHelper.getProperties();
110
111 if (!properties.isEmpty()) {
112
113 if (!element.getQarch().isEmpty()) {
114 YoctoBspPropertyElement qarch_elem = new YoctoBspPropertyElement();
115 qarch_elem.setName(QARCH_NAME);
116 qarch_elem.setValue(element.getQarch());
117 properties.add(qarch_elem);
118 }
119
120 propertyControlMap = new Hashtable<YoctoBspPropertyElement, Control>();
121
122 ArrayList<YoctoBspPropertyElement> propertiesList = new ArrayList<YoctoBspPropertyElement>(properties);
123 Collections.sort(propertiesList, Collections.reverseOrder());
124
125 Iterator<YoctoBspPropertyElement> it = propertiesList.iterator();
126 Composite comp = new Composite(propertyGroup, SWT.FILL);
127 GridLayout layout = new GridLayout(2, false);
128 GridData data = new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1);
129 comp.setLayoutData(data);
130 comp.setLayout(layout);
131
132 while (it.hasNext()) {
133 // Get property
134 YoctoBspPropertyElement propElem = it.next();
135 String type = propElem.getType();
136 String name = propElem.getName();
137 if (type.contentEquals("edit")) {
138 new Label (propertyGroup, SWT.FILL).setText(name + ":");
139
140 Composite textContainer = new Composite(propertyGroup, SWT.NONE);
141 textContainer.setLayout(new GridLayout(1, false));
142 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
143 Text text = new Text(textContainer, SWT.BORDER | SWT.SINGLE);
144 text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
145 propertyControlMap.put(propElem, text);
146
147 } else if (type.contentEquals("boolean")) {
148 String default_value = propElem.getDefaultValue();
149 Composite labelContainer = new Composite(propertyGroup, SWT.NONE);
150 labelContainer.setLayout(new GridLayout(2, false));
151 labelContainer.setLayoutData(new GridData(GridData.FILL_HORIZONTAL, GridData.FILL_VERTICAL, true, false, 2, 1));
152 Button button = new Button(propertyGroup, SWT.CHECK);
153 button.setText(name);
154 if (default_value.equalsIgnoreCase("y")) {
155 button.setSelection(true);
156 } else
157 button.setSelection(false);
158 propertyControlMap.put(propElem, button);
159 } else if (type.contentEquals("choicelist")) {
160 new Label (propertyGroup, SWT.NONE).setText(name + ":");
161
162 Composite textContainer = new Composite(propertyGroup, SWT.NONE);
163 textContainer.setLayout(new GridLayout(1, false));
164 textContainer.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1));
165 Combo combo = new Combo(textContainer, SWT.READ_ONLY);
166 combo.setLayout(new GridLayout(2, false));
167 combo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
168 combo.setItems(getBSPComboProperties(name));
169 propertyControlMap.put(propElem, combo);
170 }
171 }
172 }
173 composite.setMinSize(controlContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
174 composite.computeSize(SWT.DEFAULT, SWT.DEFAULT);
175 controlContainer.pack();
176 this.composite.layout(true, true);
177 }
178 } catch (Exception e) {
179 e.printStackTrace();
180 }
181
182
183 }
184
185
186 @Override
187 public void createControl(Composite parent) {
188 this.composite = new ScrolledComposite(parent, SWT.H_SCROLL | SWT.V_SCROLL);
189 GridData gd = new GridData(SWT.FILL, SWT.FILL, true, false);
190 GridLayout layout = new GridLayout(2, true);
191 this.composite.setLayout(layout);
192
193 gd= new GridData(SWT.FILL, SWT.FILL, true, false);
194 gd.horizontalSpan = 2;
195 this.composite.setLayoutData(gd);
196
197 setControl(this.composite);
198
199 controlContainer = new Composite(composite, SWT.NONE);
200 controlContainer.setLayout(new GridLayout(1, true));
201 controlContainer.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false));
202
203 kGroup = new Group(controlContainer, SWT.FILL);
204 kGroup.setLayout(new GridLayout(2, false));
205 GridData data = new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1);
206 kGroup.setLayoutData(data);
207 kGroup.setText("Kernel Settings:");
208
209 new Label (kGroup, SWT.NONE).setText("Kernel:");
210 Composite textContainer = new Composite(kGroup, SWT.NONE);
211 textContainer.setLayout(new GridLayout(1, false));
212 textContainer.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
213
214 kernelCombo = new Combo(textContainer, SWT.READ_ONLY);
215 kernelCombo.setLayout(new GridLayout(2, false));
216 kernelCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
217
218 kernelCombo.addSelectionListener(new SelectionListener() {
219
220 @Override
221 public void widgetSelected(SelectionEvent e) {
222 controlChanged(e.widget);
223 }
224
225 @Override
226 public void widgetDefaultSelected(SelectionEvent e) {
227 }
228 });
229
230 kbGroup = new Group(kGroup, SWT.FILL);
231 kbGroup.setLayout(new GridLayout(2, true));
232 data = new GridData(SWT.FILL, SWT.FILL, true, false);
233 data.horizontalSpan = 2;
234 kbGroup.setLayoutData(data);
235 kbGroup.setText("Branch Settings:");
236
237 textContainer = new Composite(kbGroup, SWT.NONE);
238 textContainer.setLayout(new GridLayout(2, false));
239 textContainer.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
240
241 new Label(textContainer, SWT.NONE).setText("Kernel branch:");
242
243 branchesCombo = new Combo(textContainer, SWT.READ_ONLY);
244 branchesCombo.setLayout(new GridLayout(1, false));
245 branchesCombo.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 1, 1));
246 branchesCombo.addSelectionListener(new SelectionListener() {
247
248 @Override
249 public void widgetSelected(SelectionEvent e) {
250 controlChanged(e.widget);
251 }
252
253 @Override
254 public void widgetDefaultSelected(SelectionEvent e) {
255 }
256 });
257 branchesCombo.setSize(200, 200);
258
259 newBranchButton = new Button(kbGroup, SWT.RADIO);
260 newBranchButton.setText("Create a new branch from an existing one");
261 newBranchButton.setSelection(true);
262 newBranchButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
263 SelectionListener listener = new SelectionListener() {
264 @Override
265 public void widgetDefaultSelected(SelectionEvent e) {}
266
267 @Override
268 public void widgetSelected(SelectionEvent e) {
269 controlChanged(e.widget);
270 }
271 };
272
273 newBranchButton.addSelectionListener(listener);
274
275 existingBranchButton = new Button(kbGroup, SWT.RADIO);
276 existingBranchButton.setText("Use existing branch");
277 existingBranchButton.setSelection(false);
278 existingBranchButton.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, false, 2, 1));
279 existingBranchButton.addSelectionListener(listener);
280
281// otherSettingsGroup = new Group(controlContainer, SWT.FILL);
282// otherSettingsGroup.setLayout(new GridLayout(2, true));
283// data = new GridData(SWT.FILL, SWT.FILL, true, false);
284// data.horizontalSpan = 2;
285// otherSettingsGroup.setLayoutData(data);
286// otherSettingsGroup.setText("Other Settings:");
287
288 smpButton = new Button(kGroup, SWT.CHECK);
289 smpButton.setText("Enable SMP support");
290 smpButton.setSelection(true);
291
292 propertyGroup = new Group(controlContainer, SWT.NONE);
293 propertyGroup.setLayout(new GridLayout(2, false));
294 data = new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1);
295 propertyGroup.setLayoutData(data);
296 propertyGroup.setText("BSP specific settings:");
297
298 this.composite.layout(true, true);
299
300 composite.setContent(controlContainer);
301 composite.setExpandHorizontal(true);
302 composite.setExpandVertical(true);
303 composite.setMinSize(controlContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
304 controlContainer.pack();
305 composite.pack();
306 }
307
308 @Override
309 public boolean canFlipToNextPage() {
310 return false;
311 }
312
313 public HashSet<YoctoBspPropertyElement> getProperties() {
314 String kcSelection = kernelCombo.getText();
315 String kbSelection = branchesCombo.getText();
316 YoctoBspPropertyElement kcElement = new YoctoBspPropertyElement();
317 kcElement.setName(KERNEL_CHOICE);
318 kcElement.setValue(kcSelection);
319 properties.add(kcElement);
320 YoctoBspPropertyElement defaultElement = new YoctoBspPropertyElement();
321 defaultElement.setName(DEFAULT_KERNEL);
322 defaultElement.setValue("n");
323 properties.add(defaultElement);
324
325 YoctoBspPropertyElement smpElement = new YoctoBspPropertyElement();
326 smpElement.setName(SMP_NAME);
327 if (smpButton.getSelection())
328 smpElement.setValue("y");
329 else
330 smpElement.setValue("n");
331 properties.add(smpElement);
332
333 YoctoBspPropertyElement newKbElement = new YoctoBspPropertyElement();
334 YoctoBspPropertyElement kbElement = new YoctoBspPropertyElement();
335
336 newKbElement.setName(NEED_NEW_KBRANCH_NAME);
337 if (newBranchButton.getSelection()) {
338 newKbElement.setValue("y");
339 properties.add(newKbElement);
340 kbElement.setName(NEW_KBRANCH_NAME);
341 kbElement.setValue(kbSelection);
342 properties.add(kbElement);
343 } else {
344 newKbElement.setValue("n");
345 properties.add(newKbElement);
346 kbElement.setName(EXISTING_KBRANCH_NAME);
347 kbElement.setValue(kbSelection);
348 properties.add(kbElement);
349 }
350
351 return properties;
352 }
353
354 public boolean validatePage() {
355 if (kernelCombo == null)
356 return false;
357
358 if ((kernelCombo != null) && (branchesCombo != null)) {
359 String kcSelection = kernelCombo.getText();
360 String kbSelection = branchesCombo.getText();
361 if ((kcSelection == null) || (kbSelection == null) || (kcSelection.isEmpty()) || (kbSelection.isEmpty())) {
362 setErrorMessage("Please choose a kernel and a specific branch!");
363 return false;
364 }
365 }
366 if ((propertyControlMap != null)) {
367 if (!propertyControlMap.isEmpty()) {
368 Enumeration<YoctoBspPropertyElement> keys = propertyControlMap.keys();
369 while (keys.hasMoreElements()) {
370 YoctoBspPropertyElement key = keys.nextElement();
371 Control control = propertyControlMap.get(key);
372 String type = key.getType();
373
374 if (type.contentEquals("edit")) {
375 String text_value = ((Text)control).getText();
376 if (text_value == null) {
377 setErrorMessage("Field "+ key.getName() +" is not set. All of the field on this screen must be set!");
378 return false;
379 } else {
380 key.setValue(text_value);
381 }
382 } else if (type.contentEquals("choicelist")) {
383 String choice_value = ((Combo)control).getText();
384 if (choice_value == null) {
385 setErrorMessage("Field "+ key.getName() +" is not set. All of the field on this screen must be set!");
386 return false;
387 } else {
388 key.setValue(choice_value);
389 }
390 } else {
391 boolean button_select = ((Button)control).getSelection();
392 if (button_select)
393 key.setValue("y");
394 else
395 key.setValue("n");
396 }
397 updateProperties(key);
398 }
399 }
400 }
401 return true;
402 }
403
404 private void updateProperties(YoctoBspPropertyElement element) {
405 Iterator<YoctoBspPropertyElement> it = properties.iterator();
406
407 while (it.hasNext()) {
408 YoctoBspPropertyElement propElem = it.next();
409 if (propElem.getName().contentEquals(element.getName())) {
410 properties.remove(propElem);
411 properties.add(element);
412 break;
413 } else
414 continue;
415 }
416 }
417 private void controlChanged(Widget widget) {
418 setErrorMessage(null);
419
420 String kernel_choice = kernelCombo.getText();
421 if ((kernel_choice == null) || (kernel_choice.isEmpty())) {
422 setErrorMessage("Please choose kernel !");
423 return;
424 }
425 if (widget == kernelCombo) {
426 updateKernelValues(KERNEL_BRANCHES, "\\\"" + kernel_choice + "\\\"." + NEW_KBRANCH_NAME);
427 } else if (widget == branchesCombo) {
428 setErrorMessage(null);
429 branchesCombo.computeSize(SWT.DEFAULT, SWT.DEFAULT);
430 } else if (widget == newBranchButton || widget == existingBranchButton) {
431 if (newBranchButton.getSelection()) {
432 updateKernelValues(KERNEL_BRANCHES, "\"" + kernel_choice + "\"." + NEW_KBRANCH_NAME);
433 } else {
434 updateKernelValues(KERNEL_BRANCHES, "\"" + kernel_choice + "\"." + EXISTING_KBRANCH_NAME);
435 }
436 branchesCombo.deselectAll();
437 }
438 canFlipToNextPage();
439 getWizard().getContainer().updateButtons();
440 this.composite.layout(true, true);
441 composite.pack();
442 }
443
444 private void updateKernelValues(final String value, String property) {
445 String build_dir = "";
446 if ((bspElem.getBuildLoc() == null) || bspElem.getBuildLoc().isEmpty())
447 build_dir = bspElem.getMetadataLoc()+"/build";
448 else
449 build_dir = bspElem.getBuildLoc();
450
451 String metadataLoc = bspElem.getMetadataLoc();
452 String valuesCmd = "source " + metadataLoc + "/oe-init-build-env;" + metadataLoc + "/scripts/" + VALUES_CMD_PREFIX + bspElem.getKarch() + VALUES_CMD_SURFIX + property;
453 BSPProgressDialog progressDialog = new BSPProgressDialog(getShell(), new KernelBranchesGetter(valuesCmd), "Loading Kernel " + value);
454 if (value.equals(KERNEL_CHOICES))
455 progressDialog.run(false);
456 else if (value.equals(KERNEL_BRANCHES))
457 progressDialog.run(true);
458
459 BSPAction action = progressDialog.getBspAction();
460 if (action.getItems() != null) {
461 if (value.equals(KERNEL_CHOICES)) {
462 kernelCombo.setItems(action.getItems());
463 kernelCombo.pack();
464 kernelCombo.deselectAll();
465 branchesCombo.setEnabled(false);
466 branchesCombo.deselectAll();
467 } else if (value.equals(KERNEL_BRANCHES)) {
468 branchesCombo.setItems(action.getItems());
469 branchesCombo.pack();
470 branchesCombo.setEnabled(true);
471 }
472 composite.setMinSize(controlContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
473 } else if (action.getMessage() != null)
474 MessageDialog.openError(getShell(), "Yocto-BSP", action.getMessage());
475 composite.setMinSize(controlContainer.computeSize(SWT.DEFAULT, SWT.DEFAULT, true));
476 }
477
478 private String[] getBSPComboProperties(String property) {
479 String build_dir = "";
480 if ((bspElem.getBuildLoc() == null) || bspElem.getBuildLoc().isEmpty())
481 build_dir = bspElem.getMetadataLoc()+"/build";
482 else
483 build_dir = bspElem.getBuildLoc();
484
485 String valuesCmd = "export BUILDDIR=" + build_dir + ";" + bspElem.getMetadataLoc() + "/scripts/" + VALUES_CMD_PREFIX + bspElem.getKarch() + VALUES_CMD_SURFIX + property;
486 BSPProgressDialog progressDialog = new BSPProgressDialog(getShell(), new KernelBranchesGetter(valuesCmd), "Loading property " + property + "values");
487 progressDialog.run(false);
488 BSPAction action = progressDialog.getBspAction();
489
490 if (action.getItems() != null) {
491 return action.getItems();
492 } else if (action.getMessage() != null) {
493 MessageDialog.openError(getShell(), "Yocto-BSP", action.getMessage());
494 return new String[]{};
495 }
496 return new String[]{};
497 }
498}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/QemuArchGetter.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/QemuArchGetter.java
new file mode 100644
index 0000000..e235695
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/QemuArchGetter.java
@@ -0,0 +1,27 @@
1package org.yocto.sdk.remotetools.wizards.bsp;
2
3/**
4 * BSPThread that processes the output of running "yocto-bsp list qemu property qemuarch"
5 * @author ioana.grigoropol
6 *
7 */
8public class QemuArchGetter extends BSPThread {
9
10 public QemuArchGetter(String command) {
11 super(command);
12 }
13
14 @Override
15 protected String[] processLine(String line) {
16 if (!line.startsWith("["))
17 return new String[]{ERROR, line + "\n"};
18
19 String[] values = line.split(",");
20
21 String value = values[0];
22 value = value.replace("[\"", "");
23 value = value.replaceAll("\"$", "");
24 return new String[]{SUCCESS, value};
25 }
26
27}
diff --git a/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/YoctoBSPWizard.java b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/YoctoBSPWizard.java
new file mode 100644
index 0000000..3ab24c0
--- /dev/null
+++ b/plugins/org.yocto.sdk.remotetools/src/org/yocto/sdk/remotetools/wizards/bsp/YoctoBSPWizard.java
@@ -0,0 +1,99 @@
1/*******************************************************************************
2 * Copyright (c) 2010 Intel Corporation.
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Intel - initial API and implementation
10 *******************************************************************************/
11package org.yocto.sdk.remotetools.wizards.bsp;
12
13import java.util.HashSet;
14
15import org.eclipse.jface.dialogs.MessageDialog;
16import org.eclipse.jface.wizard.IWizardPage;
17import org.eclipse.jface.wizard.Wizard;
18import org.yocto.sdk.remotetools.YoctoBspElement;
19import org.yocto.sdk.remotetools.YoctoBspPropertyElement;
20import org.yocto.sdk.remotetools.YoctoJSONHelper;
21
22/**
23 * A wizard for creating Yocto BSP.
24 *
25 * @author jzhang
26 *
27 */
28public class YoctoBSPWizard extends Wizard {
29 private static final String CREATE_CMD = "/scripts/yocto-bsp create ";
30 private static final String PROPERTY_VALUE_FILE = "/tmp/propertyvalues.json";
31
32 private MainPage mainPage;
33 private PropertiesPage propertiesPage;
34 private final YoctoBspElement bspElem;
35
36 public YoctoBSPWizard() {
37 super();
38 bspElem = new YoctoBspElement();
39 }
40
41 @Override
42 public IWizardPage getNextPage(IWizardPage page) {
43 propertiesPage.onEnterPage(mainPage.getBSPElement());
44 return propertiesPage;
45 }
46
47 @Override
48 public void addPages() {
49 mainPage = new MainPage(bspElem);
50 addPage(mainPage);
51 propertiesPage = new PropertiesPage(bspElem);
52 addPage(propertiesPage);
53 }
54
55 private BSPAction createBSP(){
56 YoctoBspElement element = mainPage.getBSPElement();
57 String createBspCmd = element.getMetadataLoc() + CREATE_CMD +
58 element.getBspName() + " " + element.getKarch();
59
60 if (!element.getBspOutLoc().isEmpty())
61 createBspCmd = createBspCmd + " -o " + element.getBspOutLoc();
62 else
63 createBspCmd = createBspCmd + " -o " + element.getMetadataLoc() + "/meta-" + element.getBspName();
64 createBspCmd = createBspCmd + " -i " + PROPERTY_VALUE_FILE;
65
66 BSPProgressDialog progressDialog = new BSPProgressDialog(getShell(), new OutputCollectorThread(createBspCmd), "Creating BSP ");
67 progressDialog.run(true);
68 return progressDialog.getBspAction();
69 }
70
71 @Override
72 public boolean performFinish() {
73 if (propertiesPage.validatePage()) {
74 HashSet<YoctoBspPropertyElement> properties = propertiesPage.getProperties();
75 YoctoJSONHelper.createBspJSONFile(properties);
76
77 BSPAction createBSPAction = createBSP();
78 if (createBSPAction.getMessage() != null && !createBSPAction.getMessage().isEmpty()) {
79 MessageDialog.openError(getShell(),"Yocto-BSP", createBSPAction.getMessage());
80 return false;
81 } else {
82 String message = "";
83 for (String item : createBSPAction.getItems())
84 message += item + "\n";
85 MessageDialog.openInformation(getShell(), "Yocto-BSP", message);
86 return true;
87 }
88 } else {
89 MessageDialog.openError(getShell(), "Yocto-BSP", "Property settings contains error!");
90 return false;
91 }
92
93 }
94
95 @Override
96 public boolean canFinish() {
97 return (mainPage.validatePage() && propertiesPage.validatePage());
98 }
99}