Skip to main content
summaryrefslogtreecommitdiffstats
blob: 9762ecbd0e141a0c4a3cfe2a517f929565071352 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
/*******************************************************************************
 *  Copyright (c) 2007 Oracle. 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: Oracle. - initial API and implementation
 *******************************************************************************/
package org.eclipse.jpt.core.internal.content.orm.resource;

import java.util.HashMap;
import java.util.Map;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jpt.core.internal.content.orm.OrmPackage;
import org.eclipse.jpt.core.internal.content.orm.resource.AttributeOverrideTranslator.AttributeOverrideBuilder;
import org.eclipse.wst.common.internal.emf.resource.MultiObjectTranslator;
import org.eclipse.wst.common.internal.emf.resource.Translator;

/**
 * Created this class so there would be a 1-1 association between 
 * AttributeOverride and AttributeOverrideTranslator.  Without this the state
 * stored on AttributeOverrideTranslator will be invalid for multiple AttributeOverrides.
 * see bug 188901.
 * 
 * TODO 189767 - memory leak if an associationOverride is removed from the model, it is still
 * stored along with its translator in the translator map
 */
public class AttributeOverridesTranslator extends MultiObjectTranslator implements OrmXmlMapper
{
	private AttributeOverrideBuilder attributeOverrideBuilder;

	private Map<EObject, AttributeOverrideTranslator> translatorMap;

	public AttributeOverridesTranslator(String domNameAndPath, EStructuralFeature aFeature, AttributeOverrideBuilder attributeOverrideBuilder) {
		super(domNameAndPath, aFeature);
		this.attributeOverrideBuilder = attributeOverrideBuilder;
		this.translatorMap = new HashMap<EObject, AttributeOverrideTranslator>();
	}
	
	@Override
	public EObject createEMFObject(String nodeName, String readAheadName) {
		AttributeOverrideTranslator translator = (AttributeOverrideTranslator) getDelegateFor(nodeName, readAheadName);
		EObject eObject = translator.createEMFObject(nodeName, readAheadName);
		this.translatorMap.put(eObject, translator);
		return eObject;
	}
	
	/* (non-Javadoc)
	 * @see MultiObjectTranslator#getDelegateFor(EObject)
	 */
	@Override
	public Translator getDelegateFor(EObject o) {
		Translator translator = translatorMap.get(o);
		if (translator != null) {
			return translator;
		}
		
		switch (o.eClass().getClassifierID()) {
			case OrmPackage.XML_ATTRIBUTE_OVERRIDE :
				return new AttributeOverrideTranslator(this.domNameAndPath, getFeature(), this.attributeOverrideBuilder);
		}
		
		return null;
	}
	
	@Override
	public Translator getDelegateFor(String domName, String readAheadName) {
		if (domName.equals(ENTITY__ATTRIBUTE_OVERRIDE)) {
			return new AttributeOverrideTranslator(this.domNameAndPath, getFeature(), this.attributeOverrideBuilder);
		}
		throw new IllegalStateException("Illegal dom name: " + domName); //$NON-NLS-1$
	}

}

Back to the top