001package org.nasdanika.html.flow;
002
003import java.util.List;
004import java.util.Optional;
005import java.util.function.BiConsumer;
006import java.util.function.Consumer;
007import java.util.stream.Collectors;
008
009import org.eclipse.emf.common.util.EList;
010import org.eclipse.emf.ecore.EObject;
011import org.nasdanika.common.Context;
012import org.nasdanika.common.ProgressMonitor;
013import org.nasdanika.flow.Activity;
014import org.nasdanika.flow.FlowPackage;
015import org.nasdanika.flow.ServiceProvider;
016import org.nasdanika.html.model.app.Action;
017import org.nasdanika.html.model.app.AppFactory;
018import org.nasdanika.ncore.util.NamedElementComparator;
019
020public class ServiceProviderActionBuilder<T extends ServiceProvider<?>> extends PackageElementActionBuilder<T> {
021        
022        public ServiceProviderActionBuilder(T value, Context context) {
023                super(value, context);
024        }
025        
026        @Override
027        protected Action buildAction(
028                        Action action,
029                        BiConsumer<EObject, Action> registry,
030                        Consumer<org.nasdanika.common.Consumer<org.nasdanika.html.emf.EObjectActionResolver.Context>> resolveConsumer,
031                        ProgressMonitor progressMonitor) throws Exception {
032                
033                action = super.buildAction(action, registry, resolveConsumer, progressMonitor);
034                List<Activity<?>> services = getTarget().getServices().values().stream().sorted(NamedElementComparator.INSTANCE).collect(Collectors.toList());
035                if (!services.isEmpty()) {
036                        Action group = AppFactory.eINSTANCE.createAction();
037                        group.setText("Services");
038//                      group.setDescription("Shared activities or journeys which can be used on their own or be referenced from other journeys."); TODO - description modal.
039                        group.setTooltip("Shared activities or journeys which can be used on their own or be referenced from other journeys.");
040                        group.setUuid(action.getUuid() + "-services");
041                        EList<Action> anonymous = action.getAnonymous();
042                        for (Activity<?> service: getTarget().getServices().values().stream().sorted(NamedElementComparator.INSTANCE).collect(Collectors.toList())) {
043                                anonymous.add(createChildAction(service, registry, resolveConsumer, progressMonitor));
044                        }
045                
046                        action.getSections().add(group);
047                }
048                
049                return action;
050        }
051                
052        @Override
053        protected void resolve(
054                        Action action, 
055                        org.nasdanika.html.emf.EObjectActionResolver.Context context,
056                        ProgressMonitor progressMonitor) throws Exception {
057                super.resolve(action, context, progressMonitor);
058                                
059                List<Activity<?>> services = getTarget().getServices().values().stream().sorted(NamedElementComparator.INSTANCE).collect(Collectors.toList());
060                if (!services.isEmpty()) {
061                        String servicesGroupUUID = action.getUuid() + "-services";
062                        Optional<Action> servicesActionOptional = action.getSections().stream()
063                                        .filter(a -> servicesGroupUUID.equals(a.getUuid()))
064                                        .findFirst();
065                        
066                        Action servicesAction = servicesActionOptional.get();
067                        servicesAction.getContent().add(renderList(services, false, null, action, FlowPackage.Literals.SERVICE_PROVIDER__SERVICES, context, progressMonitor));
068                }
069        }
070        
071}