diff options
author | tknall <tknall@7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c> | 2008-11-25 12:48:15 +0000 |
---|---|---|
committer | tknall <tknall@7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c> | 2008-11-25 12:48:15 +0000 |
commit | ea60aae139c666c610c1af5cfd0b616d3f4a535c (patch) | |
tree | e9e1556e38d1a68a90185ed7d3074f0e2dccec04 | |
parent | 1774241bd1e38eb789609ba443d48f1122fe4819 (diff) | |
download | pdf-as-3-ea60aae139c666c610c1af5cfd0b616d3f4a535c.tar.gz pdf-as-3-ea60aae139c666c610c1af5cfd0b616d3f4a535c.tar.bz2 pdf-as-3-ea60aae139c666c610c1af5cfd0b616d3f4a535c.zip |
Preparation for multilingual support for web application.
git-svn-id: https://joinup.ec.europa.eu/svn/pdf-as/trunk@312 7b5415b0-85f9-ee4d-85bd-d5d0c3b42d1c
-rw-r--r-- | maven2-repository/maven2-repository.zip | bin | 12963118 -> 13332049 bytes | |||
-rw-r--r-- | pom.xml | 27 | ||||
-rw-r--r-- | src/main/java/at/gv/egiz/pdfas/api/commons/Constants.java | 32 | ||||
-rw-r--r-- | src/main/java/at/gv/egiz/pdfas/exceptions/ErrorCode.java | 1 | ||||
-rw-r--r-- | src/main/java/at/gv/egiz/pdfas/web/i18n/LanguageDecoratorMapper.java | 111 | ||||
-rw-r--r-- | src/main/java/at/gv/egiz/pdfas/web/i18n/SetLanguageServlet.java | 59 | ||||
-rw-r--r-- | src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java | 15 | ||||
-rw-r--r-- | src/main/webapp/WEB-INF/sitemesh.xml | 30 | ||||
-rw-r--r-- | src/main/webapp/WEB-INF/web.xml | 14 | ||||
-rw-r--r-- | src/site/changes.xml | 17 |
10 files changed, 289 insertions, 17 deletions
diff --git a/maven2-repository/maven2-repository.zip b/maven2-repository/maven2-repository.zip Binary files differindex 49f943e..def0490 100644 --- a/maven2-repository/maven2-repository.zip +++ b/maven2-repository/maven2-repository.zip @@ -9,7 +9,7 @@ <groupId>knowcenter</groupId>
<artifactId>pdf-as</artifactId>
<name>PDF-AS</name>
- <version>3.0.7-20080923</version>
+ <version>3.0.8-20081119</version>
<!-- don't forget to set the version string at.knowcenter.wag.egov.egiz.PdfAS.PDFAS_VERSION accordingly -->
<description>Amtssignatur fuer elektronische Aktenfuehrung</description>
@@ -309,6 +309,31 @@ </dependency>
-->
+ <!-- iText -->
+ <dependency>
+ <groupId>com.lowagie</groupId>
+ <artifactId>itext</artifactId>
+ <!--
+ <version>2.1.5-rev3628-pdfas</version>
+ <version>1.4.2-rev2248-pdfas</version>
+ -->
+ <version>2.1.5-rev3628-pdfas</version>
+ </dependency>
+
+ <!-- pdfbox -->
+ <dependency>
+ <groupId>pdfbox</groupId>
+ <artifactId>pdfbox</artifactId>
+ <version>0.7.2-pdfas</version>
+ </dependency>
+
+ <!-- multiple languages for web application -->
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>jstl</artifactId>
+ <version>1.2</version>
+ </dependency>
+
</dependencies>
</project>
diff --git a/src/main/java/at/gv/egiz/pdfas/api/commons/Constants.java b/src/main/java/at/gv/egiz/pdfas/api/commons/Constants.java index a7bc776..19f7613 100644 --- a/src/main/java/at/gv/egiz/pdfas/api/commons/Constants.java +++ b/src/main/java/at/gv/egiz/pdfas/api/commons/Constants.java @@ -21,13 +21,15 @@ public final class Constants /**
* A binary signature.
+ * This value should not be modified due to external dependencies!
*/
- public static String SIGNATURE_TYPE_BINARY = "binary";
+ public static final String SIGNATURE_TYPE_BINARY = "binary";
/**
* A textual signature.
+ * This value should not be modified due to external dependencies!
*/
- public static String SIGNATURE_TYPE_TEXTUAL = "textual";
+ public static final String SIGNATURE_TYPE_TEXTUAL = "textual";
/**
* A "detached" textual signature.
@@ -37,32 +39,36 @@ public final class Constants * the sign result XML of the connector is returned.
* </p>
*/
- public static String SIGNATURE_TYPE_DETACHEDTEXTUAL = "detachedtextual";
+ public static final String SIGNATURE_TYPE_DETACHEDTEXTUAL = "detachedtextual";
/**
* The signature device moa.
+ * This value should not be modified due to external dependencies!
*/
- public static String SIGNATURE_DEVICE_MOA = "moa";
+ public static final String SIGNATURE_DEVICE_MOA = "moa";
/**
* The signature device bku.
+ * This value should not be modified due to external dependencies!
*/
- public static String SIGNATURE_DEVICE_BKU = "bku";
+ public static final String SIGNATURE_DEVICE_BKU = "bku";
/**
* The signature device a1.
+ * This value should not be modified due to external dependencies!
*/
- public static String SIGNATURE_DEVICE_A1 = "a1";
+ public static final String SIGNATURE_DEVICE_A1 = "a1";
/**
* The signature device MOCCA (online bku).
+ * This value should not be modified due to external dependencies!
*/
public static final String SIGNATURE_DEVICE_MOC = "moc";
/**
* Only binary signatures are verified.
*/
- public static String VERIFY_MODE_BINARY_ONLY = "binaryOnly";
+ public static final String VERIFY_MODE_BINARY_ONLY = "binaryOnly";
/**
* Binary and textual signatures are verified with time optimization.
@@ -73,27 +79,27 @@ public final class Constants * signatures may not be found.
* </p>
*/
- public static String VERIFY_MODE_SEMI_CONSERVATIVE = "semiConservative";
+ public static final String VERIFY_MODE_SEMI_CONSERVATIVE = "semiConservative";
/**
* Binary and textual signatures are verified.
*/
- public static String VERIFY_MODE_FULL_CONSERVATIVE = "fullConservative";
+ public static final String VERIFY_MODE_FULL_CONSERVATIVE = "fullConservative";
/**
* All signatures are verified.
*/
- public static int VERIFY_ALL = -1;
+ public static final int VERIFY_ALL = -1;
/**
* The system property that may be used to declare the pdf-as configuration folder.
*/
- public final static String CONFIG_DIR_SYSTEM_PROPERTY = "pdf-as.work-dir";
+ public static final String CONFIG_DIR_SYSTEM_PROPERTY = "pdf-as.work-dir";
/**
* The zip file containing the default configuration.
*/
- public final static String DEFAULT_CONFIGURATION_ZIP_RESOURCE = "DefaultConfiguration.zip";
+ public static final String DEFAULT_CONFIGURATION_ZIP_RESOURCE = "DefaultConfiguration.zip";
/**
* The configuration folder for pdf-as within the user's home folder.
@@ -103,7 +109,7 @@ public final class Constants /**
* The name of the directory, where temporary files are stored.
*/
- public final static String TEMP_DIR_NAME = "pdfastmp";
+ public static final String TEMP_DIR_NAME = "pdfastmp";
}
diff --git a/src/main/java/at/gv/egiz/pdfas/exceptions/ErrorCode.java b/src/main/java/at/gv/egiz/pdfas/exceptions/ErrorCode.java index 062ff6b..ab8914c 100644 --- a/src/main/java/at/gv/egiz/pdfas/exceptions/ErrorCode.java +++ b/src/main/java/at/gv/egiz/pdfas/exceptions/ErrorCode.java @@ -25,6 +25,7 @@ public final class ErrorCode public static final int CANNOT_WRITE_PDF = 205;
public static final int DOCUMENT_NOT_SIGNED = 206;
public static final int SIGNATURE_TYPES_EXCEPTION = 223;
+ public static final int FONT_NOT_FOUND = 230;
public static final int SIGNATURE_COULDNT_BE_CREATED = 300;
public static final int SIGNED_TEXT_EMPTY = 301;
diff --git a/src/main/java/at/gv/egiz/pdfas/web/i18n/LanguageDecoratorMapper.java b/src/main/java/at/gv/egiz/pdfas/web/i18n/LanguageDecoratorMapper.java new file mode 100644 index 0000000..1db7e3b --- /dev/null +++ b/src/main/java/at/gv/egiz/pdfas/web/i18n/LanguageDecoratorMapper.java @@ -0,0 +1,111 @@ +package at.gv.egiz.pdfas.web.i18n;
+
+import java.io.File;
+import java.util.Locale;
+import java.util.Properties;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.apache.log4j.Logger;
+
+import com.opensymphony.module.sitemesh.Config;
+import com.opensymphony.module.sitemesh.Decorator;
+import com.opensymphony.module.sitemesh.DecoratorMapper;
+import com.opensymphony.module.sitemesh.Page;
+import com.opensymphony.module.sitemesh.mapper.AbstractDecoratorMapper;
+import com.opensymphony.module.sitemesh.mapper.DefaultDecorator;
+
+public class LanguageDecoratorMapper extends AbstractDecoratorMapper {
+
+ public static final String LOCALE_SESSION_KEY = "at.gv.egiz.pdfas.web.i18n:currentLocale";
+
+ private Logger log = Logger.getLogger(LanguageDecoratorMapper.class);
+
+ public void init(Config config, Properties properties, DecoratorMapper parent) throws InstantiationException {
+ super.init(config, properties, parent);
+ }
+
+ public static Object getFirstNotNull(Object[] objects) {
+ if (objects == null) {
+ return null;
+ }
+ for (int i = 0; i < objects.length; i++) {
+ if (objects[i] != null) {
+ return objects[i];
+ }
+ }
+ return null;
+ }
+
+ public Decorator getDecorator(HttpServletRequest request, Page page) {
+ try {
+ Decorator result = null;
+ final Decorator d = super.getDecorator(request, page);
+ HttpSession session = request.getSession();
+ log.trace("Looking for Locale in session.");
+ Locale locale = (Locale) session.getAttribute(LOCALE_SESSION_KEY);
+ if (locale == null) {
+ log.debug("Unable to find Locale in session. Creating new Locale based on Accept-Language header entry.");
+ String acceptLanguage = request.getHeader("Accept-Language");
+ if (acceptLanguage != null) {
+ log.trace("Accept-Language header entry: " + acceptLanguage);
+ } else {
+ log.trace("No header entry found.");
+ }
+ if (acceptLanguage != null && acceptLanguage.length() >= 2) {
+ locale = new Locale(acceptLanguage.substring(0, 2));
+ log.debug("New Locale created: " + locale);
+ }
+ } else {
+ log.debug("Locale found: " + locale);
+ }
+ String path;
+ if (locale != null) {
+ path = modifyPath(d.getPage(), locale.getLanguage());
+ } else {
+ path = d.getPage();
+ }
+
+ File decFile = new File(config.getServletContext().getRealPath(path));
+
+ log.debug("Looking for decorator \"" + path + "\".");
+ if (decFile.isFile()) {
+ result = new DefaultDecorator(d.getName(), path, null) {
+ public String getInitParameter(String paramName) {
+ return d.getInitParameter(paramName);
+ }
+ };
+ }
+
+ if (result != null) {
+ log.debug("Decorator found (\"" + result.getName() + "\", \"" + getFirstNotNull(new Object[] { result.getURIPath(), result.getPage(), "<n/a>"}) + "\").");
+ return result;
+ } else {
+ log.trace("No decorator found. Delegating to super class.");
+ result = super.getDecorator(request, page);
+ if (result != null) {
+ log.debug("Super class returned decorator (\"" + result.getName() + "\", \"" + getFirstNotNull(new Object[] { result.getURIPath(), result.getPage(), "<n/a>"}) + "\").");
+ } else {
+ log.trace("Super class did not return a decorator.");
+ }
+ return result;
+ }
+ } catch (NullPointerException e) {
+ return super.getDecorator(request, page);
+ }
+ }
+
+ private static String modifyPath(String path, String ext) {
+ if (ext == null || ext.length() == 0) {
+ return path;
+ }
+ int dot = path.lastIndexOf('.');
+ if (dot > -1) {
+ return path.substring(0, dot) + '-' + ext + path.substring(dot);
+ } else {
+ return path + '-' + ext;
+ }
+ }
+
+}
diff --git a/src/main/java/at/gv/egiz/pdfas/web/i18n/SetLanguageServlet.java b/src/main/java/at/gv/egiz/pdfas/web/i18n/SetLanguageServlet.java new file mode 100644 index 0000000..582f765 --- /dev/null +++ b/src/main/java/at/gv/egiz/pdfas/web/i18n/SetLanguageServlet.java @@ -0,0 +1,59 @@ +package at.gv.egiz.pdfas.web.i18n;
+
+import java.io.IOException;
+import java.util.Locale;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.log4j.Logger;
+
+public class SetLanguageServlet extends HttpServlet {
+
+ private static final long serialVersionUID = 1L;
+
+ public static final String LANGUAGE_PARAMETER = "code";
+ private Logger log = Logger.getLogger(LanguageDecoratorMapper.class);
+
+ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+ this.doPost(request, response);
+ }
+
+ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
+
+ HttpSession session = request.getSession();
+
+ // check manual language override (should be two-letter ISO-639 code)
+ Locale currentManualSetLanguage = (Locale) session.getAttribute(LanguageDecoratorMapper.LOCALE_SESSION_KEY);
+ String language = request.getParameter(LANGUAGE_PARAMETER);
+ if (!StringUtils.isEmpty(language)) {
+ String code = language.trim().toLowerCase();
+ if (!ArrayUtils.contains(Locale.getISOLanguages(), code)) {
+ log.error("Manually set language code \"" + code + "\" is not a valid ISO 639 language. Do not switch language.");
+ } else {
+ currentManualSetLanguage = new Locale(code);
+ log.info("Switching language to " + currentManualSetLanguage.getDisplayLanguage() + ".");
+ session.setAttribute(LanguageDecoratorMapper.LOCALE_SESSION_KEY, currentManualSetLanguage);
+ }
+ }
+
+// if (currentManualSetLanguage != null) {
+// log.info("Forcing language " + currentManualSetLanguage.getDisplayLanguage() + ".");
+// super.getServletContext().setAttribute(LanguageDecoratorMapper.LOCALE_SESSION_KEY, currentManualSetLanguage);
+// }
+
+// response.sendRedirect(response.encodeRedirectURL(request.getContextPath() + "/"));
+ RequestDispatcher rd = request.getRequestDispatcher("/");
+ rd.forward(request, response);
+
+ }
+
+
+
+}
diff --git a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java index 113f13e..2ffc7b2 100644 --- a/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java +++ b/src/main/java/at/knowcenter/wag/egov/egiz/PdfAS.java @@ -96,7 +96,7 @@ public abstract class PdfAS * The current version of the pdf-as library. This version string is logged on every invocation
* of the api or the web application.
*/
- public static final String PDFAS_VERSION = "3.0.7-20080923";
+ public static final String PDFAS_VERSION = "3.0.8-20081119";
/**
* The key of the strict mode setting.
@@ -1235,8 +1235,17 @@ public abstract class PdfAS Rectangle psize = reader.getPageSizeWithRotation(page);
int page_rotation = reader.getPageRotation(page);
- float page_width = psize.width();
- float page_height = psize.height();
+// [tknall] for iText 1.x.x:
+// float page_width = psize.width();
+// float page_height = psize.height();
+
+// [tknall] for iText 2.x.x:
+// float page_width = psize.getWidth();
+// float page_height = psize.getHeight();
+
+ float page_width = psize.getWidth();
+ float page_height = psize.getHeight();
+
// now we can calculate x-position
float pre_pos_x = SIGNATURE_BORDER / 2;
if (!pos.isXauto())
diff --git a/src/main/webapp/WEB-INF/sitemesh.xml b/src/main/webapp/WEB-INF/sitemesh.xml new file mode 100644 index 0000000..c6653cc --- /dev/null +++ b/src/main/webapp/WEB-INF/sitemesh.xml @@ -0,0 +1,30 @@ +<sitemesh>
+ <property name="decorators-file" value="/WEB-INF/decorators.xml"/>
+ <excludes file="${decorators-file}"/>
+
+ <page-parsers>
+ <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
+ </page-parsers>
+ <decorator-mappers>
+ <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
+ <param name="property.1" value="meta.decorator" />
+ <param name="property.2" value="decorator" />
+ </mapper>
+ <!--
+ <mapper class="com.opensymphony.module.sitemesh.mapper.LanguageDecoratorMapper">
+ <param name="match.en" value="en" />
+ </mapper>
+ -->
+ <mapper class="at.gv.egiz.pdfas.web.i18n.LanguageDecoratorMapper"/>
+ <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper"/>
+ <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
+ <param name="decorator" value="printable" />
+ <param name="parameter.name" value="printable" />
+ <param name="parameter.value" value="true" />
+ </mapper>
+ <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper"/>
+ <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
+ <param name="config" value="${decorators-file}" />
+ </mapper>
+ </decorator-mappers>
+</sitemesh>
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 2bcbdd2..3b97dab 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -20,6 +20,11 @@ <param-value>REPLACE_WITH_PATH_TO_PDFAS_CONFIGURATION</param-value>
</context-param>
-->
+
+ <context-param>
+ <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
+ <param-value>at.gv.egiz.pdfas.web.i18n.language</param-value>
+ </context-param>
<filter>
<filter-name>sitemesh</filter-name>
@@ -80,6 +85,10 @@ <servlet-class>at.knowcenter.wag.egov.egiz.web.AsynchronousRedirectResponder</servlet-class>
</servlet>
+ <servlet>
+ <servlet-name>SetLanguage</servlet-name>
+ <servlet-class>at.gv.egiz.pdfas.web.i18n.SetLanguageServlet</servlet-class>
+ </servlet>
<servlet-mapping>
<servlet-name>Sign</servlet-name>
@@ -126,6 +135,11 @@ <url-pattern>/AsynchronousRedirectResponder</url-pattern>
</servlet-mapping>
+ <servlet-mapping>
+ <servlet-name>SetLanguage</servlet-name>
+ <url-pattern>/SetLanguage</url-pattern>
+ </servlet-mapping>
+
<session-config>
<session-timeout>10</session-timeout>
</session-config>
diff --git a/src/site/changes.xml b/src/site/changes.xml index a0a2556..96307b2 100644 --- a/src/site/changes.xml +++ b/src/site/changes.xml @@ -13,6 +13,23 @@ </release>
-->
+ <release version="3.0.8-20081119" date="2008-09-19" description="subsequent release">
+ <action dev="tknall" type="remove">lib-folder removed.</action>
+ <action dev="tknall" type="update">Maven2-repository updated.</action>
+ <action dev="tknall" type="add">Adding external patched itext (1.4.2 and 2.1.5) and pdfbox libraries.</action>
+ <action dev="tknall" type="remove">Removing iText and pdfbox from sources.</action>
+ <action dev="tknall" type="remove">Cleaning up certstore removing all certificates except MOA-certificates.</action>
+ <action dev="tknall" type="remove">Removing deprecated templates.</action>
+ <action dev="tknall" type="update">Correcting default.bku.sign.detached.xml according to Security Layer spec.</action>
+ <action dev="tknall" type="update"></action>
+ <action dev="tknall" type="add">Adding DejaVuFont.</action>
+ <action dev="tknall" type="add">Adding DejaVuFont license.</action>
+ <action dev="tknall" type="update">Adding test file for PDF/A. Removing issues.txt.</action>
+ <action dev="tknall" type="add">Preparation for multilingual support for web application.</action>
+ <action dev="tknall" type="update">Minor updates of configuration.</action>
+ <action dev="tknall" type="update">Sitemesh updates.</action>
+ </release>
+
<release version="3.0.7-20080923" date="2008-09-23" description="subsequent release">
<action dev="tknall" type="remove">Deprecated webapp-folder removed from svn repository.</action>
<action dev="tknall" type="add">New DefaultConfiguration.zip integrated in order to allow mocca signatures.</action>
|