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}