/** * Copyright (c) 2002-2004 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM - Initial API and implementation */ package org.eclipse.emf.mapping.domain; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtension; import org.eclipse.core.runtime.IExtensionPoint; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.emf.common.command.CommandStack; import org.eclipse.emf.common.notify.AdapterFactory; import org.eclipse.emf.ecore.resource.ResourceSet; import org.eclipse.emf.mapping.MappingPlugin; /** * This class extends the AdapterFactoryMappingDomain by providing initialization * using config information specified in the VABase plugin.xml. * * <p> * A sample configuration is like this: * <pre> * <extension point = "org.eclipse.emf.mapping"> * <mapping-domain> * <type-mappings id="DTD2DTD"> * <type-mapping top="java.xmi:ContainerManagedEntity" bottom="rdbschema.xmi:Table"/> * <type-mapping top="java.xmi:Field" bottom="rdbschema.xmi:Column"/> * </type-mappings> * * <top-label-separator value=""/> * <bottom-label-separator value="_"/> * * <top-label-case value="mixed"/> * <bottom-label-case value="upper"/> * * <top-label-forms> * <label-form long="Table" short="Tab"/> * <label-form long="Integer" short="Int"/> * </top-label-forms> * * <bottom-label-forms> * <label-form long="TABLE" short="TBL"/> * <label-form long="INTEGER" short="INT"/> * </bottom-label-forms> * </mapping-domain> * </extension> * </pre> */ public class PluginAdapterFactoryMappingDomain extends AdapterFactoryMappingDomain { public final String MAPPING_EXTENSION_POINT_ID = "configuration"; public PluginAdapterFactoryMappingDomain (AdapterFactory mappingDomainAdapterFactory, AdapterFactory editingDomainAdapterFactory, CommandStack commandStack, String mappingDomainKey) { super(mappingDomainAdapterFactory, editingDomainAdapterFactory, commandStack); initializeFromPlugin(mappingDomainKey); } public PluginAdapterFactoryMappingDomain (AdapterFactory mappingDomainAdapterFactory, AdapterFactory editingDomainAdapterFactory, CommandStack commandStack, ResourceSet resourceSet, String mappingDomainKey) { super(mappingDomainAdapterFactory, editingDomainAdapterFactory, commandStack, resourceSet); initializeFromPlugin(mappingDomainKey); } public PluginAdapterFactoryMappingDomain (AdapterFactory mappingDomainAdapterFactory, AdapterFactory topDomainAdapterFactory, AdapterFactory bottomDomainAdapterFactory, CommandStack commandStack, String mappingDomainKey) { super(mappingDomainAdapterFactory, topDomainAdapterFactory, bottomDomainAdapterFactory, commandStack); initializeFromPlugin(mappingDomainKey); } public PluginAdapterFactoryMappingDomain (AdapterFactory mappingDomainAdapterFactory, AdapterFactory topDomainAdapterFactory, AdapterFactory bottomDomainAdapterFactory, CommandStack commandStack, ResourceSet resourceSet, String mappingDomainKey) { super(mappingDomainAdapterFactory, topDomainAdapterFactory, bottomDomainAdapterFactory, commandStack, resourceSet); initializeFromPlugin(mappingDomainKey); } protected void initializeFromPlugin(String mappingDomainKey) { if (mappingDomainKey == null) return; IExtensionRegistry registry = Platform.getExtensionRegistry(); IExtensionPoint pct = registry.getExtensionPoint(MappingPlugin.getPlugin().getBundle().getSymbolicName(), MAPPING_EXTENSION_POINT_ID); IExtension[] extension = pct.getExtensions(); for (int l = 0; l < extension.length; ++l) { IExtension config = extension[l]; IConfigurationElement[] cElems = config.getConfigurationElements(); for (int i=0; i < cElems.length; i++) { IConfigurationElement d = cElems[i]; if (d.getName().equals("mapping-domain") && mappingDomainKey.equals(d.getAttribute("key"))) { // type-mappings IConfigurationElement typeMappings[] = d.getChildren("type-mappings"); for (int j=0; j < typeMappings.length; j++) { IConfigurationElement mapping[] = typeMappings[j].getChildren("type-mapping"); for (int k=0; k < mapping.length; k++) { addTypeMapping(mapping[k].getAttribute("top"), mapping[k].getAttribute("bottom")); } } // top-label-separator IConfigurationElement topLabelSeparatorAll[] = d.getChildren("top-label-separator"); if (topLabelSeparatorAll.length > 0) { String sep = topLabelSeparatorAll[0].getAttribute("value"); if (sep.length() > 0) { topLabelSeparator = sep.charAt(0); } } // bottom-label-separator IConfigurationElement bottomLabelSeparatorAll[] = d.getChildren("bottom-label-separator"); if (bottomLabelSeparatorAll.length > 0) { String sep = bottomLabelSeparatorAll[0].getAttribute("value"); if (sep.length() > 0) { bottomLabelSeparator = sep.charAt(0); } } // top-label-case IConfigurationElement topLabelCaseAll[] = d.getChildren("top-label-case"); if (topLabelCaseAll.length > 0) { String labelCase = topLabelCaseAll[0].getAttribute("value"); if (labelCase.equalsIgnoreCase("upper")) { topLabelCase = LABEL_UPPER; } else if (labelCase.equalsIgnoreCase("lower")) { topLabelCase = LABEL_LOWER; } else if (labelCase.equalsIgnoreCase("mixed")) { topLabelCase = LABEL_MIXED; } } // bottom-label-case IConfigurationElement bottomLabelCaseAll[] = d.getChildren("bottom-label-case"); if (bottomLabelCaseAll.length > 0) { String labelCase = bottomLabelCaseAll[0].getAttribute("value"); if (labelCase.equalsIgnoreCase("upper")) { bottomLabelCase = LABEL_UPPER; } else if (labelCase.equalsIgnoreCase("lower")) { bottomLabelCase = LABEL_LOWER; } else if (labelCase.equalsIgnoreCase("mixed")) { bottomLabelCase = LABEL_MIXED; } } // top-label-forms IConfigurationElement topLabelForms[] = d.getChildren("top-label-forms"); for (int j=0; j < topLabelForms.length; j++) { IConfigurationElement labelForm[] = topLabelForms[j].getChildren("label-form"); for (int k=0; k < labelForm.length; k++) { topLabelLongForms.add(labelForm[k].getAttribute("long")); topLabelShortForms.add(labelForm[k].getAttribute("short")); } } // bottom-label-forms IConfigurationElement bottomLabelForms[] = d.getChildren("bottom-label-forms"); for (int j=0; j < bottomLabelForms.length; j++) { IConfigurationElement labelForm[] = bottomLabelForms[j].getChildren("label-form"); for (int k=0; k < labelForm.length; k++) { bottomLabelLongForms.add(labelForm[k].getAttribute("long")); bottomLabelShortForms.add(labelForm[k].getAttribute("short")); } } break; } //if } // for } // for } protected void addTypeMapping(String topType, String bottomType) { /* * The type string must be qualified by its package uri, e.g. DTD.xmi:DTDElement. * The package uri is used to look up the package by calling RefRegister.getPackage(uri). */ topToBottomTypeTable.put(topType, bottomType); bottomToTopTypeTable.put(bottomType, topType); } }