Buscar este blog

lunes, 22 de diciembre de 2014

Java: XSD to POJO

Se parte de un XSD y se generan las clases Java correspondientes.
Se empleará JAXB.

La herramienta que se usará es xjc, que viene instalada en el directorio \bin de los JDK. Si no se tiene esta ruta dentro del path, simplemente habrá que referenciarla desde una ventana de comandos.


Se necesita un fichero de binding para que se cree una clase por cada elemento del XSD, sino, se generará una única clase pública con clases internas.

Fichero jaxb-binding.xml:

<jaxb:bindings
    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
    version="2.1">
    <jaxb:globalBindings localScoping="toplevel"/>
</jaxb:bindings>


Con esto, sólo hace falta tener el XSD que se quiera mapear, por ejemplo, el famoso employee.xsd:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="employee" type="employee"/>

  <xs:complexType name="employee">
    <xs:sequence>
      <xs:element name="name" type="xs:string" minOccurs="0"/>
      <xs:element name="salary" type="xs:double"/>
      <xs:element name="designation" type="xs:string" minOccurs="0"/>
      <xs:element name="address" type="address" minOccurs="0"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:int" use="required"/>
  </xs:complexType>

  <xs:complexType name="address">
    <xs:sequence>
      <xs:element name="city" type="xs:string" minOccurs="0"/>
      <xs:element name="line1" type="xs:string" minOccurs="0"/>
      <xs:element name="line2" type="xs:string" minOccurs="0"/>
      <xs:element name="state" type="xs:string" minOccurs="0"/>
      <xs:element name="zipcode" type="xs:long"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>


Finalmente, se lanza el comando:

xjc.exe -d . -p es.pruebas.jaxb -b jaxb-binding.xml employee.xsd


martes, 9 de diciembre de 2014

java.lang.NoSuchMethodException: org.objectweb.asm.MethodWriter.visitLabel(org.objectweb.asm.Label)

Seguramente estás usando JBOSS.

El problema es que se están pisando las clases de asm de JBOSS con las incluídas en el lib de la aplicación.

Solución

1) Eliminar que no haya ninguna dependencia de asm en el war. Se puede ver con el Dependency Hierarchy del pom o directamente en el war generado.
Por lo general estas librerías las mete Apache CXF, así que una solución es hacer la siguiente exclusión:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<dependency>
 <groupId>org.apache.cxf</groupId>
 <artifactId>cxf-rt-frontend-jaxws</artifactId>
 <exclusions>
  <exclusion>
   <artifactId>asm</artifactId>
   <groupId>asm</groupId>
  </exclusion>
 </exclusions>
</dependency>

2)Usar el asm de JBOSS.
Hay que incluir la dependencia del módulo asm.asm desde el jboss-deployment-structure (va en el META-INF):


1
2
3
4
5
6
7
<jboss-deployment-structure>
 <deployment>
  <dependencies>
   <module name="asm.asm" />  
  </dependencies>
 </deployment>
</jboss-deployment-structure> 


Hibernate proxy to real object - Hibernate proxy to java POJO

Objetivo

Convertir un objeto persistente, recuperado de base de datos con Hibernate, en un POJO java.
Los objetos Hibernate realmente son proxys que se utilizan, por ejemplo, para la inicialización de cargas vagas.
Cuando se tiene una lista dentro de un objeto de Hibernate, esta lista es un PersistentBag que, en el momento de acceder a ella por primera vez, accede a base de datos para cargarla.
En algunas ocasiones se necesita eliminar la "naturaleza de Hibernate" de un objeto, para quitar esos proxys y convertirlos en objetos reales. Así, a la hora de devolver un objeto en un servicio web o hacia la vista sería conveniente trabajar siempre con POJOs.

Solución

Crear un aspecto que intercepte las salidas de los DAOs y ponga a null los proxys no inicializados
En este código a los DAOs se les llama Fachada.

El aspecto inspecciona por reflexión el objeto devuelto. Revista todas sus propiedades y, si alguna no está inicializada (Hibernate.isInitialized) la setea a null.

Código fuente del aspecto:

 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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
import java.lang.reflect.Field;
import java.util.Collection;

import org.aspectj.lang.ProceedingJoinPoint;
import org.hibernate.Hibernate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Aspecto que elmina la naturaleza de hibernate de un objeto. Se ejectua
 * después del retorno de las fachadas e inspecciona los objetos devueltos
 * convirtiendo los proxys de Hibernate en null.
 *
 * @author Sisifo
 *
 */
