Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
View | Details | Raw Unified | Return to bug 202064 | Differences between
and this patch

Collapse All | Expand All

(-)src/org/eclipse/emf/cdo/internal/server/protocol/LoadRevisionIndication.java (-17 / +34 lines)
Lines 50-55 Link Here
50
50
51
  protected CDOID contextID = CDOIDNull.NULL;
51
  protected CDOID contextID = CDOIDNull.NULL;
52
52
53
  protected int loadRevisionCollectionChunkSize = 1;
54
  
53
  public LoadRevisionIndication()
55
  public LoadRevisionIndication()
54
  {
56
  {
55
  }
57
  }
Lines 78-88 Link Here
78
    }
80
    }
79
81
80
    int fetchSize = in.readInt();
82
    int fetchSize = in.readInt();
83
    
81
    if (fetchSize > 0)
84
    if (fetchSize > 0)
82
    {
85
    {
86
      loadRevisionCollectionChunkSize = in.readInt();
87
      if (loadRevisionCollectionChunkSize < 1)
88
    	  loadRevisionCollectionChunkSize = 1;
83
      contextID = CDOIDImpl.read(in);
89
      contextID = CDOIDImpl.read(in);
90
      
84
      if (PROTOCOL.isEnabled()) PROTOCOL.format("Reading fetch rules for context {0}", contextID);
91
      if (PROTOCOL.isEnabled()) PROTOCOL.format("Reading fetch rules for context {0}", contextID);
85
92
      
93
      
86
      for (int i = 0; i < fetchSize; i++)
94
      for (int i = 0; i < fetchSize; i++)
87
      {
95
      {
88
        CDOFetchRule fetchRule = new CDOFetchRule(in, getPackageManager());
96
        CDOFetchRule fetchRule = new CDOFetchRule(in, getPackageManager());
Lines 99-122 Link Here
99
    HashSet<CDOID> revisions = new HashSet<CDOID>();
107
    HashSet<CDOID> revisions = new HashSet<CDOID>();
100
    if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} revisions", ids.length);
108
    if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} revisions", ids.length);
101
109
110
    for (CDOID id : ids)
111
    {
112
    	revisions.add(id);
113
    }
114
    
102
    // Need to fetch the rule first.
115
    // Need to fetch the rule first.
116
    Set<CDOFetchRule> visitedFetchRules = new HashSet<CDOFetchRule>();
103
    if (!contextID.isNull() && fetchRules.size() > 0)
117
    if (!contextID.isNull() && fetchRules.size() > 0)
104
    {
118
    {
105
      if (PROTOCOL.isEnabled()) PROTOCOL.format("Collecting more objects based on rules");
119
      if (PROTOCOL.isEnabled()) PROTOCOL.format("Collecting more objects based on rules");
106
      CDORevisionImpl revisionContext = getRevision(contextID);
120
      
107
      Set<CDOFetchRule> workingFetchRules = new HashSet<CDOFetchRule>();
121
      CDORevisionImpl revisionContext = getRevision(contextID);      
108
      collectRevisionsByRule(revisionContext, referenceChunk, revisions, additionalRevisions, workingFetchRules);
122
      
123
      collectRevisions(revisionContext, revisions, additionalRevisions, visitedFetchRules);
109
    }
124
    }
110
125
111
    for (CDOID id : ids)
126
    for (CDOID id : ids)
112
    {
127
    {
113
      CDORevisionImpl revision = getRevision(id);
128
      CDORevisionImpl revision = getRevision(id);
114
      revision.write(out, session, referenceChunk);
129
      revision.write(out, session, referenceChunk);
115
      revisions.add(revision.getID());
130
116
      session.collectContainedRevisions(revision, referenceChunk, revisions, additionalRevisions);
131
      collectRevisions(revision, revisions, additionalRevisions, visitedFetchRules);
132
            
117
    }
133
    }
118
134
119
    out.writeInt(additionalRevisions.size());
135
    out.writeInt(additionalRevisions.size());
136
    
120
    if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} additional revisions", additionalRevisions.size());
137
    if (PROTOCOL.isEnabled()) PROTOCOL.format("Writing {0} additional revisions", additionalRevisions.size());
121
138
122
    for (CDORevisionImpl revision : additionalRevisions)
139
    for (CDORevisionImpl revision : additionalRevisions)
Lines 130-145 Link Here
130
    return getRevisionManager().getRevision(id, referenceChunk);
147
    return getRevisionManager().getRevision(id, referenceChunk);
131
  }
148
  }
132
149
133
  private void collectRevisionsByRule(CDORevisionImpl revision, int referenceChunk, Set<CDOID> revisions,
150
  private void collectRevisions(CDORevisionImpl revision, Set<CDOID> revisions,
134
      List<CDORevisionImpl> additionalRevisions, Set<CDOFetchRule> workingFetchRules)
151
      List<CDORevisionImpl> additionalRevisions, Set<CDOFetchRule> visitedFetchRules)
135
  {
152
  {
153
	  
154
	getSession().collectContainedRevisions(revision, this.referenceChunk, revisions, additionalRevisions);
155
	
136
    CDOFetchRule fetchRule = fetchRules.get(revision.getCDOClass());
156
    CDOFetchRule fetchRule = fetchRules.get(revision.getCDOClass());
137
    if (fetchRule == null || workingFetchRules.contains(fetchRule))
157
    if (fetchRule == null || visitedFetchRules.contains(fetchRule))
138
    {
158
    {
139
      return;
159
      return;
140
    }
160
    }
141
161
142
    workingFetchRules.add(fetchRule);
162
    visitedFetchRules.add(fetchRule);
143
163
144
    RevisionManager revisionManager = getSessionManager().getRepository().getRevisionManager();
164
    RevisionManager revisionManager = getSessionManager().getRepository().getRevisionManager();
145
    for (CDOFeature feature : fetchRule.getFeatures())
165
    for (CDOFeature feature : fetchRule.getFeatures())
Lines 147-153 Link Here
147
      if (feature.isMany())
167
      if (feature.isMany())
148
      {
168
      {
149
        MoveableList list = revision.getList(feature);
169
        MoveableList list = revision.getList(feature);
150
        int toIndex = Math.min(referenceChunk, list.size()) - 1;
170
        int toIndex = Math.min(this.loadRevisionCollectionChunkSize, list.size()) - 1;
151
        for (int i = 0; i <= toIndex; i++)
171
        for (int i = 0; i <= toIndex; i++)
152
        {
172
        {
153
          Object value = list.get(i);
173
          Object value = list.get(i);
Lines 159-167 Link Here
159
              CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk);
179
              CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk);
160
              revisions.add(containedRevision.getID());
180
              revisions.add(containedRevision.getID());
161
              additionalRevisions.add(containedRevision);
181
              additionalRevisions.add(containedRevision);
162
182
              collectRevisions(containedRevision, revisions, additionalRevisions, visitedFetchRules);
163
              collectRevisionsByRule(containedRevision, referenceChunk, revisions, additionalRevisions,
164
                  workingFetchRules);
165
            }
183
            }
166
          }
184
          }
