001package org.nasdanika.html.model.app.graph.emf;
002
003import java.util.concurrent.CompletionStage;
004import java.util.function.BiConsumer;
005import java.util.function.Consumer;
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                        BiConsumer<Element, BiConsumer<ProcessorInfo<Object>,ProgressMonitor>> infoProvider,
034                        Consumer<CompletionStage<?>> endpointWiringStageConsumer,
035                        ProgressMonitor progressMonitor) {
036                
037                if (config.getElement() instanceof EReferenceConnection) {
038                        return config.toInfo(new ConnectionProcessor((ConnectionProcessorConfig<WidgetFactory, WidgetFactory>) config));
039                }
040                
041                if (config.getElement() instanceof EObjectNode) {
042                        Object adapter = EcoreUtil.getRegisteredAdapter(((EObjectNode) config.getElement()).get(), NodeProcessorInfo.Factory.class);
043                        if (adapter instanceof NodeProcessorInfo.Factory) {
044                                return ((NodeProcessorInfo.Factory<Object,WidgetFactory,WidgetFactory>) adapter).create((NodeProcessorConfig<WidgetFactory, WidgetFactory>) config, parallel, infoProvider, endpointWiringStageConsumer, getContext(), progressMonitor);
045                        }
046                }
047                
048                return super.createProcessor(config, parallel, infoProvider, endpointWiringStageConsumer, progressMonitor);
049        }
050        
051        protected Context getContext() {
052                return Context.EMPTY_CONTEXT;
053        }
054                
055}