diff options
author | Paul Elder | 2013-05-23 16:01:28 +0000 |
---|---|---|
committer | Gerrit Code Review @ Eclipse.org | 2013-07-25 14:55:06 +0000 |
commit | 2ca28faf3fff2ebc3bf650b826119a9295436b57 (patch) | |
tree | 65bcb2390d2d7acdd943fbcaadb31785eb5aed20 | |
parent | 4f36d3eb105be48c85372643f833fce9a62c76f6 (diff) | |
download | eclipse.platform.ui-2ca28faf3fff2ebc3bf650b826119a9295436b57.tar.gz eclipse.platform.ui-2ca28faf3fff2ebc3bf650b826119a9295436b57.tar.xz eclipse.platform.ui-2ca28faf3fff2ebc3bf650b826119a9295436b57.zip |
Bug 409279: Follow EMF best practices for model loading/saving
Adopt recommended EMF load/save options for better performance. Change
reduces model load time by approximately 60%.
Bug: 413645
Change-Id: Icb084c825114936d148abbf42f56ad70151bfb5c
-rw-r--r-- | bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4XMIResourceFactory.java | 43 |
1 files changed, 41 insertions, 2 deletions
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4XMIResourceFactory.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4XMIResourceFactory.java index d2b2ab0fa86..e46a5df2a86 100644 --- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4XMIResourceFactory.java +++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/E4XMIResourceFactory.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009, 2010 IBM Corporation and others. + * Copyright (c) 2009, 2013 IBM Corporation 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 @@ -11,14 +11,53 @@ package org.eclipse.e4.ui.internal.workbench; +import java.util.List; +import java.util.Map; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.resource.Resource; +import org.eclipse.emf.ecore.xmi.XMLParserPool; +import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl; +import org.eclipse.emf.ecore.xmi.impl.XMLParserPoolImpl; +/** + * Resource factory for {@link E4XMIResource}. + */ public class E4XMIResourceFactory extends XMIResourceFactoryImpl { + /** + * List used for EMF {@link XMLResource#OPTION_USE_CACHED_LOOKUP_TABLE} option value. Packaged + * in a ThreadLocal per EMF recommendation for thread safety. + */ + private final ThreadLocal<List<Object>> lookupTable = new ThreadLocal<List<Object>>(); + /** + * Parser pool object for {@link XMLResource#OPTION_USE_PARSER_POOL} option. Also needed for + * setting {@link XMLResource#OPTION_USE_DEPRECATED_METHODS} for false. + */ + private final XMLParserPool parserPool = new XMLParserPoolImpl(); + /** + * Map used for {@link XMLResource#OPTION_USE_XML_NAME_TO_FEATURE_MAP}. Per EMF documentation, + * the map is hosted within a ThreadLocale for thread safety. + */ + private final ThreadLocal<Map<Object, Object>> nameToFeatureMap = new ThreadLocal<Map<Object, Object>>(); + @Override public Resource createResource(URI uri) { - return new E4XMIResource(uri); + final E4XMIResource resource = new E4XMIResource(uri); + + // configure default save/load options, as suggested by + // EMF: Eclipse Modeling Framework, Second Edition + // Section 15.5.1 + final Map<Object, Object> saveOptions = resource.getDefaultSaveOptions(); + saveOptions.put(XMLResource.OPTION_CONFIGURATION_CACHE, Boolean.TRUE); + saveOptions.put(XMLResource.OPTION_USE_CACHED_LOOKUP_TABLE, lookupTable.get()); + + final Map<Object, Object> loadOptions = resource.getDefaultLoadOptions(); + loadOptions.put(XMLResource.OPTION_DEFER_ATTACHMENT, Boolean.TRUE); + loadOptions.put(XMLResource.OPTION_DEFER_IDREF_RESOLUTION, Boolean.TRUE); + loadOptions.put(XMLResource.OPTION_USE_PARSER_POOL, parserPool); + loadOptions.put(XMLResource.OPTION_USE_XML_NAME_TO_FEATURE_MAP, nameToFeatureMap.get()); + loadOptions.put(XMLResource.OPTION_USE_DEPRECATED_METHODS, Boolean.FALSE); + return resource; } } |