167
        }
185
        }
Lines 177-189 Link Here
177
            CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk);
195
            CDORevisionImpl containedRevision = revisionManager.getRevision(id, referenceChunk);
178
            revisions.add(containedRevision.getID());
196
            revisions.add(containedRevision.getID());
179
            additionalRevisions.add(containedRevision);
197
            additionalRevisions.add(containedRevision);
180
198
            collectRevisions(containedRevision, revisions, additionalRevisions, visitedFetchRules);
181
            collectRevisionsByRule(containedRevision, referenceChunk, revisions, additionalRevisions, workingFetchRules);
182
          }
199
          }
183
        }
200
        }
184
      }
201
      }
185
    }
202
    }
186
203
187
    workingFetchRules.remove(fetchRule);
204
    visitedFetchRules.remove(fetchRule);
188
  }
205
  }
189
}
206
}
(-)src/org/eclipse/emf/cdo/tests/FetchRuleAnalyzerTest.java (+121 lines)
Added Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 **************************************************************************/
11
package org.eclipse.emf.cdo.tests;
12
13
import org.eclipse.emf.cdo.CDOSession;
14
import org.eclipse.emf.cdo.CDOState;
15
import org.eclipse.emf.cdo.CDOTransaction;
16
import org.eclipse.emf.cdo.eresource.CDOResource;
17
import org.eclipse.emf.cdo.tests.model1.Company;
18
import org.eclipse.emf.cdo.tests.model1.Model1Factory;
19
import org.eclipse.emf.cdo.tests.model1.PurchaseOrder;
20
import org.eclipse.emf.cdo.tests.model1.SalesOrder;
21
import org.eclipse.emf.cdo.tests.model1.Supplier;
22
import org.eclipse.emf.cdo.util.CDOUtil;
23
24
import org.eclipse.net4j.IBufferHandler;
25
import org.eclipse.net4j.IChannel;
26
27
import org.eclipse.emf.common.util.EList;
28
import org.eclipse.emf.common.util.URI;
29
import org.eclipse.emf.ecore.EObject;
30
import org.eclipse.emf.ecore.resource.ResourceSet;
31
import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
32
import org.eclipse.emf.internal.cdo.CDOSessionImpl;
33
import org.eclipse.emf.internal.cdo.CDOTransactionImpl;
34
import org.eclipse.emf.internal.cdo.analyzer.CDOFeatureAnalyzerModelBased;
35
import org.eclipse.emf.internal.cdo.analyzer.CDOFetchRuleManagerThreadLocal;
36
37
import java.util.Date;
38
39
/**
40
 * @author Eike Stepper
41
 */
42
public class FetchRuleAnalyzerTest extends AbstractCDOTest
43
{
44
  
45
  public void testLoadObject() throws Exception
46
  {
47
    {
48
      // disableConsole();
49
      msg("Opening session");
50
      CDOSession session = openModel1Session();
51
52
      msg("Opening transaction");
53
      CDOTransaction transaction = session.openTransaction(new ResourceSetImpl());
54
55
      msg("Creating resource");
56
      CDOResource resource = transaction.createResource("/test2");
57
58
      msg("Creating supplier");
59
60
      for (int i = 0 ; i< 10; i++)
61
      {
62
          Company company = Model1Factory.eINSTANCE.createCompany();
63
    	  company.setCity("CITY" + String.valueOf(i));
64
    	  
65
          for (int j = 0 ; j< 10; j++)
66
          {
67
        	  PurchaseOrder purchaseOrder = Model1Factory.eINSTANCE.createPurchaseOrder();
68
        	  company.getPurchaseOrders().add(purchaseOrder);
69
        	  
70
71
        	  Supplier supplier = Model1Factory.eINSTANCE.createSupplier();
72
        	  
73
        	  // Should it detect supplier to make it persistent...
74
        	  // I don't want to do resource.getContents().add(supplier)
75
        	  purchaseOrder.setSupplier(supplier);
76
        	  
77
        	  SalesOrder salesOrder = Model1Factory.eINSTANCE.createSalesOrder();
78
        	  company.getSalesOrders().add(salesOrder);
79
          }  
80
    	  resource.getContents().add(company);
81
      }
82
83
      transaction.commit();
84
      // XXX session.close();
85
      enableConsole();
86
    }
87
    
88
    msg("Opening session");
89
    CDOSessionImpl session = (CDOSessionImpl)openModel1Session();
90
    
91
    session.getRevisionManager().setRuleManager(new CDOFetchRuleManagerThreadLocal());
92
    
93
    
94
    msg("Opening transaction");
95
    CDOTransactionImpl transaction = (CDOTransactionImpl)session.openTransaction(new ResourceSetImpl());
96
    
97
    CDOFeatureAnalyzerModelBased featureanalyzerModelBased = new CDOFeatureAnalyzerModelBased();
98
    
99
    transaction.setFeatureAnalyzer(featureanalyzerModelBased);
100
    
101
    transaction.setLoadRevisionCollectionChunkSize(10);
102
    
103
    msg("Getting resource");
104
    CDOResource resource = transaction.getResource("/test2");
105
106
    msg("Getting contents");
107
    EList<EObject> contents = resource.getContents();
108
    
109
    for (EObject eObject : contents)
110
    {
111
    	Company company = (Company) eObject;
112
    	for (PurchaseOrder purchaseOrder : company.getPurchaseOrders())
113
    	{
114
    		purchaseOrder.getSupplier();
115
    	}
116
    }
117
    assertEquals(featureanalyzerModelBased.getNbFetch(), 12);
118
119
    msg("Verifying name");
120
  }
121
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/NOOPFetchRuleManager.java (+6 lines)
Lines 37-40 Link Here
37
  {
37
  {
38
    return null;
38
    return null;
39
  }
39
  }
40
41
  public int getLoadRevisionCollectionChunkSize() 
42
  {
43
	// TODO Auto-generated method stub
44
	return 1;
45
  }
40
}
46
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOClusterOfFetchRule.java (-78 / +42 lines)
Lines 11-21 Link Here
11
 **************************************************************************/
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
12
package org.eclipse.emf.internal.cdo.analyzer;
13
13
14
import java.util.HashMap;
15
import java.util.Iterator;
16
import java.util.Map;
17
18
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
19
import org.eclipse.emf.cdo.protocol.model.CDOClass;
14
import org.eclipse.emf.cdo.protocol.model.CDOClass;
20
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
15
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
21
import org.eclipse.emf.internal.cdo.bundle.OM;
16
import org.eclipse.emf.internal.cdo.bundle.OM;
Lines 28-122 Link Here
28
{
23
{
29
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOClusterOfFetchRule.class);
24
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOClusterOfFetchRule.class);
30
25
31
  private Map<CDOFeature, CDOFetchFeatureInfo> featureStats = new HashMap<CDOFeature, CDOFetchFeatureInfo>();