public class EliminaHibernateProxysAspect {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    public Object eliminarHibernateProxysAround(final ProceedingJoinPoint pjp) throws Throwable {
        final Object retVal = pjp.proceed();
        inicializarSiEsNecesario(retVal);
        return retVal;
    }

    @SuppressWarnings("rawtypes")
    private Object inicializarSiEsNecesario(Object object) {
        if (object == null) {
            return null;
        }

        if (!Hibernate.isInitialized(object)) {
            return null;
        } else {
            if (object instanceof Collection) {
                return inicializarColeccion((Collection) object);
            } else {
                return inicializarPropiedadesObjeto(object);
            }
        }

    }


    @SuppressWarnings("rawtypes")
    private Collection inicializarColeccion(Collection coleccion) {
        for (Object object : coleccion) {
            inicializarSiEsNecesario(object);
        }

        return coleccion;
    }

    private Object inicializarPropiedadesObjeto(Object object) {
        for (Field field : object.getClass().getDeclaredFields()) {
            if (fieldEsSusceptibleDeInicializarse(field)) {
                field.setAccessible(true);
                try {
                    field.set(object, inicializarSiEsNecesario(field.get(object)));
                } catch (final Exception e) {
                    logger.error("Se ha producido un error al acceder al campo {} del objeto {}", new Object[] { field,
                            object }, e);
                    throw new RuntimeException("Error al acceder a campo", e);
                }
            }
        }

        return object;
    }

    private boolean fieldEsSusceptibleDeInicializarse(final Field field) {
        if (Collection.class.isAssignableFrom(field.getType())) {
            return true;
        }

        if (!claseEsDeTipoBasico(field.getType()) && !clasePertenceALaEspecificiacionJava(field.getType())) {
            return true;
        }

        return false;
    }

    private boolean clasePertenceALaEspecificiacionJava(final Class<?> clase) {
        final String clasePropiedad = clase.getCanonicalName();
        if (clasePropiedad.startsWith("java.") || clasePropiedad.startsWith("javax.")) {
            return true;
        }
        return false;
    }

    private boolean claseEsDeTipoBasico(final Class<?> clase) {
        if (clase.isEnum() || clase.isPrimitive()) {
            return true;
        }
        return false;
    }
}

Fichero de cofiguración aop:


1
2
3
4
5
6
7
8
9
<bean id="eliminaHibernateProxysAspectImpl" class="es.sisifo.simplearchetype.persistencia.aop.EliminaHibernateProxysAspect"/>

<aop:config>
   <aop:pointcut id="fachadePointcut"     expression="execution(* es.sisifo..persistencia..*FacadeImpl.*(..))"/>

  <aop:aspect id="eliminaHibernateProxysAspect" ref="eliminaHibernateProxysAspectImpl">      
    <aop:around pointcut-ref="fachadePointcut" method="eliminarHibernateProxysAround"/>            
 </aop:aspect>           
</aop:config>

domingo, 30 de noviembre de 2014

Primeros pasos Microsoft Project 2010 - First steps Microsoft Project 2010

En este post se describen las tareas básicas para configurar un proyecto de MP 2007 y comenzar a introducir tareas.

Los pasos a seguir son los siguientes.

Configurar gestión de tareas
En las opciones generales del proyecto (File > Options) seleccionar schedule. Ahí hay que actualizar los siguientes campos:

  • New task created: Autoscheduled
  • Default task type: Fixed work


Con esto se consigue que las tareas se vayan organizando automáticamente y que la duración que se introduce sea siempre las horas que se estima que van a dura. De otro modo la duración se especificaría en días, independiente de la jornada laboral existente.


Configurar calendario
Con esto se introduce la jornada laboral del proyecto.
En la barra de tareas principal hay que ir a Project > Change Working Time



Una vez ahí se crea un nuevo calendario (si no se tuviera de proyectos anteriores) con la jornada laboral que se empleará.

Se asigna el nuevo horario en "Work Weeks" pulsando en defaults.


También se pueden añadir las vacaciones en la pestaña Exceptions.


Configurar inicio de proyecto
Con esto se indica cuándo va a comenzar el proyecto, y también se le asigna el calendario que se creó en el paso anterior.

En la barra de tareas principal hay que ir a Project > Project Information




Configurar vista de tareas
Por defecto, en la vista de Gantt Chart, se muestra la duración de la tarea, entre otras cosas. A la hora de planificar lo que suele interesar es introducir el trabajo (horas que va a llevar hacerla) y que MP calcule la duración (en función de los recursos asignados y la jornada laboral, cuántos días va a llevar trabajar esas horas).

