3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
14 package org
.tianocore
.frameworkwizard
.far
.updateui
;
16 import java
.awt
.Dimension
;
17 import java
.awt
.Toolkit
;
18 import java
.awt
.event
.MouseEvent
;
19 import java
.awt
.event
.MouseListener
;
21 import java
.util
.ArrayList
;
22 import java
.util
.Iterator
;
23 import java
.util
.LinkedHashSet
;
24 import java
.util
.List
;
26 import java
.util
.Vector
;
28 import javax
.swing
.JPanel
;
29 import javax
.swing
.JTextArea
;
30 import javax
.swing
.JButton
;
31 import javax
.swing
.JScrollPane
;
32 import javax
.swing
.JLabel
;
33 import javax
.swing
.JTable
;
34 import javax
.swing
.ListSelectionModel
;
35 import javax
.swing
.table
.DefaultTableModel
;
37 import org
.tianocore
.frameworkwizard
.common
.DataType
;
38 import org
.tianocore
.frameworkwizard
.common
.Log
;
39 import org
.tianocore
.frameworkwizard
.common
.Tools
;
40 import org
.tianocore
.frameworkwizard
.common
.ui
.IDialog
;
41 import org
.tianocore
.frameworkwizard
.far
.AggregationOperation
;
42 import org
.tianocore
.frameworkwizard
.far
.DistributeRule
;
43 import org
.tianocore
.frameworkwizard
.far
.Far
;
44 import org
.tianocore
.frameworkwizard
.packaging
.PackageIdentification
;
45 import org
.tianocore
.frameworkwizard
.platform
.PlatformIdentification
;
46 import org
.tianocore
.frameworkwizard
.workspace
.Workspace
;
47 import org
.tianocore
.frameworkwizard
.workspace
.WorkspaceTools
;
49 public class UpdateStepTwo
extends IDialog
implements MouseListener
{
54 private static final long serialVersionUID
= -4400145363721213110L;
56 private JPanel jContentPane
= null;
58 private JTextArea jTextArea
= null;
60 private UpdateStepOne stepOne
= null;
62 private JButton jButtonCancel
= null;
64 private JButton jButtonFinish
= null;
66 private JButton jButtonPrevious
= null;
68 private JScrollPane jScrollPane
= null;
70 private JLabel jLabel
= null;
72 private JTable jTablePackage
= null;
74 private PartialTableModel model
= null;
76 List
<PackageIdentification
> updatPkgList
= new ArrayList
<PackageIdentification
>();
78 public UpdateStepTwo(IDialog iDialog
, boolean modal
, UpdateStepOne stepOne
) {
80 this.stepOne
= stepOne
;
84 * This method initializes jTextArea
86 * @return javax.swing.JTextArea
88 private JTextArea
getJTextArea() {
89 if (jTextArea
== null) {
90 jTextArea
= new JTextArea();
91 jTextArea
.setBounds(new java
.awt
.Rectangle(30, 7, 642, 50));
92 jTextArea
.setText("Step 2: Summary. \n");
93 jTextArea
.setEditable(false);
99 * This method initializes jButtonCancel
101 * @return javax.swing.JButton
103 private JButton
getJButtonCancel() {
104 if (jButtonCancel
== null) {
105 jButtonCancel
= new JButton();
106 jButtonCancel
.setBounds(new java
.awt
.Rectangle(570, 330, 90, 20));
107 jButtonCancel
.setText("Cancel");
108 jButtonCancel
.addMouseListener(this);
110 return jButtonCancel
;
114 * This method initializes jButtonFinish
116 * @return javax.swing.JButton
118 private JButton
getJButtonFinish() {
119 if (jButtonFinish
== null) {
120 jButtonFinish
= new JButton();
121 jButtonFinish
.setBounds(new java
.awt
.Rectangle(470, 330, 90, 20));
122 jButtonFinish
.setText("Finish");
123 jButtonFinish
.addMouseListener(this);
125 return jButtonFinish
;
129 * This method initializes jButtonPrevious
131 * @return javax.swing.JButton
133 private JButton
getJButtonPrevious() {
134 if (jButtonPrevious
== null) {
135 jButtonPrevious
= new JButton();
136 jButtonPrevious
.setBounds(new java
.awt
.Rectangle(370, 330, 90, 20));
137 jButtonPrevious
.setText("Previous");
138 jButtonPrevious
.addMouseListener(this);
140 return jButtonPrevious
;
144 * This method initializes jScrollPane
146 * @return javax.swing.JScrollPane
148 private JScrollPane
getJScrollPane() {
149 if (jScrollPane
== null) {
150 jScrollPane
= new JScrollPane();
151 jScrollPane
.setBounds(new java
.awt
.Rectangle(30, 100, 642, 170));
152 jScrollPane
.setViewportView(getJTablePackage());
158 * This method initializes jTablePackage
160 * @return javax.swing.JTable
162 private JTable
getJTablePackage() {
163 if (jTablePackage
== null) {
164 jTablePackage
= new JTable();
165 model
= new PartialTableModel();
166 jTablePackage
= new JTable(model
);
167 jTablePackage
.setRowHeight(20);
168 jTablePackage
.setAutoResizeMode(javax
.swing
.JTable
.AUTO_RESIZE_SUBSEQUENT_COLUMNS
);
169 model
.addColumn("Name");
170 model
.addColumn("Version");
171 model
.addColumn("Guid");
172 model
.addColumn("Path");
174 jTablePackage
.setSelectionMode(ListSelectionModel
.SINGLE_SELECTION
);
176 return jTablePackage
;
179 public void prepareTable() {
180 model
.setRowCount(0);
182 Far far
= stepOne
.getFar();
183 List
<PackageIdentification
> packagesInFar
= far
.mainfest
.getPackageList();
185 WorkspaceTools wt
= new WorkspaceTools();
186 List
<PackageIdentification
> packagesInDb
= wt
.getAllPackages();
188 updatPkgList
= AggregationOperation
.intersection(packagesInDb
, packagesInFar
);
190 // Change here to get packages and platforms from FAR
192 Iterator
<PackageIdentification
> iter
= updatPkgList
.iterator();//packageList.iterator();
193 while (iter
.hasNext()) {
194 String
[] str
= new String
[4];
195 PackageIdentification item
= iter
.next();
196 str
[0] = item
.getName();
197 str
[1] = item
.getVersion();
198 str
[2] = item
.getGuid();
199 str
[3] = Tools
.getFilePathOnly(Tools
.getRelativePath(item
.getPath(), Workspace
.getCurrentWorkspace()));
202 } catch (Exception ex
) {
203 ex
.printStackTrace();
208 * This is the default constructor
210 public UpdateStepTwo(IDialog iDialog
, boolean modal
) {
211 super(iDialog
, modal
);
216 * This method initializes this
220 private void initialize() {
221 this.setSize(700, 400);
222 this.setContentPane(getJContentPane());
223 this.setTitle("Update Framework Archive(FAR) - Step 2: Summary");
224 Dimension d
= Toolkit
.getDefaultToolkit().getScreenSize();
225 this.setLocation((d
.width
- this.getSize().width
) / 2, (d
.height
- this.getSize().height
) / 2);
229 * This method initializes jContentPane
231 * @return javax.swing.JPanel
233 private JPanel
getJContentPane() {
234 if (jContentPane
== null) {
235 jLabel
= new JLabel();
236 jLabel
.setBounds(new java
.awt
.Rectangle(30, 70, 281, 20));
237 jLabel
.setText("Following packages will be updated: ");
238 jContentPane
= new JPanel();
239 jContentPane
.setLayout(null);
240 jContentPane
.add(getJTextArea(), null);
241 jContentPane
.add(getJButtonCancel(), null);
242 jContentPane
.add(getJButtonFinish(), null);
243 jContentPane
.add(getJButtonPrevious(), null);
244 jContentPane
.add(getJScrollPane(), null);
245 jContentPane
.add(jLabel
, null);
250 public void mouseClicked(MouseEvent e
) {
251 if (e
.getSource() == jButtonCancel
) {
252 this.setVisible(false);
253 } else if (e
.getSource() == jButtonFinish
) {
257 WorkspaceTools wsTools
= new WorkspaceTools();
259 Iterator
<PackageIdentification
> iter
= updatPkgList
.iterator();
260 List
<PackageIdentification
> depResultList
= new ArrayList
<PackageIdentification
>();
261 while (iter
.hasNext()) {
262 List
<PackageIdentification
> depPkgList
= stepOne
.getFar().getPackageDependencies(iter
.next());
263 depResultList
= AggregationOperation
.union(depResultList
, depPkgList
);
266 List
<PackageIdentification
> dbPkgList
= DistributeRule
.vectorToList(wsTools
.getAllPackages());
267 List
<PackageIdentification
> resultList
= AggregationOperation
274 Iterator resultIter
= resultList
.iterator();
275 while (resultIter
.hasNext()) {
276 Log
.wrn("Update far", "Missing dependency package " + ((PackageIdentification
) resultIter
.next()).toString()
282 // Remove all update packages
285 // For all packages, remove all files.
286 // Exception FPD file still in DB
288 Vector
<PlatformIdentification
> allPlatforms
= wsTools
.getAllPlatforms();
289 Set
<File
> allPlatformFiles
= new LinkedHashSet
<File
>();
291 Iterator
<PlatformIdentification
> allPlfIter
= allPlatforms
.iterator();
292 while (iter
.hasNext()) {
293 allPlatformFiles
.add(allPlfIter
.next().getFpdFile());
296 Iterator
<PackageIdentification
> packageIter
= this.updatPkgList
.iterator();
297 while (packageIter
.hasNext()) {
298 PackageIdentification item
= packageIter
.next();
299 Set
<File
> deleteFiles
= new LinkedHashSet
<File
>();
300 recursiveDir(deleteFiles
, item
.getSpdFile().getParentFile(), allPlatformFiles
);
301 Iterator
<File
> iterDeleteFile
= deleteFiles
.iterator();
302 while (iterDeleteFile
.hasNext()) {
303 deleteFiles(iterDeleteFile
.next());
306 // Remove all empty parent dir
308 File parentDir
= item
.getSpdFile().getParentFile();
309 while (parentDir
.listFiles().length
== 0) {
310 File tempFile
= parentDir
;
311 parentDir
= parentDir
.getParentFile();
317 // Install all update packages
319 Iterator
<PackageIdentification
> updataIter
= this.updatPkgList
.iterator();
320 while (updataIter
.hasNext()) {
321 PackageIdentification pkgId
= updataIter
.next();
323 stepOne
.getFar().installPackage(pkgId
, new File(pkgId
.getSpdFile().getParent()));
324 } catch (Exception ex
) {
325 Log
.wrn("Install " + pkgId
.toString(), ex
.getMessage());
326 Log
.err("Install " + pkgId
.toString(), ex
.getMessage());
330 this.stepOne
.returnType
= DataType
.RETURN_TYPE_OK
;
332 this.setVisible(false);
334 } else if (e
.getSource() == jButtonPrevious
) {
335 this.setVisible(false);
336 stepOne
.setVisible(true);
340 public void mousePressed(MouseEvent e
) {
341 // TODO Auto-generated method stub
345 public void mouseReleased(MouseEvent e
) {
346 // TODO Auto-generated method stub
350 public void mouseEntered(MouseEvent e
) {
351 // TODO Auto-generated method stub
355 public void mouseExited(MouseEvent e
) {
356 // TODO Auto-generated method stub
360 private void recursiveDir(Set
<File
> files
, File dir
, Set
<File
> platformFiles
) {
361 File
[] fileList
= dir
.listFiles();
362 for (int i
= 0; i
< fileList
.length
; i
++) {
363 if (fileList
[i
].isFile()) {
364 if (!platformFiles
.contains(fileList
[i
])) {
365 files
.add(fileList
[i
]);
368 if (isContain(fileList
[i
], platformFiles
)) {
369 recursiveDir(files
, fileList
[i
], platformFiles
);
371 files
.add(fileList
[i
]);
377 private void deleteFiles(File file
) {
378 if (file
.isDirectory()) {
379 File
[] files
= file
.listFiles();
380 for (int i
= 0; i
< files
.length
; i
++) {
381 deleteFiles(files
[i
]);
387 private boolean isContain(File dir
, Set
<File
> platformFiles
) {
388 Iterator
<File
> iter
= platformFiles
.iterator();
389 while (iter
.hasNext()) {
390 File file
= iter
.next();
391 if (file
.getPath().startsWith(dir
.getPath())) {
393 // continue this FPD file
402 class PartialTableModel
extends DefaultTableModel
{
406 private static final long serialVersionUID
= 1L;
408 public boolean isCellEditable(int row
, int col
) {