32
33
  private Map<CDOClass, CDOFetchRule> fetchRules = new HashMap<CDOClass, CDOFetchRule>();
34
26
27
  private CDOFeatureInfo featureInfo = new CDOFeatureInfo();
28
  
35
  private CDOFeature rootFeature;
29
  private CDOFeature rootFeature;
30
  
31
  private CDOClass rootClass;
36
32
37
  private long lastUpdate;
33
  private long lastUpdate;
38
34
39
  public CDOClusterOfFetchRule(CDOFeature rootFeature)
35
  public CDOClusterOfFetchRule(CDOClass rootClass, CDOFeature rootFeature)
40
  {
36
  {
41
    this.rootFeature = rootFeature;
37
    this.rootFeature = rootFeature;
38
    this.rootClass = rootClass;
42
    lastUpdate = System.currentTimeMillis();
39
    lastUpdate = System.currentTimeMillis();
43
  }
40
  }
44
41
45
  public boolean isActive()
42
  /**
46
  {
43
   * 
47
    return !fetchRules.isEmpty();
44
   */
48
  }
45
  public int hashCode()
49
46
  {
50
  public Iterator<CDOFetchRule> iterator()
47
	  return rootFeature.hashCode();
51
  {
48
  }
52
    return fetchRules.values().iterator();
49
  
53
  }
50
  /**
54
51
   * 
55
  public synchronized CDOFetchFeatureInfo getFeatureStat(CDOFeature cdoFeature)
52
   */
56
  {
53
  public boolean equals(Object object)
57
    CDOFetchFeatureInfo featureRule = featureStats.get(cdoFeature);
54
  {
58
    if (featureRule == null)
55
	  if (object instanceof CDOClusterOfFetchRule)
59
    {
56
	  {
60
      featureRule = new CDOFetchFeatureInfo();
57
		  CDOClusterOfFetchRule featureInfo = (CDOClusterOfFetchRule)object;
61
      featureStats.put(cdoFeature, featureRule);
58
		  return featureInfo.rootClass == this.rootClass &&
62
    }
59
		  	featureInfo.rootFeature == this.rootFeature;
63
60
	  }
64
    return featureRule;
61
	  return false;
65
  }
62
  }
66
63
 
67
  public synchronized CDOFetchRule addFeatureRule(CDOClass cdoClass, CDOFeature cdoFeature)
64
  /**
68
  {
65
   * 
69
    if (TRACER.isEnabled())
66
   * @return
70
    {
67
   */
71
      TRACER.format("Adding new fetch rule : {0}.{1} from root feature {2}", cdoClass.getName(), cdoFeature.getName(),
72
          rootFeature);
73
    }
74
75
    lastUpdate = System.currentTimeMillis();
76
    CDOFetchRule fetchRule = getFetchRule(cdoClass);
77
    fetchRule.addFeature(cdoFeature);
78
    return fetchRule;
79
  }
80
81
  public synchronized CDOFetchRule removeFeatureRule(CDOClass cdoClass, CDOFeature cdoFeature)
82
  {
83
    if (TRACER.isEnabled())
84
    {
85
      TRACER.format("Removing fetch rule : {0}.{1} from root feature {2}", cdoClass.getName(), cdoFeature.getName(),
86
          rootFeature);
87
    }
88
89
    lastUpdate = System.currentTimeMillis();
90
91
    CDOFetchRule fetchRule = getFetchRule(cdoClass);
92
    fetchRule.removeFeature(cdoFeature);
93
    if (fetchRule.isEmpty())
94
    {
95
      fetchRules.remove(cdoClass);
96
    }
97
98
    return fetchRule;
99
  }
100
101
  public synchronized CDOFetchRule getFetchRule(CDOClass cdoFeature)
102
  {
103
    CDOFetchRule featureRule = fetchRules.get(cdoFeature);
104
    if (featureRule == null)
105
    {
106
      featureRule = new CDOFetchRule(cdoFeature);
107
      fetchRules.put(cdoFeature, featureRule);
108
    }
109
110
    return featureRule;
111
  }
112
113
  public long getLastUpdate()
68
  public long getLastUpdate()
114
  {
69
  {
115
    return lastUpdate;
70
    return lastUpdate;
116
  }
71
  }
117
72
  /**
73
   * 
74
   * @return
75
   */
118
  public CDOFeature getRootFeature()
76
  public CDOFeature getRootFeature()
119
  {
77
  {
120
    return rootFeature;
78
    return rootFeature;
121
  }
79
  }
80
81
  public CDOFeatureInfo getFeatureInfo() 
82
  {
83
	
84
	return featureInfo;
85
  }
122
}
86
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDODynamicFetchRuleManager.java (-58 lines)
Removed Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import org.eclipse.emf.cdo.analyzer.CDOFetchRuleManager;
15
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
16
import org.eclipse.emf.cdo.protocol.CDOID;
17
18
import java.util.Collection;
19
import java.util.List;
20
21
/**
22
 * @author Eike Stepper
23
 */
24
public class CDODynamicFetchRuleManager implements CDOFetchRuleManager
25
{
26
  private static final ThreadLocal<CDOFetchRuleManager> threadLocal = new ThreadLocal<CDOFetchRuleManager>();
27
28
  public CDODynamicFetchRuleManager()
29
  {
30
  }
31
32
  public static void join(CDOFetchRuleManager fetchRulemanager)
33
  {
34
    threadLocal.set(fetchRulemanager);
35
  }
36
37
  public static CDOFetchRuleManager getCurrent()
38
  {
39
    return threadLocal.get();
40
  }
41
42
  public static void leave()
43
  {
44
    threadLocal.set(null);
45
  }
46
47
  public CDOID getContext()
48
  {
49
    CDOFetchRuleManager analyzer = CDODynamicFetchRuleManager.getCurrent();
50
    return analyzer != null ? analyzer.getContext() : null;
51
  }
52
53
  public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids)
54
  {
55
    CDOFetchRuleManager analyzer = CDODynamicFetchRuleManager.getCurrent();
56
    return analyzer != null ? analyzer.getFetchRules(ids) : null;
57
  }
58
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOGraph.java (-112 lines)
Removed Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import java.util.ArrayList;
15
import java.util.Iterator;
16
import java.util.List;
17
18
import org.eclipse.emf.cdo.protocol.CDOID;
19
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
20
import org.eclipse.emf.internal.cdo.bundle.OM;
21
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
22
23
/**
24
 * @author Eike Stepper
25
 */
