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) throws Exception {
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) throws Exception {
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}