Estos son mis principios. Si a usted no le gustan, tengo otros

Maven. Forzar la codificación del código fuente

Posted: June 24th, 2010 | Author: Edu | Filed under: Java, Maven, Tools | No Comments »
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Modificar el fichero pom.xml. En la propiedad project.build.sourceEncoding indicar la codificación que tenga el código fuente.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<project>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Instalación rápida de Subversion en Linux (APT)

Posted: June 24th, 2010 | Author: Edu | Filed under: Linux, Tools, VCS | No Comments »
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Instalar subversion:

# sudo apt-get install subversion

Crear la ruta /var/svn:

# mkdir /var/svn

Instalar apache2 y libapache2-svn:

# sudo apt-get install apache2 libapache2-svn

Crear el fichero /etc/subversion/passwd y añadir el primer usuario:

# htpasswd -c /etc/subversion/passwd user_name

Para añadir el resto de usuarios:

# htpasswd -c /etc/subversion/passwd user_name

Editar /etc/apache2/mods-enabled:

<Location /svn>
  DAV svn
  SVNParentPath /var/svn
  AuthType Basic
  AuthName "Subversion Repository"
  AuthUserFile /etc/subversion/passwd
  <LimitExcept GET PROPFIND OPTIONS REPORT>
    Require valid-user
  </LimitExcept>
</Location>

Crear los repositorios de subversion:

# svnadmin create /var/svn/repo
# chown -R www-data /var/svn/repo

Reiniciar apache2:

# /etc/init.d/apache2 restart

Crear la estructura de directorios TTB (Trunk, Tags, Branches):

# svn mkdir http://localhost/svn/repo/trunk  -m "Creating trunk"
# svn mkdir http://localhost/svn/repo/tags  -m "Creating tags"
# svn mkdir http://localhost/svn/repo/branches  -m "Creating branches"
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Spring MVC y Spring Security

Posted: June 13th, 2010 | Author: Edu | Filed under: Code, Java, Spring, Spring MVC | Tags: , , , | No Comments »
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

En este post voy a explicar cómo proteger una aplicación Spring MVC utilizando el módulo Spring Security. Se trata de una guía muy ràpida y para nada seria. Se parte de la base de que tenemos un proyecto web Maven recien generado :-)

Dependencias a añadir al fichero pom.xml de Maven.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring</artifactId>
            <version>2.5.6.SEC01</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>2.5.6.SEC01</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-core</artifactId>
            <version>2.0.5.RELEASE</version>
            <type>jar</type>
            <scope>compile</scope>
        </dependency>

Modificaciones de /WEB-INF/web.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
    <!-- Listener que inicializa el contexto de Spring -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- Ubicación del fichero de configuración de Spring -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>
    <!-- Dispatcher Servlet -->
    <servlet>
        <servlet-name>springapp</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>springapp</servlet-name>
        <url-pattern>*.htm</url-pattern>
    </servlet-mapping>
    <!-- Filtro de Spring Security que intercepta las llamadas a las URL de
         la aplicación -->
    <filter>
        <filter-name>springSecurityFilterChain</filter-name>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>springSecurityFilterChain</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

Contenido de /WEB-INF/applicationContext.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:security="http://www.springframework.org/schema/security"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/security
        http://www.springframework.org/schema/security/spring-security-2.0.4.xsd">
 
    <!-- Configuración del acceso a las diferentes URL de la aplicación en función del
         rol del usuario. En este caso toda la aplicación está protegida y se requiere
         de un usuario con rol ROLE_USER para acceder -->
    <security:http auto-config="true">
        <security:intercept-url pattern="/**" access="ROLE_USER" />
    </security:http>
 
    <!-- Algunos usuarios de prueba. Posteriormente podremos cambiar el servicio para
         que vaya a buscar la información de los usuarios a otro lugar (BBDD) -->
    <security:authentication-provider>
        <security:user-service>
            <security:user name="admin" password="admin" authorities="ROLE_USER, ROLE_ADMIN" />
            <security:user name="user1" password="user1" authorities="ROLE_USER" />
            <security:user name="user1" password="user1" authorities="ROLE_USER" />
        </security:user-service>
    </security:authentication-provider>
 
</beans>

Una vez hecho esto, al acceder a cualquier recurso de la aplicación se nos mostrará la pantalla de login por defecto de Spring Security. Otro día veremos cómo personalizar esta página de login. Os dejo con una captura de la página:

Un saludo

VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Pair Programming

Posted: June 6th, 2010 | Author: Edu | Filed under: Agile, Best-Practices, Code, Opinion, XP | Tags: , , , , | 5 Comments »
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

¿Por qué no se practica pair-programming (programación por parejas) en las empresas?

Las ventajas, pensándolo detenidamente 5 minutos saltan a la vista:

  • Cuatro ojos ven más que dos. Esto es evidente. El código generado es de mucha más calidad.
  • El hecho de que alguien supervise directamente nuestro trabajo (nuestra pareja de programación) influye en que nos esforcemos más.
  • Dos personas comparten la responsabilidad de una tarea. El stress es menor.
  • Mejora las relaciones de equipo.
  • Amplifica la transmisión del conocimiento.

La excusa para no utilizarla que siempre he escuchado es la misma:

“¿Cómo voy a tener a dos personas haciendo una tarea cuando podría hacerla una única persona?”.

Normalmente esta gente suele ser la misma que ve a los programadores, no como una persona o un profesional, sino como un gasto en la cuenta de su proyecto y mi consejo: alejate de esta gente como de la peste ;)

VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Integración rápida de Maven con Hudson y Archiva

Posted: June 5th, 2010 | Author: Edu | Filed under: Archiva, Continuous-Integration, Hudson, Java, Maven, Tools | Tags: , , , , , | No Comments »
VN:F [1.9.2_1090]
Rating: 0.0/5 (0 votes cast)

Supongamos que tenemos un proyecto dividido en varios módulos de funcionalidad y que cada módulo de funcionalidad genera un artefacto. Por ejemplo:

  • core.jar: Almacena la lógica de negocio común.
  • web.war: Aplicación web que hace uso de la lógica de negocio (utiliza core.jar).

Cada vez que modificamos la lógica de negocio subiendo código al gestor de versiones y se genere un artefacto core.jar queremos que se genere un nuevo artefacto web.war que incluya las modificaciones de el primero. Esto lo podemos conseguir fácilmente con Hudson, Maven y Archiva. Partimos de la base que tenemos el servidor Hudson montado y que tenemos dos proyectos definidos “core” y “web”. Ambos proyectos funcionan con Maven.

Instalación y arranque rápido de Apache archiva:

  • Descargar y descomprimir Apache Archiva en la máquina que vaya a hacer de servidor de repositorios Maven. En mi caso es la misma máquina dónde se encuentra Hudson.
  • Ejecutar Apache Archiva:
# $ARCHIVA_HOME/bin/archiva console
  • Definir los repositorios que consideremos oportunos y usuarios con perfil “Repository Manager”. En mi caso trabajaré con el repositorio “snapshots” que viene definido por defecto.

Configuración Maven:

  • Editar el fichero pom.xml de todos los proyectos y añadir el repositorio archiva:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<repositories>
	...
	<repository>
		<id>archiva.snapshots</id>
		<url>http://localhost:8081/archiva/repository/snapshots/</url>
		<releases>
			<enabled>false</enabled>
		</releases>
		<snapshots>
			<enabled>true</enabled>
		</snapshots>
	</repository>
	...
</repositories>
  • Editar el fichero pom.xml del proyecto web y añadir la dependencia al proyecto core, por ejemplo:
1
2
3
4
5
<dependency>
	<groupId>com.sourcerebels</groupId>
	<artifactId>core</artifactId>
	<version>0.0.1-SNAPSHOT</version>
</dependency>
  • Editar el fichero de configuración de Maven (settings.xml):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<servers>
	...
	<server>
		<id>archiva.internal</id>
		<username>usuario_archiva</username>
		<password>password_archiva</password>
	</server>
	<server>
		<id>archiva.snapshots</id>
		<username>usuario_archiva</username>
		<password>password_archiva</password>
	</server>
	...
</servers>

Configuración Hudson:

  • Para cada uno de los artefactos del proyecto configuraremos que se despliegue en el repositorio “archiva.snapshots”:

  • Con este punto conseguiremos que cada vez que se genere una nueva versión del fichero core.jar esta se archive en el repositorio Maven. Ahora para que el proyecto web se construya cuando alguno de los snapshots de los que depende sean construidos:




    Esto es todo :-)

    VN:F [1.9.2_1090]
    Rating: 0.0/5 (0 votes cast)