2008-10-02 17 views
11

Tengo un número bastante grande de archivos fuente que necesito analizar y extraer todos los literales de cadena y ponerlos en un archivo como play old java constant.
Para exemple:Extraiga toda la cadena de un proyecto de java

Label l = new Label("Cat"); 

se convertiría en:

Label l = new Label(Constants.CAT); 

Y en Constants.java Me hubiera:

public final static String CAT = "Cat"; 

no quiero que las cuerdas que se exteriorizan en un texto de la propiedad archivo.
Una de las razones es la coherencia y la legibilidad del código.
El otro es que nuestro código de cliente usa GWT, que no es compatible con el mecanismo de archivo de texto de la propiedad Java.

Podría escribir algún tipo de analizador (utilizando la tarea de reemplazar hormigas).
Pero me pregunté si un IDE ya hace este tipo de cosas automáticamente.

+0

"nuestro código de cliente usa GWT, que no admite el mecanismo de archivo de texto de la propiedad Java": esto simplemente no es cierto ... Es cierto, no se puede cargar un archivo de propiedades * directamente * desde el cliente, pero el cliente puede realizar una llamada asincrónica al servidor y el servidor puede devolver el objeto Propiedades (o los datos en cualquier forma que lo necesite). * Puedes * usar archivos de propiedades en el lado del cliente, solo hay un paso o dos más por los que tienes que pasar. –

Respuesta

9

Para completar la respuesta de Peter Kelley, puede considerar para eclipse IDE la solución AST.

Puede escribir un programa AST que analice su código fuente y haga lo que quiera.

Un ejemplo completo está disponible en este eclipse corner article, también más detalles en el eclipse help.
Y puede encontrar algunos ejemplos en Listing 5 of the section "Implementation of in-place translation" of Automating the embedding of Domain Specific Languages in Eclipse JDT, junto con multiple examples in GitHub projects.

+0

@Roy, por favor comparta el resultado. Incluso estoy buscando lo mismo. Sería muy útil si pudieras compartirlo – Ravisha

+1

@El enlace de la presentación de VonC no funciona. –

+1

@YajliMaclo Exact, esta presentación ya no está disponible. He hecho referencia a nuevos ejemplos en su lugar. – VonC

21

Eclipse hace esto automáticamente. Haga clic derecho en el archivo, elija "Fuente", luego "Externalizar cadenas"

Esto no hace exactamente lo que solicitó (teniendo las cadenas en un archivo Constants.java como cadenas) pero el método utilizado es muy poderoso de hecho . Los mueve a un archivo de propiedades que se puede cargar dinámicamente según su configuración regional. Tenerlos en un archivo de código fuente de Java separado como sugieres significa que tendrás TODOS los idiomas en tu aplicación a la vez o enviarás diferentes aplicaciones según la configuración regional.

Lo usamos para nuestras aplicaciones donde incluso las cosas básicas tienen que enviarse en inglés y japonés - nuestras aplicaciones más complicadas se envían en 12 idiomas - no somos una pequeña empresa de desarrollo de software de ninguna manera :-).

Si hace los quiere en un archivo de Java, a pesar de los inconvenientes ya mencionados, es mucho más fácil de escribir un programa para transformarse archivo de propiedades en un archivo fuente de Java de lo que es tratar de extraer las cadenas de forma libre fuente de Java.

Todo lo que necesita hacer es modificar la clase de Accesor para usar las cadenas integradas (en la clase separada) en lugar de cargarlas en tiempo de ejecución.

+0

Ya he comprobado Eclipse y moverá toda la cadena en un archivo de propiedad txt, que luego es cargado por Messages.getString(). Esto no es lo que quiero hacer. Solo quiero que mi cuerda sea una vieja constante de Java. –

+0

Esto no es una mala idea. Una vez que los tenga, puede buscar esos patrones y reemplazarlos con lo que desee. – ykaganovich

+0

Además, este método no reconoce la misma cadena en el mismo proyecto. Quiero que todas las instancias de "Gato" apunten a Constantes.CAT –

1

Hay algunas buenas razones por las que no le gustaría hacer esto. Aparte del hecho de que cualquier archivo generado de este tipo (no sabía acerca de la función de eclipse) no va a distinguir entre cadenas que está configurando, por ejemplo, como argon de constructor en clases de prueba y cosas que realmente desea tener como constantes, el problema más grande es que todas sus finales públicas estáticas se compilarán en sus clases, y si desea alterar el comportamiento de las clases, deberá modificar no solo la clase que contiene las constantes, sino todo lo que la haga referencia.

1

Acepto completamente lo que dijo Pax Diablo. Estamos usando esa función también.

Cuando se aplica a un archivo de clase, la función "Externalizar cadenas" creará dos archivos, una clase Messages.class y un archivo de propiedades messages.properties. A continuación, redirigirá todos los usos directos de los literales de cadenas a una llamada a Messages.get (clave String) y utilizando la clave que ingresó para la cadena en el asistente "Ext. String".

BTW: ¿Qué hay de malo en los archivos de propiedades? Como dijo, puedes simplemente cambiar el archivo de propiedades y no tienes que cambiar la clase si necesitas cambiar el texto.

Otra ventaja es esta: la forma de extraer los literales de cadena en un archivo de propiedad le deja libre para traducir el idioma de origen en cualquier idioma que desee sin modificar ningún código. El cargador de archivos de propiedades carga el archivo de idioma de destino automáticamente utilizando el archivo correspondiente con el código de idioma ISO. Para que no tenga que preocuparse por la plataforma en la que se ejecuta su código, seleccionará el idioma apropiado (casi) automáticamente. Consulte la documentación de la clase ResourceBundle para ver cómo funciona esto en detalle.

Cuestiones relacionadas