]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Tools/Java/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/platform/ui/FpdModuleSA.java
Refresh library instance selection UI for platform editor after library instance...
[mirror_edk2.git] / Tools / Java / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / platform / ui / FpdModuleSA.java
index 0b190ae2dbaa378bb9e7f46382085ee15ccb0c8b..e46a9bbeaff6377fcdf5b3d93b18ee8b7f6f2ef5 100644 (file)
@@ -21,12 +21,14 @@ import javax.swing.event.ListSelectionListener;
 import javax.swing.event.TableModelEvent;\r
 import javax.swing.event.TableModelListener;\r
 import javax.swing.table.DefaultTableModel;\r
+import javax.swing.table.TableColumn;\r
 import javax.swing.table.TableModel;\r
 \r
 import org.tianocore.frameworkwizard.common.DataValidation;\r
 import org.tianocore.frameworkwizard.common.GlobalData;\r
 import org.tianocore.frameworkwizard.common.IDefaultTableModel;\r
 import org.tianocore.frameworkwizard.common.Identifications.OpeningPlatformType;\r
+import org.tianocore.frameworkwizard.platform.ui.global.LibraryClassDescriptor;\r
 import org.tianocore.frameworkwizard.platform.ui.global.WorkspaceProfile;\r
 import org.tianocore.frameworkwizard.platform.ui.global.SurfaceAreaQuery;\r
 import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;\r
