/** * Copyright 2004-2016 Riccardo Solmi. All rights reserved. * This file is part of the Whole Platform. * * The Whole Platform is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * The Whole Platform is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with the Whole Platform. If not, see <http://www.gnu.org/licenses/>. */ package org.whole.lang.events; import java.util.HashMap; import java.util.Map; import org.whole.lang.model.IEntity; import org.whole.lang.reflect.FeatureDescriptor; /** * @author Riccardo Solmi */ public abstract class MappingChangeEventHandler extends AbstractDelegatingChangeEventHandler { private static final long serialVersionUID = 1L; private Map<Object, IChangeEventHandler> eventHandlerMap = new HashMap<Object, IChangeEventHandler>(); protected IChangeEventHandler getChangeEventHandler(IEntity source, FeatureDescriptor fd) { IChangeEventHandler eventHandler = eventHandlerMap.get(getKey(source, fd)); if (eventHandler == null) eventHandler = onDemandEventHandler(source, fd); return eventHandler; } protected abstract Object getKey(IEntity source, FeatureDescriptor fd); protected IChangeEventHandler onDemandEventHandler(IEntity source, FeatureDescriptor fd) { return IdentityChangeEventHandler.instance; } public void put(Object key, IChangeEventHandler eventHandler) { eventHandlerMap.put(key, eventHandler); } public static class LanguageReactionsChangeEventMapper extends LanguageChangeEventMapper { private static final long serialVersionUID = 1L; @Override protected IChangeEventHandler getChangeEventHandler(IEntity source, FeatureDescriptor fd) { return getActualEventHandler(super.getChangeEventHandler(source, fd), source); } protected final IChangeEventHandler onDemandEventHandler(IEntity source, FeatureDescriptor fd) { IChangeEventHandler reactionsHandler = source.wGetEntityDescriptor().getLanguageKit().getReactionsHandler(); reactionsHandler = reactionsHandler.cloneChangeEventHandler(IdentityChangeEventHandler.instance); put(getKey(source, fd), reactionsHandler); return reactionsHandler; } }; public static class LanguageChangeEventMapper extends MappingChangeEventHandler { private static final long serialVersionUID = 1L; protected final Object getKey(IEntity source, FeatureDescriptor fd) { return source.wGetEntityDescriptor().getLanguageKit(); } }; public static class EntiyDescriptorChangeEventMapper extends MappingChangeEventHandler { private static final long serialVersionUID = 1L; protected final Object getKey(IEntity source, FeatureDescriptor fd) { return source.wGetEntityDescriptor(); } }; }