diff options
| -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.zipBinary files differ index 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>
 | 