26
public class CDOGraph
27
{
28
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOGraph.class);
29
30
  private CDOGraphAnalyzer analyzer;
31
32
  private CDOClusterOfFetchRule featureRule;
33
34
  private List<CDOID> clusterOfObjects = new ArrayList<CDOID>();
35
36
  private long lastUpdated;
37
38
  private long creationTime;
39
40
  public CDOGraph(CDOGraphAnalyzer analyzer, CDOID rootID, CDOClusterOfFetchRule featureRule)
41
  {
42
    this.analyzer = analyzer;
43
    this.featureRule = featureRule;
44
    // Adding the root element
45
    add(rootID, null, rootID);
46
    creationTime = System.currentTimeMillis();
47
  }
48
49
  public List<CDOID> getObjects()
50
  {
51
    return clusterOfObjects;
52
  }
53
54
  public CDOClusterOfFetchRule getFeatureRule()
55
  {
56
    return featureRule;
57
  }
58
59
  public long getLastUpdated()
60
  {
61
    return lastUpdated;
62
  }
63
64
  public long getCreationTime()
65
  {
66
    return creationTime;
67
  }
68
69
  public CDOID getRoot()
70
  {
71
    return getObjects().get(0);
72
  }
73
74
  public void clean()
75
  {
76
    Iterator<CDOID> itr = clusterOfObjects.iterator();
77
    itr.next(); // Skip the Root!
78
    while (itr.hasNext())
79
    {
80
      analyzer.removeTrackingID(itr.next());
81
    }
82
83
    creationTime = System.currentTimeMillis();
84
  }
85
86
  public void update()
87
  {
88
    lastUpdated = System.currentTimeMillis();
89
  }
90
91
  public void add(CDOID fromID, CDOFeature feature, CDOID id)
92
  {
93
    // For now .. we do not need to calculate the path.. later we will do!!
94
    clusterOfObjects.add(id);
95
    analyzer.addTrackingID(id, this);
96
  }
97
98
  public void remove()
99
  {
100
    if (TRACER.isEnabled())
101
    {
102
      TRACER.format("Removing CDOGraph {0}", this);
103
    }
104
105
    for (CDOID id : clusterOfObjects)
106
    {
107
      analyzer.removeTrackingID(id);
108
    }
109
110
    analyzer.removeTracking(this);
111
  }
112
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDODynamicFetchRuleAnalyzer.java (-210 lines)
Removed Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.HashMap;
17
import java.util.Iterator;
18
import java.util.List;
19
import java.util.Map;
20
21
import org.eclipse.emf.cdo.CDOView;
22
import org.eclipse.emf.cdo.analyzer.CDOFeatureAnalyzer;
23
import org.eclipse.emf.cdo.analyzer.CDOFetchRuleManager;
24
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
25
import org.eclipse.emf.cdo.protocol.CDOID;
26
import org.eclipse.emf.cdo.protocol.model.CDOClass;
27
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
28
import org.eclipse.emf.internal.cdo.InternalCDOObject;
29
import org.eclipse.emf.internal.cdo.bundle.OM;
30
import org.eclipse.emf.internal.cdo.util.FSMUtil;
31
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
32
33
/**
34
 * @author Eike Stepper
35
 */
36
public class CDODynamicFetchRuleAnalyzer implements CDOFeatureAnalyzer, CDOFetchRuleManager
37
{
38
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDODynamicFetchRuleAnalyzer.class);
39
40
  private static final long ELAPSE_TIME = 400L;
41
42
  private Map<CDOFeature, CDOClusterOfFetchRule> featureRules = new HashMap<CDOFeature, CDOClusterOfFetchRule>();
43
44
  private CDOGraphAnalyzer graphAnalyzer = new CDOGraphAnalyzer();
45
46
  private CDOGraph currentGraph;
47
48
  private long lastAccessTime;
49
50
  private boolean inUse;
51
52
  private InternalCDOObject lastRevision;
53
54
  private CDOView view;
55
56
  private boolean doesFetch;
57
58
  public CDODynamicFetchRuleAnalyzer(CDOView view)
59
  {
60
    this.view = view;
61
  }
62
63
  public CDOClusterOfFetchRule getCurrentFeatureRule()
64
  {
65
    return currentGraph.getFeatureRule();
66
  }
67
68
  public CDOGraph getCurrentGraph()
69
  {
70
    return currentGraph;
71
  }
72
73
  public void preTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index)
74
  {
75
    CDOClass cdoClass = cdoObject.cdoClass();
76
    doesFetch = false;
77
    CDODynamicFetchRuleManager.join(this);
78
    lastRevision = cdoObject;
79
    if (TRACER.isEnabled())
80
    {
81
      TRACER.format("preTraverseFeature : {0}.{1}", cdoClass.getName(), feature.getName());
82
    }
83
84
    // Do not handle these cases
85
    long currentTime = System.currentTimeMillis();
86
    long elapseTimeBeforeLastRequest = currentTime - lastAccessTime;
87
    lastAccessTime = currentTime;
88
89
    // Don`t handle containment relationship
90
    if (!feature.isReference())
91
    {
92
      return;
93
    }
94
95
    if (elapseTimeBeforeLastRequest > ELAPSE_TIME)
96
    {
97
      graphAnalyzer.clear();
98
    }
99
100
    // Purge old graph that we didn't update for specific elapse time
101
    graphAnalyzer.purge(ELAPSE_TIME * 2, ELAPSE_TIME * 2);
102
103
    CDOClusterOfFetchRule featureRule = getFeatureRule(cdoClass, feature);
104
105
    // Get the graph <cdoObject> belongs to
106
    currentGraph = graphAnalyzer.getGraph(cdoObject.cdoID(), featureRule);
107
    lastAccessTime = System.currentTimeMillis();
108
109
    if (currentGraph.getFeatureRule().getRootFeature() == feature)
110
    {
111
      if (graphAnalyzer.isTimeToRemove(currentGraph, lastAccessTime, ELAPSE_TIME))
112
      {
113
        // Clean it!!
114
        currentGraph.clean();
115
        return;
116
      }
117
    }
118
119
    // need to calculate currentFeature to calculate the connected graph
120
    if (feature.isMany() && index != 0)
121
    {
122
      return;
123
    }
124
125
    // Get the cluster of rule for that feature
126
    CDOClusterOfFetchRule currentFeatureRule = currentGraph.getFeatureRule();
127
    CDOFetchFeatureInfo infoOfFeature = currentFeatureRule.getFeatureStat(feature);
128
    infoOfFeature.updateTimeInfo(elapseTimeBeforeLastRequest);
129
130
    // Detect a new rule
131
    if (!infoOfFeature.isActive() && infoOfFeature.getTimeBeforeUsed() < ELAPSE_TIME)
132
    {
133
      currentFeatureRule.addFeatureRule(cdoClass, feature);
134
      infoOfFeature.setActive(true);
135
    }
136
137
    // Detect if the rule is still good!
138
    else if (infoOfFeature.isActive() && infoOfFeature.getTimeBeforeUsed() > ELAPSE_TIME)
139
    {
140
      // Unregister rules
141
      currentFeatureRule.removeFeatureRule(cdoClass, feature);
142
      infoOfFeature.setActive(false);
143
    }
144
145
    lastAccessTime = currentTime;
146
    inUse = true;
147
  }
