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 }