blob: f54e3b9899cecbd6811920135adb0cbb927ccbd9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Lars Vogel <Lars.Vogel@vogella.com> - Bug 472654
******************************************************************************/
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<>();
/**
* 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<>();
@Override
public Resource createResource(URI 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;
}
}