148
149
  public void postTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index, Object object)
150
  {
151
    if (TRACER.isEnabled())
152
    {
153
      TRACER.format("postTraverseFeature : {0}.{1}", cdoObject.cdoClass(), feature.getName());
154
    }
155
156
    if (currentGraph != null)
157
    {
158
      // Adding return object to the link graph
159
      InternalCDOObject destObject = FSMUtil.adapt(object, view);
160
      currentGraph.add(cdoObject.cdoID(), feature, destObject.cdoID());
161
162
      // calculate latency time
163
      if (doesFetch == true)
164
      {
165
        CDOClusterOfFetchRule currentFeatureRule = currentGraph.getFeatureRule();
166
        CDOFetchFeatureInfo infoOfFeature = currentFeatureRule.getFeatureStat(feature);
167
        infoOfFeature.updateLatencyTime(System.currentTimeMillis() - lastAccessTime);
168
      }
169
    }
170
171
    lastAccessTime = System.currentTimeMillis();
172
    inUse = false;
173
    CDODynamicFetchRuleManager.leave();
174
  }
175
176
  public CDOID getContext()
177
  {
178
    return lastRevision.cdoID();
179
  }
180
181
  public synchronized CDOClusterOfFetchRule getFeatureRule(CDOClass cdoClass, CDOFeature cdoFeature)
182
  {
183
    CDOClusterOfFetchRule featureRule = featureRules.get(cdoFeature);
184
    if (featureRule == null)
185
    {
186
      featureRule = new CDOClusterOfFetchRule(cdoFeature);
187
      featureRules.put(cdoFeature, featureRule);
188
    }
189
190
    return featureRule;
191
  }
192
193
  public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids)
194
  {
195
    doesFetch = true;
196
    if (!inUse || currentGraph == null)
197
    {
198
      return null;
199
    }
200
201
    List<CDOFetchRule> list = new ArrayList<CDOFetchRule>();
202
    for (Iterator<CDOFetchRule> it = currentGraph.getFeatureRule().iterator(); it.hasNext();)
203
    {
204
      CDOFetchRule fetchRule = it.next();
205
      list.add(fetchRule);
206
    }
207
208
    return list;
209
  }
210
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOGraphAnalyzer.java (-111 lines)
Removed Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import java.util.ArrayList;
15
import java.util.HashMap;
16
import java.util.HashSet;
17
import java.util.Map;
18
19
import org.eclipse.emf.cdo.protocol.CDOID;
20
import org.eclipse.emf.internal.cdo.bundle.OM;
21
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
22
23
/**
24
 * @author Eike Stepper
25
 */
26
public class CDOGraphAnalyzer
27
{
28
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOGraphAnalyzer.class);
29
30
  private Map<CDOID, CDOGraph> idToGraphMap = new HashMap<CDOID, CDOGraph>();
31
32
  private HashSet<CDOGraph> uniqueGraphs = new HashSet<CDOGraph>();
33
34
  private long lastPurgeOperation;
35
36
  public CDOGraphAnalyzer()
37
  {
38
    lastPurgeOperation = System.currentTimeMillis();
39
  }
40
41
  public CDOGraph getGraph(CDOID fromID, CDOClusterOfFetchRule featureRule)
42
  {
43
    CDOGraph graph = idToGraphMap.get(fromID);
44
    if (graph == null)
45
    {
46
      graph = new CDOGraph(this, fromID, featureRule);
47
      uniqueGraphs.add(graph);
48
    }
49
50
    // Update is time value
51
    graph.update();
52
    return graph;
53
  }
54
55
  public void purge(long elapseTimeForPurging, long elapseTimeToClear)
56
  {
57
    long time = System.currentTimeMillis();
58
    if (time - lastPurgeOperation > elapseTimeForPurging)
59
    {
60
      if (TRACER.isEnabled())
61
      {
62
        TRACER.format("Purging graph {0}", this);
63
      }
64
65
      ArrayList<CDOGraph> listToRemove = new ArrayList<CDOGraph>();
66
      for (CDOGraph graph : uniqueGraphs)
67
      {
68
        if (isTimeToRemove(graph, time, elapseTimeToClear))
69
        {
70
          listToRemove.add(graph);
71
        }
72
      }
73
74
      for (CDOGraph graph : listToRemove)
75
      {
76
        graph.remove();
77
      }
78
79
      lastPurgeOperation = System.currentTimeMillis();
80
    }
81
  }
82
83
  public boolean isTimeToRemove(CDOGraph graph, long currentTimestamp, long elapseTimeToClear)
84
  {
85
    return currentTimestamp - graph.getLastUpdated() > elapseTimeToClear
86
        || currentTimestamp - graph.getFeatureRule().getLastUpdate() > elapseTimeToClear
87
        && currentTimestamp - graph.getCreationTime() > elapseTimeToClear;
88
  }
89
90
  public void addTrackingID(CDOID id, CDOGraph graph)
91
  {
92
    idToGraphMap.put(id, graph);
93
    graph.update();
94
  }
95
96
  public void removeTrackingID(CDOID id)
97
  {
98
    idToGraphMap.remove(id);
99
  }
100
101
  public void removeTracking(CDOGraph graph)
102
  {
103
    uniqueGraphs.remove(graph);
104
  }
105
106
  public void clear()
107
  {
108
    idToGraphMap.clear();
109
    uniqueGraphs.clear();
110
  }
111
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchFeatureInfo.java (-3 / +31 lines)
Lines 11-16 Link Here
11
 **************************************************************************/
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
12
package org.eclipse.emf.internal.cdo.analyzer;
13
13
14
import org.eclipse.emf.cdo.protocol.model.CDOClass;
15
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
16
14
/**
17
/**
15
 * @author Eike Stepper
18
 * @author Eike Stepper
16
 */
19
 */
Lines 21-33 Link Here
21
  private long latencyTime;
24
  private long latencyTime;
22
25
23
  private boolean active;
26
  private boolean active;
24
27
  
25
  public CDOFetchFeatureInfo()
28
  private CDOClass cdoClass;
29
  
30
  private CDOFeature cdoFeature;
31
  
32
  public CDOFetchFeatureInfo(CDOClass cdoClass, CDOFeature cdoFeature)
