AbstractGriffonArtifactScript.java
001 /*
002  * Copyright 2010-2012 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.griffon.runtime.core;
018 
019 import griffon.core.*;
020 import groovy.lang.*;
021 import org.codehaus.griffon.runtime.builder.UberInterceptorMetaClass;
022 import org.codehaus.griffon.runtime.util.GriffonApplicationHelper;
023 import org.slf4j.Logger;
024 import org.slf4j.LoggerFactory;
025 
026 import java.io.InputStream;
027 import java.net.URL;
028 import java.util.Collections;
029 import java.util.List;
030 import java.util.Map;
031 import java.util.concurrent.Callable;
032 import java.util.concurrent.ExecutorService;
033 import java.util.concurrent.Future;
034 
035 /**
036  * Base implementation of the GriffonArtifact interface for Script based artifacts.
037  *
038  @author Andres Almiray
039  @since 0.9.4
040  */
041 public abstract class AbstractGriffonArtifactScript extends Script implements GriffonArtifact {
042     private GriffonApplication app;
043     private final Logger log;
044     private MetaClass myMetaClass;
045     private final ResourceLocator resourceLocator = new ResourceLocator();
046 
047     public AbstractGriffonArtifactScript(String type) {
048         log = LoggerFactory.getLogger("griffon.app." + type + "." + getClass().getName());
049     }
050 
051     public GriffonApplication getApp() {
052         return app;
053     }
054 
055     public void setApp(GriffonApplication app) {
056         this.app = app;
057     }
058 
059     public Object newInstance(Class clazz, String type) {
060         return GriffonApplicationHelper.newInstance(app, clazz, type);
061     }
062 
063     public MetaClass getMetaClass() {
064         if (myMetaClass == null) {
065             Class clazz = getClass();
066             myMetaClass = GroovySystem.getMetaClassRegistry().getMetaClass(clazz);
067             if (!(myMetaClass instanceof ExpandoMetaClass|| !(myMetaClass instanceof UberInterceptorMetaClass)) {
068                 myMetaClass = new ExpandoMetaClass(clazz, true, true);
069                 log.debug("Upgrading MetaClass to " + myMetaClass);
070                 myMetaClass.initialize();
071                 GroovySystem.getMetaClassRegistry().setMetaClass(clazz, myMetaClass);
072             }
073         }
074         return myMetaClass;
075     }
076 
077     public void setMetaClass(MetaClass metaClass) {
078         myMetaClass = metaClass;
079         GroovySystem.getMetaClassRegistry().setMetaClass(getClass(), metaClass);
080     }
081 
082     public GriffonClass getGriffonClass() {
083         return app.getArtifactManager().findGriffonClass(getClass());
084     }
085 
086     public boolean isUIThread() {
087         return UIThreadManager.getInstance().isUIThread();
088     }
089 
090     // TODO @deprecated - remove before 1.0
091     public void execAsync(Runnable runnable) {
092         execInsideUIAsync(runnable);
093     }
094 
095     // TODO @deprecated - remove before 1.0
096     public void execSync(Runnable runnable) {
097         execInsideUISync(runnable);
098     }
099 
100     // TODO @deprecated - remove before 1.0
101     public void execOutside(Runnable runnable) {
102         execOutsideUI(runnable);
103     }
104 
105     public void execInsideUIAsync(Runnable runnable) {
106         UIThreadManager.getInstance().executeAsync(runnable);
107     }
108 
109     public void execInsideUISync(Runnable runnable) {
110         UIThreadManager.getInstance().executeSync(runnable);
111     }
112 
113     public void execOutsideUI(Runnable runnable) {
114         UIThreadManager.getInstance().executeOutside(runnable);
115     }
116 
117     public Future execFuture(ExecutorService executorService, Closure closure) {
118         return UIThreadManager.getInstance().executeFuture(executorService, closure);
119     }
120 
121     public Future execFuture(Closure closure) {
122         return UIThreadManager.getInstance().executeFuture(closure);
123     }
124 
125     public Future execFuture(ExecutorService executorService, Callable callable) {
126         return UIThreadManager.getInstance().executeFuture(executorService, callable);
127     }
128 
129     public Future execFuture(Callable callable) {
130         return UIThreadManager.getInstance().executeFuture(callable);
131     }
132 
133     public Logger getLog() {
134         return log;
135     }
136 
137     public MVCGroup buildMVCGroup(String mvcType) {
138         return getApp().getMvcGroupManager().buildMVCGroup(mvcType, null, Collections.<String, Object>emptyMap());
139     }
140 
141     public MVCGroup buildMVCGroup(String mvcType, String mvcName) {
142         return getApp().getMvcGroupManager().buildMVCGroup(mvcType, mvcName, Collections.<String, Object>emptyMap());
143     }
144 
145     public MVCGroup buildMVCGroup(Map<String, Object> args, String mvcType) {
146         return getApp().getMvcGroupManager().buildMVCGroup(mvcType, null, args);
147     }
148 
149     public MVCGroup buildMVCGroup(String mvcType, Map<String, Object> args) {
150         return getApp().getMvcGroupManager().buildMVCGroup(mvcType, null, args);
151     }
152 
153     public MVCGroup buildMVCGroup(Map<String, Object> args, String mvcType, String mvcName) {
154         return getApp().getMvcGroupManager().buildMVCGroup(mvcType, mvcName, args);
155     }
156 
157     public MVCGroup buildMVCGroup(String mvcType, String mvcName, Map<String, Object> args) {
158         return getApp().getMvcGroupManager().buildMVCGroup(mvcType, mvcName, args);
159     }
160 
161     public List<? extends GriffonMvcArtifact> createMVCGroup(String mvcType) {
162         return getApp().getMvcGroupManager().createMVCGroup(mvcType, null, Collections.<String, Object>emptyMap());
163     }
164 
165     public List<? extends GriffonMvcArtifact> createMVCGroup(Map<String, Object> args, String mvcType) {
166         return getApp().getMvcGroupManager().createMVCGroup(mvcType, null, args);
167     }
168 
169     public List<? extends GriffonMvcArtifact> createMVCGroup(String mvcType, Map<String, Object> args) {
170         return getApp().getMvcGroupManager().createMVCGroup(mvcType, null, args);
171     }
172 
173     public List<? extends GriffonMvcArtifact> createMVCGroup(String mvcType, String mvcName) {
174         return getApp().getMvcGroupManager().createMVCGroup(mvcType, mvcName, Collections.<String, Object>emptyMap());
175     }
176 
177     public List<? extends GriffonMvcArtifact> createMVCGroup(Map<String, Object> args, String mvcType, String mvcName) {
178         return getApp().getMvcGroupManager().createMVCGroup(mvcType, mvcName, args);
179     }
180 
181     public List<? extends GriffonMvcArtifact> createMVCGroup(String mvcType, String mvcName, Map<String, Object> args) {
182         return getApp().getMvcGroupManager().createMVCGroup(mvcType, mvcName, args);
183     }
184 
185     public void destroyMVCGroup(String mvcName) {
186         getApp().getMvcGroupManager().destroyMVCGroup(mvcName);
187     }
188 
189     public void withMVCGroup(String mvcType, Closure handler) {
190         getApp().getMvcGroupManager().withMVCGroup(mvcType, null, Collections.<String, Object>emptyMap(), handler);
191     }
192 
193     public void withMVCGroup(String mvcType, String mvcName, Closure handler) {
194         getApp().getMvcGroupManager().withMVCGroup(mvcType, mvcName, Collections.<String, Object>emptyMap(), handler);
195     }
196 
197     public void withMVCGroup(String mvcType, Map<String, Object> args, Closure handler) {
198         getApp().getMvcGroupManager().withMVCGroup(mvcType, null, args, handler);
199     }
200 
201     public void withMVCGroup(Map<String, Object> args, String mvcType, Closure handler) {
202         getApp().getMvcGroupManager().withMVCGroup(mvcType, null, args, handler);
203     }
204 
205     public void withMVCGroup(String mvcType, String mvcName, Map<String, Object> args, Closure handler) {
206         getApp().getMvcGroupManager().withMVCGroup(mvcType, mvcName, args, handler);
207     }
208 
209     public void withMVCGroup(Map<String, Object> args, String mvcType, String mvcName, Closure handler) {
210         getApp().getMvcGroupManager().withMVCGroup(mvcType, mvcName, args, handler);
211     }
212 
213     public <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVCGroup(String mvcType, MVCClosure<M, V, C> handler) {
214         getApp().getMvcGroupManager().withMVCGroup(mvcType, null, Collections.<String, Object>emptyMap(), handler);
215     }
216 
217     public <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVCGroup(String mvcType, String mvcName, MVCClosure<M, V, C> handler) {
218         getApp().getMvcGroupManager().withMVCGroup(mvcType, mvcName, Collections.<String, Object>emptyMap(), handler);
219     }
220 
221     public <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVCGroup(String mvcType, Map<String, Object> args, MVCClosure<M, V, C> handler) {
222         getApp().getMvcGroupManager().withMVCGroup(mvcType, null, args, handler);
223     }
224 
225     public <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVCGroup(Map<String, Object> args, String mvcType, MVCClosure<M, V, C> handler) {
226         getApp().getMvcGroupManager().withMVCGroup(mvcType, null, args, handler);
227     }
228 
229     public <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVCGroup(String mvcType, String mvcName, Map<String, Object> args, MVCClosure<M, V, C> handler) {
230         getApp().getMvcGroupManager().withMVCGroup(mvcType, mvcName, args, handler);
231     }
232 
233     public <M extends GriffonModel, V extends GriffonView, C extends GriffonController> void withMVCGroup(Map<String, Object> args, String mvcType, String mvcName, MVCClosure<M, V, C> handler) {
234         getApp().getMvcGroupManager().withMVCGroup(mvcType, mvcName, args, handler);
235     }
236 
237     public InputStream getResourceAsStream(String name) {
238         return resourceLocator.getResourceAsStream(name);
239     }
240 
241     public URL getResourceAsURL(String name) {
242         return resourceLocator.getResourceAsURL(name);
243     }
244 
245     public List<URL> getResources(String name) {
246         return resourceLocator.getResources(name);
247     }
248 }