source: trunk/org/expeditee/agents/CopyTree.java@ 4

Last change on this file since 4 was 4, checked in by davidb, 16 years ago

Starting source code to Expeditee

File size: 3.4 KB
Line 
1package org.expeditee.agents;
2
3import java.util.HashMap;
4import java.util.LinkedList;
5
6import org.expeditee.gui.Frame;
7import org.expeditee.gui.FrameIO;
8import org.expeditee.gui.FrameUtils;
9import org.expeditee.items.Item;
10
11public class CopyTree extends TreeProcessor {
12
13 private String _nameTo;
14
15 private String _nameFrom;
16
17 private String _framePath;
18
19 private int _lastNumber = -1;
20
21 private int _firstNumber = 1;
22
23 private HashMap<String, String> _nameMap = new HashMap<String, String>();
24
25 private LinkedList<String> _toReparse = new LinkedList<String>();
26
27 public CopyTree(String framesetTo) {
28 _nameTo = framesetTo.trim();
29 }
30
31 @Override
32 public boolean initialise(Frame init) {
33 _nameFrom = init.getFramesetName().toLowerCase();
34
35 // get the last used frame in the destination frameset
36 _lastNumber = FrameIO.getLastNumber(_nameTo);
37
38 if (_lastNumber < 0) {
39 // create the new frameset
40 Frame one = FrameIO.CreateFrameset(_nameTo, init.path);
41 _framePath = one.path;
42 _lastNumber = -1;
43 _firstNumber = 1;
44
45 // copy the original .0 frame
46 Frame zero = FrameIO.LoadFrame(init.getFramesetNameAdjusted() + "0");
47 processFrame(zero);
48 } else {
49 // get the frame path
50 Frame zero = FrameIO.LoadFrame(_nameTo + "0");
51 _framePath = zero.path;
52 _firstNumber = _lastNumber + 1;
53 }
54
55 return super.initialise(init);
56 }
57
58 @Override
59 protected void processFrame(Frame toProcess) {
60 // load a fresh copy of the frame that bypasses the cache
61 FrameIO.SuspendCache();
62
63 Frame fresh = FrameIO.LoadFrame(toProcess.getFrameName());
64 if (_nameMap.containsKey(fresh.getFrameName().toLowerCase())) {
65 fresh
66 .setFrameName(_nameMap.get(fresh.getFrameName()
67 .toLowerCase()));
68 } else {
69 fresh.setFrameset(_nameTo);
70 fresh.setFrameNumber(++_lastNumber);
71
72 _nameMap.put(toProcess.getFrameName().toLowerCase(), fresh
73 .getFrameName().toLowerCase());
74 }
75
76 boolean added = false;
77 for (Item i : fresh.getItems())
78 if (i.getLink() != null && !i.isAnnotation() && i.isLinkValid()) {
79 String link = i.getLink();
80 link = link.toLowerCase();
81 // link = link.replace(_nameFrom, _nameTo);
82 if (_nameMap.containsKey(link))
83 link = _nameMap.get(link);
84 else if (link.startsWith(_nameFrom)) {
85 _nameMap.put(link, _nameTo + (++_lastNumber));
86 link = _nameTo + _lastNumber;
87 }
88 i.setLink(link);
89 } else if (!added && i.getLink() != null && i.isAnnotation()
90 && i.isLinkValid()) {
91 // annotation links need to be parsed at the end
92 if (i.getLink().toLowerCase().startsWith(_nameFrom)) {
93 _toReparse.add(fresh.getFrameName());
94 added = true;
95 }
96
97 }
98
99 fresh.path = _framePath;
100 FrameIO.SaveFrame(fresh);
101 FrameIO.ResumeCache();
102 }
103
104 @Override
105 protected void finalise(Frame frame) {
106 // reparse all frames that have annotation links that may need updating
107 for (String name : _toReparse) {
108 Frame toParse = FrameIO.LoadFrame(name);
109 boolean changed = false;
110 for (Item i : toParse.getItems()) {
111 if (i.getLink() != null && i.isAnnotation() && i.isLinkValid()) {
112 String link = i.getLink();
113 link = link.toLowerCase();
114 // link = link.replace(_nameFrom, _nameTo);
115 if (_nameMap.containsKey(link)) {
116 link = _nameMap.get(link);
117 i.setLink(link);
118 changed = true;
119 }
120 }
121 }
122
123 if (changed)
124 FrameIO.SaveFrame(toParse);
125 }
126
127 message("Tree successfully copied to " + _nameTo);
128 FrameUtils.DisplayFrame(Frame.GetFramesetNameAdjusted(_nameTo) + _firstNumber);
129 }
130
131}
Note: See TracBrowser for help on using the repository browser.