]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - Tools/Java/Source/FrameworkWizard/src/org/tianocore/frameworkwizard/Clone.java
Fixed the width of the GuidValue field
[mirror_edk2.git] / Tools / Java / Source / FrameworkWizard / src / org / tianocore / frameworkwizard / Clone.java
... / ...
CommitLineData
1/** @file\r
2 \r
3 The file is used to clone workspace, module, package and platform\r
4 \r
5 Copyright (c) 2006, Intel Corporation\r
6 All rights reserved. This program and the accompanying materials\r
7 are licensed and made available under the terms and conditions of the BSD License\r
8 which accompanies this distribution. The full text of the license may be found at\r
9 http://opensource.org/licenses/bsd-license.php\r
10 \r
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13 \r
14 **/\r
15package org.tianocore.frameworkwizard;\r
16\r
17import java.awt.event.ActionEvent;\r
18import java.io.File;\r
19import java.io.IOException;\r
20import java.math.BigInteger;\r
21import java.util.Vector;\r
22\r
23import javax.swing.JFileChooser;\r
24import javax.swing.JPanel;\r
25import javax.swing.JLabel;\r
26import javax.swing.JTextField;\r
27import javax.swing.JButton;\r
28\r
29import org.apache.xmlbeans.XmlException;\r
30import org.tianocore.ModuleDefinitionsDocument.ModuleDefinitions;\r
31import org.tianocore.ModuleSurfaceAreaDocument.ModuleSurfaceArea;\r
32import org.tianocore.PackageDefinitionsDocument.PackageDefinitions;\r
33import org.tianocore.PackageSurfaceAreaDocument.PackageSurfaceArea;\r
34import org.tianocore.PlatformDefinitionsDocument.PlatformDefinitions;\r
35import org.tianocore.PlatformSurfaceAreaDocument.PlatformSurfaceArea;\r
36import org.tianocore.frameworkwizard.common.DataType;\r
37import org.tianocore.frameworkwizard.common.DataValidation;\r
38import org.tianocore.frameworkwizard.common.FileOperation;\r
39import org.tianocore.frameworkwizard.common.GlobalData;\r
40import org.tianocore.frameworkwizard.common.IFileFilter;\r
41import org.tianocore.frameworkwizard.common.Log;\r
42import org.tianocore.frameworkwizard.common.OpenFile;\r
43import org.tianocore.frameworkwizard.common.SaveFile;\r
44import org.tianocore.frameworkwizard.common.Tools;\r
45import org.tianocore.frameworkwizard.common.Identifications.Identification;\r
46import org.tianocore.frameworkwizard.common.ui.IDialog;\r
47import org.tianocore.frameworkwizard.common.ui.IFrame;\r
48import org.tianocore.frameworkwizard.module.Identifications.ModuleIdentification;\r
49import org.tianocore.frameworkwizard.packaging.PackageIdentification;\r
50import org.tianocore.frameworkwizard.platform.PlatformIdentification;\r
51import org.tianocore.frameworkwizard.workspace.Workspace;\r
52import org.tianocore.frameworkwizard.workspace.WorkspaceTools;\r
53import javax.swing.JComboBox;\r
54\r
55/**\r
56 The class is used to provide functions to clone workspace, module, package and platform\r
57 It extends IDialog\r
58\r
59 **/\r
60public class Clone extends IDialog {\r
61\r
62 ///\r
63 /// Define Class Serial Version UID\r
64 ///\r
65 private static final long serialVersionUID = -5469299324965727137L;\r
66\r
67 ///\r
68 /// Define Class Members\r
69 ///\r
70 private JPanel jContentPane = null;\r
71\r
72 private JLabel jLabelType = null;\r
73\r
74 private JTextField jTextFieldType = null;\r
75\r
76 private JLabel jLabelSource = null;\r
77\r
78 private JTextField jTextFieldSource = null;\r
79\r
80 private JButton jButtonBrowse = null;\r
81\r
82 private JLabel jLabelDestinationFile = null;\r
83\r
84 private JTextField jTextFieldFilePath = null;\r
85\r
86 private JLabel jLabelBaseName = null;\r
87\r
88 private JTextField jTextFieldBaseName = null;\r
89\r
90 private JLabel jLabelGuid = null;\r
91\r
92 private JTextField jTextFieldGuid = null;\r
93\r
94 private JLabel jLabelVersion = null;\r
95\r
96 private JTextField jTextFieldVersion = null;\r
97\r
98 private JButton jButtonOk = null;\r
99\r
100 private JButton jButtonCancel = null;\r
101\r
102 private JButton jButtonGenerateGuid = null;\r
103\r
104 private JLabel jLabelBelong = null;\r
105\r
106 private JComboBox jComboBoxExistingPackage = null;\r
107\r
108 ///\r
109 /// Define members not for UI\r
110 ///\r
111\r
112 private int mode = -1;\r
113\r
114 private Vector<PackageIdentification> packages = null;\r
115\r
116 private WorkspaceTools wt = new WorkspaceTools();\r
117\r
118 private Identification oldId = null;\r
119\r
120 private Identification newId = null;\r
121\r
122 private ModuleIdentification mid = null;\r
123\r
124 private PackageIdentification pid = null;\r
125\r
126 private PlatformIdentification fid = null;\r
127\r
128 /**\r
129 This method initializes jTextFieldType \r
130 \r
131 @return javax.swing.JTextField\r
132 \r
133 **/\r
134 private JTextField getJTextFieldType() {\r
135 if (jTextFieldType == null) {\r
136 jTextFieldType = new JTextField();\r
137 jTextFieldType.setBounds(new java.awt.Rectangle(210, 10, 320, 20));\r
138 jTextFieldType.setEditable(false);\r
139 }\r
140 return jTextFieldType;\r
141 }\r
142\r
143 /**\r
144 This method initializes jTextFieldSource \r
145 \r
146 @return javax.swing.JTextField \r
147 \r
148 **/\r
149 private JTextField getJTextFieldSource() {\r
150 if (jTextFieldSource == null) {\r
151 jTextFieldSource = new JTextField();\r
152 jTextFieldSource.setBounds(new java.awt.Rectangle(210, 35, 320, 20));\r
153 jTextFieldSource.setEditable(false);\r
154 }\r
155 return jTextFieldSource;\r
156 }\r
157\r
158 /**\r
159 This method initializes jButtonBrowse \r
160 \r
161 @return javax.swing.JButton \r
162 \r
163 **/\r
164 private JButton getJButtonBrowse() {\r
165 if (jButtonBrowse == null) {\r
166 jButtonBrowse = new JButton();\r
167 jButtonBrowse.setBounds(new java.awt.Rectangle(445, 85, 85, 20));\r
168 jButtonBrowse.setText("Browse");\r
169 jButtonBrowse.addActionListener(this);\r
170 }\r
171 return jButtonBrowse;\r
172 }\r
173\r
174 /**\r
175 This method initializes jTextFieldDestinationFile \r
176 \r
177 @return javax.swing.JTextField \r
178 \r
179 **/\r
180 private JTextField getJTextFieldFilePath() {\r
181 if (jTextFieldFilePath == null) {\r
182 jTextFieldFilePath = new JTextField();\r
183 jTextFieldFilePath.setBounds(new java.awt.Rectangle(210, 85, 230, 20));\r
184 }\r
185 return jTextFieldFilePath;\r
186 }\r
187\r
188 /**\r
189 This method initializes jTextFieldBaseName \r
190 \r
191 @return javax.swing.JTextField \r
192 \r
193 **/\r
194 private JTextField getJTextFieldBaseName() {\r
195 if (jTextFieldBaseName == null) {\r
196 jTextFieldBaseName = new JTextField();\r
197 jTextFieldBaseName.setBounds(new java.awt.Rectangle(210, 110, 320, 20));\r
198 }\r
199 return jTextFieldBaseName;\r
200 }\r
201\r
202 /**\r
203 This method initializes jTextFieldGuid \r
204 \r
205 @return javax.swing.JTextField \r
206 \r
207 **/\r
208 private JTextField getJTextFieldGuid() {\r
209 if (jTextFieldGuid == null) {\r
210 jTextFieldGuid = new JTextField();\r
211 jTextFieldGuid.setBounds(new java.awt.Rectangle(210, 135, 230, 20));\r
212 }\r
213 return jTextFieldGuid;\r
214 }\r
215\r
216 /**\r
217 This method initializes jTextFieldVersion \r
218 \r
219 @return javax.swing.JTextField \r
220 \r
221 **/\r
222 private JTextField getJTextFieldVersion() {\r
223 if (jTextFieldVersion == null) {\r
224 jTextFieldVersion = new JTextField();\r
225 jTextFieldVersion.setBounds(new java.awt.Rectangle(210, 160, 320, 20));\r
226 }\r
227 return jTextFieldVersion;\r
228 }\r
229\r
230 /**\r
231 This method initializes jButtonOk \r
232 \r
233 @return javax.swing.JButton \r
234 \r
235 **/\r
236 private JButton getJButtonOk() {\r
237 if (jButtonOk == null) {\r
238 jButtonOk = new JButton();\r
239 jButtonOk.setBounds(new java.awt.Rectangle(285, 200, 90, 20));\r
240 jButtonOk.setText("Ok");\r
241 jButtonOk.addActionListener(this);\r
242 }\r
243 return jButtonOk;\r
244 }\r
245\r
246 /**\r
247 This method initializes jButtonCancel \r
248 \r
249 @return javax.swing.JButton \r
250 \r
251 **/\r
252 private JButton getJButtonCancel() {\r
253 if (jButtonCancel == null) {\r
254 jButtonCancel = new JButton();\r
255 jButtonCancel.setBounds(new java.awt.Rectangle(405, 200, 90, 20));\r
256 jButtonCancel.setText("Cancel");\r
257 jButtonCancel.addActionListener(this);\r
258 }\r
259 return jButtonCancel;\r
260 }\r
261\r
262 /**\r
263 This method initializes jButtonGenerateGuid \r
264 \r
265 @return javax.swing.JButton \r
266 \r
267 **/\r
268 private JButton getJButtonGenerateGuid() {\r
269 if (jButtonGenerateGuid == null) {\r
270 jButtonGenerateGuid = new JButton();\r
271 jButtonGenerateGuid.setBounds(new java.awt.Rectangle(445, 135, 85, 20));\r
272 jButtonGenerateGuid.setText("Gen");\r
273 jButtonGenerateGuid.addActionListener(this);\r
274 }\r
275 return jButtonGenerateGuid;\r
276 }\r
277\r
278 /**\r
279 This method initializes jComboBoxExistingPackage \r
280 \r
281 @return javax.swing.JComboBox \r
282 \r
283 **/\r
284 private JComboBox getJComboBoxExistingPackage() {\r
285 if (jComboBoxExistingPackage == null) {\r
286 jComboBoxExistingPackage = new JComboBox();\r
287 jComboBoxExistingPackage.setBounds(new java.awt.Rectangle(210, 60, 320, 20));\r
288 }\r
289 return jComboBoxExistingPackage;\r
290 }\r
291\r
292 /**\r
293 This is the default constructor\r
294 \r
295 **/\r
296 public Clone() {\r
297 super();\r
298 init();\r
299 }\r
300\r
301 /**\r
302 This is the override constructor\r
303 \r
304 @param parentFrame The parent frame which starts this frame\r
305 @param modal To identify the frame's modal\r
306 @param fileType To identify the clone target type\r
307 @param identification The clone target's identification\r
308 \r
309 **/\r
310 public Clone(IFrame parentFrame, boolean modal, int fileType, Identification identification) {\r
311 super(parentFrame, modal);\r
312 this.mode = fileType;\r
313 if (identification != null) {\r
314 this.oldId = new Identification(identification.getName(), identification.getGuid(),\r
315 identification.getVersion(), identification.getPath());\r
316 this.newId = new Identification(identification.getName(), identification.getGuid(),\r
317 identification.getVersion(), identification.getPath());\r
318 }\r
319 init(mode);\r
320 }\r
321\r
322 /**\r
323 Query all existing packages and fill them into combox\r
324 \r
325 **/\r
326 private void initExistingPackage() {\r
327 packages = wt.getAllPackages();\r
328 for (int index = 0; index < packages.size(); index++) {\r
329 this.jComboBoxExistingPackage.addItem(packages.elementAt(index).getName());\r
330 }\r
331 }\r
332\r
333 /**\r
334 This method initializes this\r
335 \r
336 **/\r
337 private void init() {\r
338 this.setSize(550, 260);\r
339 this.setContentPane(getJContentPane());\r
340 this.setTitle("Clone");\r
341 this.centerWindow();\r
342 }\r
343\r
344 /**\r
345 This method initializes this with given clone target type.\r
346 Customize the frame interface via different clone target type.\r
347 \r
348 @param mode To identify the clone target type\r
349 \r
350 **/\r
351 private void init(int mode) {\r
352 init();\r
353 //\r
354 // For MODULE_SURFACE_AREA\r
355 //\r
356 if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {\r
357 this.jTextFieldType.setText(DataType.MODULE_SURFACE_AREA);\r
358 String s = oldId.getPath();\r
359 s = Tools.getRelativePath(s, Tools.getFilePathOnly(wt.getPackageIdByModuleId(oldId).getPath()));\r
360 this.jTextFieldSource.setText(Tools.convertPathToCurrentOsType(s));\r
361 initExistingPackage();\r
362 this.jButtonBrowse.setVisible(false);\r
363 this.jTextFieldFilePath\r
364 .setToolTipText("<html>Input the module's relative path and filename, for example:<br>Application\\HelloWorld\\HelloWorld.msa</html>");\r
365 this.jTextFieldFilePath.setSize(320, this.jTextFieldFilePath.getSize().height);\r
366 this.jLabelDestinationFile.setText("New Module Path and Filename");\r
367 }\r
368 //\r
369 // For PACKAGE_SURFACE_AREA\r
370 //\r
371 if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {\r
372 this.jTextFieldType.setText(DataType.PACKAGE_SURFACE_AREA);\r
373 String s = oldId.getPath();\r
374 s = Tools.getRelativePath(oldId.getPath(), Workspace.getCurrentWorkspace());\r
375 this.jTextFieldSource.setText(Tools.convertPathToCurrentOsType(s));\r
376 this.jLabelBelong.setEnabled(false);\r
377 this.jComboBoxExistingPackage.setEnabled(false);\r
378 this.jButtonBrowse.setVisible(false);\r
379 this.jTextFieldFilePath.setToolTipText("<html>Input the package's relative path and file name, for example:<br>MdePkg\\MdePkg.spd</html>");\r
380 this.jTextFieldFilePath.setSize(320, this.jTextFieldFilePath.getSize().height);\r
381 this.jLabelDestinationFile.setText("New Package Path and Filename");\r
382 }\r
383 //\r
384 // For PLATFORM_SURFACE_AREA\r
385 //\r
386 if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {\r
387 this.jTextFieldType.setText(DataType.PLATFORM_SURFACE_AREA);\r
388 this.jTextFieldSource.setText(oldId.getPath());\r
389 this.jLabelBelong.setEnabled(false);\r
390 this.jComboBoxExistingPackage.setEnabled(false);\r
391 this.jTextFieldFilePath\r
392 .setToolTipText("<html>Select the platform's relative path and filename. For example:<br>C:\\MyWorkspace\\EdkNt32Pkg\\Nt32.fpd</html>");\r
393 this.jLabelDestinationFile.setText("New Platform Path and Filename");\r
394 }\r
395 //\r
396 // For WORKSPACE\r
397 //\r
398 if (mode == DataType.RETURN_TYPE_WORKSPACE) {\r
399 this.jTextFieldType.setText(DataType.WORKSPACE);\r
400 this.jTextFieldSource.setText(Workspace.getCurrentWorkspace());\r
401 this.jLabelBelong.setEnabled(false);\r
402 this.jComboBoxExistingPackage.setEnabled(false);\r
403 this.jLabelBaseName.setEnabled(false);\r
404 this.jTextFieldBaseName.setEditable(false);\r
405 this.jLabelGuid.setEnabled(false);\r
406 this.jTextFieldGuid.setEnabled(false);\r
407 this.jButtonGenerateGuid.setEnabled(false);\r
408 this.jLabelVersion.setEnabled(false);\r
409 this.jTextFieldVersion.setEnabled(false);\r
410 this.jTextFieldFilePath.setToolTipText("<html>Input the workspace path, for example:<br>C:\\MyWorkspace</html>");\r
411 this.jLabelDestinationFile.setText("New Workspace Path");\r
412 }\r
413 }\r
414\r
415 /**\r
416 This method initializes jContentPane\r
417 \r
418 @return javax.swing.JPanel\r
419 \r
420 **/\r
421 private JPanel getJContentPane() {\r
422 if (jContentPane == null) {\r
423 jLabelBelong = new JLabel();\r
424 jLabelBelong.setBounds(new java.awt.Rectangle(15, 60, 190, 20));\r
425 jLabelBelong.setText("Clone Package");\r
426 jLabelVersion = new JLabel();\r
427 jLabelVersion.setBounds(new java.awt.Rectangle(15, 160, 190, 20));\r
428 jLabelVersion.setText("Version");\r
429 jLabelGuid = new JLabel();\r
430 jLabelGuid.setBounds(new java.awt.Rectangle(15, 135, 190, 20));\r
431 jLabelGuid.setText("Guid");\r
432 jLabelBaseName = new JLabel();\r
433 jLabelBaseName.setBounds(new java.awt.Rectangle(15, 110, 190, 20));\r
434 jLabelBaseName.setText("Base Name");\r
435 jLabelDestinationFile = new JLabel();\r
436 jLabelDestinationFile.setBounds(new java.awt.Rectangle(15, 85, 190, 20));\r
437 jLabelDestinationFile.setText("Destination File Name");\r
438 jLabelSource = new JLabel();\r
439 jLabelSource.setBounds(new java.awt.Rectangle(15, 35, 190, 20));\r
440 jLabelSource.setText("Source");\r
441 jLabelType = new JLabel();\r
442 jLabelType.setBounds(new java.awt.Rectangle(15, 10, 190, 20));\r
443 jLabelType.setText("Type");\r
444 jContentPane = new JPanel();\r
445 jContentPane.setLayout(null);\r
446 jContentPane.setSize(new java.awt.Dimension(540, 227));\r
447 jContentPane.add(jLabelType, null);\r
448 jContentPane.add(getJTextFieldType(), null);\r
449 jContentPane.add(jLabelSource, null);\r
450 jContentPane.add(getJTextFieldSource(), null);\r
451 jContentPane.add(jLabelDestinationFile, null);\r
452 jContentPane.add(getJTextFieldFilePath(), null);\r
453 jContentPane.add(jLabelBaseName, null);\r
454 jContentPane.add(getJTextFieldBaseName(), null);\r
455 jContentPane.add(jLabelGuid, null);\r
456 jContentPane.add(getJTextFieldGuid(), null);\r
457 jContentPane.add(jLabelVersion, null);\r
458 jContentPane.add(getJTextFieldVersion(), null);\r
459 jContentPane.add(getJButtonOk(), null);\r
460 jContentPane.add(getJButtonCancel(), null);\r
461 jContentPane.add(getJButtonBrowse(), null);\r
462 jContentPane.add(getJButtonGenerateGuid(), null);\r
463 jContentPane.add(jLabelBelong, null);\r
464 jContentPane.add(getJComboBoxExistingPackage(), null);\r
465 }\r
466 return jContentPane;\r
467 }\r
468\r
469 /* (non-Javadoc)\r
470 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)\r
471 * \r
472 * Override actionPerformed to listen all actions\r
473 */\r
474 public void actionPerformed(ActionEvent arg0) {\r
475 if (arg0.getSource() == jButtonCancel) {\r
476 this.setVisible(false);\r
477 this.returnType = DataType.RETURN_TYPE_CANCEL;\r
478 }\r
479\r
480 if (arg0.getSource() == jButtonOk) {\r
481 if (this.check()) {\r
482 try {\r
483 //\r
484 // Save to file\r
485 //\r
486 this.save();\r
487 } catch (IOException e) {\r
488 Log.wrn("Clone", e.getMessage());\r
489 Log.err("Clone", e.getMessage());\r
490 return;\r
491 } catch (XmlException e) {\r
492 Log.wrn("Clone", e.getMessage());\r
493 Log.err("Clone", e.getMessage());\r
494 return;\r
495 } catch (Exception e) {\r
496 Log.wrn("Clone", e.getMessage());\r
497 Log.err("Clone", e.getMessage());\r
498 return;\r
499 }\r
500 } else {\r
501 return;\r
502 }\r
503 this.setVisible(false);\r
504 }\r
505\r
506 if (arg0.getSource() == this.jButtonGenerateGuid) {\r
507 this.jTextFieldGuid.setText(Tools.generateUuidString());\r
508 }\r
509\r
510 //\r
511 // Use different file ext for different clone target type\r
512 //\r
513 if (arg0.getSource() == this.jButtonBrowse) {\r
514 JFileChooser fc = new JFileChooser();\r
515 fc.setAcceptAllFileFilterUsed(false);\r
516\r
517 if (mode == DataType.RETURN_TYPE_WORKSPACE) {\r
518 fc.setCurrentDirectory(new File(Workspace.getCurrentWorkspace()));\r
519 fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);\r
520 }\r
521 if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {\r
522 fc.setCurrentDirectory(new File(packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex())\r
523 .getPath()));\r
524 fc.addChoosableFileFilter(new IFileFilter(DataType.MODULE_SURFACE_AREA_EXT));\r
525 }\r
526 if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {\r
527 fc.setCurrentDirectory(new File(Workspace.getCurrentWorkspace()));\r
528 fc.addChoosableFileFilter(new IFileFilter(DataType.PACKAGE_SURFACE_AREA_EXT));\r
529 }\r
530 if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {\r
531 fc.setCurrentDirectory(new File(Workspace.getCurrentWorkspace()));\r
532 fc.addChoosableFileFilter(new IFileFilter(DataType.PLATFORM_SURFACE_AREA_EXT));\r
533 }\r
534 int result = fc.showSaveDialog(new JPanel());\r
535 if (result == JFileChooser.APPROVE_OPTION) {\r
536 this.jTextFieldFilePath.setText(Tools.addPathExt(fc.getSelectedFile().getPath(), mode));\r
537 }\r
538 }\r
539 }\r
540\r
541 /**\r
542 Check name, guid and version.\r
543 If all of them are valid, save information to new id\r
544 \r
545 @retval true All name, guid and version are valid\r
546 @retval false Any one of name, guid and version is invalid\r
547 \r
548 **/\r
549 private boolean checkId() {\r
550 //\r
551 // Check Basename\r
552 //\r
553 if (isEmpty(this.jTextFieldBaseName.getText())) {\r
554 Log.wrn("Clone", "The Name is required!");\r
555 return false;\r
556 }\r
557 if (!DataValidation.isBaseName(this.jTextFieldBaseName.getText())) {\r
558 Log.wrn("Clone", "<html>Incorrect data type for the Name, it must<br>be a single word, starting with an alpha character.</html>");\r
559 return false;\r
560 }\r
561\r
562 //\r
563 // Check Guid\r
564 //\r
565 if (isEmpty(this.jTextFieldGuid.getText())) {\r
566 Log.wrn("Clone", "A Guid is required!!");\r
567 return false;\r
568 }\r
569 if (!DataValidation.isGuid(this.jTextFieldGuid.getText())) {\r
570 Log.wrn("Clone", "<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>");\r
571 return false;\r
572 }\r
573\r
574 //\r
575 // Check Version\r
576 //\r
577 if (isEmpty(this.jTextFieldVersion.getText())) {\r
578 Log.wrn("Clone", "A Version must be entered!");\r
579 return false;\r
580 }\r
581 if (!DataValidation.isVersion(this.jTextFieldVersion.getText())) {\r
582 Log.wrn("Clone", "<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>");\r
583 return false;\r
584 }\r
585\r
586 //\r
587 // Save information to id\r
588 //\r
589 newId.setName(this.jTextFieldBaseName.getText());\r
590 newId.setGuid(this.jTextFieldGuid.getText());\r
591 newId.setVersion(this.jTextFieldVersion.getText());\r
592 newId.setPath(this.jTextFieldFilePath.getText());\r
593\r
594 return true;\r
595 }\r
596\r
597 /**\r
598 Check before save\r
599 \r
600 @retval true All check points are passed\r
601 @retval false Any one of check points is failed\r
602 \r
603 **/\r
604 private boolean check() {\r
605 String src = this.oldId.getPath();\r
606 String trg = this.jTextFieldFilePath.getText();\r
607 File srcFile = new File(src);\r
608 File trgFile = new File(trg);\r
609\r
610 //\r
611 // Common Check\r
612 //\r
613 if (!srcFile.exists()) {\r
614 Log.wrn("Clone", "The source file does not exist!");\r
615 return false;\r
616 }\r
617 if (isEmpty(trg)) {\r
618 Log.wrn("Clone", "The destination file path must be entered!");\r
619 return false;\r
620 }\r
621 if (src.equals(trg)) {\r
622 Log.wrn("Clone", "The source and destination can not be same!");\r
623 return false;\r
624 }\r
625 if (trgFile.exists()) {\r
626 Log.wrn("Clone", "The destination already exists!");\r
627 return false;\r
628 }\r
629\r
630 //\r
631 // Check for workspace\r
632 //\r
633 if (mode == DataType.RETURN_TYPE_WORKSPACE) {\r
634 if (trg.indexOf(src + DataType.FILE_SEPARATOR) == 0) {\r
635 Log.wrn("Clone", "The new workspace can not be located within the current workspace!");\r
636 return false;\r
637 }\r
638 }\r
639\r
640 //\r
641 // Check for Module\r
642 //\r
643 if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {\r
644 trg = this.getModulePath();\r
645 if (src.equals(trg)) {\r
646 Log.wrn("Clone", "The source and destination paths for cloning a module must be different!");\r
647 return false;\r
648 }\r
649 trgFile = new File(trg);\r
650 if (trgFile.exists()) {\r
651 Log.wrn("Clone", "The target module already exists!");\r
652 return false;\r
653 }\r
654 return checkId();\r
655 }\r
656\r
657 //\r
658 // Check for Package\r
659 //\r
660 if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {\r
661 if (trg.indexOf(DataType.DOS_FILE_SEPARATOR) == -1 && trg.indexOf(DataType.UNIX_FILE_SEPARATOR) == -1) {\r
662 Log.wrn("Clone", "The package name must include a path!");\r
663 return false;\r
664 }\r
665 trg = this.getPackagePath();\r
666 if (Tools.getFilePathOnly(src).equals(Tools.getFilePathOnly(trg))) {\r
667 Log.wrn("Clone", "The source and destination paths for cloning a package must be different!");\r
668 return false;\r
669 }\r
670 trgFile = new File(trg);\r
671 if (trgFile.exists()) {\r
672 Log.wrn("Clone", "The target package already exists!");\r
673 return false;\r
674 }\r
675 return checkId();\r
676 }\r
677\r
678 //\r
679 // Check for Platform\r
680 //\r
681 if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {\r
682 if (trg.indexOf(Workspace.getCurrentWorkspace()) != 0) {\r
683 Log.wrn("Clone", "The platform clone must be located in the current workspace!");\r
684 return false;\r
685 }\r
686 trgFile = new File(trg);\r
687 if (trgFile.exists()) {\r
688 Log.wrn("Clone", "The target platform already exists.");\r
689 return false;\r
690 }\r
691 return checkId();\r
692 }\r
693\r
694 return true;\r
695 }\r
696\r
697 /**\r
698 Save clone target to new location\r
699 \r
700 @throws IOException\r
701 @throws XmlException\r
702 @throws Exception\r
703 \r
704 **/\r
705 private void save() throws IOException, XmlException, Exception {\r
706 String src = this.oldId.getPath();\r
707 String trg = this.jTextFieldFilePath.getText();\r
708 Vector<String> vFiles = new Vector<String>();\r
709\r
710 //\r
711 // Clone Workspace\r
712 //\r
713 if (mode == DataType.RETURN_TYPE_WORKSPACE) {\r
714 FileOperation.copyFolder(src, trg);\r
715 this.returnType = DataType.RETURN_TYPE_WORKSPACE;\r
716 }\r
717\r
718 //\r
719 // Clone Module Surface Area\r
720 //\r
721 if (mode == DataType.RETURN_TYPE_MODULE_SURFACE_AREA) {\r
722 //\r
723 // Get target path from source path\r
724 //\r
725 trg = getModulePath();\r
726 newId.setPath(trg);\r
727 vFiles = wt.getAllFilesPathOfModule(src);\r
728\r
729 //\r
730 // First copy all files to new directory\r
731 //\r
732 FileOperation.copyFile(src, trg);\r
733 for (int index = 1; index < vFiles.size(); index++) {\r
734 String oldFile = vFiles.get(index);\r
735 String newFile = vFiles.get(index).replace(Tools.getFilePathOnly(src), Tools.getFilePathOnly(trg));\r
736 FileOperation.copyFile(oldFile, newFile);\r
737 }\r
738\r
739 //\r
740 // Create new msa file\r
741 //\r
742 ModuleSurfaceArea msa = null;\r
743 msa = OpenFile.openMsaFile(src);\r
744\r
745 //\r
746 // Update to memory\r
747 //\r
748 msa.getMsaHeader().setModuleName(newId.getName());\r
749 msa.getMsaHeader().setGuidValue(newId.getGuid());\r
750 msa.getMsaHeader().setVersion(newId.getVersion());\r
751\r
752 //\r
753 // Update <Cloned> Section\r
754 //\r
755 updateModuleClonedId(msa, oldId);\r
756 \r
757 //\r
758 // Save to file\r
759 //\r
760 SaveFile.saveMsaFile(trg, msa);\r
761\r
762 //\r
763 // Update to platformId\r
764 //\r
765 this.setMid(new ModuleIdentification(newId,\r
766 packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex())));\r
767\r
768 //\r
769 // Open belonging package\r
770 //\r
771 PackageSurfaceArea psa = PackageSurfaceArea.Factory.newInstance();\r
772 psa = OpenFile.openSpdFile(mid.getPackageId().getPath());\r
773\r
774 //\r
775 // Update the db file\r
776 //\r
777 wt.addModuleToPackage(mid, psa);\r
778 \r
779 //\r
780 // Update GlobalData\r
781 //\r
782 GlobalData.vModuleList.addElement(mid);\r
783 GlobalData.openingModuleList.insertToOpeningModuleList(mid, msa);\r
784\r
785 this.returnType = DataType.RETURN_TYPE_MODULE_SURFACE_AREA;\r
786 }\r
787\r
788 //\r
789 // Clone Package Surface Area\r
790 //\r
791 if (mode == DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA) {\r
792 //\r
793 // Get target path from source path\r
794 //\r
795 trg = this.getPackagePath();\r
796 newId.setPath(trg);\r
797 vFiles = wt.getAllFilesPathOfPakcage(src);\r
798\r
799 //\r
800 // First copy all files to new directory\r
801 //\r
802 FileOperation.copyFile(src, trg);\r
803 for (int index = 1; index < vFiles.size(); index++) {\r
804 String oldFile = vFiles.get(index);\r
805 String newFile = vFiles.get(index).replace(Tools.getFilePathOnly(src), Tools.getFilePathOnly(trg));\r
806 FileOperation.copyFile(oldFile, newFile);\r
807 }\r
808\r
809 //\r
810 // Create new spd file\r
811 //\r
812 PackageSurfaceArea spd = null;\r
813 spd = OpenFile.openSpdFile(src);\r
814\r
815 //\r
816 // Update to memory\r
817 //\r
818 spd.getSpdHeader().setPackageName(newId.getName());\r
819 spd.getSpdHeader().setGuidValue(newId.getGuid());\r
820 spd.getSpdHeader().setVersion(newId.getVersion());\r
821\r
822 //\r
823 // Update <Cloned> Section\r
824 //\r
825 updatePackageClonedId(spd, oldId);\r
826\r
827 //\r
828 // Save to file\r
829 //\r
830 SaveFile.saveSpdFile(trg, spd);\r
831\r
832 //\r
833 // Update to platformId\r
834 //\r
835 this.setPid(new PackageIdentification(newId));\r
836\r
837 //\r
838 // Update the db file\r
839 //\r
840 wt.addPackageToDatabase(pid);\r
841 \r
842 //\r
843 // Update GlobalData\r
844 //\r
845 GlobalData.vPackageList.addElement(pid);\r
846 GlobalData.openingPackageList.insertToOpeningPackageList(pid, spd);\r
847 \r
848 //\r
849 // Add all cloned modules\r
850 //\r
851 Vector<String> modulePaths = GlobalData.getAllModulesOfPackage(pid.getPath());\r
852 String modulePath = null;\r
853 ModuleSurfaceArea msa = null;\r
854 \r
855 for (int indexJ = 0; indexJ < modulePaths.size(); indexJ++) {\r
856 try {\r
857 modulePath = modulePaths.get(indexJ);\r
858 msa = OpenFile.openMsaFile(modulePath);\r
859 } catch (IOException e) {\r
860 Log.err("Open Module Surface Area " + modulePath, e.getMessage());\r
861 continue;\r
862 } catch (XmlException e) {\r
863 Log.err("Open Module Surface Area " + modulePath, e.getMessage());\r
864 continue;\r
865 } catch (Exception e) {\r
866 Log.err("Open Module Surface Area " + modulePath, "Invalid file type");\r
867 continue;\r
868 }\r
869 Identification id = Tools.getId(modulePath, msa);\r
870 mid = new ModuleIdentification(id, pid);\r
871 GlobalData.vModuleList.addElement(mid);\r
872 GlobalData.openingModuleList.insertToOpeningModuleList(mid, msa);\r
873 }\r
874 \r
875 this.returnType = DataType.RETURN_TYPE_PACKAGE_SURFACE_AREA;\r
876 }\r
877\r
878 //\r
879 // Clone Platform Surface Area\r
880 //\r
881 if (mode == DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA) {\r
882 PlatformSurfaceArea fpd = null;\r
883 fpd = OpenFile.openFpdFile(src);\r
884\r
885 //\r
886 // Update to memory\r
887 //\r
888 fpd.getPlatformHeader().setPlatformName(newId.getName());\r
889 fpd.getPlatformHeader().setGuidValue(newId.getGuid());\r
890 fpd.getPlatformHeader().setVersion(newId.getVersion());\r
891\r
892 //\r
893 // Update Cloned From element\r
894 //\r
895 updatePlatformClonedId(fpd, oldId);\r
896\r
897 //\r
898 // Save to file\r
899 //\r
900 SaveFile.saveFpdFile(trg, fpd);\r
901\r
902 //\r
903 // Update to platformId\r
904 //\r
905 this.setFid(new PlatformIdentification(newId));\r
906\r
907 //\r
908 // Update the db file\r
909 //\r
910 wt.addPlatformToDatabase(fid);\r
911 \r
912 //\r
913 // Update GlobalData\r
914 //\r
915 GlobalData.vPlatformList.addElement(fid);\r
916 GlobalData.openingPlatformList.insertToOpeningPlatformList(fid, fpd);\r
917\r
918 this.returnType = DataType.RETURN_TYPE_PLATFORM_SURFACE_AREA;\r
919 }\r
920 vFiles = null;\r
921 }\r
922\r
923 /**\r
924 Get the path of selected package\r
925 \r
926 @return String The path of selected package\r
927 \r
928 **/\r
929 private String getSelectPackagePath() {\r
930 return Tools.getFilePathOnly(packages.elementAt(this.jComboBoxExistingPackage.getSelectedIndex()).getPath());\r
931 }\r
932\r
933 /**\r
934 Get the path of source module\r
935 Since the path of source module is relative, make it up to full path.\r
936 \r
937 @return String The full path of source module\r
938 \r
939 **/\r
940 private String getModulePath() {\r
941 String trg = this.jTextFieldFilePath.getText();\r
942 trg = Tools.addPathExt(trg, mode);\r
943 trg = Tools.addFileSeparator(getSelectPackagePath()) + trg;\r
944 Tools.convertPathToCurrentOsType(trg);\r
945 return trg;\r
946 }\r
947\r
948 /**\r
949 Get the path of source package\r
950 Since the path of source package is relative, make it up to full path.\r
951 \r
952 @return String The full path of source package\r
953 \r
954 **/\r
955 private String getPackagePath() {\r
956 String trg = this.jTextFieldFilePath.getText();\r
957 trg = Tools.addPathExt(trg, mode);\r
958 trg = Tools.addFileSeparator(Workspace.getCurrentWorkspace()) + trg;\r
959 trg = Tools.convertPathToCurrentOsType(trg);\r
960 return trg;\r
961 }\r
962\r
963 /**\r
964 Set msa file's <Cloned> section via given identification\r
965 \r
966 @param msa ModuleSurfaceArea for clone target\r
967 @param id Identification of clone source\r
968 \r
969 **/\r
970 private void updateModuleClonedId(ModuleSurfaceArea msa, Identification id) {\r
971 //\r
972 // Get PlatformDefinitions First\r
973 //\r
974 ModuleDefinitions pd = null;\r
975 if (msa.getModuleDefinitions() == null) {\r
976 pd = ModuleDefinitions.Factory.newInstance();\r
977 msa.addNewModuleDefinitions();\r
978 } else {\r
979 pd = msa.getModuleDefinitions();\r
980 }\r
981\r
982 //\r
983 // Get ClonedFrom then\r
984 //\r
985 ModuleDefinitions.ClonedFrom cf = null;\r
986 BigInteger count = new BigInteger("-1");\r
987 if (pd.getClonedFrom() == null) {\r
988 cf = ModuleDefinitions.ClonedFrom.Factory.newInstance();\r
989 } else {\r
990 cf = pd.getClonedFrom();\r
991 if (cf != null) {\r
992 for (int index = 0; index < cf.getClonedList().size(); index++) {\r
993 if (cf.getClonedList().get(index).getId() != null) {\r
994 count = count.max(cf.getClonedList().get(index).getId());\r
995 }\r
996 }\r
997 }\r
998 }\r
999\r
1000 //\r
1001 // Set new Cloned item\r
1002 //\r
1003 ModuleDefinitions.ClonedFrom.Cloned c = ModuleDefinitions.ClonedFrom.Cloned.Factory.newInstance();\r
1004 c.setModuleGuid(id.getGuid());\r
1005 c.setModuleVersion(id.getVersion());\r
1006 c.setPackageGuid(wt.getPackageIdByModuleId(oldId).getGuid());\r
1007 c.setPackageVersion(wt.getPackageIdByModuleId(oldId).getVersion());\r
1008 c.setId(count.add(new BigInteger("1")));\r
1009 String guid = wt.getModuleFarGuid(oldId);\r
1010 if (guid != null && !guid.equals("")) {\r
1011 c.setFarGuid(guid);\r
1012 }\r
1013\r
1014 cf.addNewCloned();\r
1015 cf.setClonedArray(cf.getClonedList().size() - 1, c);\r
1016 pd.addNewClonedFrom();\r
1017 pd.setClonedFrom(cf);\r
1018 msa.setModuleDefinitions(pd);\r
1019 }\r
1020\r
1021 /**\r
1022 Set spd file's <Cloned> section via given identification\r
1023 \r
1024 @param spd PackageSurfaceArea for clone target\r
1025 @param id Identification of clone source\r
1026 \r
1027 **/\r
1028 private void updatePackageClonedId(PackageSurfaceArea spd, Identification id) {\r
1029 //\r
1030 // Get PlatformDefinitions First\r
1031 //\r
1032 PackageDefinitions pd = null;\r
1033 if (spd.getPackageDefinitions() == null) {\r
1034 pd = PackageDefinitions.Factory.newInstance();\r
1035 spd.addNewPackageDefinitions();\r
1036 } else {\r
1037 pd = spd.getPackageDefinitions();\r
1038 }\r
1039\r
1040 //\r
1041 // Get ClonedFrom then\r
1042 //\r
1043 PackageDefinitions.ClonedFrom cf = null;\r
1044 BigInteger count = new BigInteger("-1");\r
1045 if (pd.getClonedFrom() == null) {\r
1046 cf = PackageDefinitions.ClonedFrom.Factory.newInstance();\r
1047 } else {\r
1048 cf = pd.getClonedFrom();\r
1049 if (cf != null) {\r
1050 for (int index = 0; index < cf.getClonedList().size(); index++) {\r
1051 if (cf.getClonedList().get(index).getId() != null) {\r
1052 count = count.max(cf.getClonedList().get(index).getId());\r
1053 }\r
1054 }\r
1055 }\r
1056 }\r
1057\r
1058 //\r
1059 // Set new Cloned item\r
1060 //\r
1061 PackageDefinitions.ClonedFrom.Cloned c = PackageDefinitions.ClonedFrom.Cloned.Factory.newInstance();\r
1062 c.setPackageGuid(id.getGuid());\r
1063 c.setPackageVersion(id.getVersion());\r
1064 c.setId(count.add(new BigInteger("1")));\r
1065 String guid = wt.getPackageFarGuid(oldId);\r
1066 if (guid != null && !guid.equals("")) {\r
1067 c.setFarGuid(guid);\r
1068 }\r
1069\r
1070 cf.addNewCloned();\r
1071 cf.setClonedArray(cf.getClonedList().size() - 1, c);\r
1072 pd.addNewClonedFrom();\r
1073 pd.setClonedFrom(cf);\r
1074 spd.setPackageDefinitions(pd);\r
1075 }\r
1076\r
1077 /**\r
1078 Set fpd file's <Cloned> section via given identification\r
1079 \r
1080 @param fpd PlatformSurfaceArea for clone target\r
1081 @param id Identification of clone source\r
1082 \r
1083 **/\r
1084 private void updatePlatformClonedId(PlatformSurfaceArea fpd, Identification id) {\r
1085 //\r
1086 // Get PlatformDefinitions First\r
1087 //\r
1088 PlatformDefinitions pd = null;\r
1089 if (fpd.getPlatformDefinitions() == null) {\r
1090 pd = PlatformDefinitions.Factory.newInstance();\r
1091 fpd.addNewPlatformDefinitions();\r
1092 } else {\r
1093 pd = fpd.getPlatformDefinitions();\r
1094 }\r
1095\r
1096 //\r
1097 // Get ClonedFrom then\r
1098 //\r
1099 PlatformDefinitions.ClonedFrom cf = null;\r
1100 BigInteger count = new BigInteger("-1");\r
1101 if (pd.getClonedFrom() == null) {\r
1102 cf = PlatformDefinitions.ClonedFrom.Factory.newInstance();\r
1103 } else {\r
1104 cf = pd.getClonedFrom();\r
1105 if (cf != null) {\r
1106 for (int index = 0; index < cf.getClonedList().size(); index++) {\r
1107 if (cf.getClonedList().get(index).getId() != null) {\r
1108 count = count.max(cf.getClonedList().get(index).getId());\r
1109 }\r
1110 }\r
1111 }\r
1112 }\r
1113\r
1114 //\r
1115 // Set new Cloned item\r
1116 //\r
1117 PlatformDefinitions.ClonedFrom.Cloned c = PlatformDefinitions.ClonedFrom.Cloned.Factory.newInstance();\r
1118 c.setPlatformGuid(id.getGuid());\r
1119 c.setPlatformVersion(id.getVersion());\r
1120 c.setId(count.add(new BigInteger("1")));\r
1121 String guid = wt.getPlatformFarGuid(oldId);\r
1122 if (guid != null && !guid.equals("")) {\r
1123 c.setFarGuid(guid);\r
1124 }\r
1125\r
1126 cf.addNewCloned();\r
1127 cf.setClonedArray(cf.getClonedList().size() - 1, c);\r
1128 pd.addNewClonedFrom();\r
1129 pd.setClonedFrom(cf);\r
1130 fpd.setPlatformDefinitions(pd);\r
1131 }\r
1132\r
1133 /**\r
1134 Get PlatformIdentification\r
1135 \r
1136 @return PlatformIdentification\r
1137 \r
1138 **/\r
1139 public PlatformIdentification getFid() {\r
1140 return fid;\r
1141 }\r
1142\r
1143 /**\r
1144 Set PlatformIdentification\r
1145 \r
1146 @param fid PlatformIdentification\r
1147 \r
1148 **/\r
1149 public void setFid(PlatformIdentification fid) {\r
1150 this.fid = fid;\r
1151 }\r
1152\r
1153 /**\r
1154 Get ModuleIdentification\r
1155 \r
1156 @return ModuleIdentification\r
1157 \r
1158 **/\r
1159 public ModuleIdentification getMid() {\r
1160 return mid;\r
1161 }\r
1162\r
1163 /**\r
1164 Set ModuleIdentification\r
1165 \r
1166 @param mid ModuleIdentification\r
1167 \r
1168 **/\r
1169 public void setMid(ModuleIdentification mid) {\r
1170 this.mid = mid;\r
1171 }\r
1172\r
1173 /**\r
1174 Get PackageIdentification\r
1175 \r
1176 @return PackageIdentification\r
1177 \r
1178 **/\r
1179 public PackageIdentification getPid() {\r
1180 return pid;\r
1181 }\r
1182\r
1183 /**\r
1184 Set PackageIdentification\r
1185 \r
1186 @param pid PackageIdentification\r
1187 \r
1188 **/\r
1189 public void setPid(PackageIdentification pid) {\r
1190 this.pid = pid;\r
1191 }\r
1192}\r