/* * Copyright (c) 2006 Borland Software Corporation * * 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: * Michael Golubev (Borland) - initial API and implementation */ package org.eclipse.uml2.diagram.parser; import java.util.List; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EObject; import org.eclipse.gmf.runtime.emf.type.core.IElementType; import org.eclipse.uml2.diagram.parser.lookup.Lookup; import org.eclipse.uml2.diagram.parser.lookup.LookupResolveRequest; import org.eclipse.uml2.diagram.parser.lookup.LookupResolver; import org.eclipse.uml2.diagram.parser.lookup.LookupSuite; import org.eclipse.uml2.uml.NamedElement; import org.eclipse.uml2.uml.UMLPackage; public abstract class ExternalParserBase { private LookupSuite myLookups = LookupSuite.NULL_SUITE; private LookupResolver myLookupResolver = LookupResolver.NULL; private EObject myContext; public abstract EClass getSubjectClass(); public abstract void parse(EObject target, String text) throws ExternalParserException; public final EObject parseNewObject(EObject context, String text) throws ExternalParserException { myContext = context; try { EObject result = createSubjectPrototype(); parse(result, text); return result; } finally { myContext = null; } } public final void parse(EObject target, String text, EObject context) throws ExternalParserException { myContext = context; try { parse(target, text); } finally { myContext = null; } } public final void setLookupSuite(LookupSuite suite) { myLookups = suite; if (myLookups == null) { myLookups = LookupSuite.NULL_SUITE; } } public final void setLookupResolver(LookupResolver lookupResolver) { myLookupResolver = lookupResolver; if (myLookupResolver == null) { myLookupResolver = LookupResolver.NULL; } } public final LookupSuite getLookupSuite() { return myLookups; } public final <T> T lookup(Class<T> clazz, String name) { Lookup<T> lookup = getLookupSuite().getLookup(clazz); return lookup.lookup(name, getContext()); } public EObject createSubjectPrototype() { EClass subjectClass = getSubjectClass(); return subjectClass.getEPackage().getEFactoryInstance().create(subjectClass); } protected final EObject getContext() { return myContext; } protected final void checkContext() { if (getContext() == null) { throw new IllegalStateException("I need context element to perform lookups"); } } protected <T extends NamedElement> void applyLookup(Class<T> clazz, String name, LookupResolver.Callback callback) { Lookup<T> lookup = getLookupSuite().getLookup(clazz); T result = lookup.lookup(name, getContext()); if (result != null) { callback.lookupResolved(result); return; } List<IElementType> allowedTypes = lookup.getResolutionElementTypes(); if (allowedTypes.isEmpty()) { return; } LookupResolveRequest request = new LookupResolveRequest(allowedTypes, UMLPackage.eINSTANCE.getNamedElement_Name(), name); myLookupResolver.addLookupResolveRequest(request, callback); } }