Statistics
| Revision:

svn-gvsig-desktop / tags / gvSIGv0_6_1RELEASE / frameworks / _fwAndami / src / com / iver / andami / PluginServices.java @ 5222

History | View | Annotate | Download (11.4 KB)

1 1104 fjp
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41 598 fernando
package com.iver.andami;
42
43
import java.awt.Component;
44
import java.awt.event.ActionListener;
45 1141 fernando
import java.io.File;
46
import java.lang.reflect.InvocationTargetException;
47 735 vcaballero
import java.util.Iterator;
48 598 fernando
import java.util.Locale;
49
import java.util.MissingResourceException;
50
import java.util.PropertyResourceBundle;
51
import java.util.ResourceBundle;
52
53 1141 fernando
import javax.swing.SwingUtilities;
54 598 fernando
55 1153 fernando
import org.apache.log4j.Logger;
56 598 fernando
57 1153 fernando
import com.iver.andami.messages.Messages;
58
import com.iver.andami.messages.NotificationManager;
59
import com.iver.andami.plugins.Extension;
60 2862 jaume
import com.iver.andami.plugins.ExtensionDecorator;
61 1153 fernando
import com.iver.andami.plugins.PluginClassLoader;
62
import com.iver.andami.ui.mdiFrame.MDIFrame;
63
import com.iver.andami.ui.mdiFrame.MainFrame;
64
import com.iver.andami.ui.mdiManager.MDIManager;
65
import com.iver.utiles.XMLEntity;
66
67
68 598 fernando
/**
69 1141 fernando
 * Clase que proporciona servicios a los plugins.
70 598 fernando
 *
71 1141 fernando
 * @author Fernando Gonz?lez Cort?s
72 598 fernando
 */
