Copiar a algún directorio, y meterlo en path, los scripts de python que se han dejado en el proyecto install del workspace (concretamente install/scripts/svnScripts). Estos scripts realizan en batch algunas tareas con el svn y nuestro workspace que veremos a continuación.
En el archivo svn-utils.py debemos sustituir en la linea 32 las cadenas "USUARIO" y "PASSWORD" por los valores correspondientes a nuestro usuario en el repositorio.
Nota: Los ejemplos se han puesto considerando que la versión de gvSIG cuyo instalador se va a generar es la 1.11.0. Si se va a generar un instalador de una versión posterior, sustitúyase donde aparezca 1.11.0 o 1_11_0 por la versión correspondiente. Si ha cambiado la versión de gvSIG, ahora solamente hay que cambiarla en el archivo package.info del proyecto appgvSIG en las propiedades version y gvSIG-version.
1.- Comunicar a la lista de desarrollo el número de versión y esperar un poco para que suban sus cambios (mirar en el archivo build.number de la extensión actual e incrementarlo en uno )
ejemplo:
Hola, Se va a generar inmediatamente un nuevo build de gvSIG 1.11 para testing. Este build se extraerá del Trunk. Si tenéis algo pendiente, subidlo ya. Saludos.
2.- Quitar el build automatically.
3.- Sincronización con el svn:
svn update *
4.- Hacer clean-all y build all del build.xml de appgvSIG para el workspace (a través de external tools).
5.- Refresh para todo el workspace.
6.- Comprobar que gvSIG arranca y carga lo que esperamos
7.- Ejecutar en consola de shell en el directorio del workspace:
svn update *
para descargar los cambios.
7.1.- Si no hay cambios (esto se mira en la ventana del shell), se pasa al siguiente punto.
7.2.- Si sí los hay, se hace sincronize y se bajan los cambios, y se repite todo desde el punto 4 (clean all y build all) hasta que en este punto no haya cambios.
8.- Ejecutar en consola de shell en el directorio del workspace:
svn-preparar_tag trunk pre_v1_11_0_Build_xxxx
donde xxxx es el el nuevo build number (indicado en el punto 1). Esto hace que se copien los proyectos desde el trunk al tag/tmp_build/ (se realiza remotamente en el servidor sin hacer una copia en local).
9.- Cerrar eclipse
10.- Ejecutar en consola de shell en el directorio del workspace:
svn-sw_ToTmp_workspace
Esto hace un switch para cada uno de los proyectos a la nueva ubicación (tag/tmp_build).
11.- Hacer clean-all y build all del build.xml de appgvSIG para el workspace (a través de external tools). Comprobar que gvSIG arranca y carga lo que esperamos.
12.- Si hay que cambiar etiquetas de distribución (alpha, beta, RC1, ...) o número de versión cambiarlas en el:
install/instalador-gvSIG-lin/installer_files/LEEME (Aquí solo en caso de cambio de número de versión) install/instalador-gvSIG-lin/installer_files/README (Aquí solo en caso de cambio de número de versión) install/instalador-gvSIG-win/installer_files/LEEME.txt (Aquí solo en caso de cambio de número de versión) install/instalador-gvSIG-win/installer_files/README.txt (Aquí solo en caso de cambio de número de versión) install/build.properties (Aquí solo en caso de cambio de número de versión) install/instalador-gvSIG-lin/install_template.xml (appname y appversion. Hay que asegurarse de no dejar espacios y sustituirlos por guiones bajos) install/instalador-gvSIG-win/install_15_template.xml (appname y appversion. Hay que asegurarse de no dejar espacios y sustituirlos por guiones bajos) _fwAndami/theme/andami-theme.xml (en dos sitios) appgvSIG/package.info.
13.- Ahora desde external tools configurations ejecutamos el target make-binary-distribution del build.xml del proyecto appgvSIG . Esto hace que se incremente el build number de gvSIG.
14.- Comprobar que gvSIG arranca y carga lo que esperamos. Comprobar en el about de la aplicación que el build number es el que toca.
15.- Finalmente ejecutamos los siguientes targets del build.xml del proyecto install:
- check,
- linux* y
- windows*
NOTA:
Durante la ejecución de estos dos targets, el proceso se parará y mostrará un cuadro de dialogo con el texto "Instale en este momento las contribuciones externas y después continúe con este proceso. Cuando el instalador pregunte el lugar donde está instalado gvSIG, proporciónele la ruta al directorio prev_install que se ha creado nuevo en el directorio INSTALL de su workspace. ¿Desea continuar ahora?". Si queremos incoporar dichas contribuciones debemos hacerlo ahora:
- Si tenemos paquetes de instalación para Linux los ejecutamos (tanto si estamos ejecutando el target "linux" como el "windows") y le suministramos (como dice el texto) la ruta al directorio prev_install del proyecto install del workspace.
- Si no, copiamos la extensión correspondiente al directorio prev_install/bin/gvSIG/extensiones que se ha creado nuevo en el directorio install de su workspace
Debemos asegurarnos de que se han copiado correctamente los ficheros "package.info" dentro de cada una de las extensiones incorporadas, y que el contenido de ellos es el que corresponde.
Para continuar con el proceso, seleccionamos "Sí" en el desplegable y pulsamos "OK".
Puede ser recomendable la ejecución de estos targets desde línea de comandos:
- ant -f build.xml check Linux - ant -f build.xml check Windowsporque con las modificaciones que se han incorporado para la inclusión de las contribuciones externas, al ejecutarlos desde eclipse, se pierde la salida de la consola y no podremos ver si ha ocurrido algún error posterior a este punto.
16.- Se generan cuatro archivos, dos para windows y dos para linux (con y sin jre).
17.- Instalamos la aplicación para probarla y verificamos que la versión es la correcta (en el menú help/about tiene que figurar el nuevo build number).
18.- Si todo va bien subimos los archivos al servidor ftp de osor dentro de la carperta:
/home/groups/gvsig-desktop/www/downloads/pub/projects/gvSIG-desktop/devel/gvSIG-1_11/gvSIG-1_11_0/XXXX
donde XXXX es el nuevo build number (indicado en el punto 1)
19.- Si hemos cambiado etiquetas de distribución (alpha, beta, etc.) (pto. 12) habrá que subir estos cambios al tag en un solo commit.
20.- Cerrar eclipse.
21.- Ejecutar en consola de shell en el directorio del workspace:
svn-sw_workspace trunk
Esto hace un switch para cada uno de los proyectos a la ubicación original (trunk).
22.- Ejecutar en consola de shell en el directorio del workspace:
svn-merge_workspace_with_tmp_build
Esto hace un merge para cada uno de los proyectos a la ubicación original (trunk).
23.- Hacer commit en el trunk con los cambios que hemos hecho en el tag. El mensaje del commit será v1_11_0_Build_xxxx donde xxxx será el número de build
24.- Desde el svn explorer de eclipse u otra utilidad renombrar el tag tmp_build a v1_11_0_Build_xxxx. El mensaje del commit será v1_11_0_Build_xxxx donde xxxx será el número de build
25.- Crear un ticket de tipo nota en el bugtracking (tomar como plantilla anteriores tickets de este tipo, por ejemplo del build 1305 https://forge.osor.eu/tracker/index.php?func=detail&aid=15259&group_id=89&atid=804). No olvidar en el mismo comentario poner el enlace a las descargas de los binarios.
This document describes a list of coding conventions that are required for code submissions to the project. By default, the coding conventions for most Open Source Projects should follow the existing coding conventions in the code that you are working on. For example, if the bracket is on the same line as the if statement, then you should write all your code to have that convention.
If you commit code that does not follow these conventions and you are caught, you are responsible for also fixing your own code.
Below is a list of coding conventions that are specific to gvSIG, everything else not specificially mentioned here should follow the official Sun Java Coding Conventions
As explained in the Sun Java Coding Conventions:
Code conventions are important to programmers for a number of reasons:
Having coding conventions is nice but having a way to ensure they are applied is even better ... :-)
The gvSIG maven configuration has a checkstyle target which performs coding conventions using the Checkstyle tool.
Please run this target before committing any code.
Also the eclipse configuration needed to format the source code taking into account the code conventions defined in the current document will be available in the org.gvsig.maven.base.build project, from the gvsig-tools OSOR project.
If the project you are working with has a prepare-workspace.xml file which you have used to configure your workspace, you will have those files already downloaded and available into the folder:
WORKSPACE/org.gvsig.maven.base.build/eclipse-configs
Otherwise, you may download all the files through the repository URL:
To import those configurations perform the following:
Headers
Look at the Headers document for more information.
Indentations
4 spaces. NO tabs.
Javadoc
All API interfaces and classes must be fully documented through javadocs comments at interface/class, method and package level.
When you inherit or extend from another interface or class which is already documented, and implement or rewrite one of the parent methods, don't write any javadoc comments, as they are also inherited since java 1.4.
Brackets
All brackets should begin at the end of the line that begins the statement, and end on a new line indented to the beginning of the statement. Example:
AVOID:
public class MyClass
{
public void someMethod()
{
if (...) { // Do something }
}
}
RIGHT:
public class MyClass {
public void someMethod() {
if (...) {
// Do something
}
}
}
Brackets are mandatory even for single line statements:
if (expression) // AVOID!
// some code
if (expression) { // RIGHT
// some code
}
Blank Spaces
Keywords followed by a parenthesis should be separated by a space. Example:
while (true) {
// some code
}
Blank space should appear after commas in argument lists. Binary operators should be separated from their operands by spaces:
a += c + d;
a = (a + b) / (c * d);
while (d++ = s++) {
n++;
}
printSize("size is " + foo + "\n");
Class variables
Class variables should not have any prefix or suffix related to its data type or scope. Example:
String nameString; // AVOID!
String name; // RIGHT
Parameter names
Method parameters should be prefixed by "the" for differentiating them from inner variables, when there is an inner variable with the same name or use. For example:
public void someMethod(String theClassName) {
String className; // inner variable
}
Line length
Avoid lines longer than 80 characters for Code, comments, ...
Versioning
All .java files should have a @version tag like the one below into the class javadoc comment:
@version $Id$
Logging
Do not use System.out to log. Instead, use the SLF4J logging API. For example:
private static final Logger LOG =
LoggerFactory.getLogger(MyClass.class);
public void someMethod() {
LOG.debug("some debug text");
}
For more information on SLF4J usage, you can read the Logging document.
Exception handling
Managing exceptions correctly requires experience. This is not supposed to be a guide on managing exceptions, simply a few best practices.
An example:
public void getTestClass() {
try {
Class responseClass =
Class.forName("some.package.MyClass");
} catch (ClassNotFoundException cnfe) {
String message = "Cannot instantiate test class";
LOG.error(message, ex);
throw new ChainedRuntimeException(message, e);
}
}
Qualified imports
All import statements should containing the full class name of classes to import and should not use the "*" notation: An example:
// AVOID!
import java.util.*;
import java.net.*;
// RIGHT
import java.util.Date;
import java.net.HttpURLConnection;
Use interfaces in the declaration of methods and variables.
By example, if you need a variable x that is a list, declare it as List instead an ArrayList:
// AVOID!
ArrayList x = new ArrayList();
HashMap y = new HashMap();
public HashMap create(ArrayList keys, ArrarList values) {
...
}
// RIGHT
List x = new ArrayList();
Map y = new HashMap();
public Map create(List keys, List values) {
...
}
API packages
Usually, API interfaces and classes will belong to the library's main root package. If you create subpackages, use them to group by functionality, not by type.
How to name packages
All packages must begin with org.gvsig.
For more information on this convention, you can read the How to name packages document.
Attention!
TODO
For more information on this convention, you can read the How to name interfaces and classes document.
La línea 1.X de gvSIG presenta una compatibilidad de código entre las distintas versiónes bastante elevada, con lo que gran parte de la documentación existente para las versiónes 1.0/1.1 y 1.9 puede ser valida para esta versión.
Así pues puede ser útil consultar la documentación de:
En donde puede encontrar documentación sobre parte de la arquitectura válida para la línea 1.X de gvSIG.
Así mismo también pueden serle útiles los documentos aportados por la comunidad de:
The gvSIG subversion repository was moved from its own server at the gvsig.org domain to a server hosted in OSOR during the week of April 12th 2010.
The easiest way is to do a checkout of the project again in a new workspace. However, if we have changes to upload, another option is to change the reference to the subversion server in our own workspace.
At first, we have two options for this:
From eclipse: (for lack of testing) we can use the option Team > Disconnect on a project, and then Team > Share project indicating the new URL to use.
From console: we can use the option of the subversion client svn switch --relocate OLD_URL NEW_URL folder. For example, to migrate the build project of the 2.0 (from the same build project), we'd use:
svn switch --relocate \ https://gvsig.org/svn/gvSIG/branches/v2_0_0_prep/build \ https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/build \ .
All of this, project by project. If we have a unix shell (we are on linux, mac, windows with the cygnus utilities, etc.) we can use the following instructions (including to create a script) to migrate a complete workspace of the gvSIG core:
# Andami svn switch --relocate \ https://gvsig.org/svn/gvSIG/branches/v2_0_0_prep/frameworks/_fwAndami \ https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/frameworks/_fwAndami \ _fwAndami # Root projects for project in build binaries org.gvsig.core.maven.dependencies; do svn switch --relocate https://gvsig.org/svn/gvSIG/branches/v2_0_0_prep/${project} \ https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/${project} \ ${project}; done # Applications for project in app*; do svn switch --relocate https://gvsig.org/svn/gvSIG/branches/v2_0_0_prep/applications/${project} \ https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/applications/${project} \ ${project}; done # Libraries for project in lib*; do svn switch --relocate https://gvsig.org/svn/gvSIG/branches/v2_0_0_prep/libraries/${project} \ https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/libraries/${project} \ ${project}; done # Extensions for project in ext* org.gvsig.symbology; do svn switch --relocate https://gvsig.org/svn/gvSIG/branches/v2_0_0_prep/extensions/${project} \ https://svn.forge.osor.eu/svn/gvsig-desktop/branches/v2_0_0_prep/extensions/${project} \ ${project}; done
The differences between versions 1.X and 2.X are very important in some areas of the application. There are important changes relating to:
In the light of these changes, there is no simple answer to the question What needs to be taken into account when initiating a development in the 1.X line and then later migrating to the 2 line?
The first issue that arises is that compatibility can't be maintained. Upon further reflection, there are some recommendations that can be followed, some more difficult than others. Some of them are listed here and developers will have to decide on their applicability to their projects:
Never modify gvSIG source code. Although this may seem obvious, don't modify the gvSIG code, use it as is. There are extension points in gvSIG that allow you to click on many of the gvSIG features in order to customize them. For those features where this is not available tell us so that we can study them and provide a solution.
Work with a gvSIG installable, not with the source. This is more than just a recommendation. Don't embed the gvSIG source along with your development in its workspace. Rather create a separate workspace for your development when deploying your plugins in a gvSIG installation.
Use maven as a construction mechanism. There is a maven repository for gvSIG version 1.9. If you are able to prepare your project with maven then you should follow the multi-module structure recommended for the gvSIG 2 line.
This is not essential and can be quite difficult if you aren't familiar with maven, but if you intend migrating to the gvSIG 2 line it is worth working towards.
Keep the API implementation and the contributed features separate. Try to find a balance between a monolithic implementation and having several API and implementation libraries. Also try to ensure that dependencies between them are only through the API.
If you want to start making the separation between the API and implementation in the 1.X code, you can use the mechanisms implemented in the org.gvsig.tools library for the gvSIG 2 line as these also work in the 1.X line.
Keep the data access sections within the application's logic during implementation, and try as far as possible to keep track of those parts of the code that access data. When migrating to version 2.X these are the parts of the application that will have to be modified.
Keep the access to controlled geometries in the logic part of the development. Changes in the handling of geometries are important in the 2.X line.
Control and document which parts of the application are saved with the project. Data storage in the project has changed completely and you are now required to declare what will be stored in the project. It is therefore advisable to keep the data storage well-documented in order to faciliate the migration to 2.X projects.
Use the slf4j API as a logging mechanism on the log4j backend. You can find more information on this in the document on Logging.
Use the clonable interface. Use this interface when you have to clone objects and follow the java recommendations for doing so. Never use the project's persistence mechanisms for cloning an object. You can find more information on this in the document on cloning objects.
In general it is a good idea to read the sections on Creating a gvSIG project and Migrating projects to gvSIG 2.0 in the gvSIG 2.0 developers guide.