2011-03-18 21 views
9

¿Hay alguna manera de tener la misma clase implementada de manera diferente en el cliente que en el servidor?Implementaciones de cliente y servidor GWT de la misma clase

Para evitar el "¿Por qué quieres hacer eso?" pregunta .. Elaboraré

Estoy convirtiendo una aplicación cliente/servidor Java muy grande. Actualmente utiliza un cliente de Swing GUI y habla con el servidor a través de Spring Remoting (RPC). El uso de GWT RPC con servicios de Spring no es un problema, hay varios excelentes ejemplos disponibles y todo parece funcionar bien.

Varias clases que son comunes tanto para el cliente como para el servidor contienen datos que se transmiten hacia adelante y hacia atrás. Estas clases también contienen algún comportamiento que se implementa mediante el uso de las clases estándar de JRE. Por ejemplo, una clase contiene, analiza y formatea la fecha y la hora, incluida la zona horaria, horario de verano, etc. de una manera específica de la localidad. Podría reescribirlo/refactorizarlo, pero la aplicación supera los 10 millones de SLOC, lo que genera millones de referencias a esta clase, por lo que una reescritura importante no es rentable.

Para utilizar esto como un ejemplo, GWT proporciona una excelente compatibilidad con i18n para analizar y formatear las fechas. Pero la implementación es diferente a la forma en que JRE lo hace.

Por lo tanto, estoy buscando una forma inteligente donde pueda insertar una implementación en el shell de mi clase DateTime, dependiendo de si está en el cliente (usando GWT y JS nativo) o en el servidor (usando el JRE). ¿Hay una manera astuta de hacer esto? Tal vez usando el archivo del módulo XXXXX.gwt.xml. Estoy buscando una solución genérica.

Respuesta

0

Creo que lo que usted está buscando, es esto: <source path="client" /> en su proyecto de archivo gwt.xml. Le dice al generador de GWT dónde buscar el código del lado del cliente para convertir a JS. En mi proyecto lo tengo configurado de este modo:

<source path="client" /> 
<source path="shared" /> 

Básicamente código de cliente se encuentra en el directorio del cliente, y en común mantenemos frijoles y algunas envolturas de datos para el cliente y el servidor.

Lo que podría hacer es agregar los paquetes que desea convertir al cliente con la ruta de origen como se muestra arriba. Pero debe recordar, que las clases que va a convertir, pueden estar compuestas solo de objetos y propiedades que el generador de GWT puede convertir en un script java del lado del cliente. No estoy seguro de si también camino más precisa se puede poner en la ruta de origen, como:

<source path="shared/beans/whatever" /> 

Otro inconveniente es, que si se utiliza el soporte de i18n GWT, se maneja diferente configuración regional en tiempo de compilación por su propia - lo que es bueno. Si decide usar su propio mecanismo, sus clases deben contener cierta lógica para conocer la configuración regional utilizada actualmente, que debe ser compatible con GWT.

+1

Eso no es lo que se preguntó. Tiene varias clases que se usan en el cliente y el servidor (sí, eso normalmente se compartiría), pero estas clases contienen código JRE que no es de GWT, por lo que solo funcionarían en el servidor. – John

+1

Hacer la misma clase pero con diferentes implementaciones hace que me duelan los ojos. Para mí eso frenará un contrato de diseño y un programador debe saber qué implementación reside debajo.¿No hay una forma de hacer una implementación de interfaz con dos clases diferentes siguiendo esa interfaz? Esa es la forma en que se resolvería tu pregunta (si me preguntas). – Sven

+0

@John - Mencioné que no funcionaría fork para las clases que contienen código no GWT. Quizás no estaba muy claro sobre esto. – jjczopek

5

Desea utilizar el <super-source> para anulando la implementación de un paquete con otro. Esto es lo que GWT usa para emular las clases de Java Runtime, y (entre otras) proporciona diferentes implementaciones para el cliente y el servidor de las clases com.google.gwt.regexp.shared.*.

+0

¿La super-fuente realmente * está anulando * la otra implementación o simplemente está agregando? He encontrado el aspecto * primordial * en ninguna parte de los documentos (pero sería genial). – xamde

+1

Archivo por archivo, anula. Es como si hubiera aparecido antes en el classpath (y así es cómo se implementa (más o menos); ver http://code.google.com/p/google-web-toolkit/wiki/ResourceOracle) –

Cuestiones relacionadas