73
public class PluginServices {
74 1141 fernando
        private static Logger logger = Logger.getLogger(PluginServices.class.getName());
75 4942 fjp
76
        private static String[] arguments;
77
78 1141 fernando
        private PluginClassLoader loader;
79
        private PropertyResourceBundle resourceBundle;
80
        private XMLEntity persistentXML;
81 598 fernando
82 1141 fernando
        /**
83
         * Crea un nuevo PluginServices
84
         *
85
         * @param loader ClassLoader del plugin
86
         */
87
        public PluginServices(PluginClassLoader loader) {
88
                this.loader = loader;
89
        }
90 598 fernando
91 1141 fernando
        /**
92
         * Devuelve el mensaje en el idioma del locale actual del texto
93
         * correspondiente a la clave que se pasa como par?metro
94
         *
95
         * @param key Clave del texto que se quiere obtener
96
         *
97
         * @return Texto en el idioma que toca o la propia clave si no se encuentra
98
         *                    en el fichero
99
         */
100
        public String getText(String key) {
101
                if (resourceBundle == null) {
102
                        return key;
103
                }
104 598 fernando
105 1141 fernando
                if (key == null) {
106
                        return null;
107
                }
108 598 fernando
109 1141 fernando
                try {
110
                        return resourceBundle.getString(key);
111
                } catch (MissingResourceException e) {
112 4379 luisw2
                        logger.warn(getPluginName()+": "+Messages.getString("PluginServices.No_se_encontro_la_traduccion_para") + " " + key);
113 598 fernando
114 1141 fernando
                        return key;
115
                }
116
        }
117 598 fernando
118 1141 fernando
        /**
119
         * Obtiene el classloader del plugin
120
         *
121
         * @return Returns the loader.
122
         */
123
        public PluginClassLoader getClassLoader() {
124
                return loader;
125
        }
126
127
        /**
128
         * Obtiene el nombre del plugin
129
         *
130
         * @return String
131
         */
132
        String getPluginName() {
133
                return loader.getPluginName();
134
        }
135
136
        /**
137
         * Establece el paquete de traducciones del objeto
138
         * pluginservices asociado a un plugin
139
         *
140
         * @param name nombre del paquete
141
         * @param locale locale para obtener los recursos del paquete
142
         */
143
        void setResourceBundle(String name, Locale locale) {
144
                try {
145
                        resourceBundle = (PropertyResourceBundle) ResourceBundle.getBundle(name,
146
                                        locale, loader);
147
                } catch (MissingResourceException e) {
148 4379 luisw2
                        logger.error(Messages.getString("PluginServices.No_se_encontro_el_recurso_de_traducciones") +
149
                                        " '"+name+"' en "+getPluginName(), e);
150 598 fernando
                }
151 1141 fernando
        }
152 598 fernando
153 1141 fernando
        /**
154
         * Obtienen una referencia al PluginServices del plugin cuyo nombre se pasa
155
         * como par?metro
156
         *
157
         * @param pluginClassInstance Instancia de una clase propia del plugin a
158
         *                   cuyos servicios se quiere acceder
159
         *
160
         * @return Objeto PluginServices asociado al plugin
161
         *
162
         * @throws RuntimeException Si el par?metro no es un objeto cargado desde un plugin
163
         */
164
        public static PluginServices getPluginServices(Object pluginClassInstance) {
165
                try {
166
                        PluginClassLoader loader = (PluginClassLoader) pluginClassInstance.getClass()
167
                                                                                                                                                          .getClassLoader();
168
169
                        return Launcher.getPluginServices(loader.getPluginName());
170
                } catch (ClassCastException e) {
171 1445 fjp
                        /* throw new RuntimeException(
172
                                "Parameter is not a plugin class instance"); */
173
                    return null;
174 598 fernando
                }
175 1141 fernando
        }
176 598 fernando
177 1141 fernando
        /**
178
         * Obtienen una referencia al PluginServices del plugin cuyo nombre se pasa
179
         * como par?metro
180
         *
181
         * @param pluginName Instancia de una clase propia del plugin a cuyos
182
         *                   servicios se quiere acceder
183
         *
184
         * @return Objeto PluginServices asociado al plugin
185
         */
186
        public static PluginServices getPluginServices(String pluginName) {
187
                return Launcher.getPluginServices(pluginName);
188
        }
189 598 fernando
190 1141 fernando
        /**
191
         * Obtiene una referencia al gestor de ventanas
192
         *
193
         * @return MDIManager
194
         */
195
        public static MDIManager getMDIManager() {
196
                return Launcher.getFrame().getMDIManager();
197
        }
198 598 fernando
199 1141 fernando
        /**
200
         * Obtiene una referencia al marco principal de la
201
         * aplicaci?n
202
         *
203
         * @return MainFrame
204
         */
205
        public static MainFrame getMainFrame() {
206
                return Launcher.getFrame();
207
        }
208
209
        /**
210
         * Obtiene una referencia a la instancia de la extensi?n
211
         * cuya clase se pasa como par?metro
212
         *
213
         * @param extensionClass Clase de la extensi?n cuya instancia se quiere obtener
214
         *
215
         * @return Instancia de la extensi?n o null en caso de que no haya
216
         * una extensi?n con esa clase
217
         */
218
        public static Extension getExtension(Class extensionClass) {
219 2862 jaume
                ExtensionDecorator extAux = (ExtensionDecorator) Launcher.getClassesExtensions().get(extensionClass);
220
                return extAux.getExtension();
221
                // return (Extension) Launcher.getClassesExtensions().get(extensionClass);
222
223 1141 fernando
        }
224
225
        /**
226 2862 jaume
         * Gets a reference to the Extension Decorator with support for several more options
227
         * @param extensionClass
228
         * @return
229
         */
230
        public static ExtensionDecorator getDecoratedExtension(Class extensionClass) {
231
                return (ExtensionDecorator) Launcher.getClassesExtensions().get(extensionClass);
232
        }
233
234
        /**
235 1141 fernando
         * Obtiene un iterador sobre las extensiones
236
         *
237
         * @return Iterator
238
         */
239
        public static Iterator getExtensions() {
240
                return Launcher.getClassesExtensions().values().iterator();
241
        }
242
243
        /**
244
         * Obtiene una traducci?n de un plugin
245
         *
246
         * @param pluginObject Objeto cargado desde un plugin
247
         * @param key Nombre de la clave cuyo valor se quiere obtener
248
         *
249
         * @return El valor, si existe. La clave si no existe. Si el objeto que
250
         * se pasa como par?metro no ha sido cargado desde un plugin
251
         * se devuelve la clave.
252
         */
253
        public static String getText(Object pluginObject, String key) {
254
                try {
255
                        PluginServices ps = getPluginServices(pluginObject);
256 1445 fjp
                        if (ps == null) return key;
257 1141 fernando
                        return ps.getText(key);
258
                } catch (RuntimeException e) {
259
                        logger.error("GetText: Clave = " + key + ". ", e);
260
261
                        return key;
262 608 fjp
                }
263 1141 fernando
        }
264
265
        /**
266
         * Establece los datos del plugin que deber?n persistir entre ejecuciones
267
         * en formato xml
268
         *
269
         * @param entity DOCUMENT ME!
270
         */
271 1217 fernando
        public void setPersistentXML(XMLEntity entity) {
272 1141 fernando
                persistentXML = entity;
273
        }
274
275
        /**
276
         * Obtiene un objeto que representa la persistencia del plugin en formato
277 1217 fernando
         * xml.
278 1141 fernando
         *
279 1217 fernando
         * @return Devuelve null hasta que se invoca el m?todo setPersistentXML
280 1141 fernando
         */
281
        public XMLEntity getPersistentXML() {
282 1363 fernando
                if (persistentXML == null){
283
                        persistentXML = new XMLEntity();
284
                }
285 1141 fernando
                return persistentXML;
286
        }
287
288
        /**
289
         * A?ade un listener a un popup menu registrado en el
290
         * config.xml de alg?n plugin
291
         *
292
         * @param name Nombre del men? contextual
293
         * @param c Componente que desplegar? el men? cuando
294
         * se haga click con el bot?n derecho
295
         * @param listener Listener que se ejecutar? cuando se
296
         * seleccione cualquier entrada del men?
297
         *
298
         * @throws RuntimeException Si la interfaz no est? preparada
299
         * todav?a. S?lo puede darse durante el arranque
300
         */
301
        public void addPopupMenuListener(String name, Component c,
302
                ActionListener listener) {
303
                MDIFrame frame = Launcher.getFrame();
304
305
                if (frame == null) {
306
                        throw new RuntimeException("MDIFrame not loaded yet");
307 608 fjp
                }
308 598 fernando
309 1141 fernando
                frame.addPopupMenuListener(name, c, listener, loader);
310
        }
311 598 fernando
312 1141 fernando
        /**
313
         * Obtiene una referencia al directorio del plugin
314
         *
315
         * @return File
316
         */
317
        public File getPluginDirectory() {
318
                return new File(Launcher.getPluginsDir() + File.separator +
319
                        getPluginName());
320
        }
321 598 fernando
322 1141 fernando
        /**
323
         * Ejecuta una tarea en segundo plano, dejando a la
324
         * interfaz responder pero inhibiendo los eventos
325
         *
326
         * @param r Tarea a ejecutar
327
         *
328
         * @return Thread en el que se ejecuta la tarea
329
         */
330
        public static Thread backgroundExecution(Runnable r) {
331
                Thread t = new Thread(new RunnableDecorator(r));
332
                t.start();
333 598 fernando
334 1141 fernando
                return t;
335
        }
336
337 2142 fernando
        public static void closeApplication(){
338
            Launcher.closeApplication();
339
        }
340
341 1141 fernando
        /**
342
         * DOCUMENT ME!
343
         *
344
         * @author Fernando Gonz?lez Cort?s
345
         */
346
        private static class RunnableDecorator implements Runnable {
347
                private Runnable r;
348
349
                /**
350
                 * Crea un nuevo RunnableDecorator.
351
                 *
352
                 * @param r DOCUMENT ME!
353
                 */
354
                public RunnableDecorator(Runnable r) {
355
                        this.r = r;
356
                }
357
358
                /**
359
                 * @see java.lang.Runnable#run()
360
                 */
361
                public void run() {
362 3204 fjp
                        /* try {
363 1141 fernando
                                SwingUtilities.invokeAndWait(new Runnable() {
364
                                                public void run() {
365
                                                        getMDIManager().setWaitCursor();
366
                                                }
367
                                        });
368
                        } catch (InterruptedException e) {
369 1173 fernando
                                NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
370 1141 fernando
                                        e);
371
                        } catch (InvocationTargetException e) {
372 1173 fernando
                                NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
373 1141 fernando
                                        e);
374 3204 fjp
                        } */
375 1141 fernando
376 2240 fernando
                        try {
377
                            SwingUtilities.invokeAndWait(new Runnable() {
378
                    public void run() {
379
                                    try{
380
                                        r.run();
381
                                    } catch(RuntimeException e){
382
                                            NotificationManager.addError(Messages.getString("PluginServices.Bug_en_el_codigo"), e);
383
                                    } catch (Error e){
384
                                            NotificationManager.addError(Messages.getString("PluginServices.Error_grave_de_la_aplicaci?n"), e);
385
                                    }
386
                    }
387
                });
388
                        } catch (InterruptedException e) {
389
                                NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
390
                                        e);
391
                        } catch (InvocationTargetException e) {
392
                                NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_poner_el_reloj_de_arena"),
393
                                        e);
394 1153 fernando
                        }
395 1141 fernando
396 3204 fjp
                        /* try {
397 1141 fernando
                                SwingUtilities.invokeAndWait(new Runnable() {
398
                                                public void run() {
399
                                                        getMDIManager().restoreCursor();
400
                                                }
401
                                        });
402
                        } catch (InterruptedException e) {
403 1173 fernando
                                NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_restaurar_el_cursor_del_raton"),
404 1141 fernando
                                        e);
405
                        } catch (InvocationTargetException e) {
406 1173 fernando
                                NotificationManager.addWarning(Messages.getString("PluginServices.No_se_pudo_restaurar_el_cursor_del_raton"),
407 1141 fernando
                                        e);
408 3204 fjp
                        } */
409 1141 fernando
                }
410
        }
411 4942 fjp
412
        /**
413
         * Usually appName plugins-directory [locale] [other args]
414
         *
415
         * @return the original arguments that Andami received. (app-name
416
         *         plugins-directory, locale, etc)
417
         */
418
        public static String[] getArguments() {
419
                return arguments;
420
        }
421
422
        public static void setArguments(String[] arguments) {
423
                PluginServices.arguments = arguments;
424
        }
425
426 598 fernando
}