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