logo

8 сент. 2013 г.

BIP 11g: кириллица в названиях отчетов + Firefox

Всем привет!
В этом сообщений хочу рассказать как "обойти" проблему с кириллическими названиями отчетов, формируемых в BIPublisher 11g через Mozilla Firefox (проблема наблюдается в версиях 11.1.1.7.1, 11.1.1.6.8).


Причина проблемы в том, что разработчики последних патчей Oracle BIPublisher "забыли", что выгрузка в Firefox аттачей должна отличаться от выгрузки в MSIE.
Надеюсь, в ближайших патчах это будет исправлено. А пока предлагаю следующий воркэраунд.

Решение практически полностью аналогично ранее опубликованному - BIP 11g: кириллица в названиях отчетов + Internet Explorer.

Единственная разница - нужно использовать другой код класса-фильтра:
package oracle.xdo.servlet;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import oracle.apps.fnd.i18n.common.util.MimeUtil;
import java.net.URLDecoder;


public class XxCyrillicFilter1 implements Filter {
    protected FilterConfig config;    
    
    public void init(FilterConfig config) throws ServletException {
        this.config = config;
    }
    
    public void destroy() {
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    throws ServletException, IOException {
        ServletResponse newResponse = response;

        if (request instanceof HttpServletRequest) {
          String uAgent = ((HttpServletRequest)request).getHeader("User-Agent");
          boolean isMSIE = ( uAgent != null && uAgent.indexOf( "IE" ) != -1 );
          if (!isMSIE)                 
          newResponse = new XxResponseWrapper1((HttpServletResponse) response);         
        }        

        chain.doFilter(request, newResponse);
    } 
}

class XxResponseWrapper1 extends HttpServletResponseWrapper
{    
    public XxResponseWrapper1(HttpServletResponse response){
        super(response);
    }
    
    public void setHeader(String name, String value){
        if (!"content-disposition".equalsIgnoreCase(name))         
          super.setHeader(name, value);
        else {  
          String changedCD;
          try {
            int endIndexFirstPart = value.indexOf("filename=\"") + 10;
            int endIndex = value.indexOf(".");
          
            String badString = value.substring(endIndexFirstPart, endIndex);
          
            badString = URLDecoder.decode(badString,"UTF-8");    
            badString = MimeUtil.encodeHeader(badString, "UTF-8", "B");                
                
            changedCD = value.substring(0, endIndexFirstPart) + badString + value.substring(endIndex);
                
          } catch (UnsupportedEncodingException e) {
          changedCD = value;
        }
        super.setHeader(name, changedCD);
      }
   }
}   

Здесь я дал другое имя классам: XxCyrillicFilter1 и XxResponseWrapper1. А значит в файле web.xml задеплоенного приложения xmlpserver.war нужно ссылаться на класс oracle.xdo.servlet.XxCyrillicFilter1
<filter>
  <filter-name>XxCyrillicFilter1</filter-name>
  <filter-class>oracle.xdo.servlet.XxCyrillicFilter1</filter-class>
</filter>
 
<filter-mapping>
  <filter-name>XxCyrillicFilter1</filter-name>
  <url-pattern>/servlet/xdo</url-pattern>
</filter-mapping>
<filter-mapping>
  <filter-name>XxCyrillicFilter1</filter-name>
  <url-pattern>*.xdo</url-pattern>
</filter-mapping>

P.S. Прикладываю файлы скомпилированных классов.

Комментариев нет:

Отправить комментарий