La multitenencia (multitenancy en inglés) te permite desplegar una
aplicación una vez y esta única aplicación puede servir a varias empresas
al mismo tiempo, cada una con sus propios datos. Esto es perfecto para
SaaS (Software como Servicio), así puedes desplegar tu aplicación en la
nube y alquilarla a muchos clientes. También es muy útil para hacer
aplicaciones multimunicipio para las administraciones públicas (como las
diputaciones en España). Incluso si no estás interesado en hacer
aplicaciones multiempresa tener conjuntos de datos aislados puede ser
interesante para muchas cosas, como tener una base de datos de producción
y otra de pruebas sin esfuerzo.
XavaPro
incluye soporte de multiempresa y multimunicipio.
Crear
una nueva organización
Para soportar multiempresa XavaPro usa organizaciones. Encontrarás el
módulo Organizaciones en la carpeta Admin. Este módulo te permite crear
una nueva organización simplemente especificando su nombre y pulsando un
botón:
Después de pulsar el botón "Crear nueva organización" la nueva
organización está lista para ser usada en la URL especificada. El proceso
de creación crea un esquema nuevo en la base de datos, todas las tablas de
la aplicación y llena las tablas de administración con los datos
iniciales. Desde v6.1 las carpetas, roles y permisos para la nueva
organización se copian desde la organización raíz.
Puedes ir a la URL de la nueva empresa (/TuAplicacion/o/TuEmpresa)
directamente o bien a la URL de la aplicación (/TuAplicacion). En este
último caso el formulario de identificación pregunta por la empresa usando
un combo:
Cada organización tiene sus propios usuarios, contraseñas, roles y
permisos, por supuesto.
Personalización
La sintaxis para crear y eliminar esquemas depende de tu base de datos.
Puedes especificar la sintaxis para tu base de datos con las propiedades
createSchema
y
dropSchema (nueva en v5.7.1) en
naviox.properties:
# Multiempresa: Sólo disponible en XavaPro (http://www.openxava.org/xavapro)
# La sentencia para crear el esquema al crear una nueva organización
# Esta es la de por defecto
createSchema=CREATE SCHEMA ${schema}
# Estas son por base de datos, puedes añadir la tuya usando el nombre de la base de datos
# como sufijo (realmente la primera palabra de connection.getMetaData().getDatabaseProductName())
createSchema.PostgreSQL=CREATE SCHEMA ${schema}
createSchema.HSQL=CREATE SCHEMA ${schema} AUTHORIZATION DBA
# La sentencia para eliminar el esquema al crear eliminar una organización
# Esta es la de por defecto
dropSchema=DROP SCHEMA ${schema} CASCADE
# Estas son por base de datos, puedes añadir la tuya usando el nombre de la base de datos
# como sufijo (realmente la primera palabra de connection.getMetaData().getDatabaseProductName())
dropSchema.MySQL=DROP SCHEMA ${schema}
Si quieres hacer
personalizaciones adicionales, como llenar las tablas de la aplicación,
crear algunos roles y usuarios iniciales, dar una estructura específica a
los módulos y carpetas, etc. puedes definir tu propia accion para crear la
organización. La acción original para crear una nueva organización es
createNewOrganization
en el controlador
Organization definido en
Addons/xava/controllers.xml.
Por lo tanto, para definir tu propia acción para crear una nueva
organización has de definir un módulo
Organization en tu
aplicación y asignarle tu propio controlador con tu propia acción.
Primero, añade el módulo Organization
a tu aplicacion.xml:
<modulo nombre="Organization">
<modelo nombre="Organization" />
<controlador nombre="MiOrganizacion" />
</module>
Después añade tu controlador MiOrganizacion
a tu controladores.xml:
<controlador nombre="MiOrganizacion">
<hereda-de controlador="Organization"/>
<accion nombre="createNewOrganization" modo="detail" cuesta="true"
clase="com.tuempresa.tuaplicacion.acciones.CrearMiOrganizacionNueva"/>
</controlador>
Finalmente escribe el código
para tu acción CrearMiOrganizacionNueva:
package com.tuempresa.tuaplicacion.acciones;
import com.openxava.naviox.actions.*;
public class CrearMiOrganizacionNueva extends CreateNewOrganizationAction {
public void execute() throws Exception {
super.execute(); // Esto crea la nueva organización
// AQUÍ TU PROPIO CÓDIGO PARA REFINAR LA NUEVA ORGANIZACIÓN
}
}
Fíjate como extendemos CreateNewOrganizationAction
que contiene la lógica original para crear una nueva organización.
Puedes ocultar el combo con la lista de organizaciones en el momento de la
identificación con la siguiente entrada en
naviox.properties (nuevo
en v5.6):
showOrganizationOnSignIn=false
También tienes la opción de usar un campo de texto simple en lugar de un
combo para introducir el nombre de la organización, de esta manera el
usuario no tiene acceso a la lista de todas las organizaciones. Añade la
siguiente entrada en
naviox.properties (nuevo en v6.3):
showListOfOrganizationsOnSignIn=false
JDBC
dentro de las organizaciones (nuevo en v5.6)
El código JPA o Hibernate (Hibernate a partir de v5.6) en tus acciones,
calculadores, entidades, etc. va contra el esquema correcto para la
organización actual, sin embargo es no es el caso para JDBC. Si quieres
que tu código JDBC vaya contra el esquema de la organización actual has de
añadir la siguiente entrada en
xava.properties:
connectionRefinerClass=com.openxava.naviox.util.SetCatalogFromPersistenceSchemaConnectionRefiner
Esto funciona para bases de datos donde catálogo y esquema son sinónimos,
como MySQL.
Usuarios
compartidos entre organizaciones (nuevo en v5.6)
Cuando usas multiempresa con XavaPro cada empresa tiene su propio grupo de
usuarios totalmente independiente de las otras organizaciones. Esto está
bien para muchos casos, sin embargo en algunas aplicaciones se necesita
tener el mismo grupo de usuarios para todas las organizaciones. Puedes
configurar tu aplicación para funcionar de esta manera, simplemente marca
la opción correspondiente en el módulo de configuración:
Con "Usuarios compartidos" activados los usuarios y contraseñas para todas
las organizaciones son los de la aplicación raíz. Has de crear los
usuarios en la aplicación raíz solamente y cuando estos usuarios traten de
acceder a una organización tendrán la posibilidad de unirse:
Hay un rol
joined en cada organización para definir los permisos
de estos usuarios.
Cuando el usuario se identifica con "Usuarios compartidos" activado, la
lista de sus organizaciones se muestra para que pueda escoger:
El usuario puede ir a cualquiera de sus organizaciones sin necesidad de
identificarse de nuevo.
Tema
visual por organización (nuevo en v6.4)
Puedes asignar un estilo visual diferente a cada organización. Para ello,
ve al módulo Organizaciones y edita una organización. Allí tienes una
propiedad llamada
tema con un combo para elegir entre los temas
disponibles, así:
Elige uno y pulsa Modificar,
luego la organización usará ese tema sin posibilidad de cambiarlo por el
usuario. Si no se define un tema para una organización, todos los temas
estarán disponibles para ser elegidos por el usuario en esa
organización.
Todos los temas disponibles se
definen en xava.properties con la propiedad themes, de
esta manera::
themes=terra.css, light.css, dark.css, black-and-white.css, blue.css