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