Lo que habrá que hacer es borrar esa columna y añadir una de "Work".




Configuración de nivelado de recursos
En algún punto habrá que crear los recursos y asignárselos a cada tarea, incluyendo el tanto por ciento de dedicación al que van estar.

El siguiente paso ya sería generar la planificación en sí, en función de tareas y recursos. Para ello la opción más simple es empleando el "Level Resource" o "Level All".

Antes de esto lo mejor es configurar las opciones de nivelado. Para ello hay que ir a Resoruce > Leveling Options.



Aquí lo que suelo cambiar es:
  • Desmarcar la opción para permitir cambios de asignación en tareas.
  • Desmarcar la opción para permitir separación de tareas
También se puede cambiar el leveling order a ID only. En este caso a la hora de distribuir en el tiempo dos tareas para un mismo recurso se ejecutarán en el orden en el que se hayan introducido en la vista de Gantt.


Información adicional
Para más información sobre como gestionar la distribución de recursos se puede consultar la siguiente página: Simple Tips for Leveling Resources in MS Project

miércoles, 19 de noviembre de 2014

Apache Chemistry Cmis Workbench - proxy

Descubierto por Jacovo ;)

Objetivo
Lanzar el CMIS Workbench de Apache Chemistry configurado para que eacepte un proxy.

Cuando se lanza detrás de un proxy corporativo que requiere autenticación, el workbech no conecta con el gestor documental y se queda colgado.


Solución

Dentro del directorio del workbench, editar el archivo workbench.bat y sustituir la última línea por la siguiente:

start /B javaw -Dhttp.proxyHost=proxy.indra.es -Dhttp.proxyPort=8080 -Dhttp.proxyUser=usuariodelproxy -Dhttp.proxyPassword=passworddelproxy -Dhttp.nonProxyHosts=localhost -Dorg.apache.chemistry.opencmis.binding.webservices.jaxws.impl=sunjre -classpath ".;*" org.apache.chemistry.opencmis.workbench.Workbench

viernes, 14 de noviembre de 2014

Linux Centos Basic SVN Config

Importante:
Esta página ha sido copiada de  http://wiki.centos.org/es/HowTos/Subversion con el único propósito de garantizar que no me pierda.

No es original mía.


Instalación y uso de Subversion para principiantes

Subversion no es solo para codificadores o programadores. Puede ser utilizado para muchas cosas como restaurar la configuración de Nagios, documentos, y casi cualquier cosa basada en texto. Muchas personas se han preguntado por qué no comenzaron a utilizarlo antes. Para ellos, aquí mostramos cómo dar los primeros pasos en Subversion.
Este artículo explica rápidamente como instalar, configurar y usar Subversion localmente. Así como en una red a través de Apache. Para instalaciones y configuraciones más complejas, consulte la documentación que suministramos más abajo. Existe gran cantidad de documentos bien escritos y detallados sobre el tema. Este es solo un comienzo rápido para los que desean aprender algo nuevo.
Sistema
  • CentOS 4.3 Server CD /RHEL 4
  • Subversion 1.1.4
Paquetes y dependencias
  • Subversion: RPM subversion-1.1.4-2.ent
  • Módulo de apache: RPM mod_dav_svn-1.1.4-2.ent
Referencias

1. Instalación

Para nuestro ejemplo vamos a utilizar una instalación mínima del CD Servidor de CentOS 4.3 en una máquina con el VMware Server. Lo primero que necesitamos hacer es instalar los paquetes que mencionamos arriba.
[root@lucifer ~]# yum install mod_dav_svn subversion
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 mod_dav_svn             i386       1.1.4-2.ent      base               50 k
 subversion              i386       1.1.4-2.ent      base              1.6 M
Installing for dependencies:
 apr                     i386       0.9.4-24.5.c4.1  base               88 k
 apr-util                i386       0.9.4-21         base               51 k
 guile                   i386       5:1.6.4-14       base              746 k
 httpd                   i386       2.0.52-22.ent.centos4  base
887 k
 httpd-suexec            i386       2.0.52-22.ent.centos4  base
28 k
 neon                    i386       0.24.7-4         base               86 k
 perl-URI                noarch     1.30-4           base               79 k
 swig                    i386       1.3.21-6         base              1.0 M
 umb-scheme              i386       3.2-35           base              967 k

Transaction Summary
=============================================================================
Install     11 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 5.5 M
Is this ok [y/N]:
Diga si (y) y continúe hacia delante. Probablemente, sus opciones sean diferentes a las mostradas. Esa es la instalación.