26
  {
33
  {
27
    active = false;
34
    active = false;
28
    latencyTime = -1;
35
    latencyTime = -1;
36
    this.cdoClass = cdoClass;
37
    this.cdoFeature = cdoFeature;
38
  }
39
  public int hashCode()
40
  {
41
	  return cdoFeature.hashCode();
42
  }
43
  public boolean equals(Object object)
44
  {
45
	  if (object instanceof CDOFetchFeatureInfo)
46
	  {
47
		  CDOFetchFeatureInfo featureInfo = (CDOFetchFeatureInfo)object;
48
		  return featureInfo.cdoClass == this.cdoClass &&
49
		  	featureInfo.cdoFeature == this.cdoFeature;
50
	  }
51
	  return false;
29
  }
52
  }
30
31
  public boolean isActive()
53
  public boolean isActive()
32
  {
54
  {
33
    return active;
55
    return active;
Lines 81-84 Link Here
81
      setTimeBeforeUsed((getTimeBeforeUsed() + elapseTimeBeforeLastRequest) / 2);
103
      setTimeBeforeUsed((getTimeBeforeUsed() + elapseTimeBeforeLastRequest) / 2);
82
    }
104
    }
83
  }
105
  }
106
public CDOClass getCdoClass() {
107
	return cdoClass;
108
}
109
public CDOFeature getCdoFeature() {
110
	return cdoFeature;
111
}
84
}
112
}
(-)src/org/eclipse/emf/internal/cdo/protocol/LoadRevisionRequest.java (-1 / +4 lines)
Lines 85-93 Link Here
85
    {
85
    {
86
      // At this point, fetch size is more than one.
86
      // At this point, fetch size is more than one.
87
      int fetchSize = fetchRules.size();
87
      int fetchSize = fetchRules.size();
88
      out.writeInt(fetchSize);
89
      CDOID contextID = ruleManager.getContext();
88
      CDOID contextID = ruleManager.getContext();
89
      
90
      out.writeInt(fetchSize);
91
      out.writeInt(ruleManager.getLoadRevisionCollectionChunkSize());
90
      CDOIDImpl.write(out, contextID);
92
      CDOIDImpl.write(out, contextID);
93
      
91
      for (CDOFetchRule fetchRule : fetchRules)
94
      for (CDOFetchRule fetchRule : fetchRules)
92
      {
95
      {
93
        fetchRule.write(out);
96
        fetchRule.write(out);
(-)src/org/eclipse/emf/cdo/analyzer/CDOFetchRuleManager.java (+3 lines)
Lines 28-31 Link Here
28
  public CDOID getContext();
28
  public CDOID getContext();
29
29
30
  public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids);
30
  public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids);
31
  
32
  public int getLoadRevisionCollectionChunkSize();
33
31
}
34
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java (+76 lines)
Added Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.List;
17
18
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
19
import org.eclipse.emf.cdo.protocol.CDOID;
20
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
21
import org.eclipse.emf.internal.cdo.InternalCDOObject;
22
import org.eclipse.emf.internal.cdo.bundle.OM;
23
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
24
25
/**
26
 * @author Eike Stepper
27
 */
28
public class CDOFeatureAnalyzerModelBased extends CDOAbstracFeatureRuleAnalyzer
29
{
30
	private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOFeatureAnalyzerModelBased.class);
31
	
32
	CDOFeatureInfo featureInfos = new CDOFeatureInfo();
33
	
34
	/**
35
	 * 
36
	 */
37
	public void doPreTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index)
38
	{		 
39
40
	}
41
	
42
	/**
43
	 * 
44
	 */
45
	public void doPostTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index, Object value)
46
	{
47
		if (didFetch())
48
			featureInfos.activate(cdoObject.cdoClass(), feature);
49
	}
50
	
51
	/**
52
	 * 
53
	 */
54
	public CDOID getContext() 
55
	{
56
		// TODO Auto-generated method stu
57
		return null;
58
	}
59
	
60
	/**
61
	 * 
62
	 */
63
	public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids) 
64
	{
65
		this.fetchData();
66
		
67
		List<CDOFetchRule> rules = new ArrayList<CDOFetchRule>();
68
		
69
		rules.addAll(featureInfos.getRules(this.lastTraverseCDOObject.cdoClass(), this.lastTraverseFeature));
70
		
71
		return rules;
72
	}
73
74
	
75
76
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOAbstracFeatureRuleAnalyzer.java (+135 lines)
Added Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import org.eclipse.emf.cdo.analyzer.CDOFeatureAnalyzer;
15
import org.eclipse.emf.cdo.analyzer.CDOFetchRuleManager;
16
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
17
import org.eclipse.emf.internal.cdo.InternalCDOObject;
18
import org.eclipse.emf.internal.cdo.bundle.OM;
19
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
20
21
/**
22
 * @author Eike Stepper
23
 */
24
public abstract class CDOAbstracFeatureRuleAnalyzer implements CDOFeatureAnalyzer, CDOFetchRuleManager
25
{
26
	private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOAbstracFeatureRuleAnalyzer.class);
27
	
28
	protected CDOFeature lastTraverseFeature;	  
29
	
30
	protected int lastTraverseIndex;
31
32
	protected long lastAccessTime;
33
	
34
	protected long lastElapseTimeBetweenOperations;
35
	
36
	protected InternalCDOObject lastTraverseCDOObject;
37
	
38
	protected long lastLatencyTime;
39
	
40
	protected int loadRevisionCollectionChunkSize;
41
	
42
	private boolean didFetch;
43
	
44
	private int nbFetch = 0;
45
	
46
	
47
	/**
48
	 * 
49
	 */
50
	public void preTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index) 
51
	{
52
	   if (TRACER.isEnabled())
53
	    {
54
	      TRACER.format("preTraverseFeature : {0}.{1}", cdoObject.cdoClass(), feature.getName());
55
	    }
56
	   
57
	    loadRevisionCollectionChunkSize =   cdoObject.cdoView().getLoadRevisionCollectionChunkSize();
58
	    
59
		// TODO Auto-generated method stub
60
		lastTraverseFeature = feature;
61
		
62
		lastTraverseCDOObject = cdoObject;
63
		
64
		lastTraverseIndex = index;
65
		
66
		lastElapseTimeBetweenOperations = System.currentTimeMillis() - lastAccessTime; 
67
		
68
		lastAccessTime = System.currentTimeMillis();
69
		
70
		didFetch = false;
71
		
72
		CDOFetchRuleManagerThreadLocal.join(this);
73
74
		doPreTraverseFeature( cdoObject,  feature,  index);
75
	}
76
	/**
77
	 * 
78
	 */
79
	protected void fetchData()
80
	{
81
		didFetch = true;
82
		nbFetch++;
83
	}
84
	/**
85
	 * 
86
	 * @return
87
	 */
