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(int mode
) {
573 String name
= this.jTextFieldBaseName
.getText();
574 String guid
= this.jTextFieldGuid
.getText();
575 String version
= this.jTextFieldVersion
.getText();
581 Log
.wrn("Clone", "The Name is required!");
584 if (!DataValidation
.isBaseName(name
)) {
587 "<html>Incorrect data type for the Name, it must<br>be a single word, starting with an alpha character.</html>");
595 Log
.wrn("Clone", "A Guid is required!!");
598 if (!DataValidation
.isGuid(guid
)) {
602 "<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>");
609 if (isEmpty(version
)) {
610 Log
.wrn("Clone", "A Version must be entered!");
613 if (!DataValidation
.isVersion(version
)) {
617 "<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>");
621 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
622 String packageGuid
= packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex()).getGuid();
623 String packageVersion
= packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex()).getVersion();
624 if (GlobalData
.findModuleId(guid
, version
, packageGuid
, packageVersion
) != null) {
625 Log
.wrn("Clone", "A module with same Guid and same Version already exists, please selece a new Guid or Version!");
630 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
631 if (GlobalData
.findPackageId(guid
, version
) != null) {
632 Log
.wrn("Clone", "A package with same Guid and same Version already exists, please selece a new Guid or Version!");
637 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
638 if (GlobalData
.findPlatformId(guid
, version
) != null) {
639 Log
.wrn("Clone", "A platform with same Guid and same Version already exists, please selece a new Guid or Version!");
645 // Save information to id
647 newId
.setName(this.jTextFieldBaseName
.getText());
648 newId
.setGuid(this.jTextFieldGuid
.getText());
649 newId
.setVersion(this.jTextFieldVersion
.getText());
650 newId
.setPath(this.jTextFieldFilePath
.getText());
658 @retval true All check points are passed
659 @retval false Any one of check points is failed
662 private boolean check() {
663 String src
= this.oldId
.getPath();
664 String trg
= this.jTextFieldFilePath
.getText();
665 File srcFile
= new File(src
);
666 File trgFile
= new File(trg
);
671 if (!srcFile
.exists()) {
672 Log
.wrn("Clone", "The source file does not exist!");
676 Log
.wrn("Clone", "The destination file path must be entered!");
679 if (src
.equals(trg
)) {
680 Log
.wrn("Clone", "The source and destination can not be same!");
683 if (trgFile
.exists()) {
684 Log
.wrn("Clone", "The destination already exists!");
689 // Check for workspace
691 if (mode
== DataType
.RETURN_TYPE_WORKSPACE
) {
692 if (trg
.indexOf(src
+ DataType
.FILE_SEPARATOR
) == 0) {
693 Log
.wrn("Clone", "The new workspace can not be located within the current workspace!");
701 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
702 trg
= this.getModulePath();
703 if (Tools
.getFilePathOnly(src
).equals(Tools
.getFilePathOnly(trg
))) {
704 Log
.wrn("Clone", "The source and destination paths for cloning a module must be different!");
707 trgFile
= new File(trg
);
708 if (trgFile
.exists()) {
709 Log
.wrn("Clone", "The target module already exists!");
714 // Check if path already exists
715 // Currently we allow user to add multiple msa files in one same directory
716 // Remove this checkpoint
718 // if (GlobalData.isDuplicateRelativePath(Tools.getFilePathOnly(trg), mode)) {
719 // Log.wrn("Clone", "There already exists a same directory with a module");
723 return checkId(mode
);
729 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
730 if (trg
.indexOf(DataType
.DOS_FILE_SEPARATOR
) == -1 && trg
.indexOf(DataType
.UNIX_FILE_SEPARATOR
) == -1) {
731 Log
.wrn("Clone", "The package name must include a path!");
734 trg
= this.getPackagePath();
735 if (Tools
.getFilePathOnly(src
).equals(Tools
.getFilePathOnly(trg
))) {
736 Log
.wrn("Clone", "The source and destination paths for cloning a package must be different!");
739 trgFile
= new File(trg
);
740 if (trgFile
.exists()) {
741 Log
.wrn("Clone", "The target package already exists!");
744 if (GlobalData
.isDuplicateRelativePath(Tools
.getFilePathOnly(trg
), mode
)) {
745 Log
.wrn("Clone", "There already exists a same directory with a package");
749 return checkId(mode
);
753 // Check for Platform
755 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
756 if (trg
.indexOf(Workspace
.getCurrentWorkspace()) != 0) {
757 Log
.wrn("Clone", "The platform clone must be located in the current workspace!");
760 if (Tools
.getFilePathOnly(src
).equals(Tools
.getFilePathOnly(trg
))) {
761 Log
.wrn("Clone", "The source and destination paths for cloning a platform must be different!");
764 trgFile
= new File(trg
);
765 if (trgFile
.exists()) {
766 Log
.wrn("Clone", "The target platform already exists.");
769 if (GlobalData
.isDuplicateRelativePath(Tools
.getFilePathOnly(trg
), mode
)) {
770 Log
.wrn("Clone", "There already exists a same directory with a platform");
774 return checkId(mode
);
781 Save clone target to new location
788 private void save() throws IOException
, XmlException
, Exception
{
789 String src
= this.oldId
.getPath();
790 String trg
= this.jTextFieldFilePath
.getText();
791 Vector
<String
> vFiles
= new Vector
<String
>();
796 if (mode
== DataType
.RETURN_TYPE_WORKSPACE
) {
797 FileOperation
.copyFolder(src
, trg
);
798 this.returnType
= DataType
.RETURN_TYPE_WORKSPACE
;
802 // Clone Module Surface Area
804 if (mode
== DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
) {
806 // Get target path from source path
808 trg
= getModulePath();
810 vFiles
= wt
.getAllFilesPathOfModule(src
);
812 String oldPackagePath
= GlobalData
.openingModuleList
.getIdByPath(src
).getPackageId().getPath();
813 String newPackagePath
= packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex()).getPath();
816 // First copy all files to new directory
818 FileOperation
.copyFile(src
, trg
);
819 for (int index
= 1; index
< vFiles
.size(); index
++) {
820 String oldFile
= vFiles
.get(index
);
822 if (oldFile
.indexOf(Tools
.getFilePathOnly(src
)) > -1) {
824 // The file is not include header
826 newFile
= oldFile
.replace(Tools
.getFilePathOnly(src
), Tools
.getFilePathOnly(trg
));
827 } else if (oldFile
.indexOf(Tools
.getFilePathOnly(oldPackagePath
)) > -1) {
829 // The file is include header
831 newFile
= oldFile
.replace(Tools
.getFilePathOnly(oldPackagePath
),
832 Tools
.getFilePathOnly(newPackagePath
));
835 FileOperation
.copyFile(oldFile
, newFile
);
839 // Create new msa file
841 ModuleSurfaceArea msa
= null;
842 msa
= OpenFile
.openMsaFile(src
);
847 msa
.getMsaHeader().setModuleName(newId
.getName());
848 msa
.getMsaHeader().setGuidValue(newId
.getGuid());
849 msa
.getMsaHeader().setVersion(newId
.getVersion());
852 // Update <Cloned> Section
854 updateModuleClonedId(msa
, oldId
);
859 SaveFile
.saveMsaFile(trg
, msa
);
862 // Update to platformId
864 this.setMid(new ModuleIdentification(newId
,
865 packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex())));
868 // Open belonging package
870 PackageSurfaceArea psa
= PackageSurfaceArea
.Factory
.newInstance();
871 psa
= OpenFile
.openSpdFile(mid
.getPackageId().getPath());
874 // Update the db file
876 wt
.addModuleToPackage(mid
, psa
);
881 GlobalData
.vModuleList
.addElement(mid
);
882 GlobalData
.openingModuleList
.insertToOpeningModuleList(mid
, msa
);
884 this.returnType
= DataType
.RETURN_TYPE_MODULE_SURFACE_AREA
;
888 // Clone Package Surface Area
890 if (mode
== DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
) {
892 // Get target path from source path
894 trg
= this.getPackagePath();
896 vFiles
= wt
.getAllFilesPathOfPakcage(src
);
899 // First copy all files to new directory
901 FileOperation
.copyFile(src
, trg
);
902 for (int index
= 1; index
< vFiles
.size(); index
++) {
903 String oldFile
= vFiles
.get(index
);
904 String newFile
= vFiles
.get(index
).replace(Tools
.getFilePathOnly(src
), Tools
.getFilePathOnly(trg
));
905 FileOperation
.copyFile(oldFile
, newFile
);
909 // Create new spd file
911 PackageSurfaceArea spd
= null;
912 spd
= OpenFile
.openSpdFile(src
);
917 spd
.getSpdHeader().setPackageName(newId
.getName());
918 spd
.getSpdHeader().setGuidValue(newId
.getGuid());
919 spd
.getSpdHeader().setVersion(newId
.getVersion());
922 // Update <Cloned> Section
924 updatePackageClonedId(spd
, oldId
);
929 SaveFile
.saveSpdFile(trg
, spd
);
932 // Update to platformId
934 this.setPid(new PackageIdentification(newId
));
937 // Update the db file
939 wt
.addPackageToDatabase(pid
);
944 GlobalData
.vPackageList
.addElement(pid
);
945 GlobalData
.openingPackageList
.insertToOpeningPackageList(pid
, spd
);
948 // Add all cloned modules
950 Vector
<String
> modulePaths
= GlobalData
.getAllModulesOfPackage(pid
.getPath());
951 String modulePath
= null;
952 ModuleSurfaceArea msa
= null;
954 for (int indexJ
= 0; indexJ
< modulePaths
.size(); indexJ
++) {
956 modulePath
= modulePaths
.get(indexJ
);
957 msa
= OpenFile
.openMsaFile(modulePath
);
958 } catch (IOException e
) {
959 Log
.err("Open Module Surface Area " + modulePath
, e
.getMessage());
961 } catch (XmlException e
) {
962 Log
.err("Open Module Surface Area " + modulePath
, e
.getMessage());
964 } catch (Exception e
) {
965 Log
.err("Open Module Surface Area " + modulePath
, "Invalid file type");
968 Identification id
= Tools
.getId(modulePath
, msa
);
969 mid
= new ModuleIdentification(id
, pid
);
970 GlobalData
.vModuleList
.addElement(mid
);
971 GlobalData
.openingModuleList
.insertToOpeningModuleList(mid
, msa
);
974 this.returnType
= DataType
.RETURN_TYPE_PACKAGE_SURFACE_AREA
;
978 // Clone Platform Surface Area
980 if (mode
== DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
) {
981 PlatformSurfaceArea fpd
= null;
982 fpd
= OpenFile
.openFpdFile(src
);
987 fpd
.getPlatformHeader().setPlatformName(newId
.getName());
988 fpd
.getPlatformHeader().setGuidValue(newId
.getGuid());
989 fpd
.getPlatformHeader().setVersion(newId
.getVersion());
992 // Update Cloned From element
994 updatePlatformClonedId(fpd
, oldId
);
999 SaveFile
.saveFpdFile(trg
, fpd
);
1002 // Update to platformId
1004 this.setFid(new PlatformIdentification(newId
));
1007 // Update the db file
1009 wt
.addPlatformToDatabase(fid
);
1012 // Update GlobalData
1014 GlobalData
.vPlatformList
.addElement(fid
);
1015 GlobalData
.openingPlatformList
.insertToOpeningPlatformList(fid
, fpd
);
1017 this.returnType
= DataType
.RETURN_TYPE_PLATFORM_SURFACE_AREA
;
1023 Get the path of selected package
1025 @return String The path of selected package
1028 private String
getSelectPackagePath() {
1029 return Tools
.getFilePathOnly(packages
.elementAt(this.jComboBoxExistingPackage
.getSelectedIndex()).getPath());
1033 Get the path of source module
1034 Since the path of source module is relative, make it up to full path.
1036 @return String The full path of source module
1039 private String
getModulePath() {
1040 String trg
= this.jTextFieldFilePath
.getText();
1041 trg
= Tools
.addPathExt(trg
, mode
);
1042 trg
= Tools
.addFileSeparator(getSelectPackagePath()) + trg
;
1043 Tools
.convertPathToCurrentOsType(trg
);
1048 Get the path of source package
1049 Since the path of source package is relative, make it up to full path.
1051 @return String The full path of source package
1054 private String
getPackagePath() {
1055 String trg
= this.jTextFieldFilePath
.getText();
1056 trg
= Tools
.addPathExt(trg
, mode
);
1057 trg
= Tools
.addFileSeparator(Workspace
.getCurrentWorkspace()) + trg
;
1058 trg
= Tools
.convertPathToCurrentOsType(trg
);
1063 Set msa file's <Cloned> section via given identification
1065 @param msa ModuleSurfaceArea for clone target
1066 @param id Identification of clone source
1069 private void updateModuleClonedId(ModuleSurfaceArea msa
, Identification id
) {
1071 // Get PlatformDefinitions First
1073 ModuleDefinitions pd
= null;
1074 if (msa
.getModuleDefinitions() == null) {
1075 pd
= ModuleDefinitions
.Factory
.newInstance();
1076 msa
.addNewModuleDefinitions();
1078 pd
= msa
.getModuleDefinitions();
1082 // Get ClonedFrom then
1084 ModuleDefinitions
.ClonedFrom cf
= null;
1085 BigInteger count
= new BigInteger("-1");
1086 if (pd
.getClonedFrom() == null) {
1087 cf
= ModuleDefinitions
.ClonedFrom
.Factory
.newInstance();
1089 cf
= pd
.getClonedFrom();
1091 for (int index
= 0; index
< cf
.getClonedList().size(); index
++) {
1092 if (cf
.getClonedList().get(index
).getId() != null) {
1093 count
= count
.max(cf
.getClonedList().get(index
).getId());
1100 // Set new Cloned item
1102 ModuleDefinitions
.ClonedFrom
.Cloned c
= ModuleDefinitions
.ClonedFrom
.Cloned
.Factory
.newInstance();
1103 c
.setModuleGuid(id
.getGuid());
1104 c
.setModuleVersion(id
.getVersion());
1105 c
.setPackageGuid(wt
.getPackageIdByModuleId(oldId
).getGuid());
1106 c
.setPackageVersion(wt
.getPackageIdByModuleId(oldId
).getVersion());
1107 c
.setId(count
.add(new BigInteger("1")));
1108 String guid
= wt
.getModuleFarGuid(oldId
);
1109 if (guid
!= null && !guid
.equals("")) {
1114 cf
.setClonedArray(cf
.getClonedList().size() - 1, c
);
1115 pd
.addNewClonedFrom();
1116 pd
.setClonedFrom(cf
);
1117 msa
.setModuleDefinitions(pd
);
1121 Set spd file's <Cloned> section via given identification
1123 @param spd PackageSurfaceArea for clone target
1124 @param id Identification of clone source
1127 private void updatePackageClonedId(PackageSurfaceArea spd
, Identification id
) {
1129 // Get PlatformDefinitions First
1131 PackageDefinitions pd
= null;
1132 if (spd
.getPackageDefinitions() == null) {
1133 pd
= PackageDefinitions
.Factory
.newInstance();
1134 spd
.addNewPackageDefinitions();
1136 pd
= spd
.getPackageDefinitions();
1140 // Get ClonedFrom then
1142 PackageDefinitions
.ClonedFrom cf
= null;
1143 BigInteger count
= new BigInteger("-1");
1144 if (pd
.getClonedFrom() == null) {
1145 cf
= PackageDefinitions
.ClonedFrom
.Factory
.newInstance();
1147 cf
= pd
.getClonedFrom();
1149 for (int index
= 0; index
< cf
.getClonedList().size(); index
++) {
1150 if (cf
.getClonedList().get(index
).getId() != null) {
1151 count
= count
.max(cf
.getClonedList().get(index
).getId());
1158 // Set new Cloned item
1160 PackageDefinitions
.ClonedFrom
.Cloned c
= PackageDefinitions
.ClonedFrom
.Cloned
.Factory
.newInstance();
1161 c
.setPackageGuid(id
.getGuid());
1162 c
.setPackageVersion(id
.getVersion());
1163 c
.setId(count
.add(new BigInteger("1")));
1164 String guid
= wt
.getPackageFarGuid(oldId
);
1165 if (guid
!= null && !guid
.equals("")) {
1170 cf
.setClonedArray(cf
.getClonedList().size() - 1, c
);
1171 pd
.addNewClonedFrom();
1172 pd
.setClonedFrom(cf
);
1173 spd
.setPackageDefinitions(pd
);
1177 Set fpd file's <Cloned> section via given identification
1179 @param fpd PlatformSurfaceArea for clone target
1180 @param id Identification of clone source
1183 private void updatePlatformClonedId(PlatformSurfaceArea fpd
, Identification id
) {
1185 // Get PlatformDefinitions First
1187 PlatformDefinitions pd
= null;
1188 if (fpd
.getPlatformDefinitions() == null) {
1189 pd
= PlatformDefinitions
.Factory
.newInstance();
1190 fpd
.addNewPlatformDefinitions();
1192 pd
= fpd
.getPlatformDefinitions();
1196 // Get ClonedFrom then
1198 PlatformDefinitions
.ClonedFrom cf
= null;
1199 BigInteger count
= new BigInteger("-1");
1200 if (pd
.getClonedFrom() == null) {
1201 cf
= PlatformDefinitions
.ClonedFrom
.Factory
.newInstance();
1203 cf
= pd
.getClonedFrom();
1205 for (int index
= 0; index
< cf
.getClonedList().size(); index
++) {
1206 if (cf
.getClonedList().get(index
).getId() != null) {
1207 count
= count
.max(cf
.getClonedList().get(index
).getId());
1214 // Set new Cloned item
1216 PlatformDefinitions
.ClonedFrom
.Cloned c
= PlatformDefinitions
.ClonedFrom
.Cloned
.Factory
.newInstance();
1217 c
.setPlatformGuid(id
.getGuid());
1218 c
.setPlatformVersion(id
.getVersion());
1219 c
.setId(count
.add(new BigInteger("1")));
1220 String guid
= wt
.getPlatformFarGuid(oldId
);
1221 if (guid
!= null && !guid
.equals("")) {
1226 cf
.setClonedArray(cf
.getClonedList().size() - 1, c
);
1227 pd
.addNewClonedFrom();
1228 pd
.setClonedFrom(cf
);
1229 fpd
.setPlatformDefinitions(pd
);
1233 Get PlatformIdentification
1235 @return PlatformIdentification
1238 public PlatformIdentification
getFid() {
1243 Set PlatformIdentification
1245 @param fid PlatformIdentification
1248 public void setFid(PlatformIdentification fid
) {
1253 Get ModuleIdentification
1255 @return ModuleIdentification
1258 public ModuleIdentification
getMid() {
1263 Set ModuleIdentification
1265 @param mid ModuleIdentification
1268 public void setMid(ModuleIdentification mid
) {
1273 Get PackageIdentification
1275 @return PackageIdentification
1278 public PackageIdentification
getPid() {
1283 Set PackageIdentification
1285 @param pid PackageIdentification
1288 public void setPid(PackageIdentification pid
) {