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}