Cairo Dock es mi lanzador por defecto en las últimas versiones de Ubuntu que he instalado. Me agrada estéticamente y tiene varias funcionalidades.

Este, como otros lanzadores (AWN, Unity Launcher, Docky), tiene problemas con identificar correctamente las ventanas de las aplicaciones Java. De estas, las que utilizo principalmente son Eclipse y WebStorm. Pues me di a la tarea de como resolver este problema y poder poner mi lanzador directamente en la barra de Cairo Dock, pero te debe funcionar también con los otros.

Primero crea tu lanzador (archivo .desktop), por ejemplo para WebStorm

[Desktop Entry]
Type=Application
Name=Web Storm
Comment=Web Development IDE
Icon=/home/cirovladimir/Apps/web-storm-6.0.1/bin/webide.png
Exec=/home/cirovladimir/Apps/web-storm-6.0.1/bin/webstorm.sh
Terminal=false
Categories=Development;IDE;Java;
StartupWMClass=jetbrains-webstorm

La línea importante es la que dice StartupWMClass=jetbrains-webstorm.

Para obtener el valor correcto de esta variable para otras aplicaciones puedes ejecutar el comando

xprops | grep WM_CLASS

y dar clic en la ventana de la aplicación

Fuentes:

http://askubuntu.com/questions/36434/how-can-i-remove-duplicate-icons-for-launched-java-programs-in-the-launcher
https://bugs.launchpad.net/docky/+bug/484610

Una de las características que nos ayuda a la hora de escribir código es, sin duda, la función de autocompletado. En la mayoría de editores que utilizo esta función me permite seleccionar métodos, clases o propiedades de forma rápida.

En el caso de los métodos, muchas veces el nombre tiene el mismo prefijo, getters y setters, o por ejemplo:

editAudiencia(audiencia);

y lo quiero cambiar a

editNewAudiencia(audiencia);

lo que tienes que hacer es posicionar el cursor justo al terminar el prefijo ‘edit’ y presionar CTRL+SPACE para ver las opciones. Para mi sorpresa, en Eclipse, al seleccionar el nuevo método me quedó algo así

editNewAudiencia(inicio, fin)Audiencia(audiencia);

cómo podemos observar, Eclipse por default inserta el código en vez de reemplazar el sufijo del método. Para cambiar esto, ve a las preferencias de Eclipse->Java->Editor->Content Assist y selecciona ‘Completion overwrites’

Fuentes:
http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftips%2Fjdt_tips.html

git – saltos de línea CRLF

Si en tu equipo de trabajo utilizan computadoras con Windows y Linux (o Mac) para desarrollar, seguramente tendrán un problema con los saltos de línea. Git resuelve este problema mediante el parámetro de configuración ‘core.autocrlf’.

En las computadoras con Windows establece este parámetro en ‘true’ mediante el comando

git config –global core.autocrlf true

En las computadoras con Linux (Mac) debe ser falso (default).

CP-1252

Otro problema que se nos presentó, debido a este ambiente heterogéneo, fue la codificación de los proyectos. La codificacioón por default en Windows (en español) es CP-1252 mientras que Linux utiliza UTF-8. Para que nuestros proyectos Maven puedan ser compilados en ambas plataformas, es necesario agregar el siguiente parámetro de configuración al archivo pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Fuentes:
git book
http://stackoverflow.com/questions/9976616/maven-platform-encoding

Tenemos un proyecto de GWT con multiples módulos organizados de forma jerárquica. Para la administración de las dependencias utilizamos Maven, además de que nos ayuda a generar el archivo WAR para instalarlo en un servidor de aplicaciones (JBoss).

Pues cuando intentamos compilar este proyecto en Windows, el plugin maven-datanucleus-plugin nos arrojó un error con un mensaje parecido al siguiente:

La línea de comandos es demasiado larga

Para corregirlo utilizamos la siguiente configuración en el archivo pom.xml

    <build></p><plugins><plugin>                <groupId>org.datanucleus</groupId>
                <artifactId>maven-datanucleus-plugin</artifactId>
                <version>${maven-datanucleus-plugin.version}</version>
                <configuration>
                    <fork>false</fork>
                    <log4jConfiguration>${basedir}/src/main/resources/log4j.properties</log4jConfiguration>
                    <verbose>true</verbose></p><props>${basedir}/src/main/resources/datanucleus.properties</props>                </configuration>
                <executions>
                    <execution></p><phase>process-classes</phase>                        <goals>
                            <goal>enhance</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>        </plugins>    </build>

Lo importante es agregar la opción fork

Fuentes:
http://stackoverflow.com/questions/8353855/the-command-line-is-too-long-standard-error-from-the-datanucleus-tool
https://issues.onehippo.com/browse/REPO-391
http://kindofjava.blogspot.mx/2011/06/java-classpath-via-maven-too-long.html

Las aplicaciones desarrolladas con GWT deben ser compiladas para generar el código javascript que se ejecutará en el navegador. Este proceso puede ser muy tardado.

Normalmente cuando desarrollamos nuestra aplicación, sólo debemos actualizar el navegador (F5) para ver los cambios que hemos hecho al código. Sin embargo, hay ocasiones que necesitamos recompilar el código para que los cambios se vean reflejados. En estos casos podemos especificar un sólo navegador -el que utilicemos para probar la aplicación- para acelerar el proceso de compilación. Basta con agregar la siguiente línea al archivo gwt.xml del módulo

