diff options
author | Esteban Dugueperoux | 2014-11-03 17:26:00 +0000 |
---|---|---|
committer | Esteban Dugueperoux | 2015-02-02 08:31:02 +0000 |
commit | 8c711da1f172057cf2bf9c5695a47e083f63a303 (patch) | |
tree | 3f554313421180e81cfab675f08a49cb28c5e923 | |
parent | 4dc12f638545505831adcc63166feee8edffceec (diff) | |
download | cdo-8c711da1f172057cf2bf9c5695a47e083f63a303.tar.gz cdo-8c711da1f172057cf2bf9c5695a47e083f63a303.tar.xz cdo-8c711da1f172057cf2bf9c5695a47e083f63a303.zip |
[449806] NPE with CDOFetchRuleManager on CDOResource
Have a NPE when calling CDOView.getResource() will a CDOFetchRuleManager
has been configured on the CDOSession.
Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=449806
Change-Id: I3f6b44af78da7e9f05aa089b69f2475e80b6f9a6
Signed-off-by: Esteban Dugueperoux <esteban.dugueperoux@obeo.fr>
3 files changed, 112 insertions, 18 deletions
diff --git a/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_449806_Test.java b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_449806_Test.java new file mode 100644 index 0000000000..a22ce75d74 --- /dev/null +++ b/plugins/org.eclipse.emf.cdo.tests/src/org/eclipse/emf/cdo/tests/bugzilla/Bugzilla_449806_Test.java @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2015 Obeo and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Esteban Dugueperoux - initial API and implementation + */ +package org.eclipse.emf.cdo.tests.bugzilla; + +import org.eclipse.emf.cdo.eresource.CDOResource; +import org.eclipse.emf.cdo.session.CDOSession; +import org.eclipse.emf.cdo.tests.AbstractCDOTest; +import org.eclipse.emf.cdo.tests.model1.Category; +import org.eclipse.emf.cdo.tests.model1.Company; +import org.eclipse.emf.cdo.transaction.CDOTransaction; +import org.eclipse.emf.cdo.view.CDOFetchRuleManager; +import org.eclipse.emf.cdo.view.CDOView; + +import org.eclipse.emf.internal.cdo.analyzer.CDOAbstractFeatureRuleAnalyzer; +import org.eclipse.emf.internal.cdo.analyzer.CDOFeatureAnalyzerModelBased; +import org.eclipse.emf.internal.cdo.analyzer.CDOFeatureAnalyzerUI; +import org.eclipse.emf.internal.cdo.session.CDOCollectionLoadingPolicyImpl; + +import org.eclipse.emf.spi.cdo.InternalCDOSession; + +/** + * Bug 449806 : Test {@link CDOFetchRuleManager} on {@link CDOResource}. + * + * @author Esteban Dugueperoux + */ +public class Bugzilla_449806_Test extends AbstractCDOTest +{ + + private static final String RESOURCE_NAME = "test1.model1"; + + private static final int NB_CATEGORY = 10; + + @Override + public void setUp() throws Exception + { + super.setUp(); + CDOSession session = openSession(); + CDOTransaction transaction = session.openTransaction(); + CDOResource resource = transaction.getOrCreateResource(getResourcePath(RESOURCE_NAME)); + Company company = getModel1Factory().createCompany(); + for (int i = 0; i < NB_CATEGORY; i++) + { + Category category = getModel1Factory().createCategory(); + company.getCategories().add(category); + } + resource.getContents().add(company); + transaction.commit(); + transaction.close(); + session.close(); + } + + public void testCDOFeatureAnalyzerUI() throws Exception + { + testCDOAbstractFeatureRuleAnalyzer(new CDOFeatureAnalyzerUI()); + } + + public void testCDOFeatureAnalyzerModelBased() throws Exception + { + testCDOAbstractFeatureRuleAnalyzer(new CDOFeatureAnalyzerModelBased()); + } + + private void testCDOAbstractFeatureRuleAnalyzer(CDOAbstractFeatureRuleAnalyzer abstractFeatureRuleAnalyzer) + throws Exception + { + CDOSession session = openSession(); + session.options().setCollectionLoadingPolicy(new CDOCollectionLoadingPolicyImpl(1, 0)); + ((InternalCDOSession)session).setFetchRuleManager(abstractFeatureRuleAnalyzer); + + CDOView currentView = session.openView(); + currentView.options().setFeatureAnalyzer(abstractFeatureRuleAnalyzer); + + CDOResource resource = currentView.getResource(getResourcePath(RESOURCE_NAME)); + + Company company = (Company)resource.getContents().get(0); + assertEquals(NB_CATEGORY, company.getCategories().size()); + } + +} diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java index 441168fa45..b5e6a6b230 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerModelBased.java @@ -55,7 +55,10 @@ public class CDOFeatureAnalyzerModelBased extends CDOAbstractFeatureRuleAnalyzer { fetchData(); List<CDOFetchRule> rules = new ArrayList<CDOFetchRule>(); - rules.addAll(featureInfos.getRules(lastTraverseCDOObject.eClass(), lastTraverseFeature)); + if (lastTraverseCDOObject != null) + { + rules.addAll(featureInfos.getRules(lastTraverseCDOObject.eClass(), lastTraverseFeature)); + } return rules; } } diff --git a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java index b3d4d432b1..e676481a51 100644 --- a/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java +++ b/plugins/org.eclipse.emf.cdo/src/org/eclipse/emf/internal/cdo/analyzer/CDOFeatureAnalyzerUI.java @@ -73,28 +73,33 @@ public class CDOFeatureAnalyzerUI extends CDOAbstractFeatureRuleAnalyzer public List<CDOFetchRule> getFetchRules(Collection<CDOID> ids) { - boolean addRootFeature = true; - fetchData(); + List<CDOFetchRule> list = new ArrayList<CDOFetchRule>(); - if (lastTraverseFeature.isMany()) + boolean addRootFeature = true; + if (lastTraverseFeature != null) { - addRootFeature = false; - } + fetchData(); - CDOClusterOfFetchRule search = new CDOClusterOfFetchRule(lastTraverseCDOObject.eClass(), lastTraverseFeature); - CDOClusterOfFetchRule fetchOfRule = featureRules.get(search); - if (fetchOfRule == null) - { - return null; - } + if (lastTraverseFeature.isMany()) + { + addRootFeature = false; + } - Collection<CDOFetchRule> fetchRules = fetchOfRule.getFeatureInfo().getRules(null, null); - List<CDOFetchRule> list = new ArrayList<CDOFetchRule>(); - for (CDOFetchRule fetchRule : fetchRules) - { - if (addRootFeature == true || lastTraverseCDOObject.eClass() != fetchRule.getEClass()) + CDOClusterOfFetchRule search = new CDOClusterOfFetchRule(lastTraverseCDOObject.eClass(), lastTraverseFeature); + CDOClusterOfFetchRule fetchOfRule = featureRules.get(search); + if (fetchOfRule == null) + { + return null; + } + + Collection<CDOFetchRule> fetchRules = fetchOfRule.getFeatureInfo().getRules(null, null); + + for (CDOFetchRule fetchRule : fetchRules) { - list.add(fetchRule); + if (addRootFeature == true || lastTraverseCDOObject.eClass() != fetchRule.getEClass()) + { + list.add(fetchRule); + } } } |