|
Lines 28-35
Link Here
|
| 28 |
import org.eclipse.net4j.util.io.ExtendedDataOutputStream; |
28 |
import org.eclipse.net4j.util.io.ExtendedDataOutputStream; |
| 29 |
|
29 |
|
| 30 |
import java.io.IOException; |
30 |
import java.io.IOException; |
|
|
31 |
import java.util.ArrayList; |
| 31 |
import java.util.HashMap; |
32 |
import java.util.HashMap; |
| 32 |
import java.util.HashSet; |
33 |
import java.util.HashSet; |
|
|
34 |
import java.util.List; |
| 33 |
import java.util.Map; |
35 |
import java.util.Map; |
| 34 |
import java.util.Set; |
36 |
import java.util.Set; |
| 35 |
|
37 |
|
|
Lines 79-117
Link Here
|
| 79 |
if (fetchSize > 0) |
81 |
if (fetchSize > 0) |
| 80 |
{ |
82 |
{ |
| 81 |
contextID = CDOIDImpl.read(in); |
83 |
contextID = CDOIDImpl.read(in); |
|
|
84 |
|
| 85 |
if (PROTOCOL.isEnabled()) PROTOCOL.format("Reading fetch rules for context {0}", contextID); |
| 86 |
|
| 82 |
for (int i = 0; i < fetchSize; i++) |
87 |
for (int i = 0; i < fetchSize; i++) |
| 83 |
{ |
88 |
{ |
| 84 |
CDOFetchRule fetchRule = new CDOFetchRule(in, getPackageManager()); |
89 |
CDOFetchRule fetchRule = new CDOFetchRule(in, getPackageManager()); |
| 85 |
fetchRules.put(fetchRule.getCDOClass(), fetchRule); |
90 |
fetchRules.put(fetchRule.getCDOClass(), fetchRule); |
|
|
91 |
|
| 86 |
} |
92 |
} |
|
|
93 |
|
| 87 |
} |
94 |
} |
| 88 |
} |
95 |
} |
| 89 |
|
96 |
|
| 90 |
@Override |
97 |
@Override |
| 91 |
protected void responding(ExtendedDataOutputStream out) throws IOException |
98 |
protected void responding(ExtendedDataOutputStream out) throws IOException |
| 92 |
{ |
99 |
{ |
|
|
100 |
|
| 93 |
Session session = getSession(); |
101 |
Session session = getSession(); |
| 94 |
Map<CDOID, CDORevisionImpl> containedRevisions = new HashMap<CDOID, CDORevisionImpl>(0); |
102 |
|
| 95 |
|
103 |
List<CDORevisionImpl> additionalRevisions = new ArrayList<CDORevisionImpl>(); |
|
|
104 |
|
| 105 |
HashSet<CDOID> revisions = new HashSet<CDOID>(); |
| 106 |
|
| 96 |
if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} revisions", ids.length); |
107 |
if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} revisions", ids.length); |
| 97 |
for (CDOID id : ids) |
108 |
|
|
|
109 |
|
| 110 |
// Need to fetch the rule first. |
| 111 |
if (!contextID.isNull() && fetchRules.size() > 0) |
| 98 |
{ |
112 |
{ |
| 99 |
CDORevisionImpl revision = getRevision(id); |
113 |
if (PROTOCOL.isEnabled()) PROTOCOL.format("Collecting more objects based on rules"); |
| 100 |
revision.write(out, session, referenceChunk); |
114 |
//System.out.println("Collecting more objects based on rules"); |
| 101 |
session.collectContainedRevisions(revision, referenceChunk, containedRevisions); |
115 |
// Should be more benefits to have referenceChunk more than 1. |
|
|
116 |
// Hope the consumer thought about that !!! |
| 117 |
CDORevisionImpl revisionContext = getRevision(contextID); |
| 118 |
|
| 119 |
collectRevisionsByRule(revisionContext, referenceChunk, revisions, additionalRevisions, new HashSet<CDOFetchRule>()); |
| 102 |
} |
120 |
} |
| 103 |
|
121 |
|
| 104 |
if (!contextID.isNull() && fetchRules.size() > 0) |
122 |
|
|
|
123 |
|
| 124 |
for (CDOID id : ids) |
| 105 |
{ |
125 |
{ |
| 106 |
// TODO What is this good for? Why 1000? |
126 |
CDORevisionImpl revision = getRevision(id); |
| 107 |
int newReferenceChunk = Math.max(referenceChunk, 1000); |
127 |
revision.write(out, session, referenceChunk); |
| 108 |
CDORevisionImpl revisionContext = getRevision(contextID); |
128 |
revisions.add( revision.getID() ); |
| 109 |
collectRevisionsByRule(revisionContext, newReferenceChunk, containedRevisions, new HashSet<CDOFetchRule>()); |
129 |
session.collectContainedRevisions(revision, referenceChunk, revisions, additionalRevisions); |
| 110 |
} |
130 |
} |
| 111 |
|
131 |
|
| 112 |
out.writeInt(containedRevisions.size()); |
132 |
|
| 113 |
if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} additional revisions", containedRevisions.size()); |
133 |
out.writeInt(additionalRevisions.size()); |
| 114 |
for (CDORevisionImpl revision : containedRevisions.values()) |
134 |
|
|
|
135 |
if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} additional revisions", additionalRevisions.size()); |
| 136 |
//System.out.println("ADDITIONAL REVISION" + additionalRevisions.size()); |
| 137 |
for (CDORevisionImpl revision : additionalRevisions) |
| 115 |
{ |
138 |
{ |
| 116 |
revision.write(out, session, referenceChunk); |
139 |
revision.write(out, session, referenceChunk); |
| 117 |
} |
140 |
} |
|
Lines 123-129
Link Here
|
| 123 |
} |
146 |
} |
| 124 |
|
147 |
|
| 125 |
private void collectRevisionsByRule(CDORevisionImpl revision, int referenceChunk, |
148 |
private void collectRevisionsByRule(CDORevisionImpl revision, int referenceChunk, |
| 126 |
Map<CDOID, CDORevisionImpl> containedRevisions, Set<CDOFetchRule> workingFetchRules) |
149 |
Set<CDOID> revisions, List<CDORevisionImpl> additionalRevisions, |
|
|
150 |
Set<CDOFetchRule> workingFetchRules) |
| 127 |
{ |
151 |
{ |
| 128 |
CDOFetchRule fetchRule = fetchRules.get(revision.getCDOClass()); |
152 |
CDOFetchRule fetchRule = fetchRules.get(revision.getCDOClass()); |
| 129 |
if (fetchRule == null || workingFetchRules.contains(fetchRule)) |
153 |
if (fetchRule == null || workingFetchRules.contains(fetchRule)) |
|
Lines 132-137
Link Here
|
| 132 |
} |
156 |
} |
| 133 |
|
157 |
|
| 134 |
workingFetchRules.add(fetchRule); |
158 |
workingFetchRules.add(fetchRule); |
|
|
159 |
|
| 135 |
RevisionManager revisionManager = getSessionManager().getRepository().getRevisionManager(); |
160 |
RevisionManager revisionManager = getSessionManager().getRepository().getRevisionManager(); |
| 136 |
for (CDOFeature feature : fetchRule.getFeatures()) |
161 |
for (CDOFeature feature : fetchRule.getFeatures()) |
| 137 |
{ |
162 |
{ |
|
Lines 145-155
Link Here
|
| 145 |
if (value instanceof CDOID) |
170 |
if (value instanceof CDOID) |
| 146 |
{ |
171 |
{ |
| 147 |
CDOID id = (CDOID)value; |
172 |
CDOID id = (CDOID)value; |
| 148 |
// TODO Missing here? if (!id.isNull() && |
173 |
if (!id.isNull() && !revisions.contains(id)) |
| 149 |
// !containedRevisions.containsKey(id)) |
174 |
{ |
| 150 |
CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk); |
175 |
CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk); |
| 151 |
containedRevisions.put(containedRevision.getID(), containedRevision); |
176 |
|
| 152 |
collectRevisionsByRule(containedRevision, referenceChunk, containedRevisions, workingFetchRules); |
177 |
revisions.add(containedRevision.getID()); |
|
|
178 |
additionalRevisions.add(containedRevision); |
| 179 |
|
| 180 |
collectRevisionsByRule(containedRevision, referenceChunk, revisions, additionalRevisions, workingFetchRules); |
| 181 |
} |
| 153 |
} |
182 |
} |
| 154 |
} |
183 |
} |
| 155 |
} |
184 |
} |
|
Lines 159-169
Link Here
|
| 159 |
if (value instanceof CDOID) |
188 |
if (value instanceof CDOID) |
| 160 |
{ |
189 |
{ |
| 161 |
CDOID id = (CDOID)value; |
190 |
CDOID id = (CDOID)value; |
| 162 |
if (!id.isNull() && !containedRevisions.containsKey(id)) |
191 |
if (!id.isNull() && !revisions.contains(id)) |
| 163 |
{ |
192 |
{ |
| 164 |
CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk); |
193 |
CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk); |
| 165 |
containedRevisions.put(containedRevision.getID(), containedRevision); |
194 |
|
| 166 |
collectRevisionsByRule(containedRevision, referenceChunk, containedRevisions, workingFetchRules); |
195 |
revisions.add(containedRevision.getID()); |
|
|
196 |
additionalRevisions.add(containedRevision); |
| 197 |
|
| 198 |
collectRevisionsByRule(containedRevision, referenceChunk, revisions, additionalRevisions, workingFetchRules); |
| 167 |
} |
199 |
} |
| 168 |
} |
200 |
} |
| 169 |
} |
201 |
} |