001package org.nasdanika.html.ecore;
002
003import java.util.Collection;
004import java.util.Objects;
005import java.util.function.BiFunction;
006import java.util.function.Function;
007import java.util.function.Predicate;
008
009import org.eclipse.emf.ecore.EClass;
010import org.eclipse.emf.ecore.EClassifier;
011import org.eclipse.emf.ecore.EModelElement;
012import org.eclipse.emf.ecore.ENamedElement;
013import org.eclipse.emf.ecore.EPackage;
014import org.nasdanika.common.Context;
015import org.nasdanika.common.ProgressMonitor;
016import org.nasdanika.exec.content.ContentFactory;
017import org.nasdanika.exec.content.Text;
018import org.nasdanika.html.model.app.Action;
019
020public class EClassifierActionSupplier<T extends EClassifier> extends ENamedElementActionSupplier<T> {
021
022        private Function<String, String> javadocResolver;
023        protected Class<?> instanceClass;
024        private Function<String, Object> ePackageResolver;
025
026        public EClassifierActionSupplier(
027                        T value, 
028                        Context context, 
029                        java.util.function.Function<EPackage,String> ePackagePathComputer,
030                        java.util.function.Function<String, String> javadocResolver,
031                        java.util.function.Function<String, Object> ePackageResolver,
032                        Predicate<EModelElement> elementPredicate,
033                        BiFunction<ENamedElement, String, String> labelProvider) {
034                super(value, context, ePackagePathComputer, elementPredicate, labelProvider);
035                this.javadocResolver = javadocResolver;
036                this.ePackageResolver = ePackageResolver;
037                instanceClass = value.getInstanceClass();
038                if (instanceClass == null) {
039                        EPackage registeredPackage = getRegisteredPackage(value);
040                        if (registeredPackage != null) {
041                                EClassifier registeredClassifier = registeredPackage.getEClassifier(value.getName());
042                                if (registeredClassifier != null) {
043                                        instanceClass = registeredClassifier.getInstanceClass();
044                                }
045                        }
046                }
047        }
048        
049        @Override
050        protected void header(Action action, ProgressMonitor progressMonitor) {
051                if (instanceClass != null) {
052                        String instanceClassName = instanceClass.getName();
053                        if (javadocResolver != null) {
054                                instanceClassName = javadocResolver.apply(instanceClassName);
055                        }
056                        
057                        Text text = ContentFactory.eINSTANCE.createText();
058                        text.setContent("<div class='text-monospace'>" + instanceClassName + "</div>");
059                        action.getContent().add(text);
060                }               
061        }
062        
063        @Override
064        public Action execute(EClass contextEClass, ProgressMonitor progressMonitor) {
065                Action action = super.execute(contextEClass, progressMonitor);
066                action.setLocation(eObject.getName() + ".html");
067                action.setId(eObject.eClass().getName() + "-" + encodeEPackage(eObject.getEPackage()) + "-" + eObject.getName());
068                return action;
069        }
070        
071        @Override
072        protected String getDefaultLabel(ProgressMonitor progressMonitor) {
073                return eObject.getName() + typeParameters(eObject);
074        }
075        
076        /**
077         * Finds all type uses in the resourceset. 
078         * @return
079         */
080        protected Collection<EClass> getUses() {
081                return getUses(eObject);
082        }
083
084        private EPackage getRegisteredPackage(EClassifier eObject) {
085                String nsURI = eObject.getEPackage().getNsURI();
086                Object value = ePackageResolver.apply(nsURI);
087                if (value instanceof EPackage) {
088                        return (EPackage) value;
089                }
090                if (value instanceof EPackage.Descriptor) {
091                        return Objects.requireNonNull(((EPackage.Descriptor) value).getEPackage(), "EPackage is null for " + nsURI);  
092                }
093                
094                if (value instanceof EPackage) {
095                        return (EPackage) value;
096                }
097                return null;
098        }       
099        
100}