@@ -93,9 +95,13 @@ public class FpdModuleSA extends JDialog implements ActionListener {
     private FpdFileContents ffc = null;\r
     private String moduleKey = null;\r
     private int moduleSaNum = -1;\r
-    private HashMap<String, ArrayList<String>> classInstanceMap = null;\r
-    private ArrayList<String> classProduced = null;\r
-    private HashMap<String, ArrayList<String>> classConsumed = null;\r
+    private HashMap<LibraryClassDescriptor, ArrayList<String>> classInstanceMap = null;\r
+    //\r
+    // map of <{libName, supArch, supMod}, list of Module information>\r
+    //\r
+    private HashMap<LibraryClassDescriptor, ArrayList<String>> classConsumed = null;\r
+    private HashMap<LibraryClassDescriptor, ArrayList<String>> classProduced = null;\r
+    \r
     private JPanel jPanelModuleSaOpts = null;\r
     private JLabel jLabelFvBinding = null;\r
     private JTextField jTextFieldFvBinding = null;\r
@@ -124,6 +130,14 @@ public class FpdModuleSA extends JDialog implements ActionListener {
     private JPanel jPanelToolchainS = null;\r
     private JPanel jPanelLibraryCenterN = null;\r
     private JPanel jPanelLibraryCenterC = null;  //  @jve:decl-index=0:visual-constraint="20,224"\r
+    \r
+    private final int buildTargetWidth = 150;\r
+    private final int toolChainFamilyWidth = 150;\r
+    private final int supportArchWidth = 150;\r
+    private final int toolCmdCodeWidth = 200;\r
+    private final int tagNameWidth = 150;\r
+    private final int argWidth = 400;\r
+    \r
     /**\r
      * This is the default constructor\r
      */\r
@@ -140,10 +154,22 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         this.moduleKey = k;\r
         moduleSaNum = i;\r
         this.docConsole = dc;\r
+        classInstanceMap = null;\r
         classProduced = null;\r
         classConsumed = null;\r
         jTabbedPane.setSelectedIndex(0);\r
         initPcdBuildDefinition(i);\r
+        ModuleIdentification mi = WorkspaceProfile.getModuleId(moduleKey);\r
+        if (mi == null) {\r
+            return;\r
+        }\r
+        int tabIndex = jTabbedPane.indexOfTab("Libraries");\r
+        if (mi.isLibrary()) {\r
+            jTabbedPane.setEnabledAt(tabIndex, false);\r
+        }\r
+        else {\r
+            jTabbedPane.setEnabledAt(tabIndex, true);\r
+        }\r
     }\r
 \r
     /**\r
@@ -170,20 +196,31 @@ public class FpdModuleSA extends JDialog implements ActionListener {
     }\r
     \r
     public void initLibraries(String key) {\r
-        //\r
-        // display library classes that need to be resolved. also potential instances for them.\r
-        //\r
-        resolveLibraryInstances(moduleKey);\r
+        libClassTableModel.setRowCount(0);\r
+        libInstanceTableModel.setRowCount(0);\r
+        selectedInstancesTableModel.setRowCount(0);\r
+        Vector<String> errorMsg = new Vector<String>();\r
+        try {\r
+            //\r
+            // display library classes that need to be resolved. also potential instances for them.\r
+            //\r
+            resolveLibraryInstances(moduleKey, errorMsg);\r
+        } catch (Exception e) {\r
+            String exceptionMsg = e.getCause() + " " + e.getMessage();\r
+            errorMsg.add(exceptionMsg);\r
+            JOptionPane.showMessageDialog(frame, exceptionMsg);\r
+        }\r
         //\r
         // display lib instances already selected for key\r
         //\r
-        selectedInstancesTableModel.setRowCount(0);\r
+        \r
         int instanceCount = ffc.getLibraryInstancesCount(key);\r
         if (instanceCount != 0) {\r
             String[][] saa = new String[instanceCount][5];\r
             ffc.getLibraryInstances(key, saa);\r
             for (int i = 0; i < saa.length; ++i) {\r
-                ModuleIdentification mi = WorkspaceProfile.getModuleId(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4]);\r
+                ModuleIdentification mi = WorkspaceProfile.getModuleId(saa[i][1] + " " + saa[i][2] + " " + saa[i][3]\r
+                                                                       + " " + saa[i][4]);\r
                 if (mi != null) {\r
                     //\r
                     // ToDo: verify this instance first.\r
@@ -194,11 +231,26 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                     //\r
                     // re-evaluate lib instance usage when adding a already-selected lib instance.\r
                     //\r
-                    resolveLibraryInstances(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4]);\r
+                    try {\r
+                        resolveLibraryInstances(saa[i][1] + " " + saa[i][2] + " " + saa[i][3] + " " + saa[i][4], errorMsg);\r
+                    } catch (Exception e) {\r
+                        String exceptionMsg = e.getCause() + " " + e.getMessage();\r
+                        if (!errorMsg.contains(exceptionMsg)) {\r
+                            JOptionPane.showMessageDialog(frame, e.getCause() + " " + e.getMessage());\r
+                        }\r
+                    }\r
                     selectedInstancesTableModel.addRow(saa[i]);\r
                 }\r
             }\r
         }\r
+\r
+        if (errorMsg.size() > 0) {\r
+            String errors = "";\r
+            for (int i = 0; i < errorMsg.size(); ++i) {\r
+                errors += " " + errorMsg.get(i) + "\n";\r
+            }\r
+            JOptionPane.showMessageDialog(frame, errors);\r
+        }\r
         showClassToResolved();\r
     }\r
     \r
@@ -233,71 +285,171 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         }\r
     }\r
     \r
-    private void resolveLibraryInstances(String key) {\r
-        ModuleIdentification mi = WorkspaceProfile.getModuleId(key);\r
-        PackageIdentification[] depPkgList = null;\r
-        try{\r
+    private void filterClassConsumedByArch (Vector<LibraryClassDescriptor> v) {\r
+        String[] moduleInfo = moduleKey.split(" ");\r
+        Vector<String> vModuleArchs = new Vector<String>();\r
+        //\r
+        // Skip guid, version information, get archs to check.\r
+        //\r
+        for (int i = 4; i < moduleInfo.length; ++i) {\r
+            vModuleArchs.add(moduleInfo[i]);\r
+        }\r
+        //\r
+        // if module will be built on all platforms, no filter needed for lib classes.\r
+        //\r
+        if (vModuleArchs.size() == 0) {\r
+            return;\r
+        }\r
+        \r
+        Iterator<LibraryClassDescriptor> iter = v.iterator();\r
+        while (iter.hasNext()) {\r
+            LibraryClassDescriptor libInfo = iter.next();\r
+\r
+            Vector<String> vSupArchs = libInfo.getVectorFromString(libInfo.supArchs);\r
+            \r
+            if (vSupArchs.size() == 0 || (vSupArchs.size() == 1 && vSupArchs.get(0).equalsIgnoreCase(""))) {\r
+                //\r
+                // update lib info to module archs only.\r
+                //\r
+                libInfo.supArchs = "";\r
+                for (int i = 0; i < vModuleArchs.size(); ++i) {\r
+                    libInfo.supArchs += vModuleArchs.get(i);\r
+                    libInfo.supArchs += " ";\r
+                }\r
+                libInfo.supArchs.trim();\r
+                continue;\r
+            }\r
             //\r
-            // Get dependency pkg list into which we will search lib instances.\r
+            // only retain those lib class used by module archs.\r
             //\r
-            depPkgList = SurfaceAreaQuery.getDependencePkg(null, mi);\r
+            vSupArchs.retainAll(vModuleArchs);\r
+            if (vSupArchs.size() > 0) {\r
+                //\r
+                // update lib info to reflect which kind of arch need to select instance.\r
+                //\r
+                libInfo.supArchs = "";\r
+                for (int i = 0; i < vSupArchs.size(); ++i) {\r
+                    libInfo.supArchs += vSupArchs.get(i);\r
+                    libInfo.supArchs += " ";\r
+                }\r
+                libInfo.supArchs.trim();\r
+                continue;\r
+            }\r
             //\r
-            // Get the lib class consumed, produced by this module itself.\r
+            // remove this lib definition if it supports no archs module will be built under.\r
             //\r
-            Vector<String> vClassConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
-            \r
-            if (this.classConsumed == null) {\r
-                this.classConsumed = new HashMap<String, ArrayList<String>>();\r
+            iter.remove();\r
+        }\r
+    }\r
+    \r
+    private void resolveLibraryInstances(String key, Vector<String> errorMsg) throws MultipleInstanceException, NoInstanceException{\r
+        ModuleIdentification mi = WorkspaceProfile.getModuleId(key);\r
+        PackageIdentification[] depPkgList = null;\r
+        \r
+        //\r
+        // Get dependency pkg list into which we will search lib instances.\r
+        //\r
+        depPkgList = SurfaceAreaQuery.getDependencePkg(null, mi);\r
+        //\r
+        // Get the lib class consumed, produced by this module itself.\r
+        //\r
+        Vector<LibraryClassDescriptor> vClassConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
+        filterClassConsumedByArch(vClassConsumed);\r
+        if (this.classConsumed == null) {\r
+            this.classConsumed = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
+        }\r
+\r
+        for (int i = 0; i < vClassConsumed.size(); ++i) {\r
+            ArrayList<String> consumedBy = this.classConsumed.get(vClassConsumed.get(i));\r
+            if (consumedBy == null) {\r
+                consumedBy = new ArrayList<String>();\r
             }\r
-            \r
-            for(int i = 0; i < vClassConsumed.size(); ++i){\r
-                ArrayList<String> consumedBy = this.classConsumed.get(vClassConsumed.get(i));\r
-                if (consumedBy == null) {\r
-                    consumedBy = new ArrayList<String>();\r
-                }\r
-                consumedBy.add(key);\r
-                this.classConsumed.put(vClassConsumed.get(i), consumedBy);\r
+            consumedBy.add(key);\r
+            this.classConsumed.put(vClassConsumed.get(i), consumedBy);\r
+        }\r
+\r
+        Vector<LibraryClassDescriptor> vClassProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
+        if (this.classProduced == null) {\r
+            this.classProduced = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
+        }\r
+        for (int i = 0; i < vClassProduced.size(); ++i) {\r
+            ArrayList<String> producedBy = this.classProduced.get(vClassProduced.get(i));\r
+            if (producedBy == null) {\r
+                producedBy = new ArrayList<String>();\r
             }\r
-            \r
-            Vector<String> vClassProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
-            if (this.classProduced == null) {\r
-                this.classProduced = new ArrayList<String>();\r
+            //\r
+            // class already produced by previous module (lib instance).\r
+            /*\r
+            if (producedBy.size() == 1) {\r
+                String instanceKey = producedBy.get(0);\r
+                ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceKey);\r
+                throw new MultipleInstanceException (vClassProduced.get(i).className, libMi.getName(), mi.getName());\r
             }\r
-            for(int i = 0; i < vClassProduced.size(); ++i){\r
-                if (!this.classProduced.contains(vClassProduced.get(i))){\r
-                    this.classProduced.add(vClassProduced.get(i));\r
+            Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
+            while (lcdi.hasNext()) {\r
+                LibraryClassDescriptor lcd = lcdi.next();\r
+                if (vClassProduced.get(i).hasInterSectionWith(lcd)) {\r
+                    ArrayList<String> alreadyProducedBy = this.classProduced.get(lcd);\r
+                    String instanceKey = alreadyProducedBy.get(0);\r
+                    ModuleIdentification libMi = WorkspaceProfile.getModuleId(instanceKey);\r
+                    throw new MultipleInstanceException (vClassProduced.get(i).className, libMi.getName(), mi.getName());\r
                 }\r
             }\r
-            \r
+            */\r
+            // normal case.\r
             //\r
-            // find potential instances in all pkgs for classes still in classConsumed.\r
-            //\r
-            if (classInstanceMap == null){\r
-                classInstanceMap = new HashMap<String, ArrayList<String>>();\r
+            producedBy.add(key);\r
+            this.classProduced.put(vClassProduced.get(i), producedBy);\r
+            \r
+        }\r
+\r
+        //\r
+        // find potential instances in all pkgs for classes still in classConsumed.\r
+        //\r
+        if (classInstanceMap == null) {\r
+            classInstanceMap = new HashMap<LibraryClassDescriptor, ArrayList<String>>();\r
+        }\r
+        Iterator<LibraryClassDescriptor> lic = this.classConsumed.keySet().iterator();\r
+        while (lic.hasNext()) {\r
+            LibraryClassDescriptor cls = lic.next();\r
+            if (isBoundedClass(cls)) {\r
+                continue;\r
             }\r
-            Iterator<String> lic = this.classConsumed.keySet().iterator();\r
-            while(lic.hasNext()){\r
-                String cls = lic.next();\r
-                if (this.classProduced.contains(cls) || classInstanceMap.containsKey(cls)) {\r
-                    continue;\r
-                }\r
-                ArrayList<String> instances = getInstancesForClass(cls, depPkgList);\r
-                if (instances.size() == 0){\r
-                    JOptionPane.showMessageDialog(frame, "No Applicable Instance for Library Class " + \r
-                                                  cls + ", Platform Build will Fail.");\r
+            ArrayList<String> instances = getInstancesForClass(cls, depPkgList);\r
+            if (instances.size() == 0) {\r
+//                throw new NoInstanceException (cls.className);\r
+                String exceptionMsg = new NoInstanceException (cls.className).getMessage();\r
+                if (!errorMsg.contains(exceptionMsg)) {\r
+                    errorMsg.add(exceptionMsg);    \r
                 }\r
-                classInstanceMap.put(cls, instances);\r
                 \r
             }\r
-            \r
+            classInstanceMap.put(cls, instances);\r
+\r
+        }\r
 //            showClassToResolved();\r
+    }\r
+\r
+    /**Search classProduced map to see if this class has been produced by some instance (module).\r
+     * @param cls\r
+     * @return\r
+     */\r
+    private boolean isBoundedClass (LibraryClassDescriptor cls) {\r
+        if (this.classProduced.containsKey(cls)) {\r
+            return true;\r
         }\r
-        catch(Exception e) {\r
-            e.printStackTrace();\r
+        Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
+        while (lcdi.hasNext()) {\r
+            LibraryClassDescriptor lcd = lcdi.next();\r
+            if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)) {\r
+                return true;\r
+            }\r
         }\r
+        \r
+        return false;\r
     }\r
     \r
-    private ArrayList<String> getInstancesForClass(String cls, PackageIdentification[] depPkgList) throws Exception{\r
+    private ArrayList<String> getInstancesForClass(LibraryClassDescriptor cls, PackageIdentification[] depPkgList){\r
         ArrayList<String> al = new ArrayList<String>();\r
         \r
 //        for (int i = 0; i < depPkgList.length; ++i) {\r
@@ -307,17 +459,17 @@ public class FpdModuleSA extends JDialog implements ActionListener {
 //                if (!mi.getPackageId().getGuid().equalsIgnoreCase(depPkgList[i].getGuid())) {\r
 //                    continue;\r
 //                }\r
-                String[] clsProduced = getClassProduced(mi);\r
+                Vector<LibraryClassDescriptor> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
                 \r
                 boolean isPotential = false;\r
-                for (int j = 0; j < clsProduced.length; ++j) {\r
-                    if (clsProduced[j] == null) {\r
-                        continue;\r
-                    }\r
-                    if (clsProduced[j].equals(cls)){\r
+                Iterator<LibraryClassDescriptor> lcdi = clsProduced.iterator();\r
+                while (lcdi.hasNext()) {\r
+                    LibraryClassDescriptor lcd = lcdi.next();\r
+                    if (cls.isSubSetByArchs(lcd) && cls.isSubSetByModTypes(lcd)){\r
                         isPotential = true;\r
                     }\r
-                    if (classProduced.contains(clsProduced[j])) {\r
+                    \r
+                    if (hasBeenProduced(lcd)) {\r
                         isPotential = false;\r
                         break;\r
                     }\r
@@ -332,6 +484,28 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         return al;\r
     }\r
     \r
+    private boolean hasBeenProduced (LibraryClassDescriptor cls) {\r
+        Iterator<LibraryClassDescriptor> lcdi = this.classProduced.keySet().iterator();\r
+        while (lcdi.hasNext()) {\r
+            LibraryClassDescriptor lcd = lcdi.next();\r
+            if (cls.hasInterSectionWith(lcd)) {\r
+                return true;\r
+            }\r
+        }\r
+        return false;\r
+    }\r
+    \r
+    private ArrayList<String> getConsumedBy (String className) {\r
+        Iterator<LibraryClassDescriptor> lcdi = this.classConsumed.keySet().iterator();\r
+        while (lcdi.hasNext()) {\r
+            LibraryClassDescriptor lcd = lcdi.next();\r
+            if (lcd.className.equals(className)) {\r
+                return this.classConsumed.get(lcd);\r
+            }\r
+        }\r
+        return null;\r
+    }\r
+    \r
     private void removeInstance(String key) {\r
         ModuleIdentification mi = WorkspaceProfile.getModuleId(key); \r
         //\r
@@ -341,86 +515,70 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         //\r
         // remove class produced by this instance and add back these produced class to be bound.\r
         //\r
-        String[] clsProduced = getClassProduced(mi);\r
-        for (int i = 0; i < clsProduced.length; ++i) {\r
+        Vector<LibraryClassDescriptor> clsProduced = getClassProduced(mi);\r
+        for (int i = 0; i < clsProduced.size(); ++i) {\r
             \r
-            classProduced.remove(clsProduced[i]);\r
+            classProduced.remove(clsProduced.get(i));\r
         }\r
         //\r
         // remove class consumed by this instance. we do not need to bound it now.\r
         //\r
         String[] clsConsumed = getClassConsumed(mi);\r
         for (int i = 0; i < clsConsumed.length; ++i) {\r
-            ArrayList<String> al = classConsumed.get(clsConsumed[i]);\r
+            ArrayList<String> al = getConsumedBy (clsConsumed[i]);\r
             \r
             if (al == null ) {\r
-                classConsumed.remove(clsConsumed[i]);\r
                 continue;\r
             }\r
             al.remove(key);\r
-            if (al.size() == 0) {\r
-                classConsumed.remove(clsConsumed[i]);\r
-            }\r
-           \r
+            \r
         }\r
-\r
+        \r
         showClassToResolved();\r
         \r
     }\r
     \r
     \r
-    private String[] getClassProduced(ModuleIdentification mi){\r
-        \r
-        try{\r
-            Vector<String> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
-            String[] sClassProduced = new String[clsProduced.size()];\r
-            for (int i = 0; i < clsProduced.size(); ++i) {\r
-                sClassProduced[i] = clsProduced.get(i);\r
-            }\r
-            return sClassProduced;\r
-            \r
-        }catch (Exception e) {\r
-            e.printStackTrace();\r
-        }\r
-        return new String[0];\r
+    private Vector<LibraryClassDescriptor> getClassProduced(ModuleIdentification mi){\r
         \r
+        Vector<LibraryClassDescriptor> clsProduced = SurfaceAreaQuery.getLibraryClasses("ALWAYS_PRODUCED", mi);\r
+        return clsProduced;\r
+//        String[] sClassProduced = new String[clsProduced.size()];\r
+//        for (int i = 0; i < clsProduced.size(); ++i) {\r
+//            sClassProduced[i] = clsProduced.get(i).className;\r
+//        }\r
+//        return sClassProduced;\r
     }\r
     \r
     private String[] getClassConsumed(ModuleIdentification mi){\r
         \r
-        try{\r
-            Vector<String> clsConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
-            String[] sClassConsumed = new String[clsConsumed.size()];\r
-            for (int i = 0; i < clsConsumed.size(); ++i) {\r
-                sClassConsumed[i] = clsConsumed.get(i);\r
-            }\r
-            return sClassConsumed;\r
-        }catch (Exception e) {\r
-            e.printStackTrace();\r
+        Vector<LibraryClassDescriptor> clsConsumed = SurfaceAreaQuery.getLibraryClasses("ALWAYS_CONSUMED", mi);\r
+        String[] sClassConsumed = new String[clsConsumed.size()];\r
+        for (int i = 0; i < clsConsumed.size(); ++i) {\r
+            sClassConsumed[i] = clsConsumed.get(i).className;\r
         }\r
-        return new String[0];\r
+        return sClassConsumed;\r
     }\r
     \r
     private void showClassToResolved(){\r
         libClassTableModel.setRowCount(0);\r
-        if (classConsumed.size() == 0) {\r
+        libInstanceTableModel.setRowCount(0);\r
+        if (classConsumed == null || classConsumed.size() == 0) {\r
             return;\r
         }\r
-        Iterator<String> li = classConsumed.keySet().iterator();\r
+        Iterator<LibraryClassDescriptor> li = classConsumed.keySet().iterator();\r
         while(li.hasNext()){\r
+            LibraryClassDescriptor lcd = li.next();\r
+            String[] s = {lcd.className, lcd.supArchs, lcd.supModTypes};\r
+            if (classConsumed.get(lcd) == null || classConsumed.get(lcd).size() == 0) {\r
+                continue;\r
+            }\r
             \r
-            String[] s = {li.next()};\r
-//            if (classConsumed.get(s[0]) == null) {\r
-//                continue;\r
-//            }\r
-//            if (classConsumed.get(s[0]).size() == 0) {\r
-//                continue;\r
-//            }\r
-            if (!classProduced.contains(s[0])){\r
+            if (!isBoundedClass(lcd)){\r
                 libClassTableModel.addRow(s);\r
             }\r
         }\r
-        libInstanceTableModel.setRowCount(0);\r
+        \r
     }\r
     \r
     private void addLibInstance (ModuleIdentification libMi) throws Exception{\r
@@ -554,6 +712,11 @@ public class FpdModuleSA extends JDialog implements ActionListener {
             model.addColumn("MaxDatumSize");\r
             model.addColumn("DataType");\r
             model.addColumn("DefaultValue");\r
+            \r
+            jTablePcd.getColumnModel().getColumn(0).setMinWidth(250);\r
+            \r
+            TableColumn tokenColumn = jTablePcd.getColumnModel().getColumn(3);\r
+            jTablePcd.removeColumn(tokenColumn);\r
                         \r
             jTablePcd.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
             jTablePcd.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
@@ -575,15 +738,16 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                         // array for pcd related information: helpText, itemType, moduleType.\r
                         //\r
                         String[] pcdInfo = {"", "", ""};\r
-                        getPcdInfo(cName, tsGuid, pcdInfo);\r
+                        Vector<String> validPcdTypes = new Vector<String>();\r
+                        getPcdInfo(moduleKey, cName, tsGuid, pcdInfo, validPcdTypes);\r
                         jTextAreaPcdHelp.setText(pcdInfo[0]);\r
-                        initComboBox(pcdInfo[1], pcdInfo[2]);\r
+                        initComboBox(pcdInfo[1], pcdInfo[2], validPcdTypes);\r
                         jComboBoxItemType.setSelectedItem(itemType);\r
                         jTextFieldMaxDatumSize.setEnabled(true);\r
                         jTextFieldMaxDatumSize.setVisible(true);\r
-                        jTextFieldMaxDatumSize.setText(jTablePcd.getValueAt(selectedRow, 4)+"");\r
+                        jTextFieldMaxDatumSize.setText(model.getValueAt(selectedRow, 4)+"");\r
                         jTextFieldPcdDefault.setEnabled(true);\r
-                        jTextFieldPcdDefault.setText(jTablePcd.getValueAt(selectedRow, 6)+"");\r
+                        jTextFieldPcdDefault.setText(model.getValueAt(selectedRow, 6)+"");\r
                         if (model.getValueAt(selectedRow, 5).equals("VOID*")) {\r
                             if (pcdInfo[1].equals("FEATURE_FLAG")) {\r
                                 jTextFieldMaxDatumSize.setVisible(false);\r
@@ -591,14 +755,14 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                             else if (pcdInfo[1].equals("FIXED_AT_BUILD")) {\r
                                 try{\r
                                     jTextFieldMaxDatumSize.setEnabled(false);\r
-                                    jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(jTablePcd.getValueAt(selectedRow, 6)+"")+"");\r
+                                    jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(model.getValueAt(selectedRow, 6)+"")+"");\r
                                 }\r
                                 catch(Exception except){\r
                                     JOptionPane.showMessageDialog(frame, "Unacceptable PCD Value: " + except.getMessage());\r
                                 }\r
                             }\r
                             else{\r
-                                jTextFieldMaxDatumSize.setText(jTablePcd.getValueAt(selectedRow, 4)+"");\r
+                                jTextFieldMaxDatumSize.setText(model.getValueAt(selectedRow, 4)+"");\r
                             }\r
                         }\r
                         else {\r
@@ -631,29 +795,35 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         return jTablePcd;\r
     }\r
     \r
-    private void initComboBox(String originalType, String mType) {\r
+    private void initComboBox(String originalType, String mType, Vector<String> validPcdTypes) {\r
         jComboBoxItemType.removeAllItems();\r
-        jComboBoxItemType.addItem(originalType);\r
-        if (originalType.equals("PATCHABLE_IN_MODULE") && mType.equalsIgnoreCase("false")) {\r
-            jComboBoxItemType.addItem("FIXED_AT_BUILD");\r
-        }\r
+\r
         if (originalType.equals("DYNAMIC")) {\r
-            jComboBoxItemType.addItem("FIXED_AT_BUILD");\r
-            jComboBoxItemType.addItem("PATCHABLE_IN_MODULE");\r
+            for (int i = 0; i < validPcdTypes.size(); ++i) {\r
+                jComboBoxItemType.addItem(validPcdTypes.get(i));\r
+            }\r
+        }\r
+        else {\r
+            jComboBoxItemType.addItem(originalType);\r
         }\r
     }\r
     \r
-    private void getPcdInfo(String cName, String tsGuid, String[] sa) {\r
+    /**\r
+     * @param cName\r
+     * @param tsGuid\r
+     * @param sa sa[0]: HelpText; sa[1]: itemType in Msa; sa[2]: isBinary;\r
+     */\r
+    private void getPcdInfo(String moduleKey, String cName, String tsGuid, String[] sa, Vector<String> validPcdTypes) {\r
         String[][] saa = new String[ffc.getLibraryInstancesCount(moduleKey)][5];\r
         ffc.getLibraryInstances(moduleKey, saa);\r
         \r
         try{\r
-            if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(moduleKey), cName, tsGuid, sa)) {\r
+            if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(moduleKey), cName, tsGuid, sa, validPcdTypes)) {\r
                 return;\r
             }\r
             for (int j = 0; j < saa.length; ++j) {\r
                 if (ffc.getPcdBuildDataInfo(WorkspaceProfile.getModuleId(saa[j][1] + " " + saa[j][2] + " " + saa[j][3] + " " + saa[j][4]),\r
-                                            cName, tsGuid, sa)) {\r
+                                            cName, tsGuid, sa, validPcdTypes)) {\r
                     return;\r
                 }\r
             }\r
@@ -802,6 +972,9 @@ public class FpdModuleSA extends JDialog implements ActionListener {
             selectedInstancesTableModel.addColumn("PackageVersion");\r
             jTableSelectedInstances = new JTable(selectedInstancesTableModel);\r
             jTableSelectedInstances.setRowHeight(20);\r
+            \r
+            jTableSelectedInstances.getColumnModel().getColumn(0).setMinWidth(250);\r
+            \r
             jTableSelectedInstances.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);\r
             jTableSelectedInstances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
             \r
@@ -832,10 +1005,18 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         if (jTableLibClass == null) {\r
             libClassTableModel = new IDefaultTableModel();\r
             libClassTableModel.addColumn("LibraryClass");\r
+            libClassTableModel.addColumn("Arch");\r
+            libClassTableModel.addColumn("ModType");\r
             jTableLibClass = new JTable(libClassTableModel);\r
             jTableLibClass.setRowHeight(20);\r
             jTableLibClass.setShowGrid(false);\r
             jTableLibClass.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
+            \r
+            TableColumn column = jTableLibClass.getColumnModel().getColumn(1);\r
+            jTableLibClass.getColumnModel().removeColumn(column);\r
+            column = jTableLibClass.getColumnModel().getColumn(1);\r
+            jTableLibClass.getColumnModel().removeColumn(column);\r
+            \r
             jTableLibClass.getSelectionModel().addListSelectionListener(new ListSelectionListener(){\r
                 public void valueChanged(ListSelectionEvent e) {\r
                     if (e.getValueIsAdjusting()){\r
@@ -855,7 +1036,12 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                         //\r
                         libInstanceTableModel.setRowCount(0);\r
                         String cls = libClassTableModel.getValueAt(selectedRow2, 0).toString();\r
-                        ArrayList<String> al = classInstanceMap.get(cls);\r
+                        String arch = libClassTableModel.getValueAt(selectedRow2, 1).toString();\r
+                        String modType = libClassTableModel.getValueAt(selectedRow2, 2).toString();\r
+                        ArrayList<String> al = classInstanceMap.get(new LibraryClassDescriptor(cls, arch, modType));\r
+                        if (al == null) {\r
+                            return;\r
+                        }\r
                         ListIterator<String> li = al.listIterator();\r
                         while(li.hasNext()) {\r
                             String instance = li.next();\r
@@ -907,6 +1093,9 @@ public class FpdModuleSA extends JDialog implements ActionListener {
             libInstanceTableModel.addColumn("PackageVersion");\r
             jTableLibInstances = new JTable(libInstanceTableModel);\r
             jTableLibInstances.setRowHeight(20);\r
+            \r
+            jTableLibInstances.getColumnModel().getColumn(0).setMinWidth(250);\r
+            \r
             jTableLibInstances.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_SUBSEQUENT_COLUMNS);\r
             jTableLibInstances.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);\r
             \r
@@ -1008,7 +1197,22 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                                   libInstanceTableModel.getValueAt(row, 2), libInstanceTableModel.getValueAt(row, 3),\r
                                   libInstanceTableModel.getValueAt(row, 4)};\r
                     selectedInstancesTableModel.addRow(s);\r
-                    resolveLibraryInstances(instanceValue);\r
+                    \r
+                    Vector<String> errorMsg = new Vector<String>();\r
+                    try {\r
+                        resolveLibraryInstances(instanceValue, errorMsg);\r
+                    }\r
+                    catch (Exception exp) {\r
+                        JOptionPane.showMessageDialog(frame, exp.getMessage());\r
+                    }\r
+                    \r
+                    if (errorMsg.size() > 0) {\r
+                        String errors = "";\r
+                        for (int i = 0; i < errorMsg.size(); ++i) {\r
+                            errors += " " + errorMsg.get(i) + "\n";\r
+                        }\r
+                        JOptionPane.showMessageDialog(frame, errors);\r
+                    }\r
                     showClassToResolved();\r
                 }\r
             });\r
@@ -1055,7 +1259,7 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         if (jButtonOk == null) {\r
             jButtonOk = new JButton();\r
             jButtonOk.setPreferredSize(new java.awt.Dimension(80,20));\r
-            jButtonOk.setText("Ok");\r
+            jButtonOk.setText("Close");\r
             jButtonOk.addActionListener(this);\r
         }\r
         return jButtonOk;\r
@@ -1119,6 +1323,19 @@ public class FpdModuleSA extends JDialog implements ActionListener {
         }\r
         return jPanelModuleSaOpts;\r
     }\r
+    \r
+    private Vector<String> getVectorFromString (String s) {\r
+        if (s == null || s.equals("null")) {\r
+            s = "";\r
+        }\r
+        String[] sa1 = s.split(" ");\r
+        Vector<String> v = new Vector<String>();\r
+        for (int i = 0; i < sa1.length; ++i) {\r
+            v.add(sa1[i]);\r
+        }\r
+        return v;\r
+    }\r
+    \r
     /**\r
      * This method initializes jTextField      \r
      *         \r
@@ -1139,8 +1356,27 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                     if (newFvBinding.length() == 0 && originalFvBinding == null) {\r
                         return;\r
                     }\r
-                    docConsole.setSaved(false);\r
+                    \r
+                    Vector<String> oldFvList = getVectorFromString (originalFvBinding);\r
+                    Vector<String> newFvList = getVectorFromString (newFvBinding);\r
+                    String moduleInfo[] = moduleKey.split(" ");\r
                     ffc.setFvBinding(moduleKey, newFvBinding);\r
+                    //\r
+                    // remove module from Fvs that not in newFvList now.\r
+                    //\r
+                    oldFvList.removeAll(newFvList);\r
+                    for (int j = 0; j < oldFvList.size(); ++j) {\r
+                        ffc.removeModuleInBuildOptionsUserExtensions(oldFvList.get(j), "IMAGES", 1, moduleInfo[0], moduleInfo[1], moduleInfo[2], moduleInfo[3], moduleInfo[4]);    \r
+                    }\r
+                    //\r
+                    // add module to Fvs that were not in oldFvList.\r
+                    //\r
+                    oldFvList = getVectorFromString (originalFvBinding);\r
+                    newFvList.removeAll(oldFvList);\r
+                    for (int i = 0; i < newFvList.size(); ++i) {\r
+                        ffc.addModuleIntoBuildOptionsUserExtensions(newFvList.get(i), "IMAGES", 1, moduleInfo[0], moduleInfo[1], moduleInfo[2], moduleInfo[3], moduleInfo[4]);\r
+                    }\r
+                    docConsole.setSaved(false);\r
                 }\r
             });\r
             \r
@@ -1242,6 +1478,12 @@ public class FpdModuleSA extends JDialog implements ActionListener {
             jTableModuleSaOptions = new JTable(optionsTableModel);\r
             jTableModuleSaOptions.setRowHeight(20);\r
             \r
+            jTableModuleSaOptions.getColumnModel().getColumn(0).setMinWidth(buildTargetWidth);\r
+            jTableModuleSaOptions.getColumnModel().getColumn(1).setMinWidth(toolChainFamilyWidth);\r
+            jTableModuleSaOptions.getColumnModel().getColumn(2).setMinWidth(tagNameWidth);\r
+            jTableModuleSaOptions.getColumnModel().getColumn(3).setMinWidth(toolCmdCodeWidth);\r
+            jTableModuleSaOptions.getColumnModel().getColumn(4).setMinWidth(supportArchWidth);\r
+            jTableModuleSaOptions.getColumnModel().getColumn(5).setMinWidth(argWidth);\r
 //            javax.swing.table.TableColumn toolFamilyCol = jTableModuleSaOptions.getColumnModel().getColumn(1);\r
 //            JComboBox cb = new JComboBox();\r
 //            cb.addItem("MSFT");\r
@@ -1318,7 +1560,7 @@ public class FpdModuleSA extends JDialog implements ActionListener {
                 public void actionPerformed(java.awt.event.ActionEvent e) {\r
                     String[] row = {"", "", "", "", "", ""};\r
                     optionsTableModel.addRow(row);\r
-                    Vector<Object> v = new Vector<Object>();\r
+                    Vector<Object> v = null;\r
                     Vector<Object> v1 = null;\r
                     docConsole.setSaved(false);\r
                     ffc.genModuleSAOptionsOpt(moduleKey, v, "", "", "", v1, "");\r
@@ -1453,26 +1695,25 @@ private JComboBox getJComboBoxItemType() {
     if (jComboBoxItemType == null) {\r
         jComboBoxItemType = new JComboBox();\r
         jComboBoxItemType.setPreferredSize(new java.awt.Dimension(200,20));\r
-        jComboBoxItemType.addItemListener(new java.awt.event.ItemListener() {\r
-            public void itemStateChanged(java.awt.event.ItemEvent e) {\r
-                int row = jTablePcd.getSelectedRow();\r
-                if (row < 0 || model.getValueAt(row, 2).equals(jComboBoxItemType.getSelectedItem())) {\r
-                    return;\r
-                }\r
-                if (jComboBoxItemType.getItemCount() == 3) {\r
-                    if (!jComboBoxItemType.getSelectedItem().equals("DYNAMIC")) {\r
-                        \r
-                        if (jComboBoxItemType.getSelectedItem().equals("FIXED_AT_BUILD")) {\r
-                            jTextFieldPcdDefault.setText("");\r
-                            jTextFieldPcdDefault.setEnabled(true);\r
-                        }\r
-                    }\r
-                    else{\r
-                        \r
-                    }\r
-                }\r
-            }\r
-        });\r
+//        jComboBoxItemType.addItemListener(new java.awt.event.ItemListener() {\r
+//            public void itemStateChanged(java.awt.event.ItemEvent e) {\r
+//                \r
+//                int row = jTablePcd.getSelectedRow();\r
+//                if (row < 0 || model.getValueAt(row, 2).equals(jComboBoxItemType.getSelectedItem())) {\r
+//                    return;\r
+//                }\r
+//                    if (!jComboBoxItemType.getSelectedItem().equals("DYNAMIC")) {\r
+//                        \r
+//                        if (jComboBoxItemType.getSelectedItem().equals("FIXED_AT_BUILD")) {\r
+//                            jTextFieldPcdDefault.setText("");\r
+//                            jTextFieldPcdDefault.setEnabled(true);\r
+//                        }\r
+//                    }\r
+//                    else{\r
+//                        \r
+//                    }\r
+//                }\r
+//        });\r
     }\r
     return jComboBoxItemType;\r
 }\r
@@ -1493,8 +1734,9 @@ private void pcdDynamicToNonDynamic(String cName, String tsGuid) {
     ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
     for (int i = 0; i < al.size(); ++i) {\r
         String mKey = moduleInfo (al.get(i));\r
-        ffc.updatePcdData(mKey, cName, tsGuid, jComboBoxItemType.getSelectedItem()+"", maxSize, value);\r
+        value = null;\r
         String itemType = jComboBoxItemType.getSelectedItem()+"";\r
+        ffc.updatePcdData(mKey, cName, tsGuid, itemType, maxSize, value);\r
         al.set(i, mKey + " " + itemType);\r
     }\r
     \r
@@ -1505,8 +1747,8 @@ private void pcdNonDynamicToDynamic(String cName, String tsGuid) {
     ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
     for (int i = 0; i < al.size(); ++i) {\r
         String mKey = moduleInfo (al.get(i));\r
-        ffc.updatePcdData(mKey, cName, tsGuid, jComboBoxItemType.getSelectedItem()+"", jTextFieldMaxDatumSize.getText(), jTextFieldPcdDefault.isVisible() ? jTextFieldPcdDefault.getText() : jComboBoxFeatureFlagValue.getSelectedItem()+"");\r
         String itemType = jComboBoxItemType.getSelectedItem()+"";\r
+        ffc.updatePcdData(mKey, cName, tsGuid, itemType, jTextFieldMaxDatumSize.getText(), jTextFieldPcdDefault.isVisible() ? jTextFieldPcdDefault.getText() : jComboBoxFeatureFlagValue.getSelectedItem()+"");\r
         al.set(i, mKey + " " + itemType);\r
     }\r
     try{\r
@@ -1517,6 +1759,16 @@ private void pcdNonDynamicToDynamic(String cName, String tsGuid) {
     }\r
 }\r
 \r
+private void changePcdTypeWithinSameCategory (String cName, String tsGuid) {\r
+    ArrayList<String> al = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
+    for (int i = 0; i < al.size(); ++i) {\r
+        String mKey = moduleInfo (al.get(i));\r
+        String itemType = jComboBoxItemType.getSelectedItem()+"";\r
+        ffc.updatePcdData(mKey, cName, tsGuid, itemType, null, null);\r
+        al.set(i, mKey + " " + itemType);\r
+    }\r
+}\r
+\r
 private String moduleInfo (String pcdInfo) {\r
     \r
     return pcdInfo.substring(0, pcdInfo.lastIndexOf(" "));\r
@@ -1562,24 +1814,99 @@ private JButton getJButtonUpdatePcd() {
                 if (row < 0) {\r
                     return;\r
                 }\r
-                docConsole.setSaved(false);\r
+                \r
+                String cName = model.getValueAt(row, 0)+"";\r
+                String tsGuid = model.getValueAt(row, 1)+"";\r
                 String oldItemType = model.getValueAt(row, 2)+"";\r
+                String dataType = model.getValueAt(row, 5)+"";\r
                 String newItemType = jComboBoxItemType.getSelectedItem()+"";\r
-                model.setValueAt(newItemType, row, 2);\r
-                model.setValueAt(jTextFieldMaxDatumSize.getText(), row, 4);\r
-                model.setValueAt(jTextFieldPcdDefault.isVisible()? jTextFieldPcdDefault.getText():jComboBoxFeatureFlagValue.getSelectedItem(), row, 6);\r
-                if (oldItemType.equals("DYNAMIC") && !newItemType.equals("DYNAMIC")) {\r
-                    pcdDynamicToNonDynamic(model.getValueAt(row, 0)+"", model.getValueAt(row, 1)+"");\r
+                String newValue = jTextFieldPcdDefault.isVisible()? jTextFieldPcdDefault.getText():jComboBoxFeatureFlagValue.getSelectedItem()+""; \r
+                if (newValue.length() == 0){\r
+                \r
+                    if (dataType.equals("UINT8") || dataType.equals("UINT16") || dataType.equals("UINT32") || dataType.equals("UINT64")) {\r
+                        newValue = "0";\r
+                    }\r
+                    if (dataType.equals("BOOLEAN")){\r
+                        newValue = "FALSE";\r
+                    }\r
+                    if (dataType.equals("VOID*")) {\r
+                        newValue = "L\"\"";\r
+                    }\r
+                }\r
+                \r
+                String[] pcdInfo = {"", "", ""};\r
+                Vector<String> validPcdTypes = new Vector<String>();\r
+                getPcdInfo (moduleKey, cName, tsGuid, pcdInfo, validPcdTypes);\r
+                if (pcdInfo[1].equals("FIXED_AT_BUILD") && model.getValueAt(row, 5).equals("VOID*")) {\r
+                    try {\r
+                        jTextFieldMaxDatumSize.setText(ffc.setMaxSizeForPointer(newValue)+"");\r
+                    }\r
+                    catch (Exception exp) {\r
+                        JOptionPane.showMessageDialog(frame, "PCD Value MalFormed: " + exp.getMessage());\r
+                        return;\r
+                    }\r
                 }\r
-                if (!oldItemType.equals("DYNAMIC") && newItemType.equals("DYNAMIC")) {\r
-                    pcdNonDynamicToDynamic(model.getValueAt(row, 0)+"", model.getValueAt(row, 1)+"");\r
+                String newMaxDatumSize = jTextFieldMaxDatumSize.getText();\r
+                \r
+                if (!newItemType.equals(oldItemType)) {\r
+                    Vector<ModuleIdentification> moduleInfo = new Vector<ModuleIdentification>();\r
+                    try {\r
+                        boolean changable = itemTypeCouldBeChanged (cName, tsGuid, newItemType, moduleInfo);\r
+                        if (!changable) {\r
+                            JOptionPane.showMessageDialog(frame, "Can NOT Change Pcd Type in: " + moduleInfo.get(0).getName() + " contained in package " + moduleInfo.get(0).getPackageId().getName());\r
+                            return;\r
+                        }\r
+                    }\r
+                    catch (Exception exp) {\r
+                        JOptionPane.showMessageDialog(frame, "Can NOT Change Pcd Type in: " + moduleInfo.get(0).getName() + " contained in package " + moduleInfo.get(0).getPackageId().getName() + " " + exp.getMessage());\r
+                        return;\r
+                    }\r
+                    \r
+                    if ((oldItemType.equals("DYNAMIC") || oldItemType.equals("DYNAMIC_EX")) && !newItemType.equals("DYNAMIC") && !newItemType.equals("DYNAMIC_EX")) {\r
+                        pcdDynamicToNonDynamic(cName, tsGuid);\r
+                    }\r
+                    if (!oldItemType.equals("DYNAMIC") && !oldItemType.equals("DYNAMIC_EX") && (newItemType.equals("DYNAMIC") || newItemType.equals("DYNAMIC_EX"))) {\r
+                        pcdNonDynamicToDynamic(cName, tsGuid);\r
+                    }\r
+                    else {\r
+                        changePcdTypeWithinSameCategory (cName, tsGuid);\r
+                    }\r
+                    model.setValueAt(newItemType, row, 2);\r
                 }\r
-                ffc.updatePcdData(moduleKey, model.getValueAt(row, 0)+"", model.getValueAt(row, 1)+"", model.getValueAt(row, 2)+"", model.getValueAt(row, 4)+"", model.getValueAt(row, 6)+"");\r
+                \r
+                ffc.updatePcdData(moduleKey, cName, tsGuid, model.getValueAt(row, 2)+"", newMaxDatumSize, newValue);\r
+                docConsole.setSaved(false);\r
+                model.setValueAt(newValue, row, 6);\r
+                model.setValueAt(newMaxDatumSize, row, 4);\r
+                \r
             }\r
         });\r
     }\r
     return jButtonUpdatePcd;\r
 }\r
+\r
+private boolean itemTypeCouldBeChanged (String cName, String tsGuid, String newItemType, Vector<ModuleIdentification> mi) throws Exception{\r
+    ArrayList<String> pcdConsumers = ffc.getDynPcdMapValue(cName + " " + tsGuid);\r
+    for (int i = 0; i < pcdConsumers.size(); ++i) {\r
+        String consumerInfo = moduleInfo (pcdConsumers.get(i));\r
+        mi.removeAllElements();\r
+        mi.add(WorkspaceProfile.getModuleId(consumerInfo));\r
+        String[] sa = {"", "", ""};\r
+        Vector<String> validPcdTypes = new Vector<String>();\r
+        getPcdInfo (consumerInfo, cName, tsGuid, sa, validPcdTypes);\r
+        if (validPcdTypes.size() == 0) {\r
+            return false;\r
+        }\r
+        if (!sa[1].equals("DYNAMIC")) {\r
+            return false;\r
+        }\r
+        if (!validPcdTypes.contains(newItemType)) {\r
+            return false;\r
+        }\r
+    }\r
+    return true;\r
+}\r
+\r
 /**\r
  * This method initializes jComboBoxFeatureFlagValue\r
  *     \r
@@ -1663,3 +1990,51 @@ private JPanel getJPanelLibraryCenterC() {
 \r
 \r
 }  //  @jve:decl-index=0:visual-constraint="10,10"\r
+\r
+class MultipleInstanceException extends Exception {\r
+\r
+    /**\r
+     * \r
+     */\r
+    private static final long serialVersionUID = -9148463005930920297L;\r
+    private String className = null;\r
+    private String libInstance1 = null;\r
+    private String libInstance2 = null;\r
+    \r
+    MultipleInstanceException (String libClass, String instance1, String instance2) {\r
+        super();\r
+        className = libClass;\r
+        libInstance1 = instance1;\r
+        libInstance2 = instance2;\r
+    }\r
+\r
+    /* (non-Javadoc)\r
+     * @see java.lang.Throwable#getMessage()\r
+     */\r
+    @Override\r
+    public String getMessage() {\r
+        // TODO Auto-generated method stub\r
+        return " Library Class " + className + "is Produced by Two Instances: " \r
+            + libInstance1 + " and " + libInstance2 + ". Platform Build will Fail.";\r
+    }\r
+    \r
+}\r
+\r
+class NoInstanceException extends Exception {\r
+\r
+    /**\r
+     * \r
+     */\r
+    private static final long serialVersionUID = 1987122786598970598L;\r
+    \r
+    private String className = null;\r
+    \r
+    NoInstanceException (String libClass) {\r
+        className = libClass;\r
+    }\r
+    \r
+    public String getMessage() {\r
+        return "No Applicable Instance for Library Class " + className\r
+            + ", Platform Build will Fail.";\r
+    }\r
+}\r