Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
Clear All
new posts

    Issue with FileItem when filename has spaces

    Hello,

    I'm using SmartGWT Power 2013-01-22. I'm devlopping on Windows 7 with IE 9.0.
    I have a form with a FileItem and when I attach a file with space in its name I get an ArrayIndexOutOfBoundsException on the server:
    Code:
    === 2013-01-23 13:39:28,958 [0-28] INFO  DSRequest - We parsed 1 uploaded file(s): "C:/fakepath/20130101 - TERMO DE COMPROMISSO DE MANUTENÇÃO DE SIGILO E CUMPRIMENTO DAS NORMAS DE SEGURANÇA DA INFORMAÇÃO.docx" (25912 bytes)
    === 2013-01-23 13:39:28,958 [0-28] DEBUG DataSource - In DS.forName() for 'publicoInterno' with DSRequest: com.isomorphic.datasource.DSRequest@19cfb45
    === 2013-01-23 13:39:28,958 [0-28] DEBUG DataSource - Creating instance of DataSource 'publicoInterno'
    === 2013-01-23 13:39:28,958 [0-28] DEBUG DataSource - In DS.forName() for 'discussao' with DSRequest: null
    === 2013-01-23 13:39:28,959 [0-28] DEBUG DataSource - Creating instance of DataSource 'discussao'
    === 2013-01-23 13:39:28,959 [0-28] DEBUG DataSource - In DS.forName() for 'visita' with DSRequest: null
    === 2013-01-23 13:39:28,959 [0-28] DEBUG DataSource - Creating instance of DataSource 'visita'
    === 2013-01-23 13:39:28,959 [0-28] ERROR IDACall - Top-level servlet error: 
    java.lang.ArrayIndexOutOfBoundsException: -61
    	at org.apache.commons.codec.binary.Base64.isBase64(Base64.java:137)
    	at org.apache.commons.codec.binary.Base64.discardNonBase64(Base64.java:478)
    	at org.apache.commons.codec.binary.Base64.decodeBase64(Base64.java:374)
    	at com.isomorphic.util.DataTools.base64Decode(DataTools.java:4805)
    	at com.isomorphic.datasource.DSRequest.decodeUploadedStrings(DSRequest.java:665)
    	at com.isomorphic.datasource.DSRequest.<init>(DSRequest.java:543)
    	at com.isomorphic.rpc.RPCManager.parseRequest(RPCManager.java:1994)
    	at com.isomorphic.rpc.RPCManager.<init>(RPCManager.java:284)
    	at com.isomorphic.rpc.RPCManager.<init>(RPCManager.java:269)
    	at com.isomorphic.servlet.IDACall.processRequest(IDACall.java:133)
    	at com.isomorphic.servlet.IDACall.doPost(IDACall.java:74)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    	at com.isomorphic.servlet.BaseServlet.service(BaseServlet.java:152)
    	at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    	at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1097)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:322)
    	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116)
    	at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    	at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    	at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:184)
    	at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:155)
    	at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
    	at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:83)
    	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    	at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1088)
    	at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
    	at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
    	at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
    	at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729)
    	at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49)
    	at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
    	at org.mortbay.jetty.Server.handle(Server.java:324)
    	at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
    	at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843)
    	at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647)
    	at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:205)
    	at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
    	at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
    	at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488)
    In the ISC Console RPC Log, this is what the request looks like:
    Code:
    {
        dataSource:"publicoInterno", 
        operationType:"update", 
        componentId:"isc_DynamicForm_36", 
        data:{
            anexo:"C:\\fakepath\\20130101 - TERMO DE COMPROMISSO DE MANUTENÇÃO DE SIGILO E CUMPRIMENTO DAS NORMAS DE SEGURANÇA DA INFORMAÇÃO.docx", 
            visitaTecnica:42, 
            SQ_PUBLICO_INTERNO:101, 
            discussaoTematica:22, 
            telefoneComercial:"6190909090", 
            nomeCandidato:"XXXX YYYY", 
            cargo:"iouiouio", 
            mesaRedonda:true, 
            enviado:false, 
            IM_ANEXO_filesize:84335, 
            feira:true, 
            unidadeExercicio:"iuoiuoi", 
            escolaridade:1, 
            IM_ANEXO_date_created:"2013-01-23T15:35:40", 
            padrao:"iouoiu", 
            login:"maria.matos", 
            cpf:"12345", 
            descricaoVisita:"Estádio Governador Magalhães Pinto - Mineirão", 
            vinculoFunasa:3, 
            nivel:2, 
            identidade:"98098098", 
            orgaoExpedidor:"SSP/DF", 
            unidadeLotacao:"iouoiuoi", 
            fax:"6190090909", 
            classe:"iouoiuoi", 
            unidadeOrigem:"uiouoi", 
            IM_ANEXO_filename:"analytics.jar", 
            descricaoDiscussao:"Esgotamento Sanitário", 
            formacao:"Testador", 
            matriculaSIAPE:"8979879", 
            telefoneCelular:"61909090909", 
            telefoneResidencial:"6198989890", 
            email:"cedric.lamalle@ba.com", 
            nomeEvento:"IV Seminário Internacional de Engenharia de Saúde", 
            localEvento:"Belo Horizonte/MG", 
            periodoEvento:"18 a 22/03/2013"
        }, 
        callback:{
            target:[DynamicForm ID:isc_DynamicForm_36], 
            methodName:"saveEditorReply"
        }, 
        showPrompt:true, 
        prompt:"Salvando formulário...", 
        oldValues:{
            visitaTecnica:42, 
            SQ_PUBLICO_INTERNO:101, 
            discussaoTematica:22, 
            telefoneComercial:"6190909090", 
            nomeCandidato:"XXXX YYYY", 
            cargo:"iouiouio", 
            mesaRedonda:true, 
            enviado:false, 
            IM_ANEXO_filesize:84335, 
            feira:true, 
            unidadeExercicio:"iuoiuoi", 
            escolaridade:1, 
            IM_ANEXO_date_created:"2013-01-23T15:35:40", 
            padrao:"iouoiu", 
            login:"maria.matos", 
            cpf:"12345", 
            descricaoVisita:"Estádio Governador Magalhães Pinto - Mineirão", 
            vinculoFunasa:3, 
            nivel:2, 
            identidade:"98098098", 
            orgaoExpedidor:"SSP/DF", 
            unidadeLotacao:"iouoiuoi", 
            fax:"6190090909", 
            classe:"iouoiuoi", 
            unidadeOrigem:"uiouoi", 
            IM_ANEXO_filename:"analytics.jar", 
            descricaoDiscussao:"Esgotamento Sanitário", 
            formacao:"Testador", 
            matriculaSIAPE:"8979879", 
            telefoneCelular:"61909090909", 
            telefoneResidencial:"6198989890", 
            email:"cedric.lamalle@ba.com"
        }, 
        requestId:"publicoInterno$6274", 
        clientContext:{
        }, 
        useStrictJSON:true, 
        fallbackToEval:true, 
        afterFlowCallback:"isc_DynamicForm_36.$49z(dsRequest, dsResponse, data)", 
        directSubmit:true, 
        submitForm:[DynamicForm ID:isc_DynamicForm_36], 
        editor:[DynamicForm ID:isc_DynamicForm_36], 
        bypassCache:true
    }
    I gave an example with an update, but with an add operation result is the same. After the error nothing gets back to the client and the operation times out.

    On the same form if I attach a file with no spaces, all works well.

    #2
    Just tested with MultiFileItem and the same problem ocurrs.

    Comment


      #3
      We are not reproducing this locally. Please post your .ds.xml file to give us some more troubleshooting information.

      Comment


        #4
        Here is the datasource containing an attachment:

        Code:
        <DataSource ID="anexoRelDiario" tableName="DB_FISCALIZACAO.TBL_ANEXO_REL_DIARIO" serverType="sql">
        	<fields>
        		<field type="sequence" name="SQ_ANEXO_REL_DIARIO" primaryKey="true" hidden="true"
        			sequenceName="DB_FISCALIZACAO.SEQ_ANEXO_REL_DIARIO" />
        		<field name="legenda" title="Legenda" lenght="255" type="text" nativeName="TX_LEGENDA" />
        		<field name="tipoServico" title="Tipo de serviço" type="integer" nativeName="CD_TIPO_SERVICO">
        			<valueMap>
        				<value id="0">Serviços iniciados</value>
        				<value id="1">Serviços desenvolvidos no período</value>
        				<value id="2">Serviços concluídos</value>
        			</valueMap>
        		</field>
        		<field name="descricao" title="Descrição" length="4000" type="text" nativeName="TX_DESCRICAO" />
        		<field name="foto" type="binary" nativeName="IM_FOTO" />
        		<field name="IM_FOTO_filesize" type="integer" nativeName="NU_TAMANHO_FOTO" hidden="true" />
        		<field name="IM_FOTO_date_created" type="datetime" nativeName="DT_UPLOAD_FOTO" hidden="true" />
        		<field name="IM_FOTO_filename" type="text" title="Nome do arquivo anexado" nativeName="TX_NOME_FOTO" hidden="true" />
        		<field name="relDiario" type="integer" nativeName="CD_REL_DIARIO" foreignKey="relDiario.id" hidden="true" />
        	</fields>
        </DataSource>

        Comment


          #5
          This DataSource doesn't appear to match the original request you posted, so it doesn't help much. We can't reproduce this locally with a simple binary field and a field name with embedded spaces, and the stacktrace you posted suggests that something rather odd is going on, so we wanted to see the actual DataSource that is causing this failure. What we need to see is the details of a DataSource and a request on that DataSource that is failing as you describe.

          Comment


            #6
            Sorry posted the datasource I used with MultiFileItem.
            Here's the original one:
            Code:
            <DataSource ID="publicoInterno" tableName="DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO"
            	serverType="sql">
            	<fields>
            		<field type="sequence" name="SQ_PUBLICO_INTERNO" sequenceName="DB_SEMINARIO_INTERNACIONAL.SEQ_PUBLICO_INTERNO" primaryKey="true" hidden="true" />
            		<field type="text" name="nomeCandidato" nativeName="TX_NOME_CANDIDATO" title="Nome do Candidato" length="100" />
            		<field type="text" name="matriculaSIAPE" nativeName="NU_MAT_SIAPE" title="Matrícula SIAPE" length="7" required="true"/>
            		<field type="integer" name="discussaoTematica" nativeName="CD_DISCUSSAO_TEMATICA" foreignKey="discussao.SQ_DISCUSSAO_TEMATICA" title="Discussão Temática (21 de março de 2013)" required="true" hidden="true" />
            		<field name="descricaoDiscussao" includeFrom="discussao.descricao"/>
            		<field type="integer" name="visitaTecnica" nativeName="CD_VISITA_TECNICA" foreignKey="visita.SQ_VISITA_TECNICA" title="Visita Técnica (22 de março de 2013)" required="true" hidden="true" />
            		<field name="descricaoVisita" includeFrom="visita.descricao"/>
            		
            		<field type="text" name="unidadeOrigem" nativeName="TX_UNID_ORIGEM" title="Unidade de Origem" length="80" required="true"/>
            		<field type="text" name="unidadeLotacao" nativeName="TX_UNID_LOTACAO" title="Unidade de Lotação" length="80" required="true"/>
            		<field type="text" name="unidadeExercicio" nativeName="TX_UNID_EXERCICIO" title="Unidade de Exercício" length="80" required="true"/>
            		<field type="text" name="cargo" nativeName="TX_CARGO" title="Cargo" length="60" required="true"/>
            		<field type="text" name="classe" nativeName="TX_CLASSE" title="Classe" length="50" required="true"/>
            		<field type="text" name="padrao" nativeName="TX_PADRAO" title="Padrão" length="50" required="true"/>
            		<field type="text" name="funcao" nativeName="TX_FUNCAO" title="Função" length="50" />
            		<field type="text" name="das" nativeName="TX_DAS" title="DAS" length="100" />
            		<field type="text" name="fg" nativeName="TX_FG" title="FG" length="100" />
            		<field type="text" name="fct" nativeName="TX_FCT" title="FCT" length="100" />
            		<field type="text" name="email" nativeName="TX_EMAIL" title="E-mail" length="100" required="true">
            			<validators>
            				<validator type="regexp" expression="^([a-zA-Z0-9_.\-+])+@(([a-zA-Z0-9\-])+\.)+[a-zA-Z0-9]{2,4}$">
            					<errorMessage>E-mail inválido</errorMessage>
            				</validator>
            			</validators>
            		</field>
            		<field type="integer" name="nivel" nativeName="CD_NIVEL" title="Nível" required="true">
            			<valueMap>
                    		<value id="1">Auxiliar - NA</value>
                    		<value id="2">Intermediário - NI</value>
                    		<value id="3">Superior - NS</value>
                    	</valueMap>
            		</field>
            		<field type="integer" name="vinculoFunasa" nativeName="CD_VINCULO_FUNASA" title="Vínculo com a FUNASA" required="true">
            			<valueMap>
                    		<value id="1">Servidor</value>
                    		<value id="2">Cargo de Confiança</value>
                    		<value id="3">Outros</value>
                    	</valueMap>
            		</field>
            		<field type="text" name="telefoneComercial" nativeName="NU_TELEFONE_COMERCIAL" title="Telefone Comercial" length="11" required="true"/>
            		<field type="text" name="fax" nativeName="NU_FAX" title="Fax" length="11" />
            		
            		<field type="text" name="identidade" nativeName="NU_IDENTIDADE" title="Identidade" length="11" required="true"/>
            		<field type="text" name="orgaoExpedidor" nativeName="TX_ORG_EXP" title="Órgão Expedidor" length="11" required="true"/>
            		<field type="text" name="cpf" nativeName="NU_CPF" title="CPF" length="11" required="true">
            			<validators>
                    		<validator type="serverCustom">
                                <serverObject lookupStyle="new" className="br.gov.funasa.seminario.server.ValidadorCPF" />  
                                <errorMessage>$mensagem</errorMessage>  
                            </validator>	
            	        </validators>
            		</field>
            		<field type="text" name="telefoneResidencial" nativeName="NU_TELEFONE_RESIDENCIAL" title="Telefone Residencial" length="11" required="true"/>
            		<field type="text" name="telefoneCelular" nativeName="NU_TELEFONE_CELULAR" title="Telefone Celular" length="11" required="true"/>
            		<field type="integer" name="escolaridade" nativeName="CD_ESCOLARIDADE" title="Escolaridade" required="true">
            			<valueMap>
                    		<value id="1">Ensino Fundamental</value>
                    		<value id="2">Ensino Médio</value>
                    		<value id="3">Ensino Superior</value>
                    	</valueMap>
            		</field>
            		<field type="text" name="formacao" nativeName="TX_FORMACAO" title="Formação" length="50" required="true"/>
            		<field name="anexo" title="Anexo NOC" type="binary" nativeName="IM_ANEXO"/>
            		<field name="IM_ANEXO_filesize" type="integer" nativeName="NU_TAMANHO_ANEXO" hidden="true"/>
                    <field name="IM_ANEXO_date_created" type="datetime" nativeName="DT_UPLOAD_ANEXO" hidden="true"/>
                    <field name="IM_ANEXO_filename"  type="text" title="Nome do arquivo anexado" nativeName="TX_NOME_ANEXO" hidden="false"/>
            		<field type="boolean" name="feira" nativeName="LO_INSCRICAO_FEIRA" title="Feira" sqlStorageStrategy="singleChar" sqlFalseValue="N" sqlTrueValue="S"/>
            		<field type="boolean" name="mesaRedonda" nativeName="LO_INSCRICAO_MESA_REDONDA" title="Mesas redondas e painéis" sqlStorageStrategy="singleChar" sqlFalseValue="N" sqlTrueValue="S"/>
            		<field type="boolean" name="enviado" nativeName="LO_ENVIADO" title="Relatório Enviado" sqlStorageStrategy="singleChar" sqlFalseValue="N" sqlTrueValue="S"/>
            		<field name="login" type="text" nativeName="TX_LOGIN" />
            		<field type="text" name="numeroProtocolo" nativeName="NU_PROTOCOLO" title="Número do protocolo de pre-inscrição" length="16" />
            	</fields>
            	<operationBindings>
            		<operationBinding operationType="fetch" operationId="doUsuarioLogado">
            			<serverObject bean="servicoSeguranca" methodName="adicionaDadosDoUsuarioLogado" lookupStyle="spring" />
            		</operationBinding>
            		<operationBinding operationType="add">
            			<serverObject bean="servicoInscricaoSeminario" methodName="adicionaPublicoInterno" lookupStyle="spring" />
            		</operationBinding>
            		<operationBinding operationType="add" operationId="enviar">
            			<serverObject bean="servicoInscricaoSeminario" methodName="enviarRelatorioPublicoInterno" lookupStyle="spring" />
            		</operationBinding>
            		<operationBinding operationType="update" operationId="enviar">
            			<serverObject bean="servicoInscricaoSeminario" methodName="enviarRelatorioPublicoInterno" lookupStyle="spring" />
            		</operationBinding>
            		<operationBinding operationType="custom" operationId="geraPDF">
            			<serverObject bean="servicoInscricaoSeminario" methodName="geraPDFNoc" lookupStyle="spring" />
            		</operationBinding>
            	</operationBindings>
            </DataSource>

            Comment


              #7
              Hello,
              Do you need more informations regarding this problem?

              Regards,
              Cédric.

              Comment


                #8
                The problem here is the nativeName mapping on the binary field. We don't send the nativeName property to the client (it's considered information leakage to do so, and helpful to somebody trying to design an injection attack), so it has no way of knowing that "IM_ANEXO_filename" is associated with "anexo". This is another issue we are discussing internally, but for now we think that things should just work if you rename your "IM_ANEXO_*" fields to "anexo_*" - in other words, echo the binary field's name, not its nativeName

                Comment


                  #9
                  I had first used fieldname_XXXX to map the binary metadata fields (as stated in the documentation). But it doesn't work.
                  Here's the modified Datasource:
                  Code:
                  <field name="anexo" title="Anexo NOC" type="binary" nativeName="IM_ANEXO"/>
                  		<field name="anexo_filesize" type="integer" nativeName="NU_TAMANHO_ANEXO" hidden="true"/>
                          <field name="anexo_date_created" type="datetime" nativeName="DT_UPLOAD_ANEXO" hidden="true"/>
                          <field name="anexo_filename"  type="text" title="Nome do arquivo anexado" nativeName="TX_NOME_ANEXO" hidden="false"/>
                  Here's the associated stacktrace on the server:
                  Code:
                  === 2013-01-29 09:24:31,754 [l0-4] INFO  SQLDataSource - [builtinApplication.doUsuarioLogado] derived query: SELECT $defaultSelectClause FROM $defaultTableClause WHERE $defaultWhereClause AND $defaultJoinWhereClause
                  === 2013-01-29 09:24:31,754 [l0-4] INFO  SQLDataSource - [builtinApplication.doUsuarioLogado] Executing SQL query on 'Funasa': SELECT DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_date_created, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_filename, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_filesize, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.SQ_PUBLICO_INTERNO, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO AS anexo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.DT_UPLOAD_ANEXO AS anexo_date_created, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_NOME_ANEXO AS anexo_filename, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TAMANHO_ANEXO AS anexo_filesize, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_CARGO AS cargo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_CLASSE AS classe, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_CPF AS cpf, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_DAS AS das, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_DISCUSSAO_TEMATICA AS discussaoTematica, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_EMAIL AS email, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_ENVIADO AS enviado, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_ESCOLARIDADE AS escolaridade, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_FAX AS fax, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FCT AS fct, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_INSCRICAO_FEIRA AS feira, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FG AS fg, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FORMACAO AS formacao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FUNCAO AS funcao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_IDENTIDADE AS identidade, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_LOGIN AS login, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_MAT_SIAPE AS matriculaSIAPE, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_INSCRICAO_MESA_REDONDA AS mesaRedonda, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_NIVEL AS nivel, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_NOME_CANDIDATO AS nomeCandidato, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_PROTOCOLO AS numeroProtocolo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_ORG_EXP AS orgaoExpedidor, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_PADRAO AS padrao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_CELULAR AS telefoneCelular, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_COMERCIAL AS telefoneComercial, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_RESIDENCIAL AS telefoneResidencial, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_EXERCICIO AS unidadeExercicio, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_LOTACAO AS unidadeLotacao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_ORIGEM AS unidadeOrigem, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VINCULO_FUNASA AS vinculoFunasa, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VISITA_TECNICA AS visitaTecnica, DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA.TX_DISCUSSAO_TEMATICA AS descricaoDiscussao, DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA.TX_VISITA_TECNICA AS descricaoVisita FROM DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO, DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA, DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA WHERE (DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_LOGIN='sonia.borba') AND DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_DISCUSSAO_TEMATICA = DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA.SQ_DISCUSSAO_TEMATICA AND DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VISITA_TECNICA = DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA.SQ_VISITA_TECNICA
                  === 2013-01-29 09:24:31,754 [l0-4] DEBUG DataSource - [builtinApplication.doUsuarioLogado] In DS.forName() for 'usuario' with DSRequest: com.isomorphic.datasource.DSRequest@523414
                  === 2013-01-29 09:24:31,755 [l0-4] DEBUG DataSource - [builtinApplication.doUsuarioLogado] Creating instance of DataSource 'usuario'
                  === 2013-01-29 09:24:31,756 [l0-4] DEBUG PoolableSQLConnectionFactory - [builtinApplication.doUsuarioLogado] Executing pingTest 'select 1 from dual' on connection 22509459
                  === 2013-01-29 09:24:31,757 [l0-4] DEBUG SQLConnectionManager - [builtinApplication.doUsuarioLogado] Returning borrowed connection '22509459'
                  === 2013-01-29 09:24:31,757 [l0-4] DEBUG SQLDriver - [builtinApplication.doUsuarioLogado] About to execute SQL query in 'Funasa' using connection '22509459'
                  === 2013-01-29 09:24:31,757 [l0-4] INFO  SQLDriver - [builtinApplication.doUsuarioLogado] Executing SQL query on 'Funasa': SELECT DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_date_created, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_filename, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_filesize, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.SQ_PUBLICO_INTERNO, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO AS anexo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.DT_UPLOAD_ANEXO AS anexo_date_created, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_NOME_ANEXO AS anexo_filename, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TAMANHO_ANEXO AS anexo_filesize, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_CARGO AS cargo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_CLASSE AS classe, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_CPF AS cpf, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_DAS AS das, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_DISCUSSAO_TEMATICA AS discussaoTematica, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_EMAIL AS email, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_ENVIADO AS enviado, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_ESCOLARIDADE AS escolaridade, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_FAX AS fax, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FCT AS fct, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_INSCRICAO_FEIRA AS feira, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FG AS fg, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FORMACAO AS formacao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FUNCAO AS funcao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_IDENTIDADE AS identidade, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_LOGIN AS login, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_MAT_SIAPE AS matriculaSIAPE, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_INSCRICAO_MESA_REDONDA AS mesaRedonda, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_NIVEL AS nivel, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_NOME_CANDIDATO AS nomeCandidato, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_PROTOCOLO AS numeroProtocolo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_ORG_EXP AS orgaoExpedidor, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_PADRAO AS padrao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_CELULAR AS telefoneCelular, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_COMERCIAL AS telefoneComercial, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_RESIDENCIAL AS telefoneResidencial, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_EXERCICIO AS unidadeExercicio, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_LOTACAO AS unidadeLotacao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_ORIGEM AS unidadeOrigem, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VINCULO_FUNASA AS vinculoFunasa, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VISITA_TECNICA AS visitaTecnica, DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA.TX_DISCUSSAO_TEMATICA AS descricaoDiscussao, DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA.TX_VISITA_TECNICA AS descricaoVisita FROM DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO, DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA, DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA WHERE (DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_LOGIN='sonia.borba') AND DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_DISCUSSAO_TEMATICA = DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA.SQ_DISCUSSAO_TEMATICA AND DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VISITA_TECNICA = DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA.SQ_VISITA_TECNICA
                  === 2013-01-29 09:24:31,759 [l0-4] INFO  SQLDriver - [builtinApplication.doUsuarioLogado] Execute of select: SELECT DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_date_created, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_filename, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO_filesize, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.SQ_PUBLICO_INTERNO, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.IM_ANEXO AS anexo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.DT_UPLOAD_ANEXO AS anexo_date_created, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_NOME_ANEXO AS anexo_filename, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TAMANHO_ANEXO AS anexo_filesize, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_CARGO AS cargo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_CLASSE AS classe, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_CPF AS cpf, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_DAS AS das, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_DISCUSSAO_TEMATICA AS discussaoTematica, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_EMAIL AS email, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_ENVIADO AS enviado, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_ESCOLARIDADE AS escolaridade, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_FAX AS fax, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FCT AS fct, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_INSCRICAO_FEIRA AS feira, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FG AS fg, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FORMACAO AS formacao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_FUNCAO AS funcao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_IDENTIDADE AS identidade, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_LOGIN AS login, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_MAT_SIAPE AS matriculaSIAPE, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.LO_INSCRICAO_MESA_REDONDA AS mesaRedonda, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_NIVEL AS nivel, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_NOME_CANDIDATO AS nomeCandidato, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_PROTOCOLO AS numeroProtocolo, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_ORG_EXP AS orgaoExpedidor, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_PADRAO AS padrao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_CELULAR AS telefoneCelular, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_COMERCIAL AS telefoneComercial, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.NU_TELEFONE_RESIDENCIAL AS telefoneResidencial, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_EXERCICIO AS unidadeExercicio, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_LOTACAO AS unidadeLotacao, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_UNID_ORIGEM AS unidadeOrigem, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VINCULO_FUNASA AS vinculoFunasa, DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VISITA_TECNICA AS visitaTecnica, DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA.TX_DISCUSSAO_TEMATICA AS descricaoDiscussao, DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA.TX_VISITA_TECNICA AS descricaoVisita FROM DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO, DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA, DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA WHERE (DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.TX_LOGIN='sonia.borba') AND DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_DISCUSSAO_TEMATICA = DB_SEMINARIO_INTERNACIONAL.TBL_DISCUSSAO_TEMATICA.SQ_DISCUSSAO_TEMATICA AND DB_SEMINARIO_INTERNACIONAL.TBL_PUBLICO_INTERNO.CD_VISITA_TECNICA = DB_SEMINARIO_INTERNACIONAL.TBL_VISITA_TECNICA.SQ_VISITA_TECNICA on db: Funasa threw exception: java.sql.SQLException: ORA-00904: "DB_SEMINARIO_INTERNACIONAL"."TBL_PUBLICO_INTERNO"."IM_ANEXO_FILESIZE": identificador inválido
                   - assuming stale connection and retrying query.
                  === 2013-01-29 09:24:31,759 [l0-4] DEBUG SQLConnectionManager - [builtinApplication.doUsuarioLogado] About to close PoolableConnection with hashcode "22509459"
                  === 2013-01-29 09:24:31,759 [l0-4] DEBUG PoolableSQLConnectionFactory - [builtinApplication.doUsuarioLogado] Executing pingTest 'select 1 from dual' on connection 22509459
                  === 2013-01-29 09:24:31,760 [l0-4] DEBUG PoolableSQLConnectionFactory - [builtinApplication.doUsuarioLogado] DriverManager fetching connection for Funasa via jdbc url jdbc:oracle:thin:@192.168.56.101:1521:orcl
                  === 2013-01-29 09:24:31,760 [l0-4] DEBUG PoolableSQLConnectionFactory - [builtinApplication.doUsuarioLogado] Passing credentials getConnection separately from JDBC URL
                  === 2013-01-29 09:24:31,784 [l0-4] DEBUG PoolableSQLConnectionFactory - [builtinApplication.doUsuarioLogado] makeObject() created a pooled Connection '8567344'
                  === 2013-01-29 09:24:31,786 [l0-4] DEBUG SQLConnectionManager - About to close PoolableConnection with hashcode "8567344"
                  === 2013-01-29 09:24:31,786 [l0-4] DEBUG PoolableSQLConnectionFactory - Executing pingTest 'select 1 from dual' on connection 8567344
                  === 2013-01-29 09:24:31,787 [l0-4] DEBUG DataSourceDMI - Invocation threw exception
                  java.sql.SQLException: ORA-00904: "DB_SEMINARIO_INTERNACIONAL"."TBL_PUBLICO_INTERNO"."IM_ANEXO_FILESIZE": identificador inválido
                  Looks like it's using nativeName to map the metadata fields. I've tried to remove the metadata mapping from the datasource, but still have the issue with files with space in names.

                  Comment


                    #10
                    OK, we'll take another look. Please bear with us until tomorrow - the engineer assigned to this issue is in a European timezone.

                    Comment


                      #11
                      Any news on this one?

                      The same occurs with file with non ascii chars. As I put this in production there are a lot of people complaining here.

                      Here's the code:
                      Code:
                      === 2013-02-01 11:39:01,666 [l0-4] INFO  DSRequest - We parsed 1 uploaded file(s): "Têsçí.zip" (166031 bytes)
                      === 2013-02-01 11:39:01,666 [l0-4] DEBUG DataSource - In DS.forName() for 'publicoInterno' with DSRequest: com.isomorphic.datasource.DSRequest@a49837
                      === 2013-02-01 11:39:01,666 [l0-4] DEBUG DataSource - Creating instance of DataSource 'publicoInterno'
                      === 2013-02-01 11:39:01,666 [l0-4] DEBUG DataSource - In DS.forName() for 'discussao' with DSRequest: null
                      === 2013-02-01 11:39:01,667 [l0-4] DEBUG DataSource - Creating instance of DataSource 'discussao'
                      === 2013-02-01 11:39:01,667 [l0-4] DEBUG DataSource - In DS.forName() for 'visita' with DSRequest: null
                      === 2013-02-01 11:39:01,667 [l0-4] DEBUG DataSource - Creating instance of DataSource 'visita'
                      === 2013-02-01 11:39:01,670 [l0-4] ERROR IDACall - Top-level servlet error: 
                      java.lang.ArrayIndexOutOfBoundsException: -61
                      	at org.apache.commons.codec.binary.Base64.isBase64(Base64.java:137)

                      Comment


                        #12
                        We have just committed some changes in the area of file upload. These should make your issues with nativeName mapping go away - they will allow you to use the fieldName_xxxx approach that we recently recommended, and that you tried without success.

                        These changes will also fix the separate issue you reported on another thread where repeatedly clicking Save on the same form (with a FileItem present) was causing extra records to be written.

                        At the moment, these changes will only be present in 4.0d nightly builds as of tomorrow (Feb 2nd). Are you in a position to try your use cases with this build and confirm that it fixes your problems?

                        Comment


                          #13
                          Yes, I can give it a try. Will see if it fixes the other issues.
                          Any hope to have this backported in 3.1p if it works?

                          Comment


                            #14
                            Hi,
                            I've made some tests with the following version:
                            Isomorphic SmartClient/SmartGWT Framework (SNAPSHOT_v9.0d_2013-02-03/EVAL Deployment 2013-02-03)
                            I used the same datasource and was able to save files with spaces and accented characters in the name.
                            So, any chance to have it backported to 3.1?

                            Comment


                              #15
                              Yes, we'll port these changes to 3.1p in the next day or two.

                              Comment

                              Working...
                              X