001package org.nasdanika.html.model.app.graph.emf;
002
003import java.util.concurrent.CompletionStage;
004import java.util.function.Consumer;
005import java.util.function.Function;
006
007import org.eclipse.emf.ecore.util.EcoreUtil;
008import org.nasdanika.common.Context;
009import org.nasdanika.common.ProgressMonitor;
010import org.nasdanika.graph.Element;
011import org.nasdanika.graph.emf.EObjectNode;
012import org.nasdanika.graph.emf.EReferenceConnection;
013import org.nasdanika.graph.processor.ConnectionProcessorConfig;
014import org.nasdanika.graph.processor.NodeProcessorConfig;
015import org.nasdanika.graph.processor.NodeProcessorInfo;
016import org.nasdanika.graph.processor.ProcessorConfig;
017import org.nasdanika.graph.processor.ProcessorFactory;
018import org.nasdanika.graph.processor.ProcessorInfo;
019import org.nasdanika.html.model.app.graph.WidgetFactory;
020
021/**
022 * Processor factory which uses EObjet URI's as identifiers and adapters to create node processors.
023 * @author Pavel
024 *
025 */
026public class EObjectProcessorFactory extends ProcessorFactory<Object> {
027        
028        @SuppressWarnings("unchecked")
029        @Override
030        protected ProcessorInfo<Object> createProcessor(
031                        ProcessorConfig config, 
032                        boolean parallel,
033                        Function<Element, CompletionStage<ProcessorInfo<Object>>> infoProvider,
034                        Consumer<CompletionStage<?>> stageConsumer, ProgressMonitor progressMonitor) {
035                
036                if (config.getElement() instanceof EReferenceConnection) {
037                        return config.toInfo(new ConnectionProcessor((ConnectionProcessorConfig<WidgetFactory, WidgetFactory>) config));
038                }
039                
040                if (config.getElement() instanceof EObjectNode) {
041                        Object adapter = EcoreUtil.getRegisteredAdapter(((EObjectNode) config.getElement()).get(), NodeProcessorInfo.Factory.class);
042                        if (adapter instanceof NodeProcessorInfo.Factory) {
043                                return ((NodeProcessorInfo.Factory<Object,WidgetFactory,WidgetFactory>) adapter).create((NodeProcessorConfig<WidgetFactory, WidgetFactory>) config, parallel, infoProvider, stageConsumer, getContext(), progressMonitor);
044                        }
045                }
046                
047                return super.createProcessor(config, parallel, infoProvider, stageConsumer, progressMonitor);
048        }
049        
050        protected Context getContext() {
051                return Context.EMPTY_CONTEXT;
052        }
053                
054}