]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/far/updateui/UpdateStepTwo.java
1. Wrap text by word when showing a message box
[mirror_edk2.git] / Tools / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / far / updateui / UpdateStepTwo.java
index 1dd4c4877f043af31f8eec95a6ae084f59f18360..45e6e979911aa12424fef3d60707e31e75d599c0 100644 (file)
@@ -17,8 +17,13 @@ import java.awt.Dimension;
 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
@@ -29,11 +34,15 @@ import javax.swing.JTable;
 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
@@ -64,6 +73,8 @@ public class UpdateStepTwo extends IDialog implements MouseListener {
 \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
@@ -137,7 +148,7 @@ public class UpdateStepTwo extends IDialog implements MouseListener {
     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
@@ -174,11 +185,11 @@ public class UpdateStepTwo extends IDialog implements MouseListener {
             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
@@ -243,16 +254,83 @@ public class UpdateStepTwo extends IDialog implements MouseListener {
             //\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.wrn("Update far", "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.wrn("Install " + pkgId.toString(), ex.getMessage());\r
+                    Log.err("Install " + pkgId.toString(), ex.getMessage());\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
@@ -279,6 +357,46 @@ public class UpdateStepTwo extends IDialog implements MouseListener {
 \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