import java.awt.Toolkit;\r
import java.awt.event.MouseEvent;\r
import java.awt.event.MouseListener;\r
+import java.io.File;\r
+import java.util.ArrayList;\r
import java.util.Iterator;\r
+import java.util.LinkedHashSet;\r
import java.util.List;\r
+import java.util.Set;\r
+import java.util.Vector;\r
\r
import javax.swing.JPanel;\r
import javax.swing.JTextArea;\r
import javax.swing.ListSelectionModel;\r
import javax.swing.table.DefaultTableModel;\r
\r
+import org.tianocore.frameworkwizard.common.DataType;\r
+import org.tianocore.frameworkwizard.common.Log;\r
import org.tianocore.frameworkwizard.common.Tools;\r
import org.tianocore.frameworkwizard.common.ui.IDialog;\r
import org.tianocore.frameworkwizard.far.AggregationOperation;\r
+import org.tianocore.frameworkwizard.far.DistributeRule;\r
import org.tianocore.frameworkwizard.far.Far;\r
import org.tianocore.frameworkwizard.packaging.PackageIdentification;\r
+import org.tianocore.frameworkwizard.platform.PlatformIdentification;\r
import org.tianocore.frameworkwizard.workspace.Workspace;\r
import org.tianocore.frameworkwizard.workspace.WorkspaceTools;\r
\r
\r
private PartialTableModel model = null;\r
\r
+ List<PackageIdentification> updatPkgList = new ArrayList<PackageIdentification>();\r
+\r
public UpdateStepTwo(IDialog iDialog, boolean modal, UpdateStepOne stepOne) {\r
this(iDialog, modal);\r
this.stepOne = stepOne;\r
private JScrollPane getJScrollPane() {\r
if (jScrollPane == null) {\r
jScrollPane = new JScrollPane();\r
- jScrollPane.setBounds(new java.awt.Rectangle(30, 98, 570, 170));\r
+ jScrollPane.setBounds(new java.awt.Rectangle(30, 100, 642, 170));\r
jScrollPane.setViewportView(getJTablePackage());\r
}\r
return jScrollPane;\r
WorkspaceTools wt = new WorkspaceTools();\r
List<PackageIdentification> packagesInDb = wt.getAllPackages();\r
\r
- List<PackageIdentification> result = AggregationOperation.intersection(packagesInDb, packagesInFar);\r
+ updatPkgList = AggregationOperation.intersection(packagesInDb, packagesInFar);\r
//\r
// Change here to get packages and platforms from FAR\r
//\r
- Iterator<PackageIdentification> iter = result.iterator();//packageList.iterator();\r
+ Iterator<PackageIdentification> iter = updatPkgList.iterator();//packageList.iterator();\r
while (iter.hasNext()) {\r
String[] str = new String[4];\r
PackageIdentification item = iter.next();\r
//\r
// Check depedency ?\r
//\r
+ WorkspaceTools wsTools = new WorkspaceTools();\r
+\r
+ Iterator<PackageIdentification> iter = updatPkgList.iterator();\r
+ List<PackageIdentification> depResultList = new ArrayList<PackageIdentification>();\r
+ while (iter.hasNext()) {\r
+ List<PackageIdentification> depPkgList = stepOne.getFar().getPackageDependencies(iter.next());\r
+ depResultList = AggregationOperation.union(depResultList, depPkgList);\r
+ }\r
+\r
+ List<PackageIdentification> dbPkgList = DistributeRule.vectorToList(wsTools.getAllPackages());\r
+ List<PackageIdentification> resultList = AggregationOperation\r
+ .minus(\r
+ depResultList,\r
+ AggregationOperation\r
+ .union(\r
+ this.updatPkgList,\r
+ dbPkgList));\r
+ Iterator resultIter = resultList.iterator();\r
+ while (resultIter.hasNext()) {\r
+ Log.err("Missing dependency package " + ((PackageIdentification) resultIter.next()).toString()\r
+ + "in workspace!");\r
+ return;\r
+ }\r
\r
//\r
// Remove all update packages\r
//\r
+ //\r
+ // For all packages, remove all files. \r
+ // Exception FPD file still in DB\r
+ //\r
+ Vector<PlatformIdentification> allPlatforms = wsTools.getAllPlatforms();\r
+ Set<File> allPlatformFiles = new LinkedHashSet<File>();\r
+\r
+ Iterator<PlatformIdentification> allPlfIter = allPlatforms.iterator();\r
+ while (iter.hasNext()) {\r
+ allPlatformFiles.add(allPlfIter.next().getFpdFile());\r
+ }\r
+\r
+ Iterator<PackageIdentification> packageIter = this.updatPkgList.iterator();\r
+ while (packageIter.hasNext()) {\r
+ PackageIdentification item = packageIter.next();\r
+ Set<File> deleteFiles = new LinkedHashSet<File>();\r
+ recursiveDir(deleteFiles, item.getSpdFile().getParentFile(), allPlatformFiles);\r
+ Iterator<File> iterDeleteFile = deleteFiles.iterator();\r
+ while (iterDeleteFile.hasNext()) {\r
+ deleteFiles(iterDeleteFile.next());\r
+ }\r
+ //\r
+ // Remove all empty parent dir\r
+ //\r
+ File parentDir = item.getSpdFile().getParentFile();\r
+ while (parentDir.listFiles().length == 0) {\r
+ File tempFile = parentDir;\r
+ parentDir = parentDir.getParentFile();\r
+ tempFile.delete();\r
+ }\r
+ }\r
\r
//\r
// Install all update packages\r
//\r
+ Iterator<PackageIdentification> updataIter = this.updatPkgList.iterator();\r
+ while (updataIter.hasNext()) {\r
+ PackageIdentification pkgId = updataIter.next();\r
+ try {\r
+ stepOne.getFar().installPackage(pkgId, new File(pkgId.getSpdFile().getParent()));\r
+ } catch (Exception ex) {\r
+ Log.err("Can install " + pkgId.toString() + " pakcage, please check it!");\r
+ }\r
+\r
+ }\r
+ this.stepOne.returnType = DataType.RETURN_TYPE_OK;\r
\r
this.setVisible(false);\r
+ this.dispose();\r
} else if (e.getSource() == jButtonPrevious) {\r
this.setVisible(false);\r
stepOne.setVisible(true);\r
\r
}\r
\r
+ private void recursiveDir(Set<File> files, File dir, Set<File> platformFiles) {\r
+ File[] fileList = dir.listFiles();\r
+ for (int i = 0; i < fileList.length; i++) {\r
+ if (fileList[i].isFile()) {\r
+ if (!platformFiles.contains(fileList[i])) {\r
+ files.add(fileList[i]);\r
+ }\r
+ } else {\r
+ if (isContain(fileList[i], platformFiles)) {\r
+ recursiveDir(files, fileList[i], platformFiles);\r
+ } else {\r
+ files.add(fileList[i]);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private void deleteFiles(File file) {\r
+ if (file.isDirectory()) {\r
+ File[] files = file.listFiles();\r
+ for (int i = 0; i < files.length; i++) {\r
+ deleteFiles(files[i]);\r
+ }\r
+ }\r
+ file.delete();\r
+ }\r
+\r
+ private boolean isContain(File dir, Set<File> platformFiles) {\r
+ Iterator<File> iter = platformFiles.iterator();\r
+ while (iter.hasNext()) {\r
+ File file = iter.next();\r
+ if (file.getPath().startsWith(dir.getPath())) {\r
+ //\r
+ // continue this FPD file\r
+ //\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
}\r
\r
class PartialTableModel extends DefaultTableModel {\r