source: trunk/src/org/expeditee/agents/CopyTree.java@ 298

Last change on this file since 298 was 298, checked in by ra33, 16 years ago

Adding networking stuff for peer to peer sharing of frames

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