88
	protected boolean didFetch()
89
	{
90
		return didFetch;
91
	}	
92
	/**
93
	 * 
94
	 * @param cdoObject
95
	 * @param feature
96
	 * @param index
97
	 */
98
	public void doPreTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index)
99
	{
100
		
101
	}
102
	/**
103
	 * 
104
	 */
105
	public void postTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index, Object value) 
106
	{
107
	    if (TRACER.isEnabled())
108
	    {
109
	      TRACER.format("postTraverseFeature : {0}.{1}", cdoObject.cdoClass(), feature.getName());
110
	    }		
111
	    try
112
	    {
113
	    	doPostTraverseFeature(cdoObject, feature, index, value);
114
	    }
115
	    finally
116
	    {
117
			CDOFetchRuleManagerThreadLocal.leave();	    	
118
			lastAccessTime = System.currentTimeMillis();
119
	    }
120
		
121
	}
122
123
	public void doPostTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index, Object value)
124
	{
125
		
126
	}
127
	public int getNbFetch()
128
	{
129
		return this.nbFetch;
130
	}
131
	public int getLoadRevisionCollectionChunkSize() 
132
	{
133
		return loadRevisionCollectionChunkSize;
134
	}	
135
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java (+149 lines)
Added Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import java.util.ArrayList;
15
import java.util.Collection;
16
import java.util.HashMap;
17
import java.util.Iterator;
18
import java.util.List;
19
import java.util.Map;
20
21
import org.eclipse.emf.cdo.CDOView;
22
import org.eclipse.emf.cdo.analyzer.CDOFeatureAnalyzer;
23
import org.eclipse.emf.cdo.analyzer.CDOFetchRuleManager;
24
import org.eclipse.emf.cdo.internal.protocol.CDOIDNull;
25
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
26
import org.eclipse.emf.cdo.protocol.CDOID;
27
import org.eclipse.emf.cdo.protocol.model.CDOClass;
28
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
29
import org.eclipse.emf.internal.cdo.InternalCDOObject;
30
import org.eclipse.emf.internal.cdo.bundle.OM;
31
import org.eclipse.emf.internal.cdo.util.FSMUtil;
32
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
33
34
/**
35
 * @author Eike Stepper
36
 */
37
public class CDOFeatureAnalyzerUI extends CDOAbstracFeatureRuleAnalyzer implements CDOFetchRuleManager
38
{
39
  private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOFeatureAnalyzerUI.class);
40
41
  private static final long ELAPSE_TIME = 400L;
42
  
43
  private Map<CDOClusterOfFetchRule, CDOClusterOfFetchRule> featureRules = new HashMap<CDOClusterOfFetchRule, CDOClusterOfFetchRule>();
44
45
  private CDOClusterOfFetchRule currentClusterOfFetchRule;
46
  
47
  private long maxTimeBetweenOperation;
48
  
49
  public CDOFeatureAnalyzerUI()
50
  {
51
	  this(ELAPSE_TIME);
52
  }
53
  public CDOFeatureAnalyzerUI(long maxTimeBetweenOperation)
54
  {
55
	  this.maxTimeBetweenOperation = maxTimeBetweenOperation;
56
  }
57
58
  public void doPreTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index)
59
  {
60
    // Don`t handle containment relationship
61
    if (!feature.isReference())
62
    {
63
      return;
64
    }
65
    
66
    
67
    if (this.lastElapseTimeBetweenOperations > maxTimeBetweenOperation || currentClusterOfFetchRule == null)
68
    {
69
    	// The user interacted with the UI. Restart a new ClusterOfFetchRule
70
    	currentClusterOfFetchRule = getFeatureRule(cdoObject.cdoClass(), feature);
71
    }
72
    
73
  }
74
  
75
   /**
76
    * 
77
    */
78
  public void doPostTraverseFeature(InternalCDOObject cdoObject, CDOFeature feature, int index, Object object)
79
  {
80
    if (didFetch())
81
    {
82
    	currentClusterOfFetchRule.getFeatureInfo().activate(cdoObject.cdoClass(), feature);
83
    }
84
  }
85
  
86
  /**
87
   * 
88
   */
89
  public CDOID getContext()
90
  {
91
	
92
	if (this.lastTraverseFeature.isMany())
93
		return CDOIDNull.NULL;
94
	
95
    return lastTraverseCDOObject.cdoID();
96
  }
97
98
  /**
99
   * 
100
   * @param cdoClass
101
   * @param cdoFeature
102
   * @return
103
   */
104
  public synchronized CDOClusterOfFetchRule getFeatureRule(CDOClass cdoClass, CDOFeature cdoFeature)
105
  {
106
	CDOClusterOfFetchRule search  = new CDOClusterOfFetchRule(cdoClass, cdoFeature);
107
    CDOClusterOfFetchRule featureRule = featureRules.get(search);
108
    if (featureRule == null)
109
    {
110
      featureRule = search;
111
      featureRules.put(search, featureRule);
112
    }
113
114
    return featureRule;
115
  }
116
117
  public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids)
118
  {
119
    boolean addRootFeature = true;
120
    
121
    this.fetchData();
122
    
123
    if (this.lastTraverseFeature.isMany())
124
    {
125
    	addRootFeature = false;
126
    }
127
    
128
    CDOClusterOfFetchRule search = new CDOClusterOfFetchRule(lastTraverseCDOObject.cdoClass(), lastTraverseFeature);
129
130
    CDOClusterOfFetchRule fetchOfRule = this.featureRules.get(search);
131
    
132
    if (fetchOfRule == null)
133
    	return null;
134
    
135
    Collection<CDOFetchRule> fetchRules = fetchOfRule.getFeatureInfo().getRules(null, null);
136
    
137
    List<CDOFetchRule> list = new ArrayList<CDOFetchRule>();
138
    
139
    for (CDOFetchRule fetchRule : fetchRules)
140
    {
141
      if (addRootFeature == true || (lastTraverseCDOObject.cdoClass() != fetchRule.getCDOClass()))
142
      {
143
    	  list.add(fetchRule);  
144
      }
145
    }
146
    
147
    return list;
148
  }
149
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOFetchRuleManagerThreadLocal.java (+64 lines)
Added Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
package org.eclipse.emf.internal.cdo.analyzer;
13
14
import org.eclipse.emf.cdo.analyzer.CDOFetchRuleManager;
15
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
16
import org.eclipse.emf.cdo.protocol.CDOID;
17
18
import java.util.Collection;
19
import java.util.List;
20
21
/**
22
 * @author Eike Stepper
23
 */