<set-property name="user.agent" value="safari"/>

En este caso, especificamos la compilación para Chrome. La lista completa de opciones la puedes consultar en el código fuente

Fuentes:

stackoverflow – how do i speed up the gwt compiler
stackoverflow – what are the possible user agent values in gwt xml

Para modificar la consulta de un DataSet puedes utilizar la sección “Property Binding”

en mi caso necesitaba reemplazar en la conulta el valor de un parámetro.

Para reemplazar una cadena con otra lo puedes hacer en el “Expression Builder” de la siguiente manera



var q=new Packages.java.lang.String("SELECT COUNT(*) AS TOTAL \
FROM @OFICINA.EMPLEADOS A, @OFICINA.PUESTOS R, \
@OFICINA.SALARIOS D, @OFICINA.DEPTOS O \
WHERE A.NID_ACO_EXP= R.NID_ACO \
R.NID_DMD=D.NID_DMD AND R.NORDEN=O.NID_ORDEN \
AND TRUNC(R.FECHA) BETWEEN :INICIO AND :FIN");
q.replaceAll("@OFICINA",params["OFICINA"].value);

el código es javascript, pero podemos utilizar clases Java también. En este caso utilizamos la clase String de Java en vez de Javascript, porque el método de javascript no reemplaza todas las coincidencias.

Fuentes:
birt exchange

Cuando tienes varios reportes, es buena idea crear una librería para reutilizar elementos en los reportes. Un ejemplo común es cuando necesitamos usar el mismo encabezado y pie de página para los reportes.

BIRT nos permite agregar algunos elementos dinámicos -tales como el número de páginas, la fecha e incluso un valor obtenido mediante código javascript en un DynamicText- El problema es que esto dependerá de cada reporte, así que ¿cómo agregamos elementos dinámicos desde una librería a nuestro reporte?

Pues habrá que crear una “master page” en la librería donde pongamos elementos “DynamicText” en el encabezado y que estos desplieguen el valor de un parámetro. Después podemos modificar el valor del parámetro en cada reporte, y así, tener un título personalizado pero manteniendo el formato.

Si además, queremos obtener el título mediante una consulta a la base de datos. Lo que tenemos que hacer es crear el DataSource a la base de datos y un DataSet con la consulta que obtiene el título, por ejemplo


SELECT DESCRIPCION
FROM OFICINAS
WHERE ID=:OFICINA

Luego, debemos poner el siguiente código en el evento “beforeFactory” de nuestro reporte


//public final static int MODE_GENERATION = 1; //This mode is for generate the report document. Typically used in Report Engine run task
//public final static int MODE_PRESENTATION = 2; //This mode is for present data that saved in report document, without further data manipulation operation. Typically used in report engine render task
//public final static int DIRECT_PRESENTATION = 3;//This mode is to execute the data query without create report document. It is used in report engine runAndRender task.
//public final static int MODE_UPDATE = 4; //This mode is used to update the existing report document with new queries. Typicially used in IV.
importPackage( Packages.org.eclipse.birt.report.model.api );
importPackage(Packages.java.lang);
importPackage(Packages.java.util);
importPackage(Packages.org.eclipse.birt.report.data.adapter.api);
importPackage(Packages.org.eclipse.birt.report.model.api);
importPackage(Packages.org.eclipse.birt.data.engine.api.querydefn);
var myconfig = reportContext.getReportRunnable().getReportEngine().getConfig();
var des = DataRequestSession.newSession(myconfig, new DataSessionContext(3));
var dsrc = reportContext.getDesignHandle().findDataSource("dsrcOficina");
var dset = reportContext.getDesignHandle().findDataSet("dsetOficina");
des.defineDataSource(des.getModelAdaptor().adaptDataSource(dsrc));
des.defineDataSet(des.getModelAdaptor().adaptDataSet(dset));
var paramBinding = new InputParameterBinding("param_1", new ScriptExpression("\""+ params['IDOFICINA'].value +"\"") );
queryDefinition = new QueryDefinition( );
queryDefinition.setDataSetName( "dsetOficina" );
queryDefinition.addInputParamBinding( paramBinding );
queryDefinition.setAutoBinding(true);
var pq = des.prepare( queryDefinition );
var qr = pq.execute( null );
var ri = qr.getResultIterator( );
if ( ri.next( ) )
{
params["Titulo"].value = ri.getString("DESCRIPCION");
}
ri.close( );
qr.close( );
des.shutdown( );

Es importante poner los nombres exactamente igual que en el diseñador.
En nuestro caso, el parámetro “IDOFICINA” es de tipo String, así que lo ingresamos de la siguiente manera


var paramBinding = new InputParameterBinding( "param_1",new ScriptExpression("\""+ params['IDOFICINA'].value +"\"") );

si fuera un Integer tendría que ser de la siguiente manera


var paramBinding = new InputParameterBinding( "param_1",new ScriptExpression(params['IDOFICINA'].value) );

El valor de ScriptExpression debe ser un bloque de javascript válido, cómo si lo ingresaramos en la ventana “ExpressionBuilder” 🙂

Fuentes:
eclipse forums
birt exchange