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}