2. Configuración

2.1. Apache

Antes de continuar profundizando, necesitamos asegurarnos de que Apache esté correctamente configurado. En nuestro caso asumimos que esto es una instalación virgen de CentOS, de lo contrario si ya tiene Apache trabajando, sea cuidadoso con lo que cambie. También explicaremos cómo configurar la protección básica por contraseña. En los casos que desee permitir el accesopúblico a los repositorios, puede descartar esto.
Lo primero es editar el fichero de configuración de Apache (/etc/httpd/conf/httpd.conf) y realizar los cambios que sean necesarios. Si necesita más ayuda o una configuración más complejas. Por favor consulte la documentación de Apache.
[root@lucifer ~] vim /etc/httpd/conf/httpd.conf -- Edit what you need and save
the file
[root@lucifer ~] service httpd start
[root@lucifer ~] chkconfig httpd on
Busque su computadora en la red y compruebe que pueda ver la página de prueba. Para ello ponga la dirección de su computadora en un navegador web. Ej http://yourserver. Funcionó ? Bien, vamos ahora con algo más divertido.

2.2. Configuración de Apache para Subversion

El próximo paso es configurar algunos detalles en Apache para que Subversion y Apache funcionen juntos cómodamente. Edite el fichero de configuración que Subversion instaló para usted:
[root@lucifer ~] cd /etc/httpd/conf.d/
[root@lucifer ~] vim subversion.conf

# Make sure you uncomment the following if they are commented out
LoadModule dav_svn_module     modules/mod_dav_svn.so
LoadModule authz_svn_module   modules/mod_authz_svn.so

# Add the following to allow a basic authentication and point Apache to where
# the actual
# repository resides.
<Location /repos>
        DAV svn
        SVNPath /var/www/svn/repos
        AuthType Basic
        AuthName "Subversion repos"
        AuthUserFile /etc/svn-auth-conf
        Require valid-user
</Location>
La ubicación (Location) es lo que Apache pasará en la barra de la URL. Por ejemplo: http://yourserver/repos apunta a el SVNPath que usted ha especificado. Nuestro ejemplo es simplemente eso, así que puede tomarse la liberta de poner las cosas donde desee. Asegúrese de salvar el fichero cuando haya terminado de editarlo.
A continuación tenemos que crear el fichero de contraseña que usted especificó en el paso anterior. Inicialmente utilizará el argumento -cm. Esto creará un fichero y encriptará la contraseña con MD5. Si usted necesita adicionar más usuarios, después de la creación inicial, asegúrese de haber utilizado solo la bandera -m y no -c.
[root@lucifer ~] htpasswd -cm /etc/svn-auth-conf yourusername
New password:
Re-type new password:
Adding password for user yourusername
[root@lucifer ~] htpasswd -m /etc/svn-auth-conf anotherusername
New password:
Re-type new password:
Adding password for user anotherusername
[root@lucifer ~] service httpd restart

2.3. Configurando su repositorio

Lo siguiente que necesitamos hacer es crear el repositorio actual en el cual comprobaremos las entradas y salidas a sus ficheros. Esto es simple de hacer con algunas de las herramientas incluidas en svn.
[root@lucifer ~] cd /var/www/ -- Or wherever you placed your path above
[root@lucifer ~] mkdir svn
[root@lucifer ~] cd svn
[root@lucifer ~] svnadmin create repos
[root@lucifer ~] chown -R apache.apache repos
[root@lucifer ~] service httpd restart
Luego comprobamos si se pude o no acceder al repositorio creado desde el navegador web: http://yourserver/repos. Usted debe recibir un pop-up preguntándole su nombre de usuario y contraseña. De ser así, escriba sus credenciales y debe recibir como respuesta una página con el texto Revision 0:/. De ser así, esa es la configuración del repositorio.
Si desea múltiples repositorios, lea la documentación que suministramos en los enlaces de arriba. En nuestro ejemplo solo configuramos un repositorio para mostrarle como comenzar a usarlo. Hablando de ello, a continuación vamos a ver como hacer exactamente eso.

3. Usando Subversion

3.1. Preparando su repositorio

