001    /*
002     * Copyright (C) 2006-2007 the original author or authors.
003     *
004     * Licensed under the Apache License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     *     http://www.apache.org/licenses/LICENSE-2.0
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    
017    package org.codehaus.gmaven.runtime.support.stubgen.render;
018    
019    import org.codehaus.gmaven.runtime.support.stubgen.model.ClassDef;
020    import org.codehaus.gmaven.runtime.support.stubgen.model.ConstructorDef;
021    import org.codehaus.gmaven.runtime.support.stubgen.model.MethodDef;
022    import org.codehaus.gmaven.runtime.support.stubgen.model.ModifiersDef;
023    import org.codehaus.gmaven.runtime.support.stubgen.model.ParameterDef;
024    import org.codehaus.gmaven.runtime.support.stubgen.model.SourceDef;
025    import org.codehaus.gmaven.runtime.support.stubgen.model.TypeDef;
026    
027    import java.util.Iterator;
028    import java.util.LinkedHashSet;
029    import java.util.Set;
030    
031    /**
032     * Provides support for {@link RendererFactory} implementations.
033     *
034     * @version $Id: RendererFactorySupport.java 52 2009-11-22 10:32:14Z user57 $
035     * @author <a href="mailto:jason@planet57.com">Jason Dillon</a>
036     */
037    public abstract class RendererFactorySupport
038        implements RendererFactory
039    {
040        public Set create(final SourceDef model) {
041            assert model != null;
042    
043            Set set = new LinkedHashSet();
044    
045            // Generate renderers for classes
046            Iterator iter = model.getClasses().iterator();
047            while (iter.hasNext()) {
048                ClassDef def = (ClassDef)iter.next();
049    
050                Renderer renderer = createRenderer(def);
051                assert renderer != null;
052    
053                set.add(renderer);
054            }
055    
056            // If the source def contains statements then add a render for the script
057            if (model.hasStatements()) {
058                Renderer renderer = createRenderer(model);
059                assert renderer != null;
060    
061                set.add(renderer);
062            }
063    
064            return set;
065        }
066    
067        protected abstract Renderer createRenderer(final ClassDef def);
068    
069        protected Renderer createRenderer(final SourceDef def) {
070            assert def != null;
071    
072            ClassDef script = new ClassDef();
073            script.setParent(def);
074            
075            script.getModifiers().add(ModifiersDef.PUBLIC);
076            script.setName(def.getScriptName());
077            script.setSuperClass("groovy.lang.Script");
078    
079            ConstructorDef ctor;
080    
081            ctor = new ConstructorDef();
082            ctor.getModifiers().add(ModifiersDef.PUBLIC);
083            script.addConstructor(ctor);
084    
085            ctor = new ConstructorDef();
086            ctor.getModifiers().add(ModifiersDef.PUBLIC);
087            ctor.addParameter("groovy.lang.Binding", "context");
088            script.addConstructor(ctor);
089    
090            MethodDef method;
091    
092            method = new MethodDef();
093            method.getModifiers().add(ModifiersDef.PUBLIC).add(ModifiersDef.STATIC);
094            method.setReturns(new TypeDef(TypeDef.VOID));
095            method.setName("main");
096            method.addParameter(new ParameterDef(new TypeDef(TypeDef.STRING, 1), "args"));
097            script.addMethod(method);
098    
099            method = new MethodDef();
100            method.getModifiers().add(ModifiersDef.PUBLIC);
101            method.setReturns(TypeDef.OBJECT);
102            method.setName("run");
103            script.addMethod(method);
104    
105            return createRenderer(script);
106        }
107    }