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, isCompactPath())); 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 /** 056 * Override to return true for compact reference and operation paths 057 * @return 058 */ 059 protected boolean isCompactPath() { 060 return false; 061 } 062 063}