blob: d4f0e184a3230fb765eb864124bd2c12e101893a [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2019 CEA LIST
*
* 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:
* David Lopez david.lopez@cea.fr(CEA LIST)
*
*****************************************************************************/
package org.eclipse.papyrus.moka.engine.suml.accessor;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import org.eclipse.papyrus.moka.engine.suml.opaquebehaviors.LocusAdapter;
public class AccessAdapterRegistry {
private AccessAdapterRegistry() {
}
private static AccessAdapterRegistry instance = new AccessAdapterRegistry();
public static AccessAdapterRegistry getInstance() {
return instance;
}
private ComponentAccessor accessor = new ComponentAccessor();
private HashMap<Class, ComponentAdapter> adapters = new HashMap<Class, ComponentAdapter>();
private HashMap<Class, ValueTypeConverter> converters = new HashMap<Class, ValueTypeConverter>();
private LocusAdapter locusAdapter = new LocusAdapter();
public ComponentAccessor getComponentAccessor() {
return accessor;
}
private <T> T instance(Class<T> class_) {
try {
//This is Deprecated in Java 9+, and replaced for:
//class_.getDeclaredConstructor().newInstance();
return class_.newInstance();
} catch (InstantiationException | IllegalAccessException e) {
return null;
}
}
public void registerAdapter(Class<? extends ComponentAdapter> adapterClass) {
ComponentAdapter adapter = instance(adapterClass);
adapters.put(adapter.getAdaptedClass(), adapter);
}
public void registerConverter(Class<? extends ValueTypeConverter> converterClass) {
ValueTypeConverter converter = instance(converterClass);
converters.put(converter.getValueTypeClass(), converter);
}
private Object findAssignableFor(Class class_, Map map) {
Object adapter = map.get(class_);
if( adapter != null )
return adapter;
for( Object o : map.entrySet() ) {
Entry e = (Entry)o;
if( ( (Class)e.getKey() ).isAssignableFrom(class_) )
return e.getValue();
}
return null;//Not found at all
}
private Object accessOrCreate(Class class_, Map map) {
Object obj = findAssignableFor(class_, map);
if( obj == null ) {
obj = instance(class_);
map.put(class_, obj);
}
return obj;
}
public ComponentAdapter getAdapterForObject(Object obj) {
ComponentAdapter adapter = (ComponentAdapter) findAssignableFor(obj.getClass(), adapters);
return adapter;
}
public <T extends ComponentAdapter> T getAdapterForClass(Class<T> class_) {
return (T) accessOrCreate(class_, adapters);
}
public ValueTypeConverter getConverterForValue(Object obj) {
ValueTypeConverter converter = (ValueTypeConverter) findAssignableFor(obj.getClass(), converters);
return converter;
}
public <T extends ValueTypeConverter> T getConverterForClass(Class class_) {
return (T) accessOrCreate(class_, converters);
}
public LocusAdapter getLocusAdapter() {
return locusAdapter;
}
}