Index: src/docbook/other/pass/UCS2.xml =================================================================== --- src/docbook/other/pass/UCS2.xml (revision 4358) +++ src/docbook/other/pass/UCS2.xml (working copy) @@ -1,14 +1,14 @@ - +
Nombre del proyecto - Cliente 2 - Especificación de caso de uso - Nombre del caso de uso + Especificaci√≥n de caso de uso - Nombre del caso de uso - Especificación del caso de uso + Especificaci√≥n del caso de uso 22/11/2004 @@ -30,7 +30,7 @@ 22/11/2004 - Primera versión + Primera versi√≥n @@ -39,19 +39,19 @@
Nombre del caso de uso - La siguiente plantilla está pensada para la Especificación de un - Caso de Uso (UCS), que contiene una descripción textual del caso de uso. + La siguiente plantilla est√° pensada para la Especificaci√≥n de un + Caso de Uso (UCS), que contiene una descripci√≥n textual del caso de uso. Este documento puede ser utilizado con una herramienta de control de requerimientos para especificar y marcar los requerimientos dentro de las propiedades del caso de uso. Los diagramas de caso de uso pueden ser desarrollados con una herramienta de modelado visual.
- Descripción breve + Descripci√≥n breve - La descripción ha de resumir de una forma concisa el propósito - del caso de uso. En la mayoría de los casos un párrafo será suficiente - para realizar esta descripción. + La descripci√≥n ha de resumir de una forma concisa el prop√≥sito + del caso de uso. En la mayor√≠a de los casos un p√°rrafo ser√° suficiente + para realizar esta descripci√≥n.
@@ -59,38 +59,38 @@ Flujo de eventos
- Flujo básico: nombre del flujo + Flujo b√°sico: nombre del flujo El caso de uso comienza cuando el actor hace algo. Siempre es un actor en que inicia el caso de uso. El caso de uso describe lo que el actor hace y lo que el sistema hace en respuesta. Se describe en la - forma de un diálogo entre el actor y el sistema. El caso de uso describe - lo que pasa en el sistema, pero no cómo o por qué. Si se intercambia - información, se ha de ser específico acerca de la información que se - pasa hacia y desde el sistema. Por ejemplo, no es muy útil decir que el - actor introduce información de un cliente. Es mejor especificar que el - actor introduce el nombre y la dirección del cliente. Un Glosario de - Términos puede ser útil para mantener la complejidad del caso de uso - dentro de unos márgenes manejables, definiendo cosas como Información - del Cliente en ese glosario para evitar que la especificación del caso + forma de un di√°logo entre el actor y el sistema. El caso de uso describe + lo que pasa en el sistema, pero no c√≥mo o por qu√©. Si se intercambia + informaci√≥n, se ha de ser espec√≠fico acerca de la informaci√≥n que se + pasa hacia y desde el sistema. Por ejemplo, no es muy √∫til decir que el + actor introduce informaci√≥n de un cliente. Es mejor especificar que el + actor introduce el nombre y la direcci√≥n del cliente. Un Glosario de + T√©rminos puede ser √∫til para mantener la complejidad del caso de uso + dentro de unos m√°rgenes manejables, definiendo cosas como Informaci√≥n + del Cliente en ese glosario para evitar que la especificaci√≥n del caso de uso entre demasiado en detalle. Las alternativas simples al flujo del caso de uso pueden ser descritas dentro del propio texto del caso de uso. Si el flujo alternativo puede ser descrito con unas pocas frases, merece la pena incluirlo directamente en el Flujo de Eventos. Si la - alternativa es más compleja, es mejor utilizar el apartado de Flujos + alternativa es m√°s compleja, es mejor utilizar el apartado de Flujos Alternativos para describir el flujo alternativo al completo. A veces - puede ser muy beneficioso incluir gráficos, como por ejemplo partes del - interfaz gráfico, flujos de proceso, etc. De forma similar, para + puede ser muy beneficioso incluir gr√°ficos, como por ejemplo partes del + interfaz gr√°fico, flujos de proceso, etc. De forma similar, para comportamientos dependientes de estado puede ser interesante incluir diagramas de transiciones de estado para clarificar el funcionamiento - del sistema en lugar de páginas y páginas de texto. En cualquier caso, + del sistema en lugar de p√°ginas y p√°ginas de texto. En cualquier caso, se ha de intentar que los elementos utilizado sean perfectamente - entendibles: se trata de clarificar, no de confundir. A continuación se - incluye un ejemplo de especificación de un flujo básico de un caso de + entendibles: se trata de clarificar, no de confundir. A continuaci√≥n se + incluye un ejemplo de especificaci√≥n de un flujo b√°sico de un caso de uso. - Flujo básico + Flujo b√°sico @@ -105,7 +105,7 @@ # - Acción + Acci√≥n # @@ -118,7 +118,7 @@ 1 El actor inicia el caso de uso realizando una - cierta acción. + cierta acci√≥n. 2 @@ -154,7 +154,7 @@ Dato3 - Y solicita cierta acción. + Y solicita cierta acci√≥n. 4 @@ -172,13 +172,13 @@
Flujo alternativo 1 - Las alternativas al flujo más complejas se describen dentro de + Las alternativas al flujo m√°s complejas se describen dentro de este apartado. Los Flujos Alternativos son comportamiento alternativo. Cada flujo alternativo representa un comportamiento alternativo debido - normalmente a excepciones que ocurren en el flujo básico. Pueden ser + normalmente a excepciones que ocurren en el flujo b√°sico. Pueden ser tan largos como sea necesario para describir todos los eventos asociados con el comportamiento alternativo. Cuando un flujo - alternativo finaliza, se continúa con el flujo de eventos básico a no + alternativo finaliza, se contin√∫a con el flujo de eventos b√°sico a no ser que se indique lo contrario.
@@ -197,7 +197,7 @@ # - Acción + Acci√≥n # @@ -210,7 +210,7 @@ 1 El actor inicia el caso de uso realizando una - cierta acción. + cierta acci√≥n. 2 @@ -247,7 +247,7 @@ Dato3 Y solicita cierta - acción. + acci√≥n. 4 @@ -269,14 +269,14 @@
Flujo alternativo 2 - Puede haber, y seguramente habrá, un cierto número de flujos + Puede haber, y seguramente habr√°, un cierto n√∫mero de flujos alternativos en un caso de uso. Es recomendable mantener cada flujo alternativo por separado para aumentar la claridad de la - especificación. El uso de flujos alternativos mejora la legibilidad - del caso de uso, además de prevenir la descomposición de casos de uso - en jerarquías de casos de uso. Hay que recordar que las - especificaciones de casos de uso no son más que descripciones - textuales cuyo principal propósito es documentar el comportamiento de + especificaci√≥n. El uso de flujos alternativos mejora la legibilidad + del caso de uso, adem√°s de prevenir la descomposici√≥n de casos de uso + en jerarqu√≠as de casos de uso. Hay que recordar que las + especificaciones de casos de uso no son m√°s que descripciones + textuales cuyo principal prop√≥sito es documentar el comportamiento de un sistema de una forma clara, concisa y entendible.
@@ -285,63 +285,63 @@
Requerimientos especiales - Un requerimiento especial es típicamente un requerimiento no - funcional específico a un caso de uso, pero que no se puede especificar de - una forma fácil o natural dentro del flujo de eventos del caso de uso. + Un requerimiento especial es t√≠picamente un requerimiento no + funcional espec√≠fico a un caso de uso, pero que no se puede especificar de + una forma f√°cil o natural dentro del flujo de eventos del caso de uso. Ejemplos de estos requerimientos pueden ser requerimientos acerca de - aspectos legales o normativos, estándares de aplicaciones, y atributos de + aspectos legales o normativos, est√°ndares de aplicaciones, y atributos de calidad del sistema a construir, incluyendo usabilidad, fiabilidad, rendimiento o requerimientos de soporte. Adicionalmente, otros requerimientos, como sistemas operativos, entornos, requerimientos de - compatibilidad, y restricciones de diseño, deberían ser capturados en esta - sección. + compatibilidad, y restricciones de dise√±o, deber√≠an ser capturados en esta + secci√≥n.
Requerimiento especial 1 - Descripción del requerimiento + Descripci√≥n del requerimiento
Precondiciones - Una precondición de un caso de uso es el estado en el que el + Una precondici√≥n de un caso de uso es el estado en el que el sistema ha de encontrarse antes de que el caso de uso pueda ser iniciado.
- Precondición 1 + Precondici√≥n 1 - Descripción de la precondición + Descripci√≥n de la precondici√≥n
Poscondiciones - Una poscondición de una caso de uso es una lista de posibles - estados en los que el sistema puede quedar tras la finalización de un caso + Una poscondici√≥n de una caso de uso es una lista de posibles + estados en los que el sistema puede quedar tras la finalizaci√≥n de un caso de uso.
- Poscondición 1 + Poscondici√≥n 1 - Descripción de la poscondición + Descripci√≥n de la poscondici√≥n
Validaciones - Normalmente la interacción entre un actor y el sistema provocará - un intercambio de información entre ambos. En esta sección se puede + Normalmente la interacci√≥n entre un actor y el sistema provocar√° + un intercambio de informaci√≥n entre ambos. En esta secci√≥n se puede especificar los datos obligatorios y las validaciones que el sistema - realizará sobre los datos que el actor ha de proporcionarle para llevar a + realizar√° sobre los datos que el actor ha de proporcionarle para llevar a cabo el caso de uso.
- Validación + Validaci√≥n @@ -359,7 +359,7 @@ Obligatorio - Validación + Validaci√≥n @@ -369,13 +369,13 @@ S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - Dirección + Direcci√≥n - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -383,15 +383,15 @@ S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - Código postal + C√≥digo postal S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -399,15 +399,15 @@ N - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - País + Pa√≠s N - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -415,21 +415,21 @@
- Puntos de extensión + Puntos de extensi√≥n - En esta sección se incluirán los puntos de extensión del caso de - uso. Una extensión a un caso de uso puede verse como un flujo alternativo + En esta secci√≥n se incluir√°n los puntos de extensi√≥n del caso de + uso. Una extensi√≥n a un caso de uso puede verse como un flujo alternativo en el caso de uso con la suficiente entidad y valor proporcionado al actor - como para considerarlo un caso de uso por sí mismo. + como para considerarlo un caso de uso por s√≠ mismo.
- Punto de extensión 1 + Punto de extensi√≥n 1 - Dentro de este apartado se describirá el punto de extensión del - caso de uso, como si de una especificación de caso de uso se tratara. + Dentro de este apartado se describir√° el punto de extensi√≥n del + caso de uso, como si de una especificaci√≥n de caso de uso se tratara. Existe la posibilidad de hacer referencia a otro documento de - especificación de caso de uso, que contenga la especificación completa - del caso de uso utilizado en este punto de extensión. + especificaci√≥n de caso de uso, que contenga la especificaci√≥n completa + del caso de uso utilizado en este punto de extensi√≥n.
\ No newline at end of file Index: src/docbook/other/UCS1.xml =================================================================== --- src/docbook/other/UCS1.xml (revision 4358) +++ src/docbook/other/UCS1.xml (working copy) @@ -1,14 +1,14 @@ - +
Nombre del proyecto - Cliente 1 - Especificación de caso de uso - Nombre del caso de uso + Especificaci√≥n de caso de uso - Nombre del caso de uso - Especificación del caso de uso + Especificaci√≥n del caso de uso 22/11/2004 @@ -30,7 +30,7 @@ 22/11/2004 - Primera versión + Primera versi√≥n @@ -39,19 +39,19 @@
Nombre del caso de uso - La siguiente plantilla está pensada para la Especificación de un - Caso de Uso (UCS), que contiene una descripción textual del caso de uso. + La siguiente plantilla est√° pensada para la Especificaci√≥n de un + Caso de Uso (UCS), que contiene una descripci√≥n textual del caso de uso. Este documento puede ser utilizado con una herramienta de control de requerimientos para especificar y marcar los requerimientos dentro de las propiedades del caso de uso. Los diagramas de caso de uso pueden ser desarrollados con una herramienta de modelado visual.
- Descripción breve + Descripci√≥n breve - La descripción ha de resumir de una forma concisa el propósito - del caso de uso. En la mayoría de los casos un párrafo será suficiente - para realizar esta descripción. + La descripci√≥n ha de resumir de una forma concisa el prop√≥sito + del caso de uso. En la mayor√≠a de los casos un p√°rrafo ser√° suficiente + para realizar esta descripci√≥n.
@@ -59,38 +59,38 @@ Flujo de eventos
- Flujo básico: nombre del flujo + Flujo b√°sico: nombre del flujo El caso de uso comienza cuando el actor hace algo. Siempre es un actor en que inicia el caso de uso. El caso de uso describe lo que el actor hace y lo que el sistema hace en respuesta. Se describe en la - forma de un diálogo entre el actor y el sistema. El caso de uso describe - lo que pasa en el sistema, pero no cómo o por qué. Si se intercambia - información, se ha de ser específico acerca de la información que se - pasa hacia y desde el sistema. Por ejemplo, no es muy útil decir que el - actor introduce información de un cliente. Es mejor especificar que el - actor introduce el nombre y la dirección del cliente. Un Glosario de - Términos puede ser útil para mantener la complejidad del caso de uso - dentro de unos márgenes manejables, definiendo cosas como Información - del Cliente en ese glosario para evitar que la especificación del caso + forma de un di√°logo entre el actor y el sistema. El caso de uso describe + lo que pasa en el sistema, pero no c√≥mo o por qu√©. Si se intercambia + informaci√≥n, se ha de ser espec√≠fico acerca de la informaci√≥n que se + pasa hacia y desde el sistema. Por ejemplo, no es muy √∫til decir que el + actor introduce informaci√≥n de un cliente. Es mejor especificar que el + actor introduce el nombre y la direcci√≥n del cliente. Un Glosario de + T√©rminos puede ser √∫til para mantener la complejidad del caso de uso + dentro de unos m√°rgenes manejables, definiendo cosas como Informaci√≥n + del Cliente en ese glosario para evitar que la especificaci√≥n del caso de uso entre demasiado en detalle. Las alternativas simples al flujo del caso de uso pueden ser descritas dentro del propio texto del caso de uso. Si el flujo alternativo puede ser descrito con unas pocas frases, merece la pena incluirlo directamente en el Flujo de Eventos. Si la - alternativa es más compleja, es mejor utilizar el apartado de Flujos + alternativa es m√°s compleja, es mejor utilizar el apartado de Flujos Alternativos para describir el flujo alternativo al completo. A veces - puede ser muy beneficioso incluir gráficos, como por ejemplo partes del - interfaz gráfico, flujos de proceso, etc. De forma similar, para + puede ser muy beneficioso incluir gr√°ficos, como por ejemplo partes del + interfaz gr√°fico, flujos de proceso, etc. De forma similar, para comportamientos dependientes de estado puede ser interesante incluir diagramas de transiciones de estado para clarificar el funcionamiento - del sistema en lugar de páginas y páginas de texto. En cualquier caso, + del sistema en lugar de p√°ginas y p√°ginas de texto. En cualquier caso, se ha de intentar que los elementos utilizado sean perfectamente - entendibles: se trata de clarificar, no de confundir. A continuación se - incluye un ejemplo de especificación de un flujo básico de un caso de + entendibles: se trata de clarificar, no de confundir. A continuaci√≥n se + incluye un ejemplo de especificaci√≥n de un flujo b√°sico de un caso de uso.
- Flujo básico + Flujo b√°sico @@ -105,7 +105,7 @@ # - Acción + Acci√≥n # @@ -118,7 +118,7 @@ 1 El actor inicia el caso de uso realizando una - cierta acción. + cierta acci√≥n. 2 @@ -154,7 +154,7 @@ Dato3 - Y solicita cierta acción. + Y solicita cierta acci√≥n. 4 @@ -172,13 +172,13 @@
Flujo alternativo 1 - Las alternativas al flujo más complejas se describen dentro de + Las alternativas al flujo m√°s complejas se describen dentro de este apartado. Los Flujos Alternativos son comportamiento alternativo. Cada flujo alternativo representa un comportamiento alternativo debido - normalmente a excepciones que ocurren en el flujo básico. Pueden ser + normalmente a excepciones que ocurren en el flujo b√°sico. Pueden ser tan largos como sea necesario para describir todos los eventos asociados con el comportamiento alternativo. Cuando un flujo - alternativo finaliza, se continúa con el flujo de eventos básico a no + alternativo finaliza, se contin√∫a con el flujo de eventos b√°sico a no ser que se indique lo contrario.
@@ -197,7 +197,7 @@ # - Acción + Acci√≥n # @@ -210,7 +210,7 @@ 1 El actor inicia el caso de uso realizando una - cierta acción. + cierta acci√≥n. 2 @@ -247,7 +247,7 @@ Dato3 Y solicita cierta - acción. + acci√≥n. 4 @@ -269,14 +269,14 @@
Flujo alternativo 2 - Puede haber, y seguramente habrá, un cierto número de flujos + Puede haber, y seguramente habr√°, un cierto n√∫mero de flujos alternativos en un caso de uso. Es recomendable mantener cada flujo alternativo por separado para aumentar la claridad de la - especificación. El uso de flujos alternativos mejora la legibilidad - del caso de uso, además de prevenir la descomposición de casos de uso - en jerarquías de casos de uso. Hay que recordar que las - especificaciones de casos de uso no son más que descripciones - textuales cuyo principal propósito es documentar el comportamiento de + especificaci√≥n. El uso de flujos alternativos mejora la legibilidad + del caso de uso, adem√°s de prevenir la descomposici√≥n de casos de uso + en jerarqu√≠as de casos de uso. Hay que recordar que las + especificaciones de casos de uso no son m√°s que descripciones + textuales cuyo principal prop√≥sito es documentar el comportamiento de un sistema de una forma clara, concisa y entendible.
@@ -285,63 +285,63 @@
Requerimientos especiales - Un requerimiento especial es típicamente un requerimiento no - funcional específico a un caso de uso, pero que no se puede especificar de - una forma fácil o natural dentro del flujo de eventos del caso de uso. + Un requerimiento especial es t√≠picamente un requerimiento no + funcional espec√≠fico a un caso de uso, pero que no se puede especificar de + una forma f√°cil o natural dentro del flujo de eventos del caso de uso. Ejemplos de estos requerimientos pueden ser requerimientos acerca de - aspectos legales o normativos, estándares de aplicaciones, y atributos de + aspectos legales o normativos, est√°ndares de aplicaciones, y atributos de calidad del sistema a construir, incluyendo usabilidad, fiabilidad, rendimiento o requerimientos de soporte. Adicionalmente, otros requerimientos, como sistemas operativos, entornos, requerimientos de - compatibilidad, y restricciones de diseño, deberían ser capturados en esta - sección. + compatibilidad, y restricciones de dise√±o, deber√≠an ser capturados en esta + secci√≥n.
Requerimiento especial 1 - Descripción del requerimiento + Descripci√≥n del requerimiento
Precondiciones - Una precondición de un caso de uso es el estado en el que el + Una precondici√≥n de un caso de uso es el estado en el que el sistema ha de encontrarse antes de que el caso de uso pueda ser iniciado.
- Precondición 1 + Precondici√≥n 1 - Descripción de la precondición + Descripci√≥n de la precondici√≥n
Poscondiciones - Una poscondición de una caso de uso es una lista de posibles - estados en los que el sistema puede quedar tras la finalización de un caso + Una poscondici√≥n de una caso de uso es una lista de posibles + estados en los que el sistema puede quedar tras la finalizaci√≥n de un caso de uso.
- Poscondición 1 + Poscondici√≥n 1 - Descripción de la poscondición + Descripci√≥n de la poscondici√≥n
Validaciones - Normalmente la interacción entre un actor y el sistema provocará - un intercambio de información entre ambos. En esta sección se puede + Normalmente la interacci√≥n entre un actor y el sistema provocar√° + un intercambio de informaci√≥n entre ambos. En esta secci√≥n se puede especificar los datos obligatorios y las validaciones que el sistema - realizará sobre los datos que el actor ha de proporcionarle para llevar a + realizar√° sobre los datos que el actor ha de proporcionarle para llevar a cabo el caso de uso.
- Validación + Validaci√≥n @@ -359,7 +359,7 @@ Obligatorio - Validación + Validaci√≥n @@ -369,13 +369,13 @@ S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - Dirección + Direcci√≥n - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -383,15 +383,15 @@ S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - Código postal + C√≥digo postal S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -399,15 +399,15 @@ N - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - País + Pa√≠s N - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -415,21 +415,21 @@
- Puntos de extensión + Puntos de extensi√≥n - En esta sección se incluirán los puntos de extensión del caso de - uso. Una extensión a un caso de uso puede verse como un flujo alternativo + En esta secci√≥n se incluir√°n los puntos de extensi√≥n del caso de + uso. Una extensi√≥n a un caso de uso puede verse como un flujo alternativo en el caso de uso con la suficiente entidad y valor proporcionado al actor - como para considerarlo un caso de uso por sí mismo. + como para considerarlo un caso de uso por s√≠ mismo.
- Punto de extensión 1 + Punto de extensi√≥n 1 - Dentro de este apartado se describirá el punto de extensión del - caso de uso, como si de una especificación de caso de uso se tratara. + Dentro de este apartado se describir√° el punto de extensi√≥n del + caso de uso, como si de una especificaci√≥n de caso de uso se tratara. Existe la posibilidad de hacer referencia a otro documento de - especificación de caso de uso, que contenga la especificación completa - del caso de uso utilizado en este punto de extensión. + especificaci√≥n de caso de uso, que contenga la especificaci√≥n completa + del caso de uso utilizado en este punto de extensi√≥n.
\ No newline at end of file Index: src/docbook/nested/UCS3.xml =================================================================== --- src/docbook/nested/UCS3.xml (revision 4358) +++ src/docbook/nested/UCS3.xml (working copy) @@ -1,14 +1,14 @@ - +
Nombre del proyecto - Cliente 3 - Especificación de caso de uso - Nombre del caso de uso + Especificaci√≥n de caso de uso - Nombre del caso de uso - Especificación del caso de uso + Especificaci√≥n del caso de uso 22/11/2004 @@ -30,7 +30,7 @@ 22/11/2004 - Primera versión + Primera versi√≥n @@ -39,8 +39,8 @@
Nombre del caso de uso - La siguiente plantilla está pensada para la Especificación de un - Caso de Uso (UCS), que contiene una descripción textual del caso de uso. + La siguiente plantilla est√° pensada para la Especificaci√≥n de un + Caso de Uso (UCS), que contiene una descripci√≥n textual del caso de uso. Este documento puede ser utilizado con una herramienta de control de requerimientos para especificar y marcar los requerimientos dentro de las propiedades del caso de uso. Los diagramas de caso de uso pueden ser @@ -50,11 +50,11 @@ documentos en niveles paralelos.
- Descripción breve + Descripci√≥n breve - La descripción ha de resumir de una forma concisa el propósito - del caso de uso. En la mayoría de los casos un párrafo será suficiente - para realizar esta descripción. + La descripci√≥n ha de resumir de una forma concisa el prop√≥sito + del caso de uso. En la mayor√≠a de los casos un p√°rrafo ser√° suficiente + para realizar esta descripci√≥n.
@@ -62,38 +62,38 @@ Flujo de eventos
- Flujo básico: nombre del flujo + Flujo b√°sico: nombre del flujo El caso de uso comienza cuando el actor hace algo. Siempre es un actor en que inicia el caso de uso. El caso de uso describe lo que el actor hace y lo que el sistema hace en respuesta. Se describe en la - forma de un diálogo entre el actor y el sistema. El caso de uso describe - lo que pasa en el sistema, pero no cómo o por qué. Si se intercambia - información, se ha de ser específico acerca de la información que se - pasa hacia y desde el sistema. Por ejemplo, no es muy útil decir que el - actor introduce información de un cliente. Es mejor especificar que el - actor introduce el nombre y la dirección del cliente. Un Glosario de - Términos puede ser útil para mantener la complejidad del caso de uso - dentro de unos márgenes manejables, definiendo cosas como Información - del Cliente en ese glosario para evitar que la especificación del caso + forma de un di√°logo entre el actor y el sistema. El caso de uso describe + lo que pasa en el sistema, pero no c√≥mo o por qu√©. Si se intercambia + informaci√≥n, se ha de ser espec√≠fico acerca de la informaci√≥n que se + pasa hacia y desde el sistema. Por ejemplo, no es muy √∫til decir que el + actor introduce informaci√≥n de un cliente. Es mejor especificar que el + actor introduce el nombre y la direcci√≥n del cliente. Un Glosario de + T√©rminos puede ser √∫til para mantener la complejidad del caso de uso + dentro de unos m√°rgenes manejables, definiendo cosas como Informaci√≥n + del Cliente en ese glosario para evitar que la especificaci√≥n del caso de uso entre demasiado en detalle. Las alternativas simples al flujo del caso de uso pueden ser descritas dentro del propio texto del caso de uso. Si el flujo alternativo puede ser descrito con unas pocas frases, merece la pena incluirlo directamente en el Flujo de Eventos. Si la - alternativa es más compleja, es mejor utilizar el apartado de Flujos + alternativa es m√°s compleja, es mejor utilizar el apartado de Flujos Alternativos para describir el flujo alternativo al completo. A veces - puede ser muy beneficioso incluir gráficos, como por ejemplo partes del - interfaz gráfico, flujos de proceso, etc. De forma similar, para + puede ser muy beneficioso incluir gr√°ficos, como por ejemplo partes del + interfaz gr√°fico, flujos de proceso, etc. De forma similar, para comportamientos dependientes de estado puede ser interesante incluir diagramas de transiciones de estado para clarificar el funcionamiento - del sistema en lugar de páginas y páginas de texto. En cualquier caso, + del sistema en lugar de p√°ginas y p√°ginas de texto. En cualquier caso, se ha de intentar que los elementos utilizado sean perfectamente - entendibles: se trata de clarificar, no de confundir. A continuación se - incluye un ejemplo de especificación de un flujo básico de un caso de + entendibles: se trata de clarificar, no de confundir. A continuaci√≥n se + incluye un ejemplo de especificaci√≥n de un flujo b√°sico de un caso de uso.
- Flujo básico + Flujo b√°sico @@ -108,7 +108,7 @@ # - Acción + Acci√≥n # @@ -121,7 +121,7 @@ 1 El actor inicia el caso de uso realizando una - cierta acción. + cierta acci√≥n. 2 @@ -157,7 +157,7 @@ Dato3 - Y solicita cierta acción. + Y solicita cierta acci√≥n. 4 @@ -175,13 +175,13 @@
Flujo alternativo 1 - Las alternativas al flujo más complejas se describen dentro de + Las alternativas al flujo m√°s complejas se describen dentro de este apartado. Los Flujos Alternativos son comportamiento alternativo. Cada flujo alternativo representa un comportamiento alternativo debido - normalmente a excepciones que ocurren en el flujo básico. Pueden ser + normalmente a excepciones que ocurren en el flujo b√°sico. Pueden ser tan largos como sea necesario para describir todos los eventos asociados con el comportamiento alternativo. Cuando un flujo - alternativo finaliza, se continúa con el flujo de eventos básico a no + alternativo finaliza, se contin√∫a con el flujo de eventos b√°sico a no ser que se indique lo contrario.
@@ -200,7 +200,7 @@ # - Acción + Acci√≥n # @@ -213,7 +213,7 @@ 1 El actor inicia el caso de uso realizando una - cierta acción. + cierta acci√≥n. 2 @@ -250,7 +250,7 @@ Dato3 Y solicita cierta - acción. + acci√≥n. 4 @@ -272,14 +272,14 @@
Flujo alternativo 2 - Puede haber, y seguramente habrá, un cierto número de flujos + Puede haber, y seguramente habr√°, un cierto n√∫mero de flujos alternativos en un caso de uso. Es recomendable mantener cada flujo alternativo por separado para aumentar la claridad de la - especificación. El uso de flujos alternativos mejora la legibilidad - del caso de uso, además de prevenir la descomposición de casos de uso - en jerarquías de casos de uso. Hay que recordar que las - especificaciones de casos de uso no son más que descripciones - textuales cuyo principal propósito es documentar el comportamiento de + especificaci√≥n. El uso de flujos alternativos mejora la legibilidad + del caso de uso, adem√°s de prevenir la descomposici√≥n de casos de uso + en jerarqu√≠as de casos de uso. Hay que recordar que las + especificaciones de casos de uso no son m√°s que descripciones + textuales cuyo principal prop√≥sito es documentar el comportamiento de un sistema de una forma clara, concisa y entendible.
@@ -288,63 +288,63 @@
Requerimientos especiales - Un requerimiento especial es típicamente un requerimiento no - funcional específico a un caso de uso, pero que no se puede especificar de - una forma fácil o natural dentro del flujo de eventos del caso de uso. + Un requerimiento especial es t√≠picamente un requerimiento no + funcional espec√≠fico a un caso de uso, pero que no se puede especificar de + una forma f√°cil o natural dentro del flujo de eventos del caso de uso. Ejemplos de estos requerimientos pueden ser requerimientos acerca de - aspectos legales o normativos, estándares de aplicaciones, y atributos de + aspectos legales o normativos, est√°ndares de aplicaciones, y atributos de calidad del sistema a construir, incluyendo usabilidad, fiabilidad, rendimiento o requerimientos de soporte. Adicionalmente, otros requerimientos, como sistemas operativos, entornos, requerimientos de - compatibilidad, y restricciones de diseño, deberían ser capturados en esta - sección. + compatibilidad, y restricciones de dise√±o, deber√≠an ser capturados en esta + secci√≥n.
Requerimiento especial 1 - Descripción del requerimiento + Descripci√≥n del requerimiento
Precondiciones - Una precondición de un caso de uso es el estado en el que el + Una precondici√≥n de un caso de uso es el estado en el que el sistema ha de encontrarse antes de que el caso de uso pueda ser iniciado.
- Precondición 1 + Precondici√≥n 1 - Descripción de la precondición + Descripci√≥n de la precondici√≥n
Poscondiciones - Una poscondición de una caso de uso es una lista de posibles - estados en los que el sistema puede quedar tras la finalización de un caso + Una poscondici√≥n de una caso de uso es una lista de posibles + estados en los que el sistema puede quedar tras la finalizaci√≥n de un caso de uso.
- Poscondición 1 + Poscondici√≥n 1 - Descripción de la poscondición + Descripci√≥n de la poscondici√≥n
Validaciones - Normalmente la interacción entre un actor y el sistema provocará - un intercambio de información entre ambos. En esta sección se puede + Normalmente la interacci√≥n entre un actor y el sistema provocar√° + un intercambio de informaci√≥n entre ambos. En esta secci√≥n se puede especificar los datos obligatorios y las validaciones que el sistema - realizará sobre los datos que el actor ha de proporcionarle para llevar a + realizar√° sobre los datos que el actor ha de proporcionarle para llevar a cabo el caso de uso.
- Validación + Validaci√≥n @@ -362,7 +362,7 @@ Obligatorio - Validación + Validaci√≥n @@ -372,13 +372,13 @@ S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - Dirección + Direcci√≥n - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -386,15 +386,15 @@ S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - Código postal + C√≥digo postal S - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -402,15 +402,15 @@ N - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n - País + Pa√≠s N - Validamos este campo mediante tal validación + Validamos este campo mediante tal validaci√≥n @@ -418,21 +418,21 @@
- Puntos de extensión + Puntos de extensi√≥n - En esta sección se incluirán los puntos de extensión del caso de - uso. Una extensión a un caso de uso puede verse como un flujo alternativo + En esta secci√≥n se incluir√°n los puntos de extensi√≥n del caso de + uso. Una extensi√≥n a un caso de uso puede verse como un flujo alternativo en el caso de uso con la suficiente entidad y valor proporcionado al actor - como para considerarlo un caso de uso por sí mismo. + como para considerarlo un caso de uso por s√≠ mismo.
- Punto de extensión 1 + Punto de extensi√≥n 1 - Dentro de este apartado se describirá el punto de extensión del - caso de uso, como si de una especificación de caso de uso se tratara. + Dentro de este apartado se describir√° el punto de extensi√≥n del + caso de uso, como si de una especificaci√≥n de caso de uso se tratara. Existe la posibilidad de hacer referencia a otro documento de - especificación de caso de uso, que contenga la especificación completa - del caso de uso utilizado en este punto de extensión. + especificaci√≥n de caso de uso, que contenga la especificaci√≥n completa + del caso de uso utilizado en este punto de extensi√≥n.
\ No newline at end of file Index: src/docbook/SRS.xml =================================================================== --- src/docbook/SRS.xml (revision 4358) +++ src/docbook/SRS.xml (working copy) @@ -1,14 +1,14 @@ - +
Nombre del proyecto - Cliente - Especificación de requerimientos software + Especificaci√≥n de requerimientos software - Especificación de requerimientos software + Especificaci√≥n de requerimientos software 22/11/2004 @@ -30,27 +30,27 @@ 22/11/2004 - Primera versión + Primera versi√≥n
- Introducción + Introducci√≥n - La introducción del documento de especificación de requerimientos - software [SRS] proporciona una visión general del SRS al completo. Incluye - el propósito, alcance, definiciones, acrónimos, abreviaturas, referencias, - y visión general del SRS. Nota: El SRS captura todos los requerimientos - software de un sistema, o una porción del sistema. A continuación se - incluye un esquema típico para un proyecto utilizando modelado mediante + La introducci√≥n del documento de especificaci√≥n de requerimientos + software [SRS] proporciona una visi√≥n general del SRS al completo. Incluye + el prop√≥sito, alcance, definiciones, acr√≥nimos, abreviaturas, referencias, + y visi√≥n general del SRS. Nota: El SRS captura todos los requerimientos + software de un sistema, o una porci√≥n del sistema. A continuaci√≥n se + incluye un esquema t√≠pico para un proyecto utilizando modelado mediante casos de uso. Este artefacto consta de un paquete conteniendo un conjunto - de casos de uso del modelo de casos de uso, además de especificaciones - adicionales y otra información de soporte aplicable a la porción del - sistema en cuestión. Existen diferentes esquemas aplicables a la - realización de un SRS. Se puede consultar [IEEE93] para un mayor detalle - de estas explicaciones, así como otras opciones en la organización de un + de casos de uso del modelo de casos de uso, adem√°s de especificaciones + adicionales y otra informaci√≥n de soporte aplicable a la porci√≥n del + sistema en cuesti√≥n. Existen diferentes esquemas aplicables a la + realizaci√≥n de un SRS. Se puede consultar [IEEE93] para un mayor detalle + de estas explicaciones, as√≠ como otras opciones en la organizaci√≥n de un SRS. Esto es una prueba de enlaces: @@ -73,33 +73,33 @@
- Propósito + Prop√≥sito - En este apartado se ha de especificar el propósito del documento - de Especificación de Requerimientos Software (SRS). El SRS describe de - forma completa el comportamiento externo de la aplicación o subsistema - identificado. Así mismo describe también requerimientos no funcionales, - restricciones de diseño, y otros factores necesarios para proporcionar - una descripción completa y adecuada de los requerimientos para el + En este apartado se ha de especificar el prop√≥sito del documento + de Especificaci√≥n de Requerimientos Software (SRS). El SRS describe de + forma completa el comportamiento externo de la aplicaci√≥n o subsistema + identificado. As√≠ mismo describe tambi√©n requerimientos no funcionales, + restricciones de dise√±o, y otros factores necesarios para proporcionar + una descripci√≥n completa y adecuada de los requerimientos para el software a desarrollar.
Alcance - Este apartado contiene una breve descripción de la aplicación - software a la que esta Especificación de Requerimientos Software se - aplica, las características o agrupamiento de subsistemas, con que - modelos de casos de uso está asociado, y cualquier otra cosa afectada o + Este apartado contiene una breve descripci√≥n de la aplicaci√≥n + software a la que esta Especificaci√≥n de Requerimientos Software se + aplica, las caracter√≠sticas o agrupamiento de subsistemas, con que + modelos de casos de uso est√° asociado, y cualquier otra cosa afectada o influenciada por este documento.
- Definiciones, acrónimos y abreviaturas + Definiciones, acr√≥nimos y abreviaturas Este apartado proporciona las definiciones de todos los - términos, acrónimos, y abreviaturas requeridas para poder interpretas la - Especificación de Requerimientos Software. Esta información puede ser + t√©rminos, acr√≥nimos, y abreviaturas requeridas para poder interpretas la + Especificaci√≥n de Requerimientos Software. Esta informaci√≥n puede ser proporcionada mediante una referencia al Glosario de proyecto.
@@ -107,41 +107,41 @@ Referencias Este apartado proporciona una lista completa de todos los - documentos referenciados en cualquier lugar de la Especificación de + documentos referenciados en cualquier lugar de la Especificaci√≥n de Requerimientos Software. Estos documentos se han de identificar por - título, número de informe (si es aplicable), fecha, y organización que + t√≠tulo, n√∫mero de informe (si es aplicable), fecha, y organizaci√≥n que lo publica. Se han de especificar las fuentes de las que las referencias - pueden ser obtenidas. Esta información puede ser proporcionada mediante - una referencia a un apéndice o a otro documento. + pueden ser obtenidas. Esta informaci√≥n puede ser proporcionada mediante + una referencia a un ap√©ndice o a otro documento.
- Visión general + Visi√≥n general Este apartado describe lo que contiene el resto del documento de - Especificación de Requerimientos Software y explica como se encuentra + Especificaci√≥n de Requerimientos Software y explica como se encuentra organizado el documento.
- Descripción general + Descripci√≥n general - Esta sección de la Especificación de Requerimientos Software + Esta secci√≥n de la Especificaci√≥n de Requerimientos Software describe los factores generales que afectan al producto y sus - requerimientos. Esta sección no incluye requerimientos específicos. En su + requerimientos. Esta secci√≥n no incluye requerimientos espec√≠ficos. En su lugar, proporciona un background para esos requerimientos, que se definen - en detalle en la sección 3, y hacen su comprensión más fácil. Incluye + en detalle en la secci√≥n 3, y hacen su comprensi√≥n m√°s f√°cil. Incluye cosas como perspectivas del producto, funciones del producto, - características de los usuarios, restricciones, presunciones y + caracter√≠sticas de los usuarios, restricciones, presunciones y dependencias, y subconjuntos de requerimientos.
Resumen del modelo de casos de uso - Este apartado contiene una visión general del modelo de casos de + Este apartado contiene una visi√≥n general del modelo de casos de uso o del subconjunto del modelo de casos de uso aplicable al subsistema - a característica en cuestión. Esto incluye una lista de nombres y + a caracter√≠stica en cuesti√≥n. Esto incluye una lista de nombres y descripciones breves de todos los casos de uso y actores, junto con los correspondientes diagramas y relaciones.
@@ -150,21 +150,21 @@ Presunciones y dependencias Este apartado describe las presunciones en cuanto a - disponibilidad de cualquier característica técnica clave, subsistema o - componente, o cualquier otra presunción relacionada con el proyecto + disponibilidad de cualquier caracter√≠stica t√©cnica clave, subsistema o + componente, o cualquier otra presunci√≥n relacionada con el proyecto sobre las que se puede basar la viabilidad del software descrito en esta - Especificación de Requerimientos Software. + Especificaci√≥n de Requerimientos Software.
- Requerimientos específicos + Requerimientos espec√≠ficos - Esta sección de la Especificación de Requerimientos Software + Esta secci√≥n de la Especificaci√≥n de Requerimientos Software contiene todos los requerimientos software en un nivel de detalle - suficiente para permitir a los desarrolladores diseñar un sistema que + suficiente para permitir a los desarrolladores dise√±ar un sistema que satisfaga estos requerimientos y a los probadores probar que el sistema - satisface estos requerimientos. Con la utilización del modelado basado en + satisface estos requerimientos. Con la utilizaci√≥n del modelado basado en casos de uso, estos requerimientos se capturan en casos de uso con sus correspondientes especificaciones adicionales cuando sea el caso. @@ -172,11 +172,11 @@ Especificaciones de casos de uso En el modelado con casos de uso, los casos de uso normalmente - definen la mayoría de los requerimientos funcionales del sistema, junto + definen la mayor√≠a de los requerimientos funcionales del sistema, junto con algunos requerimientos no funcionales. Para cada caso de uso en el modelo de casos de uso incluido anteriormente, o subconjunto, en este - apartado se ha de incluir, o referir, la especificación del caso de uso - en cuestión. Es importante asegurarse de que cada requerimiento está + apartado se ha de incluir, o referir, la especificaci√≥n del caso de uso + en cuesti√≥n. Es importante asegurarse de que cada requerimiento est√° etiquetado de una forma clara.
@@ -185,22 +185,22 @@ Las especificaciones adicionales capturan requerimientos que no se encuentran incluidos en los casos de uso. Los requerimientos - específicos de estas especificaciones adicionales aplicables a este - subsistema o característica deben ser incluidos aquí y refinados hasta + espec√≠ficos de estas especificaciones adicionales aplicables a este + subsistema o caracter√≠stica deben ser incluidos aqu√≠ y refinados hasta el nivel de detalle necesario para describir el subsistema o - característica. Estos requerimientos pueden ser capturados directamente + caracter√≠stica. Estos requerimientos pueden ser capturados directamente en este documento, o incluirlos en otro documento de Especificaciones - Adicionales, haciendo referencia a él en este punto. Es importante - asegurarse de que cada requerimiento está etiquetado de una forma + Adicionales, haciendo referencia a √©l en este punto. Es importante + asegurarse de que cada requerimiento est√° etiquetado de una forma clara.
- Información de soporte + Informaci√≥n de soporte - La información de soporte hace que la Especificación de - Requerimientos Software sea más fácil de utilizar. Incluye: + La informaci√≥n de soporte hace que la Especificaci√≥n de + Requerimientos Software sea m√°s f√°cil de utilizar. Incluye: @@ -208,17 +208,17 @@ - Índice + √çndice - Apéndices + Ap√©ndices - En esta sección se pueden incluir “storyboards” de casos de uso o - prototipos de interfaz de usuario. Cuando se incluyan apéndices, la - Especificación de Requerimientos Software debe indicar de forma explícita - si estos apéndices se consideran parte de los requerimientos. + En esta secci√≥n se pueden incluir ‚Äústoryboards‚Äù de casos de uso o + prototipos de interfaz de usuario. Cuando se incluyan ap√©ndices, la + Especificaci√≥n de Requerimientos Software debe indicar de forma expl√≠cita + si estos ap√©ndices se consideran parte de los requerimientos.
\ No newline at end of file Index: src/main/java/org/codehaus/mojo/docbook/TransformMojo.java =================================================================== --- src/main/java/org/codehaus/mojo/docbook/TransformMojo.java (revision 4358) +++ src/main/java/org/codehaus/mojo/docbook/TransformMojo.java (working copy) @@ -26,6 +26,8 @@ import java.io.File; import java.net.URI; import java.net.URISyntaxException; +import java.util.HashMap; +import java.util.Map; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; @@ -35,18 +37,28 @@ import org.apache.maven.settings.Settings; /** - * Transforms a set of Docbook files into XHTML output. Currently there is only support for - * XHTML output, though is planned to add all kind of outputs available in the standard - * stylesheets. + * Transforms a set of Docbook files into XHTML and PDF output. * * @author jgonzalez + * @author Lars Trieloff * @goal transform * @description Transform Docbook files into XHTML output */ public class TransformMojo extends AbstractMojo { + private static String XERCES_PARSER_CONFIG = "org.apache.xerces.xni.parser.XMLParserConfiguration"; + + private static String XERCES_XINCLUDE_PARSER = "org.apache.xerces.parsers.XIncludeParserConfiguration"; + private static String XERCES_RESOLVER_CONFIG = "org.apache.xerces.xni.parser.XMLEntityResolver"; + + private static String DOCBOOK_MOJO_RESOVER = "org.codehaus.mojo.docbook.MojoURIResolver"; + + private static String TRANSFORMER_FACTORY_PROPERTY_NAME = "javax.xml.transform.TransformerFactory"; + + private static String TRANSFORMER_FACTORY_CLASS = "org.apache.xalan.processor.TransformerFactoryImpl"; + /** * Directory where the source Docbook files are located. * @@ -57,7 +69,7 @@ /** * Directory where the resource files are located. - * + * * @parameter expression="${basedir}/src/docbook/resources" * @required */ @@ -87,11 +99,108 @@ private String outputEncoding; /** - * Specifies the stylesheet location, useful if you want to use a local copy or a - * specific version instead of the current release from the Internet. + * Specifies the list of desired output formats. Example: + * <outputFormats> <param>xhtml</param> + * <param>pdf</param> </outputFormats> * - * @parameter expression="${stylesheetLocation}" default-value="http://docbook.sourceforge.net/release/xsl/current/" + * @parameter */ + private String[] outputFormats = new String[] { "xhtml", "pdf" }; + /** + *

+ * Specifies a list of customization stylesheets for the specified output + * formats. The default value is to use no customizations, but you can point + * this configuration parameter to your own stylesheets that set parameters + * or override templates. + *

+ *

+ * An example configuration that changes the pdf stylesheet: + *

+ * + *
+     * <customizations>
+     *   <pdf>src/main/resources/docbook2pdf.xsl</pdf>
+     * </customizations>
+     * 
+ * + *

+ * All relative URLs are resolved against resourcePath + *

+ * + * @parameter + */ + private Map customizations = new HashMap(); + + /** + *

+ * Specifies a list of transformation profiles, e.g. + *

+ * + *
+     * <profiles>
+     *  <transformProfile>
+     *    <id>linux</id>
+     *    <os>linux</os>
+     *  </transformProfile>
+     *  <transformProfile>
+     *    <id>windows</id>
+     *    <os>windows</os>
+     *  </transformProfile>
+     *  <transformProfile>
+     *    <id>nonlinux</id>
+     *    <operatingsystems>
+     *      <os>windows</os>
+     *      <os>macosx</os>
+     *    </operatingsystems>
+     *  </transformProfile>
+     * </profiles>
+     * 
+ * + *

+ * This examples creates three profiles: one containing only content marked + * for linux, one containing only content marked for windows and a third + * with content marked for either windows or mac os x. The id element is + * required for each profile, as the resulting files will have the pattern + * $filename.$profile.$ext. You can combine profile conditions e.g. having + * an os element and an arch element in place and you can profile for + * multiple values as shown in the nonlinux profile. + *

+ *

+ * All available filtering elements are: + *

+ *
    + *
  • arch/architectures
  • + *
  • condition/conditions
  • + *
  • conformance/conformances
  • + *
  • lang/languages
  • + *
  • os/operatingsystems
  • + *
  • revision/revisions
  • + *
  • security/securities
  • + *
  • userlevel/userlevels
  • + *
  • vendor/vendors
  • + *
+ *

+ * Additionally there is support for attribute-based filtering, which + * requires the use of attribute and value elements. For more information + * about DocBook profiling, see Chapter 25. + * Profiling (conditional text) in Bob Stayton's DocBook XSL: The + * Complete Guide. + *

+ * + * @parameter + */ + private TransformProfile[] profiles = new TransformProfile[] {}; + + /** + * Specifies the stylesheet location, useful if you want to use a local copy + * or a specific version instead of the current release from the maven + * repository. + * + * @parameter expression="${stylesheetLocation}" + * default-value="resource://net/sourceforge/docbook/" + */ private String stylesheetLocation; /** @@ -118,7 +227,13 @@ System.setProperty( "http.proxyPort", new Integer( activeProxy.getPort() ).toString() ); System.setProperty( "http.nonProxyHosts", activeProxy.getNonProxyHosts() ); } - + + // Set XInclude Xerces parser so we're able to process master olink database file + String xercesParser = System.getProperty( TransformMojo.XERCES_PARSER_CONFIG ); + System.setProperty( TransformMojo.XERCES_PARSER_CONFIG, TransformMojo.XERCES_XINCLUDE_PARSER ); + String entityResolver = System.getProperty( TransformMojo.XERCES_RESOLVER_CONFIG ); + System.setProperty( TransformMojo.XERCES_RESOLVER_CONFIG, TransformMojo.DOCBOOK_MOJO_RESOVER ); + URI stylesheetLocationURI; try { @@ -129,27 +244,59 @@ throw new MojoExecutionException( "Unable to parse stylesheet location " + stylesheetLocation, exc ); } - try +try { - OLinkDBUpdater olinkDBUpdater = new OLinkDBUpdater( log, this.sourceDirectory, this.databaseDirectory, - stylesheetLocationURI ); - olinkDBUpdater.update(); + if ( this.sourceDirectory.exists() ) + { - DocumentTransformer documentTransformer = new DocumentTransformer( log, this.sourceDirectory, - this.resourceDirectory, - this.databaseDirectory, - this.outputDirectory, - stylesheetLocationURI ); - documentTransformer.transform(); + OLinkDBUpdater olinkDBUpdater = new OLinkDBUpdater( log, this.sourceDirectory, this.databaseDirectory, + stylesheetLocationURI ); + olinkDBUpdater.update(); + + DocumentTransformer documentTransformer = new DocumentTransformer( log, this.sourceDirectory, + this.resourceDirectory, + this.databaseDirectory, + this.outputDirectory, + stylesheetLocationURI, + this.customizations ); + for ( int i = 0; i < outputFormats.length; i++ ) + { + documentTransformer.enableOutputFormat( outputFormats[i] ); + } + + documentTransformer.transform(); + + if ( this.profiles.length != 0 ) + { + for ( int i = 0; i < profiles.length; i++ ) + { + documentTransformer.transform( this.profiles[i] ); + } + } + } } finally { - resetProperties( httpProxyHost, httpProxyPort, httpNonProxyHosts ); + resetProperties( xercesParser, httpProxyHost, httpProxyPort, httpNonProxyHosts, entityResolver ); } } - private void resetProperties( String httpProxyHost, String httpProxyPort, String httpNonProxyHosts ) + private void resetProperties( String xercesParser, String httpProxyHost, String httpProxyPort, + String httpNonProxyHosts, String entityResolver ) { + // Reset XInclude Xerces parser to previous value + if ( xercesParser != null ) + { + System.setProperty( TransformMojo.XERCES_PARSER_CONFIG, xercesParser ); + System.setProperty( TransformMojo.XERCES_RESOLVER_CONFIG, entityResolver ); + } + else + { + // In 1.4 there's no clear property method... is this correct? + System.setProperty( TransformMojo.XERCES_PARSER_CONFIG, "" ); + System.setProperty( TransformMojo.XERCES_RESOLVER_CONFIG, "" ); + } + if ( httpProxyHost != null ) { System.setProperty( "http.proxyHost", httpProxyHost ); Index: src/main/java/org/codehaus/mojo/docbook/DocumentTransformer.java =================================================================== --- src/main/java/org/codehaus/mojo/docbook/DocumentTransformer.java (revision 4358) +++ src/main/java/org/codehaus/mojo/docbook/DocumentTransformer.java (working copy) @@ -1,6 +1,6 @@ -/* +/* * maven-docbook-plugin - Copyright (C) 2005 OPEN input - http://www.openinput.com/ - * + * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to @@ -23,34 +23,50 @@ */ package org.codehaus.mojo.docbook; +import java.io.BufferedOutputStream; import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; import java.io.IOException; +import java.io.OutputStream; import java.net.URI; import java.util.Arrays; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; +import java.util.Map; import java.util.Set; import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXResult; import javax.xml.transform.stream.StreamResult; -import javax.xml.transform.stream.StreamSource; +import org.apache.fop.apps.FOPException; +import org.apache.fop.apps.Fop; +import org.apache.fop.apps.FopFactory; +import org.apache.fop.apps.MimeConstants; import org.apache.maven.plugin.logging.Log; import org.codehaus.plexus.compiler.util.scan.InclusionScanException; import org.codehaus.plexus.compiler.util.scan.StaleSourceScanner; import org.codehaus.plexus.compiler.util.scan.mapping.SuffixMapping; import org.codehaus.plexus.util.DirectoryScanner; import org.codehaus.plexus.util.FileUtils; - /** + * A helper class for transforming DocBook documents into different output + * formats. + * * @author jgonzalez + * @author Lars Trieloff */ public class DocumentTransformer { + private Set sourcePatterns; + protected Log log; protected File sourceDirectory; @@ -63,13 +79,24 @@ protected URI stylesheetLocation; + private boolean generateHtml; + + private boolean generatePdf; + + private MojoURIResolver mojoResolver; + + private String xslfoCustomization; + + private String xhtmlCustomization; + /** * @param log * @param sourceDirectory * @param outputDirectory + * @param customizations */ public DocumentTransformer( Log log, File sourceDirectory, File resourceDirectory, File databaseDirectory, - File outputDirectory, URI stylesheetLocation ) + File outputDirectory, URI stylesheetLocation, Map customizations ) { this.log = log; this.sourceDirectory = sourceDirectory; @@ -77,13 +104,36 @@ this.databaseDirectory = databaseDirectory; this.outputDirectory = outputDirectory; this.stylesheetLocation = stylesheetLocation; + this.mojoResolver = new MojoURIResolver(); + + this.xslfoCustomization = (String) customizations.get( "pdf" ); + this.xhtmlCustomization = (String) customizations.get( "xhtml" ); + + this.sourcePatterns = new HashSet( 2 ); + this.sourcePatterns.add( "*.xml" ); + this.sourcePatterns.add( "**/*xml" ); } public void transform() { - StaleSourceScanner scanner = new StaleSourceScanner( 0, Collections.singleton( "**/*.xml" ), - Collections.EMPTY_SET ); - scanner.addSourceMapping( new SuffixMapping( ".xml", ".html" ) ); + this.transform( null ); + } + + /** + * @param transformProfile + */ + public void transform( TransformProfile transformProfile ) + { + StaleSourceScanner scanner = new StaleSourceScanner( 0, this.sourcePatterns, Collections.EMPTY_SET ); + String profile = getFileExtension( transformProfile ); + if ( generateHtml ) + { + scanner.addSourceMapping( new SuffixMapping( ".xml", profile + "html" ) ); + } + if ( generatePdf ) + { + scanner.addSourceMapping( new SuffixMapping( ".xml", profile + "pdf" ) ); + } Set staleDocbookFiles; try { @@ -99,12 +149,12 @@ DirectoryScanner docbookScanner = new DirectoryScanner(); docbookScanner.setBasedir( this.sourceDirectory ); docbookScanner.setFollowSymlinks( true ); - docbookScanner.setIncludes( new String[] { "**/*.xml" } ); + docbookScanner.setIncludes( new String[] { "**/*.xml", "*.xml" } ); docbookScanner.scan(); String[] docbookFiles = docbookScanner.getIncludedFiles(); this.prepareFileSystem( docbookFiles ); - this.transformDocuments( staleDocbookFiles ); + this.transformDocuments( staleDocbookFiles, transformProfile ); } else { @@ -130,6 +180,17 @@ } } + private String getFileExtension( TransformProfile transformProfile ) + { + StringBuffer profile = new StringBuffer( "." ); + if ( transformProfile != null ) + { + profile.append( transformProfile.getId() ); + profile.append( "." ); + } + return profile.toString(); + } + /** * @param docbookFiles */ @@ -137,6 +198,7 @@ { this.log.debug( "Creating output directories for the following files - " + Arrays.asList( docbookFiles ).toString() ); + this.outputDirectory.mkdirs(); // TODO: This should be a bit smarter also, shouldn't it? for ( int fileIndex = 0; fileIndex < docbookFiles.length; fileIndex++ ) { @@ -150,56 +212,249 @@ } } - protected void transformDocuments( Set docbookFiles ) + protected void transformDocuments( Set docbookFiles, TransformProfile transformProfile ) { this.log.info( "Transforming " + docbookFiles.size() + " Docbook stale file(s)" ); - Source docbookStyleSheetSource = new StreamSource( this.stylesheetLocation.resolve( "xhtml/docbook.xsl" ) - .toString() ); + Transformer xhtmlTransformer = null; + Transformer xslfoTransformer = null; + FopFactory fopFactory = null; + URI olinkDBURI = new File( this.databaseDirectory + File.separator + "olinkdb.xml" ).toURI(); - Transformer documentTransformer; + if ( generateHtml ) + { + xhtmlTransformer = createXHTMLTransformer( olinkDBURI, transformProfile ); + } + if ( generatePdf ) + { + xslfoTransformer = createXSLFOTransformer( olinkDBURI, transformProfile ); + fopFactory = FopFactory.newInstance(); + fopFactory.setURIResolver( this.mojoResolver ); + } + Iterator filesIterator = docbookFiles.iterator(); + while ( filesIterator.hasNext() ) + { + File docbookFile = (File) filesIterator.next(); + if ( generateHtml ) + { + transformXhtml( xhtmlTransformer, docbookFile, transformProfile ); + } + if ( generatePdf ) + { + transformPdf( xslfoTransformer, docbookFile, fopFactory, transformProfile ); + } + } + } + + private Transformer createXSLFOTransformer( URI olinkDBURI, TransformProfile transformProfile ) + { + Transformer xslfoTransformer; + TransformerFactory xslfoTf = TransformerFactory.newInstance(); + xslfoTf.setURIResolver( this.mojoResolver ); + Source docbookStyleSheetSource; + String location = this.stylesheetLocation.toASCIIString() + "fo/"; + String xslt = null; + + if ( ( this.xslfoCustomization == null ) && ( transformProfile == null ) ) + { + xslt = "docbook.xsl"; + } + else if ( ( this.xslfoCustomization == null ) && ( transformProfile != null ) ) + { + xslt = "profile-docbook.xsl"; + } + else + { + location = this.sourceDirectory.toURI().toString(); + xslt = this.xslfoCustomization; + } + + try + { + docbookStyleSheetSource = this.mojoResolver.resolve( xslt, location ); + } + catch ( TransformerException e ) + { + throw new RuntimeException( "Unable to resolve " + location + "/" + xslt, e); + } + + try + { + xslfoTransformer = xslfoTf.newTransformer( docbookStyleSheetSource ); + } + catch ( TransformerConfigurationException e ) + { + throw new RuntimeException( "Unable to create new instance of transformer from source " + + docbookStyleSheetSource.getSystemId() ); + } + xslfoTransformer.setParameter( "target.database.document", olinkDBURI.toString() ); + + if ( transformProfile != null ) + { + transformProfile.setParameters( xslfoTransformer ); + } + + this.log.debug( "XSL:FO Style sheet loaded." ); + return xslfoTransformer; + } + + private Transformer createXHTMLTransformer( URI olinkDBURI, TransformProfile transformProfile ) + { + Transformer xhtmlTransformer; + TransformerFactory xhtmlTf = TransformerFactory.newInstance(); + xhtmlTf.setURIResolver( this.mojoResolver ); + Source docbookStyleSheetSource; + String location = this.stylesheetLocation.toASCIIString() + "xhtml/"; + String xslt = null; + + if ( ( this.xslfoCustomization == null ) && ( transformProfile == null ) ) + { + xslt = "docbook.xsl"; + } + else if ( ( this.xslfoCustomization == null ) && ( transformProfile != null ) ) + { + xslt = "profile-docbook.xsl"; + } + else + { + location = this.sourceDirectory.toURI().toString(); + xslt = this.xhtmlCustomization; + } + + try + { + docbookStyleSheetSource = this.mojoResolver.resolve( xslt, location ); + } + catch ( TransformerException e ) + { + throw new RuntimeException( "Unable to resolve " + location + "/" + xslt, e); + } + + try + { + xhtmlTransformer = xhtmlTf.newTransformer( docbookStyleSheetSource ); + } + catch ( TransformerConfigurationException e ) + { + throw new RuntimeException( "Unable to create new instance of transformer from source " + + docbookStyleSheetSource.getSystemId() ); + } + xhtmlTransformer.setParameter( "target.database.document", olinkDBURI.toString() ); + xhtmlTransformer.setParameter( "generate.toc", "" ); + + if ( transformProfile != null ) + { + transformProfile.setParameters( xhtmlTransformer ); + } + + this.log.debug( "XHTML Style sheet loaded." ); + return xhtmlTransformer; + } + + private void transformXhtml( Transformer documentTransformer, File docbookFile, TransformProfile transformProfile ) + { + this.log.debug( "Processing " + this.sourceDirectory + File.separator + docbookFile ); + + Source source; + try + { + source = this.mojoResolver.resolve( docbookFile.toURI().toString(), null ); + } + catch ( TransformerException e ) + { + throw new RuntimeException( "Unable to resolve " + docbookFile.toURI().toString(), e); + } + + String relativePath = docbookFile.getAbsolutePath().substring( + (int) this.sourceDirectory.getAbsolutePath() + .length() ); + + File resultFile = new File( this.outputDirectory, relativePath.substring( 0, relativePath.lastIndexOf( '.' ) ) + + getFileExtension( transformProfile ) + "html" ); + Result result = new StreamResult( resultFile.getAbsolutePath() ); + + documentTransformer.setParameter( "current.docid", OLinkDBUpdater.computeFileID( relativePath ) ); + // TODO: Parametrize this !!!! + documentTransformer + .setParameter( "html.stylesheet", this.pathToResources( relativePath ) + "css/xhtml.css" ); + try { - documentTransformer = TransformerFactory.newInstance().newTransformer( docbookStyleSheetSource ); + documentTransformer.transform( source, result ); } catch ( TransformerException e ) { - throw new RuntimeException( "Unable to get a transformer instance from source " + docbookStyleSheetSource.getSystemId(), e ); + throw new RuntimeException( "Unable to transform from source " + source.getSystemId() + " into " + result.getSystemId(), e ); } - URI olinkDBURI = new File( this.databaseDirectory + File.separator + "olinkdb.xml" ).toURI(); - documentTransformer.setParameter( "target.database.document", olinkDBURI.toString() ); - documentTransformer.setParameter( "generate.toc", "" ); - this.log.debug( "Style sheet loaded." ); + this.log.debug( "Generated " + this.databaseDirectory + File.separator + docbookFile ); + } - Iterator filesIterator = docbookFiles.iterator(); - while ( filesIterator.hasNext() ) + private void transformPdf( Transformer documentTransformer, File docbookFile, FopFactory fopFactory, + TransformProfile transformProfile ) + { + this.log.debug( "Processing " + this.sourceDirectory + File.separator + docbookFile ); + + Source source; + try { - File docbookFile = (File) filesIterator.next(); - this.log.debug( "Processing " + docbookFile ); - Source source = new StreamSource( docbookFile ); - String relativePath = docbookFile.getAbsolutePath().substring( - (int) this.sourceDirectory.getAbsolutePath() - .length() ); - File resultFile = new File( this.outputDirectory, relativePath - .substring( 0, relativePath.lastIndexOf( '.' ) ) - + ".html" ); - Result result = new StreamResult( resultFile.getAbsolutePath() ); + source = this.mojoResolver.resolve( docbookFile.toURI().toString(), null ); + } + catch ( TransformerException e ) + { + throw new RuntimeException( "Unable to resolve " + docbookFile.toURI().toString(), e); + } - documentTransformer.setParameter( "current.docid", OLinkDBUpdater.computeFileID( relativePath ) ); - // TODO: Parametrize this !!!! - documentTransformer - .setParameter( "html.stylesheet", this.pathToResources( relativePath ) + "css/xhtml.css" ); + String relativePath = docbookFile.getAbsolutePath().substring( + (int) this.sourceDirectory.getAbsolutePath() + .length() ); + File resultFile = new File( this.outputDirectory, relativePath.substring( 0, relativePath.lastIndexOf( '.' ) ) + + getFileExtension( transformProfile ) + "pdf" ); + this.mojoResolver.setDocumentUri( docbookFile.toURI() ); + documentTransformer.setParameter( "current.docid", OLinkDBUpdater.computeFileID( relativePath ) ); - try { - documentTransformer.transform( source, result ); + OutputStream out; + try + { + out = new BufferedOutputStream( new FileOutputStream( resultFile.getAbsolutePath() ) ); + } + catch ( FileNotFoundException e ) + { + throw new RuntimeException( "File not found " + resultFile.getAbsolutePath(), e ); + } + + Result intermediate; + try + { + Fop fop = fopFactory.newFop( MimeConstants.MIME_PDF, out ); + intermediate = new SAXResult( fop.getDefaultHandler() ); + } + catch ( FOPException e ) + { + throw new RuntimeException( "Unable to create FOP instance", e); + } + + try + { + documentTransformer.transform( source, intermediate ); + } + catch ( TransformerException e ) + { + throw new RuntimeException( "Unable to transform from source " + source.getSystemId() + " into " + + intermediate.getSystemId(), e ); + } + finally + { + try + { + out.close(); } - catch ( TransformerException e ) + catch ( IOException e ) { - throw new RuntimeException( "Unable to transform from source " + source.getSystemId() + " into " + result.getSystemId(), e ); + //ignore } - - this.log.debug( "Generated " + this.databaseDirectory + File.separator + docbookFile ); } + this.log.debug( "Generated " + this.databaseDirectory + File.separator + docbookFile ); } + protected String pathToResources( String relativePath ) { @@ -212,4 +467,24 @@ } return pathToResources.toString(); } + + /** + * Enables a specified output format. + * + * @param format + * the format + */ + public void enableOutputFormat( String format ) + { + if ( "xhtml".equalsIgnoreCase( format ) ) + { + generateHtml = true; + } + if ( "pdf".equalsIgnoreCase( format ) ) + { + generatePdf = true; + } + + } + } Index: src/main/java/org/codehaus/mojo/docbook/MojoURIResolver.java =================================================================== --- src/main/java/org/codehaus/mojo/docbook/MojoURIResolver.java (revision 0) +++ src/main/java/org/codehaus/mojo/docbook/MojoURIResolver.java (revision 0) @@ -0,0 +1,126 @@ +package org.codehaus.mojo.docbook; + +import java.io.InputStream; +import java.net.URI; + +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import javax.xml.transform.Source; +import javax.xml.transform.TransformerException; +import javax.xml.transform.URIResolver; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.stream.StreamSource; + +import org.apache.xml.resolver.tools.CatalogResolver; +import org.xml.sax.EntityResolver; +import org.xml.sax.InputSource; +import org.xml.sax.XMLReader; + +public class MojoURIResolver + extends CatalogResolver + implements URIResolver, EntityResolver +{ + private URI documentUri = null; + + public InputSource resolveEntity( final String href, final String base ) + { + InputSource result; + String fullUri = makeFullUri( href, base ); + if ( fullUri.startsWith( "resource://" ) ) + { + result = new InputSource( getResourceAsStream( fullUri ) ); + } + else + { + result = super.resolveEntity( href, base ); + } + if ( result == null ) + { + result = new InputSource( fullUri ); + } + if ( result == null ) + { + System.out.println( "can't handle this" ); + } + result.setSystemId( fullUri ); + return result; + } + + public Source resolve( final String href, final String base ) + throws TransformerException + { + Source result; + String fullUri = makeFullUri( href, base ); + try + { + XMLReader reader; + // get a SAXParserFactory instance + SAXParserFactory SAXpf = SAXParserFactory.newInstance(); + // enabling the namespaces processing + SAXpf.setNamespaceAware( true ); + // get a SAXParser object + SAXParser SAXparser = SAXpf.newSAXParser(); + // get the XMLReader + reader = SAXparser.getXMLReader(); + reader.setEntityResolver( this ); + // creating the SAXSource + InputSource insrc = this.resolveEntity( href, base ); + result = new SAXSource( reader, insrc ); + } + catch ( javax.xml.parsers.ParserConfigurationException e ) + { + result = new StreamSource( getResourceAsStream( fullUri ) ); + } + catch ( org.xml.sax.SAXException e ) + { + result = new StreamSource( getResourceAsStream( fullUri ) ); + } + result.setSystemId( fullUri ); + return result; + } + + private InputStream getResourceAsStream( String fullUri ) + { + return MojoURIResolver.class.getResourceAsStream( fullUri.substring( 10 ) ); + } + + private String makeFullUri( final String href, final String base ) + { + String fullUri = href; + //if it is no absolute url starting with scheme:/ + if ( ( href != null ) && ( base != null ) ) + { + try + { + fullUri = URI.create( base ).resolve( href ).toString(); + } + catch ( IllegalArgumentException use ) + { + fullUri = base; + } + } + else if ( ( href != null ) && ( href.indexOf( ":/" ) != -1 ) ) + { + fullUri = href; + } + else if ( base != null ) + { + fullUri = base; + } + else if ( this.documentUri != null ) + { + fullUri = documentUri.resolve( href ).toString(); + } + else + { + fullUri = href; + } + return fullUri; + } + + public void setDocumentUri( URI documentUri ) + { + this.documentUri = documentUri; + } + +} Index: src/main/java/org/codehaus/mojo/docbook/OLinkDBUpdater.java =================================================================== --- src/main/java/org/codehaus/mojo/docbook/OLinkDBUpdater.java (revision 4358) +++ src/main/java/org/codehaus/mojo/docbook/OLinkDBUpdater.java (working copy) @@ -39,8 +39,11 @@ import javax.xml.transform.Result; import javax.xml.transform.Source; import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; +import javax.xml.transform.sax.SAXSource; +import javax.xml.transform.sax.SAXTransformerFactory; import javax.xml.transform.stream.StreamResult; import javax.xml.transform.stream.StreamSource; @@ -137,18 +140,36 @@ protected void updateOLinkDatabase( Set docbookFiles ) { this.log.info( "Loading olink database generation stylesheet" ); - Source docbookStyleSheetSource = new StreamSource( this.stylesheetLocation.resolve( "xhtml/docbook.xsl" ) - .toString() ); - Transformer olinkDBGenerator; + TransformerFactory tf = TransformerFactory.newInstance(); + MojoURIResolver resolver = new MojoURIResolver(); + String styleSheetSourceLocation = this.stylesheetLocation.toASCIIString() + "xhtml/"; + + Source docbookStyleSheetSource; try { - TransformerFactory factory = TransformerFactory.newInstance(); - olinkDBGenerator = factory.newTransformer( docbookStyleSheetSource ); + docbookStyleSheetSource = resolver.resolve( "docbook.xsl", styleSheetSourceLocation ); } catch ( TransformerException e ) { + throw new RuntimeException( "Unable to resolve " + styleSheetSourceLocation + "/docbook.xsl", e ); + } + + tf.setURIResolver( resolver ); + if ( tf.getFeature( SAXSource.FEATURE ) ) + { + SAXTransformerFactory stf = ( (SAXTransformerFactory) tf ); + } + + Transformer olinkDBGenerator; + try + { + olinkDBGenerator = tf.newTransformer( docbookStyleSheetSource ); + } + catch ( TransformerConfigurationException e ) + { throw new RuntimeException( "Unable to get a transformer instance from source " + docbookStyleSheetSource.getSystemId(), e ); } + olinkDBGenerator.setParameter( "collect.xref.targets", "only" ); olinkDBGenerator.setParameter( "generate.toc", "" ); @@ -167,7 +188,6 @@ Result result = new StreamResult( new OLinkDBUpdater.NullWriter() ); olinkDBGenerator.setParameter( "targets.filename", databaseFile.getAbsolutePath() ); - try { olinkDBGenerator.transform( source, result ); @@ -176,7 +196,6 @@ { throw new RuntimeException( "Unable to transform from source " + source.getSystemId() + " into " + result.getSystemId(), e ); } - this.log.debug( "Generated " + this.databaseDirectory + File.separator + docbookFile ); } } @@ -190,7 +209,7 @@ this.log.info( "Creating master olink database file " + file ); try { - BufferedWriter masterOlinkDBFile = new BufferedWriter( new FileWriter( file )); + BufferedWriter masterOlinkDBFile = new BufferedWriter( new FileWriter( file ) ); // Write header masterOlinkDBFile.write( "" ); Index: src/main/java/org/codehaus/mojo/docbook/TransformProfile.java =================================================================== --- src/main/java/org/codehaus/mojo/docbook/TransformProfile.java (revision 0) +++ src/main/java/org/codehaus/mojo/docbook/TransformProfile.java (revision 0) @@ -0,0 +1,388 @@ +package org.codehaus.mojo.docbook; + +import javax.xml.transform.Transformer; + +/** + * A holder of profiling information, like operating system, architecture or + * vendor. + * + * @author Lars Trieloff + */ +public class TransformProfile { + /** + * A unique id for the profile + */ + private String id; + + /** + * The attribute to profile for (attribute-based profiling) + */ + private String attribute; + /** + * The attribute's value to profile for (for attribute-based profiling) + */ + private String value; + + /** + * For profiling for a single hardware architecture + */ + private String arch; + /** + * For profiling for multiple hardware architectures + */ + private String[] archictectures; + /** + * For profiling for a single condition + */ + private String condition; + /** + * For profiling for multiple conditions + */ + private String[] conditions; + /** + * For profiling for a single conformance + */ + private String conformance; + /** + * For profiling for multiple conformances + */ + private String[] conformances; + /** + * For profiling for a single language + */ + private String lang; + /** + * For profiling for multiple languages + */ + private String[] languages; + /** + * For profiling for a single operating system + */ + private String os; + /** + * For profiling for multiple operating systems + */ + private String[] operatingsystems; + /** + * For profiling for a single revision + */ + private String revision; + /** + * For profiling for multiple revisions + */ + private String[] revisions; + /** + * For profiling for a single role + */ + private String role; + /** + * For profiling for multiple roles + */ + private String[] roles; + /** + * For profiling for a single security level + */ + private String security; + /** + * For profiling for multiple profiling levels + */ + private String[] securities; + /** + * For profiling for a single user level + */ + private String userlevel; + /** + * For profiling for multiple user levels + */ + private String[] userlevels; + /** + * For profiling for a single vendor + */ + private String vendor; + /** + * For profiling for multiple vendors + */ + private String vendors[]; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getAttribute() { + return attribute; + } + + public void setAttribute(String attribute) { + this.attribute = attribute; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getArch() { + return arch; + } + + public void setArch(String arch) { + this.arch = arch; + } + + public String[] getArchictectures() { + return archictectures; + } + + public void setArchictectures(String[] archictectures) { + this.archictectures = archictectures; + } + + public String getCondition() { + return condition; + } + + public void setCondition(String condition) { + this.condition = condition; + } + + public String[] getConditions() { + return conditions; + } + + public void setConditions(String[] conditions) { + this.conditions = conditions; + } + + public String getConformance() { + return conformance; + } + + public void setConformance(String conformance) { + this.conformance = conformance; + } + + public String[] getConformances() { + return conformances; + } + + public void setConformances(String[] conformances) { + this.conformances = conformances; + } + + public String getLang() { + return lang; + } + + public void setLang(String lang) { + this.lang = lang; + } + + public String[] getLanguages() { + return languages; + } + + public void setLanguages(String[] languages) { + this.languages = languages; + } + + public String getOs() { + return os; + } + + public void setOs(String os) { + this.os = os; + } + + public String[] getOperatingsystems() { + return operatingsystems; + } + + public void setOperatingsystems(String[] operatingsystems) { + this.operatingsystems = operatingsystems; + } + + public String getRevision() { + return revision; + } + + public void setRevision(String revision) { + this.revision = revision; + } + + public String[] getRevisions() { + return revisions; + } + + public void setRevisions(String[] revisions) { + this.revisions = revisions; + } + + public String getRole() { + return role; + } + + public void setRole(String role) { + this.role = role; + } + + public String[] getRoles() { + return roles; + } + + public void setRoles(String[] roles) { + this.roles = roles; + } + + public String getSecurity() { + return security; + } + + public void setSecurity(String security) { + this.security = security; + } + + public String[] getSecurities() { + return securities; + } + + public void setSecurities(String[] securities) { + this.securities = securities; + } + + public String getUserlevel() { + return userlevel; + } + + public void setUserlevel(String userlevel) { + this.userlevel = userlevel; + } + + public String[] getUserlevels() { + return userlevels; + } + + public void setUserlevels(String[] userlevels) { + this.userlevels = userlevels; + } + + public String getVendor() { + return vendor; + } + + public void setVendor(String vendor) { + this.vendor = vendor; + } + + public String[] getVendors() { + return vendors; + } + + public void setVendors(String[] vendors) { + this.vendors = vendors; + } + + /** + * Concatenates all profile values. + * + * @return concatenated string conatining all profile values; + */ + private String concatenateValues() { + StringBuffer buf = new StringBuffer(); + append(buf, this.arch); + append(buf, this.archictectures); + append(buf, this.attribute); + append(buf, this.condition); + append(buf, this.conditions); + append(buf, this.conformance); + append(buf, this.conformances); + append(buf, this.lang); + append(buf, this.languages); + append(buf, this.operatingsystems); + append(buf, this.os); + append(buf, this.revision); + append(buf, this.revisions); + append(buf, this.role); + append(buf, this.roles); + append(buf, this.securities); + append(buf, this.security); + append(buf, this.userlevel); + append(buf, this.userlevels); + append(buf, this.vendor); + append(buf, this.vendors); + return buf.toString(); + } + + private void append(StringBuffer buf, String string) { + if (string == null) { + return; + } + buf.append(string); + } + + private void append(StringBuffer buf, String[] strings) { + if (strings == null) { + return; + } + for (int i = 0; i < strings.length; i++) { + buf.append(strings[i]); + } + } + + public String getSeparator() { + int startchar = 33; + String values = this.concatenateValues(); + while (values.indexOf(startchar) != -1) { + startchar++; + } + return new String(new byte[] { (byte) startchar }); + } + + public void setParameters(Transformer t) { + String s = this.getSeparator(); + t.setParameter("profile.separator", s); + setParameter(t, "profile.arch", arch, archictectures, s); + setParameter(t, "profile.condition", condition, conditions, s); + setParameter(t, "profile.conformance", conformance, conformances, s); + setParameter(t, "profile.lang", lang, languages, s); + setParameter(t, "profile.os", os, operatingsystems, s); + setParameter(t, "profile.revision", revision, revisions, s); + setParameter(t, "profile.role", role, roles, s); + setParameter(t, "profile.security", security, securities, s); + setParameter(t, "profile.userlevel", userlevel, userlevels, s); + setParameter(t, "profile.vendor", vendor, vendors, s); + + if (attribute != null && attribute.length() != 0 && value != null + && value.length() != 0) { + t.setParameter("profile.attribute", attribute); + t.setParameter("profile.value", value); + } + } + + public static void setParameter(Transformer transformer, String parameter, + String singlevalue, String[] multivalue, String separator) { + if ((multivalue == null || multivalue.length == 0) + && (singlevalue != null) && (!"".equals(singlevalue))) { + transformer.setParameter(parameter, singlevalue); + } else if (multivalue != null && multivalue.length != 0) { + transformer.setParameter(parameter, join(multivalue, separator)); + } + } + + private static String join(String[] strings, String separator) { + StringBuffer joined = new StringBuffer(); + for (int i = 0; i < strings.length; i++) { + if (i != 0) { + joined.append(separator); + } + joined.append(strings[i]); + } + return joined.toString(); + } +} Index: pom.xml =================================================================== --- pom.xml (revision 4358) +++ pom.xml (working copy) @@ -22,6 +22,13 @@ http://www.openinput.com/+1 + + Lars Trieloff + lars.trieloff@mindquarry.com + Mindquarry GmbH + http://www.mindquarry.com/ + +1 + @@ -44,6 +51,30 @@ UTF-8 + + org.codehaus.mojo + docbook-maven-plugin + 1.0.0-alpha-2-SNAPSHOT + + + + linux + linux + + + windows + windows + + + nonlinux + + windows + macosx + + + + + @@ -54,6 +85,17 @@ test + org.docbook + docbook-xsl + 1.72.0 + runtime + + + xml-resolver + xml-resolver + 1.2 + + org.apache.maven maven-plugin-api 2.0 @@ -74,12 +116,34 @@ 1.5.1 - saxon - saxon - 6.5.3 + xerces + xercesImpl + 2.7.1 + + + xalan + xalan + 2.6.0 runtime + + org.apache.xmlgraphics + fop + 0.93 + + + commons-logging + commons-logging + 1.1 + runtime + + + + mindquarry + http://releases.mindquarry.org + +