3 The file is used to clone workspace, module, package and platform
5 Copyright (c) 2006, Intel Corporation
6 All rights reserved. This program and the accompanying materials
7 are licensed and made available under the terms and conditions of the BSD License
8 which accompanies this distribution. The full text of the license may be found at
9 http://opensource.org/licenses/bsd-license.php
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
15 package org
.tianocore
.frameworkwizard
;
17 import java
.awt
.event
.ActionEvent
;
19 import java
.io
.IOException
;
20 import java
.math
.BigInteger
;
21 import java
.util
.Vector
;
23 import javax
.swing
.JFileChooser
;
24 import javax
.swing
.JPanel
;
25 import javax
.swing
.JLabel
;
26 import javax
.swing
.JTextField
;
27 import javax
.swing
.JButton
;
29 import org
.apache
.xmlbeans
.XmlException
;
30 import org
.tianocore
.ModuleDefinitionsDocument
.ModuleDefinitions
;
31 import org
.tianocore
.ModuleSurfaceAreaDocument
.ModuleSurfaceArea
;
32 import org
.tianocore
.PackageDefinitionsDocument
.PackageDefinitions
;
33 import org
.tianocore
.PackageSurfaceAreaDocument
.PackageSurfaceArea
;
34 import org
.tianocore
.PlatformDefinitionsDocument
.PlatformDefinitions
;
35 import org
.tianocore
.PlatformSurfaceAreaDocument
.PlatformSurfaceArea
;
36 import org
.tianocore
.frameworkwizard
.common
.DataType
;
37 import org
.tianocore
.frameworkwizard
.common
.DataValidation
;
38 import org
.tianocore
.frameworkwizard
.common
.FileOperation
;
39 import org
.tianocore
.frameworkwizard
.common
.GlobalData
;
40 import org
.tianocore
.frameworkwizard
.common
.IFileFilter
;
41 import org
.tianocore
.frameworkwizard
.common
.Log
;
42 import org
.tianocore
.frameworkwizard
.common
.OpenFile
;
43 import org
.tianocore
.frameworkwizard
.common
.SaveFile
;
44 import org
.tianocore
.frameworkwizard
.common
.Tools
;
45 import org
.tianocore
.frameworkwizard
.common
.Identifications
.Identification
;
46 import org
.tianocore
.frameworkwizard
.common
.ui
.IDialog
;
47 import org
.tianocore
.frameworkwizard
.common
.ui
.IFrame
;
48 import org
.tianocore
.frameworkwizard
.module
.Identifications
.ModuleIdentification
;
49 import org
.tianocore
.frameworkwizard
.packaging
.PackageIdentification
;
50 import org
.tianocore
.frameworkwizard
.platform
.PlatformIdentification
;
51 import org
.tianocore
.frameworkwizard
.workspace
.Workspace
;
52 import org
.tianocore
.frameworkwizard
.workspace
.WorkspaceTools
;
53 import javax
.swing
.JComboBox
;
56 The class is used to provide functions to clone workspace, module, package and platform
60 public class Clone
extends IDialog
{
63 /// Define Class Serial Version UID
65 private static final long serialVersionUID
= -5469299324965727137L;
68 /// Define Class Members
70 private JPanel jContentPane
= null;
72 private JLabel jLabelType
= null;
74 private JTextField jTextFieldType
= null;
76 private JLabel jLabelSource
= null;
78 private JTextField jTextFieldSource
= null;
80 private JButton jButtonBrowse
= null;
82 private JLabel jLabelDestinationFile
= null;
84 private JTextField jTextFieldFilePath
= null;
86 private JLabel jLabelBaseName
= null;
88 private JTextField jTextFieldBaseName
= null;
90 private JLabel jLabelGuid
= null;
92 private JTextField jTextFieldGuid
= null;
94 private JLabel jLabelVersion
= null;
96 private JTextField jTextFieldVersion
= null;
98 private JButton jButtonOk
= null;
100 private JButton jButtonCancel
= null;
102 private JButton jButtonGenerateGuid
= null;
104 private JLabel jLabelBelong
= null;
106 private JComboBox jComboBoxExistingPackage
= null;
109 /// Define members not for UI
112 private int mode
= -1;
114 private Vector
<PackageIdentification
> packages
= null;
116 private WorkspaceTools wt
= new WorkspaceTools();
118 private Identification oldId
= null;
120 private Identification newId
= null;
122 private ModuleIdentification mid
= null;
124 private PackageIdentification pid
= null;
126 private PlatformIdentification fid
= null;
129 This method initializes jTextFieldType
131 @return javax.swing.JTextField
134 private JTextField
getJTextFieldType() {
135 if (jTextFieldType
== null) {
136 jTextFieldType
= new JTextField();
137 jTextFieldType
.setBounds(new java
.awt
.Rectangle(210, 10, 320, 20));
138 jTextFieldType
.setEditable(false);
140 return jTextFieldType
;
144 This method initializes jTextFieldSource
146 @return javax.swing.JTextField
149 private JTextField
getJTextFieldSource() {
150 if (jTextFieldSource
== null) {
151 jTextFieldSource
= new JTextField();
152 jTextFieldSource
.setBounds(new java
.awt
.Rectangle(210, 35, 320, 20));
153 jTextFieldSource
.setEditable(false);
155 return jTextFieldSource
;
159 This method initializes jButtonBrowse
161 @return javax.swing.JButton
164 private JButton
getJButtonBrowse() {
165 if (jButtonBrowse
== null) {
166 jButtonBrowse
= new JButton();
167 jButtonBrowse
.setBounds(new java
.awt
.Rectangle(445, 85, 85, 20));
168 jButtonBrowse
.setText("Browse");
169 jButtonBrowse
.addActionListener(this);
171 return jButtonBrowse
;
175 This method initializes jTextFieldDestinationFile
177 @return javax.swing.JTextField
180 private JTextField
getJTextFieldFilePath() {
181 if (jTextFieldFilePath
== null) {
182 jTextFieldFilePath
= new JTextField();
183 jTextFieldFilePath
.setBounds(new java
.awt
.Rectangle(210, 85, 230, 20));
185 return jTextFieldFilePath
;
189 This method initializes jTextFieldBaseName
191 @return javax.swing.JTextField
194 private JTextField
getJTextFieldBaseName() {
195 if (jTextFieldBaseName
== null) {
196 jTextFieldBaseName
= new JTextField();
197 jTextFieldBaseName
.setBounds(new java
.awt
.Rectangle(210, 110, 320, 20));
199 return jTextFieldBaseName
;
203 This method initializes jTextFieldGuid
205 @return javax.swing.JTextField
208 private JTextField
getJTextFieldGuid() {
209 if (jTextFieldGuid
== null) {
210 jTextFieldGuid
= new JTextField();
211 jTextFieldGuid
.setBounds(new java
.awt
.Rectangle(210, 135, 230, 20));
213 return jTextFieldGuid
;
217 This method initializes jTextFieldVersion
219 @return javax.swing.JTextField
222 private JTextField
getJTextFieldVersion() {
223 if (jTextFieldVersion
== null) {
224 jTextFieldVersion
= new JTextField();
225 jTextFieldVersion
.setBounds(new java
.awt
.Rectangle(210, 160, 320, 20));
227 return jTextFieldVersion
;
231 This method initializes jButtonOk
233 @return javax.swing.JButton
236 private JButton
getJButtonOk() {
237 if (jButtonOk
== null) {
238 jButtonOk
= new JButton();
239 jButtonOk
.setBounds(new java
.awt
.Rectangle(285, 200, 90, 20));
240 jButtonOk
.setText("Ok");
241 jButtonOk
.addActionListener(this);
247 This method initializes jButtonCancel
249 @return javax.swing.JButton
252 private JButton
getJButtonCancel() {
253 if (jButtonCancel
== null) {
254 jButtonCancel
= new JButton();
255 jButtonCancel
.setBounds(new java
.awt
.Rectangle(405, 200, 90, 20));
256 jButtonCancel
.setText("Cancel");
257 jButtonCancel
.addActionListener(this);
259 return jButtonCancel
;
263 This method initializes jButtonGenerateGuid
265 @return javax.swing.JButton
268 private JButton
getJButtonGenerateGuid() {
269 if (jButtonGenerateGuid
== null) {
270 jButtonGenerateGuid
= new JButton();
271 jButtonGenerateGuid
.setBounds(new java
.awt
.Rectangle(445, 135, 85, 20));
272 jButtonGenerateGuid
.setText("Gen");
273 jButtonGenerateGuid
.addActionListener(this);
275 return jButtonGenerateGuid
;
279 This method initializes jComboBoxExistingPackage
281 @return javax.swing.JComboBox
284 private JComboBox
getJComboBoxExistingPackage() {
285 if (jComboBoxExistingPackage
== null) {
286 jComboBoxExistingPackage
= new JComboBox();
287 jComboBoxExistingPackage
.setBounds(new java
.awt
.Rectangle(210, 60, 320, 20));
289 return jComboBoxExistingPackage
;
293 This is the default constructor
302 This is the override constructor
304 @param parentFrame The parent frame which starts this frame
305 @param modal To identify the frame's modal
306 @param fileType To identify the clone target type
307 @param identification The clone target's identification
310 public Clone(IFrame parentFrame
, boolean modal
, int fileType
, Identification identification
) {
311 super(parentFrame
, modal
);
312 this.mode
= fileType
;
313 if (identification
!= null) {
314 this.oldId
= new Identification(identification
.getName(), identification
.getGuid(),
315 identification
.getVersion(), identification
.getPath());
316 this.newId
= new Identification(identification
.getName(), identification
.getGuid(),
317 identification
.getVersion(), identification
.getPath());
323 Query all existing packages and fill them into combox
326 private void initExistingPackage() {
327 packages
= wt
.getAllPackages();
328 for (int index
= 0; index
< packages
.size(); index
++) {
329 this.jComboBoxExistingPackage
.addItem(packages
.elementAt(index
).getName());
334 This method initializes this
337 private void init() {
338 this.setSize(550, 260);
339 this.setContentPane(getJContentPane());
340 this.setTitle("Clone");
345 This method initializes this with given clone target type.
346 Customize the frame interface via different clone target type.
348 @param mode To identify the clone target type
351 private void init(int mode
) {
354 // For MODULE_SURFACE_AREA
356 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
357 this.jTextFieldType
.setText(DataType
.MODULE_SURFACE_AREA
);
358 String s
= oldId
.getPath();
359 s
= Tools
.getRelativePath(s
, Tools
.getFilePathOnly(wt
.getPackageIdByModuleId(oldId
).getPath()));
360 this.jTextFieldSource
.setText(Tools
.convertPathToCurrentOsType(s
));
361 initExistingPackage();
362 this.jButtonBrowse
.setVisible(false);
363 this.jTextFieldFilePath
364 .setToolTipText("<html>Input the module's relative path and filename, for example:<br>Application\\HelloWorld\\HelloWorld.msa</html>");
365 this.jTextFieldFilePath
.setSize(320, this.jTextFieldFilePath
.getSize().height
);
366 this.jLabelDestinationFile
.setText("New Module Path and Filename");
369 // For PACKAGE_SURFACE_AREA
371 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
372 this.jTextFieldType
.setText(DataType
.PACKAGE_SURFACE_AREA
);
373 String s
= oldId
.getPath();
374 s
= Tools
.getRelativePath(oldId
.getPath(), Workspace
.getCurrentWorkspace());
375 this.jTextFieldSource
.setText(Tools
.convertPathToCurrentOsType(s
));
376 this.jLabelBelong
.setEnabled(false);
377 this.jComboBoxExistingPackage
.setEnabled(false);
378 this.jButtonBrowse
.setVisible(false);
379 this.jTextFieldFilePath
380 .setToolTipText("<html>Input the package's relative path and file name, for example:<br>MdePkg\\MdePkg.spd</html>");
381 this.jTextFieldFilePath
.setSize(320, this.jTextFieldFilePath
.getSize().height
);
382 this.jLabelDestinationFile
.setText("New Package Path and Filename");
385 // Check if the package can be cloned
387 PackageSurfaceArea spd
= GlobalData
.openingPackageList
388 .getPackageSurfaceAreaFromId(GlobalData
.openingPackageList
389 .getIdByPath(this.oldId
392 if (spd
.getPackageDefinitions() != null) {
393 if (!spd
.getPackageDefinitions().getRePackage()) {
394 Log
.wrn("Clone Package", "This package can't repackaged and cloned");
395 this.jTextFieldBaseName
.setEnabled(false);
396 this.jTextFieldFilePath
.setEnabled(false);
397 this.jTextFieldGuid
.setEnabled(false);
398 this.jTextFieldVersion
.setEnabled(false);
399 this.jButtonGenerateGuid
.setEnabled(false);
400 this.jButtonOk
.setEnabled(false);
406 // For PLATFORM_SURFACE_AREA
408 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
409 this.jTextFieldType
.setText(DataType
.PLATFORM_SURFACE_AREA
);
410 this.jTextFieldSource
.setText(oldId
.getPath());
411 this.jLabelBelong
.setEnabled(false);
412 this.jComboBoxExistingPackage
.setEnabled(false);
413 this.jTextFieldFilePath
414 .setToolTipText("<html>Select the platform's relative path and filename. For example:<br>C:\\MyWorkspace\\EdkNt32Pkg\\Nt32.fpd</html>");
415 this.jLabelDestinationFile
.setText("New Platform Path and Filename");
420 if (mode
== DataType
.RETURN_TYPE_WORKSPACE
) {
421 this.jTextFieldType
.setText(DataType
.WORKSPACE
);
422 this.jTextFieldSource
.setText(Workspace
.getCurrentWorkspace());
423 this.jLabelBelong
.setEnabled(false);
424 this.jComboBoxExistingPackage
.setEnabled(false);
425 this.jLabelBaseName
.setEnabled(false);
426 this.jTextFieldBaseName
.setEditable(false);
427 this.jLabelGuid
.setEnabled(false);
428 this.jTextFieldGuid
.setEnabled(false);
429 this.jButtonGenerateGuid
.setEnabled(false);
430 this.jLabelVersion
.setEnabled(false);
431 this.jTextFieldVersion
.setEnabled(false);
432 this.jTextFieldFilePath
433 .setToolTipText("<html>Input the workspace path, for example:<br>C:\\MyWorkspace</html>");
434 this.jLabelDestinationFile
.setText("New Workspace Path");
439 This method initializes jContentPane
441 @return javax.swing.JPanel
444 private JPanel
getJContentPane() {
445 if (jContentPane
== null) {
446 jLabelBelong
= new JLabel();
447 jLabelBelong
.setBounds(new java
.awt
.Rectangle(15, 60, 190, 20));
448 jLabelBelong
.setText("Clone Package");
449 jLabelVersion
= new JLabel();
450 jLabelVersion
.setBounds(new java
.awt
.Rectangle(15, 160, 190, 20));
451 jLabelVersion
.setText("Version");
452 jLabelGuid
= new JLabel();
453 jLabelGuid
.setBounds(new java
.awt
.Rectangle(15, 135, 190, 20));
454 jLabelGuid
.setText("Guid");
455 jLabelBaseName
= new JLabel();
456 jLabelBaseName
.setBounds(new java
.awt
.Rectangle(15, 110, 190, 20));
457 jLabelBaseName
.setText("Base Name");
458 jLabelDestinationFile
= new JLabel();
459 jLabelDestinationFile
.setBounds(new java
.awt
.Rectangle(15, 85, 190, 20));
460 jLabelDestinationFile
.setText("Destination File Name");
461 jLabelSource
= new JLabel();
462 jLabelSource
.setBounds(new java
.awt
.Rectangle(15, 35, 190, 20));
463 jLabelSource
.setText("Source");
464 jLabelType
= new JLabel();
465 jLabelType
.setBounds(new java
.awt
.Rectangle(15, 10, 190, 20));
466 jLabelType
.setText("Type");
467 jContentPane
= new JPanel();
468 jContentPane
.setLayout(null);
469 jContentPane
.setSize(new java
.awt
.Dimension(540, 227));
470 jContentPane
.add(jLabelType
, null);
471 jContentPane
.add(getJTextFieldType(), null);
472 jContentPane
.add(jLabelSource
, null);
473 jContentPane
.add(getJTextFieldSource(), null);
474 jContentPane
.add(jLabelDestinationFile
, null);
475 jContentPane
.add(getJTextFieldFilePath(), null);
476 jContentPane
.add(jLabelBaseName
, null);
477 jContentPane
.add(getJTextFieldBaseName(), null);
478 jContentPane
.add(jLabelGuid
, null);
479 jContentPane
.add(getJTextFieldGuid(), null);
480 jContentPane
.add(jLabelVersion
, null);
481 jContentPane
.add(getJTextFieldVersion(), null);
482 jContentPane
.add(getJButtonOk(), null);
483 jContentPane
.add(getJButtonCancel(), null);
484 jContentPane
.add(getJButtonBrowse(), null);
485 jContentPane
.add(getJButtonGenerateGuid(), null);
486 jContentPane
.add(jLabelBelong
, null);
487 jContentPane
.add(getJComboBoxExistingPackage(), null);
493 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
495 * Override actionPerformed to listen all actions
497 public void actionPerformed(ActionEvent arg0
) {
498 if (arg0
.getSource() == jButtonCancel
) {
499 this.setVisible(false);
500 this.returnType
= DataType
.RETURN_TYPE_CANCEL
;
503 if (arg0
.getSource() == jButtonOk
) {
510 } catch (IOException e
) {
511 Log
.wrn("Clone", e
.getMessage());
512 Log
.err("Clone", e
.getMessage());
514 } catch (XmlException e
) {
515 Log
.wrn("Clone", e
.getMessage());
516 Log
.err("Clone", e
.getMessage());
518 } catch (Exception e
) {
519 Log
.wrn("Clone", e
.getMessage());
520 Log
.err("Clone", e
.getMessage());
526 this.setVisible(false);
529 if (arg0
.getSource() == this.jButtonGenerateGuid
) {
530 this.jTextFieldGuid
.setText(Tools
.generateUuidString());
534 // Use different file ext for different clone target type
536 if (arg0
.getSource() == this.jButtonBrowse
) {
537 JFileChooser fc
= new JFileChooser();
538 fc
.setAcceptAllFileFilterUsed(false);
540 if (mode
== DataType
.RETURN_TYPE_WORKSPACE
) {
541 fc
.setCurrentDirectory(new File(Workspace
.getCurrentWorkspace()));
542 fc
.setFileSelectionMode(JFileChooser
.DIRECTORIES_ONLY
);
544 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
545 fc
.setCurrentDirectory(new File(packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex())
547 fc
.addChoosableFileFilter(new IFileFilter(DataType
.MODULE_SURFACE_AREA_EXT
));
549 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
550 fc
.setCurrentDirectory(new File(Workspace
.getCurrentWorkspace()));
551 fc
.addChoosableFileFilter(new IFileFilter(DataType
.PACKAGE_SURFACE_AREA_EXT
));
553 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
554 fc
.setCurrentDirectory(new File(Workspace
.getCurrentWorkspace()));
555 fc
.addChoosableFileFilter(new IFileFilter(DataType
.PLATFORM_SURFACE_AREA_EXT
));
557 int result
= fc
.showSaveDialog(new JPanel());
558 if (result
== JFileChooser
.APPROVE_OPTION
) {
559 this.jTextFieldFilePath
.setText(Tools
.addPathExt(fc
.getSelectedFile().getPath(), mode
));
565 Check name, guid and version.
566 If all of them are valid, save information to new id
568 @retval true All name, guid and version are valid
569 @retval false Any one of name, guid and version is invalid
572 private boolean checkId() {
576 if (isEmpty(this.jTextFieldBaseName
.getText())) {
577 Log
.wrn("Clone", "The Name is required!");
580 if (!DataValidation
.isBaseName(this.jTextFieldBaseName
.getText())) {
583 "<html>Incorrect data type for the Name, it must<br>be a single word, starting with an alpha character.</html>");
590 if (isEmpty(this.jTextFieldGuid
.getText())) {
591 Log
.wrn("Clone", "A Guid is required!!");
594 if (!DataValidation
.isGuid(this.jTextFieldGuid
.getText())) {
598 "<html>Incorrect data type for Guid, which must<br>be in registry format (8-4-4-4-12) for example:<br>d3adb123-eef1-466d-39ac-02febcaf5997</html>");
605 if (isEmpty(this.jTextFieldVersion
.getText())) {
606 Log
.wrn("Clone", "A Version must be entered!");
609 if (!DataValidation
.isVersion(this.jTextFieldVersion
.getText())) {
613 "<html>Incorrect data type for Version, which must<br>be one or more digits, optionally followed by sequence<br>of one or more dot, one or more digits; examples:<br>1.0 1.0.1 12.25.256</html>");
618 // Save information to id
620 newId
.setName(this.jTextFieldBaseName
.getText());
621 newId
.setGuid(this.jTextFieldGuid
.getText());
622 newId
.setVersion(this.jTextFieldVersion
.getText());
623 newId
.setPath(this.jTextFieldFilePath
.getText());
631 @retval true All check points are passed
632 @retval false Any one of check points is failed
635 private boolean check() {
636 String src
= this.oldId
.getPath();
637 String trg
= this.jTextFieldFilePath
.getText();
638 File srcFile
= new File(src
);
639 File trgFile
= new File(trg
);
644 if (!srcFile
.exists()) {
645 Log
.wrn("Clone", "The source file does not exist!");
649 Log
.wrn("Clone", "The destination file path must be entered!");
652 if (src
.equals(trg
)) {
653 Log
.wrn("Clone", "The source and destination can not be same!");
656 if (trgFile
.exists()) {
657 Log
.wrn("Clone", "The destination already exists!");
662 // Check for workspace
664 if (mode
== DataType
.RETURN_TYPE_WORKSPACE
) {
665 if (trg
.indexOf(src
+ DataType
.FILE_SEPARATOR
) == 0) {
666 Log
.wrn("Clone", "The new workspace can not be located within the current workspace!");
674 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
675 trg
= this.getModulePath();
676 if (src
.equals(trg
)) {
677 Log
.wrn("Clone", "The source and destination paths for cloning a module must be different!");
680 trgFile
= new File(trg
);
681 if (trgFile
.exists()) {
682 Log
.wrn("Clone", "The target module already exists!");
691 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
692 if (trg
.indexOf(DataType
.DOS_FILE_SEPARATOR
) == -1 && trg
.indexOf(DataType
.UNIX_FILE_SEPARATOR
) == -1) {
693 Log
.wrn("Clone", "The package name must include a path!");
696 trg
= this.getPackagePath();
697 if (Tools
.getFilePathOnly(src
).equals(Tools
.getFilePathOnly(trg
))) {
698 Log
.wrn("Clone", "The source and destination paths for cloning a package must be different!");
701 trgFile
= new File(trg
);
702 if (trgFile
.exists()) {
703 Log
.wrn("Clone", "The target package already exists!");
710 // Check for Platform
712 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
713 if (trg
.indexOf(Workspace
.getCurrentWorkspace()) != 0) {
714 Log
.wrn("Clone", "The platform clone must be located in the current workspace!");
717 trgFile
= new File(trg
);
718 if (trgFile
.exists()) {
719 Log
.wrn("Clone", "The target platform already exists.");
729 Save clone target to new location
736 private void save() throws IOException
, XmlException
, Exception
{
737 String src
= this.oldId
.getPath();
738 String trg
= this.jTextFieldFilePath
.getText();
739 Vector
<String
> vFiles
= new Vector
<String
>();
744 if (mode
== DataType
.RETURN_TYPE_WORKSPACE
) {
745 FileOperation
.copyFolder(src
, trg
);
746 this.returnType
= DataType
.RETURN_TYPE_WORKSPACE
;
750 // Clone Module Surface Area
752 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
754 // Get target path from source path
756 trg
= getModulePath();
758 vFiles
= wt
.getAllFilesPathOfModule(src
);
760 String oldPackagePath
= GlobalData
.openingModuleList
.getIdByPath(src
).getPackageId().getPath();
761 String newPackagePath
= packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex()).getPath();
764 // First copy all files to new directory
766 FileOperation
.copyFile(src
, trg
);
767 for (int index
= 1; index
< vFiles
.size(); index
++) {
768 String oldFile
= vFiles
.get(index
);
770 if (oldFile
.indexOf(Tools
.getFilePathOnly(src
)) > -1) {
772 // The file is not include header
774 newFile
= oldFile
.replace(Tools
.getFilePathOnly(src
), Tools
.getFilePathOnly(trg
));
775 } else if (oldFile
.indexOf(Tools
.getFilePathOnly(oldPackagePath
)) > -1) {
777 // The file is include header
779 newFile
= oldFile
.replace(Tools
.getFilePathOnly(oldPackagePath
),
780 Tools
.getFilePathOnly(newPackagePath
));
783 FileOperation
.copyFile(oldFile
, newFile
);
787 // Create new msa file
789 ModuleSurfaceArea msa
= null;
790 msa
= OpenFile
.openMsaFile(src
);
795 msa
.getMsaHeader().setModuleName(newId
.getName());
796 msa
.getMsaHeader().setGuidValue(newId
.getGuid());
797 msa
.getMsaHeader().setVersion(newId
.getVersion());
800 // Update <Cloned> Section
802 updateModuleClonedId(msa
, oldId
);
807 SaveFile
.saveMsaFile(trg
, msa
);
810 // Update to platformId
812 this.setMid(new ModuleIdentification(newId
,
813 packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex())));
816 // Open belonging package
818 PackageSurfaceArea psa
= PackageSurfaceArea
.Factory
.newInstance();
819 psa
= OpenFile
.openSpdFile(mid
.getPackageId().getPath());
822 // Update the db file
824 wt
.addModuleToPackage(mid
, psa
);
829 GlobalData
.vModuleList
.addElement(mid
);
830 GlobalData
.openingModuleList
.insertToOpeningModuleList(mid
, msa
);
832 this.returnType
= DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
;
836 // Clone Package Surface Area
838 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
840 // Get target path from source path
842 trg
= this.getPackagePath();
844 vFiles
= wt
.getAllFilesPathOfPakcage(src
);
847 // First copy all files to new directory
849 FileOperation
.copyFile(src
, trg
);
850 for (int index
= 1; index
< vFiles
.size(); index
++) {
851 String oldFile
= vFiles
.get(index
);
852 String newFile
= vFiles
.get(index
).replace(Tools
.getFilePathOnly(src
), Tools
.getFilePathOnly(trg
));
853 FileOperation
.copyFile(oldFile
, newFile
);
857 // Create new spd file
859 PackageSurfaceArea spd
= null;
860 spd
= OpenFile
.openSpdFile(src
);
865 spd
.getSpdHeader().setPackageName(newId
.getName());
866 spd
.getSpdHeader().setGuidValue(newId
.getGuid());
867 spd
.getSpdHeader().setVersion(newId
.getVersion());
870 // Update <Cloned> Section
872 updatePackageClonedId(spd
, oldId
);
877 SaveFile
.saveSpdFile(trg
, spd
);
880 // Update to platformId
882 this.setPid(new PackageIdentification(newId
));
885 // Update the db file
887 wt
.addPackageToDatabase(pid
);
892 GlobalData
.vPackageList
.addElement(pid
);
893 GlobalData
.openingPackageList
.insertToOpeningPackageList(pid
, spd
);
896 // Add all cloned modules
898 Vector
<String
> modulePaths
= GlobalData
.getAllModulesOfPackage(pid
.getPath());
899 String modulePath
= null;
900 ModuleSurfaceArea msa
= null;
902 for (int indexJ
= 0; indexJ
< modulePaths
.size(); indexJ
++) {
904 modulePath
= modulePaths
.get(indexJ
);
905 msa
= OpenFile
.openMsaFile(modulePath
);
906 } catch (IOException e
) {
907 Log
.err("Open Module Surface Area " + modulePath
, e
.getMessage());
909 } catch (XmlException e
) {
910 Log
.err("Open Module Surface Area " + modulePath
, e
.getMessage());
912 } catch (Exception e
) {
913 Log
.err("Open Module Surface Area " + modulePath
, "Invalid file type");
916 Identification id
= Tools
.getId(modulePath
, msa
);
917 mid
= new ModuleIdentification(id
, pid
);
918 GlobalData
.vModuleList
.addElement(mid
);
919 GlobalData
.openingModuleList
.insertToOpeningModuleList(mid
, msa
);
922 this.returnType
= DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
;
926 // Clone Platform Surface Area
928 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
929 PlatformSurfaceArea fpd
= null;
930 fpd
= OpenFile
.openFpdFile(src
);
935 fpd
.getPlatformHeader().setPlatformName(newId
.getName());
936 fpd
.getPlatformHeader().setGuidValue(newId
.getGuid());
937 fpd
.getPlatformHeader().setVersion(newId
.getVersion());
940 // Update Cloned From element
942 updatePlatformClonedId(fpd
, oldId
);
947 SaveFile
.saveFpdFile(trg
, fpd
);
950 // Update to platformId
952 this.setFid(new PlatformIdentification(newId
));
955 // Update the db file
957 wt
.addPlatformToDatabase(fid
);
962 GlobalData
.vPlatformList
.addElement(fid
);
963 GlobalData
.openingPlatformList
.insertToOpeningPlatformList(fid
, fpd
);
965 this.returnType
= DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
;
971 Get the path of selected package
973 @return String The path of selected package
976 private String
getSelectPackagePath() {
977 return Tools
.getFilePathOnly(packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex()).getPath());
981 Get the path of source module
982 Since the path of source module is relative, make it up to full path.
984 @return String The full path of source module
987 private String
getModulePath() {
988 String trg
= this.jTextFieldFilePath
.getText();
989 trg
= Tools
.addPathExt(trg
, mode
);
990 trg
= Tools
.addFileSeparator(getSelectPackagePath()) + trg
;
991 Tools
.convertPathToCurrentOsType(trg
);
996 Get the path of source package
997 Since the path of source package is relative, make it up to full path.
999 @return String The full path of source package
1002 private String
getPackagePath() {
1003 String trg
= this.jTextFieldFilePath
.getText();
1004 trg
= Tools
.addPathExt(trg
, mode
);
1005 trg
= Tools
.addFileSeparator(Workspace
.getCurrentWorkspace()) + trg
;
1006 trg
= Tools
.convertPathToCurrentOsType(trg
);
1011 Set msa file's <Cloned> section via given identification
1013 @param msa ModuleSurfaceArea for clone target
1014 @param id Identification of clone source
1017 private void updateModuleClonedId(ModuleSurfaceArea msa
, Identification id
) {
1019 // Get PlatformDefinitions First
1021 ModuleDefinitions pd
= null;
1022 if (msa
.getModuleDefinitions() == null) {
1023 pd
= ModuleDefinitions
.Factory
.newInstance();
1024 msa
.addNewModuleDefinitions();
1026 pd
= msa
.getModuleDefinitions();
1030 // Get ClonedFrom then
1032 ModuleDefinitions
.ClonedFrom cf
= null;
1033 BigInteger count
= new BigInteger("-1");
1034 if (pd
.getClonedFrom() == null) {
1035 cf
= ModuleDefinitions
.ClonedFrom
.Factory
.newInstance();
1037 cf
= pd
.getClonedFrom();
1039 for (int index
= 0; index
< cf
.getClonedList().size(); index
++) {
1040 if (cf
.getClonedList().get(index
).getId() != null) {
1041 count
= count
.max(cf
.getClonedList().get(index
).getId());
1048 // Set new Cloned item
1050 ModuleDefinitions
.ClonedFrom
.Cloned c
= ModuleDefinitions
.ClonedFrom
.Cloned
.Factory
.newInstance();
1051 c
.setModuleGuid(id
.getGuid());
1052 c
.setModuleVersion(id
.getVersion());
1053 c
.setPackageGuid(wt
.getPackageIdByModuleId(oldId
).getGuid());
1054 c
.setPackageVersion(wt
.getPackageIdByModuleId(oldId
).getVersion());
1055 c
.setId(count
.add(new BigInteger("1")));
1056 String guid
= wt
.getModuleFarGuid(oldId
);
1057 if (guid
!= null && !guid
.equals("")) {
1062 cf
.setClonedArray(cf
.getClonedList().size() - 1, c
);
1063 pd
.addNewClonedFrom();
1064 pd
.setClonedFrom(cf
);
1065 msa
.setModuleDefinitions(pd
);
1069 Set spd file's <Cloned> section via given identification
1071 @param spd PackageSurfaceArea for clone target
1072 @param id Identification of clone source
1075 private void updatePackageClonedId(PackageSurfaceArea spd
, Identification id
) {
1077 // Get PlatformDefinitions First
1079 PackageDefinitions pd
= null;
1080 if (spd
.getPackageDefinitions() == null) {
1081 pd
= PackageDefinitions
.Factory
.newInstance();
1082 spd
.addNewPackageDefinitions();
1084 pd
= spd
.getPackageDefinitions();
1088 // Get ClonedFrom then
1090 PackageDefinitions
.ClonedFrom cf
= null;
1091 BigInteger count
= new BigInteger("-1");
1092 if (pd
.getClonedFrom() == null) {
1093 cf
= PackageDefinitions
.ClonedFrom
.Factory
.newInstance();
1095 cf
= pd
.getClonedFrom();
1097 for (int index
= 0; index
< cf
.getClonedList().size(); index
++) {
1098 if (cf
.getClonedList().get(index
).getId() != null) {
1099 count
= count
.max(cf
.getClonedList().get(index
).getId());
1106 // Set new Cloned item
1108 PackageDefinitions
.ClonedFrom
.Cloned c
= PackageDefinitions
.ClonedFrom
.Cloned
.Factory
.newInstance();
1109 c
.setPackageGuid(id
.getGuid());
1110 c
.setPackageVersion(id
.getVersion());
1111 c
.setId(count
.add(new BigInteger("1")));
1112 String guid
= wt
.getPackageFarGuid(oldId
);
1113 if (guid
!= null && !guid
.equals("")) {
1118 cf
.setClonedArray(cf
.getClonedList().size() - 1, c
);
1119 pd
.addNewClonedFrom();
1120 pd
.setClonedFrom(cf
);
1121 spd
.setPackageDefinitions(pd
);
1125 Set fpd file's <Cloned> section via given identification
1127 @param fpd PlatformSurfaceArea for clone target
1128 @param id Identification of clone source
1131 private void updatePlatformClonedId(PlatformSurfaceArea fpd
, Identification id
) {
1133 // Get PlatformDefinitions First
1135 PlatformDefinitions pd
= null;
1136 if (fpd
.getPlatformDefinitions() == null) {
1137 pd
= PlatformDefinitions
.Factory
.newInstance();
1138 fpd
.addNewPlatformDefinitions();
1140 pd
= fpd
.getPlatformDefinitions();
1144 // Get ClonedFrom then
1146 PlatformDefinitions
.ClonedFrom cf
= null;
1147 BigInteger count
= new BigInteger("-1");
1148 if (pd
.getClonedFrom() == null) {
1149 cf
= PlatformDefinitions
.ClonedFrom
.Factory
.newInstance();
1151 cf
= pd
.getClonedFrom();
1153 for (int index
= 0; index
< cf
.getClonedList().size(); index
++) {
1154 if (cf
.getClonedList().get(index
).getId() != null) {
1155 count
= count
.max(cf
.getClonedList().get(index
).getId());
1162 // Set new Cloned item
1164 PlatformDefinitions
.ClonedFrom
.Cloned c
= PlatformDefinitions
.ClonedFrom
.Cloned
.Factory
.newInstance();
1165 c
.setPlatformGuid(id
.getGuid());
1166 c
.setPlatformVersion(id
.getVersion());
1167 c
.setId(count
.add(new BigInteger("1")));
1168 String guid
= wt
.getPlatformFarGuid(oldId
);
1169 if (guid
!= null && !guid
.equals("")) {
1174 cf
.setClonedArray(cf
.getClonedList().size() - 1, c
);
1175 pd
.addNewClonedFrom();
1176 pd
.setClonedFrom(cf
);
1177 fpd
.setPlatformDefinitions(pd
);
1181 Get PlatformIdentification
1183 @return PlatformIdentification
1186 public PlatformIdentification
getFid() {
1191 Set PlatformIdentification
1193 @param fid PlatformIdentification
1196 public void setFid(PlatformIdentification fid
) {
1201 Get ModuleIdentification
1203 @return ModuleIdentification
1206 public ModuleIdentification
getMid() {
1211 Set ModuleIdentification
1213 @param mid ModuleIdentification
1216 public void setMid(ModuleIdentification mid
) {
1221 Get PackageIdentification
1223 @return PackageIdentification
1226 public PackageIdentification
getPid() {
1231 Set PackageIdentification
1233 @param pid PackageIdentification
1236 public void setPid(PackageIdentification pid
) {