001package org.nasdanika.html.model.html.gen; 002 003import java.util.ArrayList; 004import java.util.List; 005 006import org.eclipse.emf.common.notify.impl.AdapterImpl; 007import org.nasdanika.common.CollectionCompoundConsumerFactory; 008import org.nasdanika.common.Context; 009import org.nasdanika.common.Function; 010import org.nasdanika.common.ListCompoundSupplierFactory; 011import org.nasdanika.common.MutableContext; 012import org.nasdanika.common.ProgressMonitor; 013import org.nasdanika.common.Supplier; 014import org.nasdanika.common.SupplierFactory; 015import org.nasdanika.emf.EObjectAdaptable; 016import org.nasdanika.html.HTMLFactory; 017import org.nasdanika.html.HTMLPage; 018import org.nasdanika.html.model.html.Page; 019 020public class PageSupplierFactoryAdapter extends AdapterImpl implements SupplierFactory<HTMLPage> { 021 022 public static final String PAGE_BODY_PROPERTY = "page/body"; 023 public static final String PAGE_HEAD_PROPERTY = "page/head"; 024 025 public PageSupplierFactoryAdapter(Page page) { 026 setTarget(page); 027 } 028 029 @Override 030 public boolean isAdapterForType(Object type) { 031 return type == SupplierFactory.class; 032 } 033 034 protected Function<Supplier.FunctionResult<List<Object>,List<Object>>, HTMLPage> createPageFunction(Context context) { 035 return new Function<Supplier.FunctionResult<List<Object>,List<Object>>, HTMLPage>() { 036 037 @Override 038 public double size() { 039 return 1; 040 } 041 042 @Override 043 public String name() { 044 return "HTML Page"; 045 } 046 047 @Override 048 public HTMLPage execute(Supplier.FunctionResult<List<Object>,List<Object>> headAndBody, ProgressMonitor progressMonitor) { 049 HTMLFactory htmlFactory = context.get(HTMLFactory.class, HTMLFactory.INSTANCE); 050 Page semanticElement = (Page) getTarget(); 051 String pageName = context.interpolateToString(semanticElement.getName()); 052 HTMLPage ret = htmlFactory.page(); 053 ret.title(pageName); 054 ret.lang(semanticElement.getLanguage()); 055 for (String styleseet: semanticElement.getStylesheets()) { 056 ret.stylesheet(styleseet); 057 } 058 for (String script: semanticElement.getScripts()) { 059 ret.script(script); 060 } 061 for (Object he: headAndBody.argument()) { 062 ret.head(he); 063 } 064 for (Object he: context.get(PAGE_HEAD_PROPERTY, List.class)) { 065 ret.head(he); 066 } 067 for (Object be: context.get(PAGE_BODY_PROPERTY, List.class)) { 068 ret.body(be); 069 } 070 for (Object be: headAndBody.result()) { 071 ret.body(be); 072 } 073 return ret; 074 } 075 }; 076 077 } 078 079 @Override 080 public Supplier<HTMLPage> create(Context context) { 081 Page page = (Page) getTarget(); 082 MutableContext mc = context.fork(); 083 mc.put(PAGE_HEAD_PROPERTY, new ArrayList<>()); 084 mc.put(PAGE_BODY_PROPERTY, new ArrayList<>()); 085 ListCompoundSupplierFactory<Object> headFactory = new ListCompoundSupplierFactory<>("Head", EObjectAdaptable.adaptToSupplierFactoryNonNull(page.getHead(), Object.class)); 086 ListCompoundSupplierFactory<Object> bodyFactory = new ListCompoundSupplierFactory<>("Body", EObjectAdaptable.adaptToSupplierFactoryNonNull(page.getBody(), Object.class)); 087 CollectionCompoundConsumerFactory<HTMLPage> buildFactory = new CollectionCompoundConsumerFactory<>("Builders", EObjectAdaptable.adaptToConsumerFactoryNonNull(page.getBuilders(), HTMLPage.class)); 088 return headFactory.then(bodyFactory.asFunctionFactory()).then(this::createPageFunction).then(buildFactory.asFunctionFactory()).create(mc); 089 } 090 091}