24
public class CDOFetchRuleManagerThreadLocal implements CDOFetchRuleManager
25
{
26
  private static final ThreadLocal<CDOFetchRuleManager> threadLocal = new ThreadLocal<CDOFetchRuleManager>();
27
28
  public CDOFetchRuleManagerThreadLocal()
29
  {
30
  }
31
32
  public static void join(CDOFetchRuleManager fetchRulemanager)
33
  {
34
    threadLocal.set(fetchRulemanager);
35
  }
36
37
  public static CDOFetchRuleManager getCurrent()
38
  {
39
    return threadLocal.get();
40
  }
41
42
  public static void leave()
43
  {
44
    threadLocal.set(null);
45
  }
46
47
  public CDOID getContext()
48
  {
49
    CDOFetchRuleManager analyzer = CDOFetchRuleManagerThreadLocal.getCurrent();
50
    return analyzer != null ? analyzer.getContext() : null;
51
  }
52
53
  public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids)
54
  {
55
    CDOFetchRuleManager analyzer = CDOFetchRuleManagerThreadLocal.getCurrent();
56
    return analyzer != null ? analyzer.getFetchRules(ids) : null;
57
  }
58
59
  public int getLoadRevisionCollectionChunkSize() 
60
  {
61
	  CDOFetchRuleManager analyzer = CDOFetchRuleManagerThreadLocal.getCurrent();
62
	  return analyzer != null ? analyzer.getLoadRevisionCollectionChunkSize() : 0;
63
  }
64
}
(-)src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureInfo.java (+139 lines)
Added Link Here
1
/***************************************************************************
2
 * Copyright (c) 2004 - 2007 Eike Stepper, Germany.
3
 * All rights reserved. This program and the accompanying materials
4
 * are made available under the terms of the Eclipse Public License v1.0
5
 * which accompanies this distribution, and is available at
6
 * http://www.eclipse.org/legal/epl-v10.html
7
 * 
8
 * Contributors:
9
 *    Simon McDuff - initial API and implementation
10
 *    Eike Stepper - maintenance
11
 **************************************************************************/
12
13
package org.eclipse.emf.internal.cdo.analyzer;
14
15
import java.util.Collection;
16
import java.util.HashMap;
17
import java.util.Map;
18
19
import org.eclipse.emf.cdo.internal.protocol.analyzer.CDOFetchRule;
20
import org.eclipse.emf.cdo.protocol.model.CDOClass;
21
import org.eclipse.emf.cdo.protocol.model.CDOFeature;
22
import org.eclipse.emf.internal.cdo.bundle.OM;
23
import org.eclipse.net4j.internal.util.om.trace.ContextTracer;
24
/**
25
 * @author Eike Stepper
26
 */
27
public class CDOFeatureInfo 
28
{
29
	private static final ContextTracer TRACER = new ContextTracer(OM.DEBUG, CDOFeatureInfo.class);
30
	
31
	private Map<CDOFetchFeatureInfo, CDOFetchFeatureInfo> featureStats = new HashMap<CDOFetchFeatureInfo, CDOFetchFeatureInfo>();
32
	private Map<CDOClass, CDOFetchRule> fetchRules = new HashMap<CDOClass, CDOFetchRule>();
33
	
34
	/**
35
	 * 
36
	 * @param cdoClass
37
	 * @param cdoFeature
38
	 * @return
39
	 */
40
    public synchronized CDOFetchFeatureInfo getFeatureStat(CDOClass cdoClass, CDOFeature cdoFeature)
41
	{
42
		CDOFetchFeatureInfo search = new CDOFetchFeatureInfo(cdoClass, cdoFeature);
43
	    CDOFetchFeatureInfo featureRule = featureStats.get(search);
44
	    if (featureRule == null)
45
	    {
46
	      featureRule = search;
47
	      featureStats.put(search, featureRule);
48
	    }
49
	    return featureRule;
50
	}
51
    /**
52
     * 
53
     * @param cdoClass
54
     * @param cdoFeature
55
     * @return
56
     */
57
    public boolean isActivate(CDOClass cdoClass, CDOFeature cdoFeature)
58
    {
59
		CDOFetchFeatureInfo search = new CDOFetchFeatureInfo(cdoClass, cdoFeature);
60
	    CDOFetchFeatureInfo featureRule = featureStats.get(search);
61
	    return (featureRule != null && featureRule.isActive());
62
    }
63
    /**
64
     * 
65
     * @param cdoClass
66
     * @param cdoFeature
67
     */
68
    public void activate(CDOClass cdoClass, CDOFeature cdoFeature)
69
    {
70
    	CDOFetchFeatureInfo info = getFeatureStat(cdoClass, cdoFeature);
71
    	if (!info.isActive())
72
    	{
73
    		info.setActive(true);
74
    		addRule(cdoClass, cdoFeature);
75
    	}
76
    }
77
    /**
78
     * 
79
     * @param cdoClass
80
     * @param cdoFeature
81
     */
82
    public void desactivate(CDOClass cdoClass, CDOFeature cdoFeature)
83
    {
84
    	CDOFetchFeatureInfo info = getFeatureStat(cdoClass, cdoFeature);
85
    	if (info.isActive())
86
    	{
87
    		info.setActive(false);
88
    		removeRule(cdoClass, cdoFeature);
89
    	}
90
    }
91
    /**
92
     * 
93
     * @param cdoClass
94
     * @param cdoFeature
95
     */
96
    private void addRule(CDOClass cdoClass, CDOFeature cdoFeature)
97
    {
98
    	if (TRACER.isEnabled())
99
    	{
100
    		TRACER.format("Adding a new rule : {0}.{1}", cdoClass.getName(), cdoFeature.getName());
101
    	}
102
    	CDOFetchRule fetchRule = fetchRules.get(cdoClass);
103
    	if (fetchRule == null)
104
    	{
105
    		fetchRule = new CDOFetchRule(cdoClass);
106
    		fetchRules.put(cdoClass, fetchRule);
107
    	}
108
    	fetchRule.addFeature(cdoFeature);
109
    	
110
    }
111
    /**
112
     * 
113
     * @param cdoClass
114
     * @param cdoFeature
115
     * @return
116
     */
117
    public Collection<CDOFetchRule> getRules(CDOClass cdoClass, CDOFeature cdoFeature)
118
    {
119
    	return fetchRules.values();
120
    }
121
    
122
    /**
123
     * 
124
     * @param cdoClass
125
     * @param cdoFeature
126
     */
127
    private void removeRule(CDOClass cdoClass, CDOFeature cdoFeature)
128
    {
129
    	if (TRACER.isEnabled())
130
    	{
131
    		TRACER.format("Removing rule : {0}.{1}", cdoClass.getName(), cdoFeature.getName());
132
    	}    	
133
    	CDOFetchRule fetchRule = fetchRules.get(cdoClass);
134
    	if (fetchRule == null)
135
    		return;
136
  		
137
    	fetchRule.removeFeature(cdoFeature);
138
    }    
139
}

Return to bug 202064