Si todo lo que hicimos arriba le resultó bien, ahora estamos listos para comenzar a utilizar el repositorio que acabamos de crear. La herramienta svn de Subversion es un cliente de línea de comando que usaremos para hablarle a la base de datos. Para ver el uso de la herramienta svn, utilice la opción --help:
[root@lucifer ~] svn --help
Los argumentos más comunes que seguramente utilizará son: svn import, `svn checkout (co)svn commit (ci)`. Con estos usted importará inicialmente los ficheros hacia el interior de su repositorio, comprobará los trabajos realizados en ellos y aplicará los cambios de regreso a la base de datos. Es bastante sencillo una vez que los utilice varias veces.
Antes de continuar, vamos a explicar sobre la preparación de la estructura de directorios. Casi todas las documentaciones hablan sobre crear una cierta organización para sus directorios. Especialmente se menciona la existencia de branches, tags y trunk bajo la estructura del directorio raíz, donde trunk contiene todos los ficheros. Por ejemplo:
.
|-- project1
|   |-- branches
|   |-- tags
|   `-- trunk
`-- project2
    |-- branches
    |-- tags
    `-- trunk
En el libro se explica el por qué con un poco más de detalles. Para nuestro ejemplo no nos resulta incomodo utilizar este tipo de disposición porque no estamos codificando o manteniendo proyectos de software. Nuestro objetivo principal es almacenar ficheros de configuración y elementos de texto que no son complejos. Usted puede ajustar esto a sus necesidades.
Para continuar con nuestro ejemplo, vamos a crear algunos directorios y ponerles algunos ficheros adentro. Esto lo hacemos localmente en el servidor svn actual.
[root@lucifer ~] cd /tmp
[root@lucifer ~] mkdir mytestproj
[root@lucifer ~] cd mytestproj
[root@lucifer ~] mkdir configurations options main
[root@lucifer ~] vim configurations/testconf1.cfg -- Add whatever you want to
these files.
[root@lucifer ~] vim options/testopts1.cfg
[root@lucifer ~] vim main/mainfile1.cfg
Recuerde que usted puede crear la disposición de directorios que estime conveniente. Una vez que tenga la disposición inicial de lo que usted desea, es hora de importarla a Subversion.

3.2. Importando

[root@lucifer ~] svn import /tmp/mytestproj/
file:///var/www/svn/repos/mytestproj -m "Initial repository layout for
mytestproj"
Adding         /tmp/mytestproj/main
Adding         /tmp/mytestproj/main/mainfile1.cfg
Adding         /tmp/mytestproj/configurations
Adding         /tmp/mytestproj/configurations/testconf1.cfg
Adding         /tmp/mytestproj/options
Adding         /tmp/mytestproj/options/testopts1.cfg

3.3. Comprobando

Ahora comprobamos el resultado a través del navegador web. Ej. http://yourserver/repos. Lea con cuidado el resultado que se muestra, debe coincidir con lo que usted importó. Una vez que suba la disposición original al servidor svn esta quedará disponible para ser usada remotamente desde otra computadora, por tanto tiempo como esté conectado a el servidor de Subversionmediante alguna de las cuentas de usuario que creo anteriormente. Veamos un ejemplo:
[me@mylappy ~] cd /tmp
[me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj
Authentication realm: &lt;http://yoursvnserver:80&gt; Subversion repos
Password for 'youruser':
A    mytestproj/main
A    mytestproj/main/mainfile1.cfg
A    mytestproj/configurations
A    mytestproj/configurations/testconf1.cfg
A    mytestproj/options
A    mytestproj/options/testopts1.cfg
Checked out revision 1.

3.4. Editar y aplicar

Como acabamos de ver, se ha comprobado la revisión 1 desde el servidor Subversion. Ahora podemos editar algunas cosas y aplicar los cambios de regreso al servidor Subversion.
[me@mylappy ~] cd mytestproj
[me@mylappy ~] vim configurations/testconf1.cfg -- Add or delete something and
save.
[me@mylappy ~] svn commit -m "Added a line to testconf1.cfg."
Sending        configurations/testconf1.cfg
Transmitting file data .
Committed revision 2.
Lo agradable de esto es que podemos eliminar todo el directorio que acabamos de confirmar. De hecho, la única razón por la que confirmamos fue para editar el contenido y luego ponerlo de regreso en línea. Explore su servidor web para comprobar la diferencia de los ficheros.

3.5. Adicionando y borrando elementos

Hasta ahora todo bien, pero cómo adicionamos más ficheros a directorios existentes en el repositorio ? Fácil, con el argumento add. Siga adelante y compruebe la última versión de su repositorio, copie un fichero a el directorio con add. Luego confirme los cambios con commit.
[me@mylappy ~] svn co http://yoursvnserver/repos/mytestproj
A    mytestproj/main
A    mytestproj/main/mainfile1.cfg
A    mytestproj/configurations
A    mytestproj/configurations/testconf1.cfg
A    mytestproj/options
A    mytestproj/options/testopts1.cfg
Checked out revision 2.

[me@mylappy ~] cd mytestproj
[me@mylappy ~] cp /etc/yum.repos.d/CentOS-Base.repo configurations/
[me@mylappy ~] svn add configurations/CentOS-Base.repo
A         configurations/CentOS-Base.repo

[me@mylappy ~] svn commit -m "Added the CentOS Yum repo file."
Adding         configurations/CentOS-Base.repo
Transmitting file data .
Committed revision 3.
Para eliminar elementos simplemente use delete en lugar de add. Aplique los cambios de regreso y estarán listos para continuar. Es tan simple como eso. Regrese nuevamente a su navegador web y notará que el número de revisión ahora debe ser 3. Usted podrá hacer clic en los ficheros y seleccionar los directorios de la misma forma.

3.6. Revertiendo

Ok, todo esto está muy bien pero cómo revertimos los cambios a una versión anterior ... a caso no es esto el punto de Subversion ?
Sí, así es.
Si está inseguro de la versión en la que se encuentra ... pruebe el comando log. Esta es la razón por la cual usted puso un mensaje dentro de cada confirmación, corto y preciso, pero suficiente información para hacerle recordar.
[me@mylappy ~] svn log http://yoursvnserver/repo -- For the entire repository
[me@mylappy ~] svn log http://yoursvnserver/repo/mytestproj -- For the
specific project
Esto devolverá una lista completa con números de revisiones y comentarios. Como mencionamos más arriba, esto nos permite seleccionar la revisión a la que deseamos regresar.
[me@mylappy ~] svn co -r 1 http://yoursvnserver/repo/mytestproj
Este comando lo llevará a la revisión número 1.

4. Listas de control de acceso

Usualmente, no es necesario que todos los usuarios tengan acceso a todos los repositorio. Usando las ACLs, podemos restringir el acceso a los repositorios por usuario. Las ACLs pueden ser habilitadas en el fichero especificado en la opción AuthzSVNAccessFile la cual toma el nombre de un fichero como su parámetro. Por ejemplo:
AuthzSVNAccessFile /etc/svn-acl-conf
Usted puede adicionar lo siguiente a la sección Location del fichero /etc/httpd/conf.d/subversion.conf:
<Location /repos>
        DAV svn
        SVNParentPath /var/www/svn/repos
        AuthzSVNAccessFile /etc/svn-acl-conf
        AuthType Basic
        AuthName "Subversion repos"
        AuthUserFile /etc/svn-auth-conf
        Require valid-user
</Location>
Cree el fichero /etc/svn-acl-conf. Este fichero está formado por secciones de la forma siguiente:
[reponame:repopath]
user = access
Donde access puede ser r (lectura), rw (lectura y escritura), o dejarlo vacío para ningún acceso. La ACL por defecto niega el acceso de los usuarios al repositorio. Suponga que existe un repositorio nombrado framework al cual le gustaría dar permisos de lectura al usuario jhon y a joe de lectura y escritura. Para esto puede adicionar las secciones siguientes:
[framework:/]
john =  r
joe = rw
Además, es posible crear grupos en una sección llamada groups. Los grupos son prefijados con el símbolo arroba (@) en la lista de control de acceso. Por ejemplo:
[groups]
staff = joe, george

[framework:/]
john =  r
@staff = rw
Si prefiere hacer accesibles todos los repositorios por todos los usuarios, puede adicionar una sección para el directorio raíz de cada repositorio.
[/]
* = r

5. Conclusión

Este artículo ha sido solo una pequeña muestra del poder que puede ofrecernos Subversion. Esta guía rápida nos pone en camino y muestra cómo usarlo, un poco para entender como funciona. Usted puede hacer cualquier cosa con las herramientas de Subversion, así que asegúrese de leer los documentos para comprender las diferentes opciones que puedan ayudarlo en sus tareas.
Recuerde que aunque la instalación de Apache puede estar capacitada para sus necesidades, puede utilizar todas las herramientas de Subversion localmente en una computadora si especifica el camino al repositorio de la forma file:///path/to/repo, en vez de la forma (http://yoursvnserver/repos/whatever) que utilizamos en nuestros ejemplos con Apache.
Subversion parece ser una alternativa que muchas personas utilizan en sus computadoras locales para mantener proyectos y ficheros de configuración.

Buena Suerte!!!