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}