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                action.getUris().add(eObject.getEPackage().getNsURI() + "#" + eObject.getName());
069                return action;
070        }
071        
072        @Override
073        protected String getDefaultLabel(ProgressMonitor progressMonitor) {
074                return eObject.getName() + typeParameters(eObject);
075        }
076        
077        /**
078         * Finds all type uses in the resourceset. 
079         * @return
080         */
081        protected Collection<EClass> getUses() {
082                return getUses(eObject);
083        }
084
085        private EPackage getRegisteredPackage(EClassifier eObject) {
086                String nsURI = eObject.getEPackage().getNsURI();
087                Object value = ePackageResolver.apply(nsURI);
088                if (value instanceof EPackage) {
089                        return (EPackage) value;
090                }
091                if (value instanceof EPackage.Descriptor) {
092                        return Objects.requireNonNull(((EPackage.Descriptor) value).getEPackage(), "EPackage is null for " + nsURI);  
093                }
094                
095                if (value instanceof EPackage) {
096                        return (EPackage) value;
097                }
098                return null;
099        }       
100        
101}