Hello.

I'm trying to do following:
1. I have a GWT-application with a form uploading text files in utf8
character encoding
2. Uploaded file content I save in the entity Blob field in datastore
3. I have a JavaFX client application getting this file content and
displaying it

Everything works just fine on dev environment but on production I have
problems with encoding - I get question marks on my javafx appet form.

More details.

1. On Form submit we go to

public class Upload extends HttpServlet

which creates a jdo transfer object (dictionaryTO) with byte[] field
where we need to store a content of the file:
dictionaryTO.setFile(inputStreamToBytes(item.openStream()));

where (notice, I'm setting "utf8" there):

       private byte[] inputStreamToBytes(InputStream stream)
                       throws IOException, IllegalArgumentException,
IllegalStateException
{

               BufferedReader inputStream = null;
               inputStream = new BufferedReader(new InputStreamReader
(stream,
"utf8"));

               String str;
               ByteArrayOutputStream out = new ByteArrayOutputStream
();
               StringBuffer buffer = new StringBuffer();
               while ((str = inputStream.readLine()) != null) {
                               ....
                               buffer.append(str);
                               buffer.append("\n");
               }
               out.write(buffer.toString().getBytes());
               out.close();
               return out.toByteArray();
       }

2. After that I need to transfer this object to next servlet
(dictionaryService) which will save this object as an entity in
datastore. Doing it this way:
                       PrintWriter out = null;
                       response.setCharacterEncoding("utf8");
                       response.setContentType("text/plain");
                       out = response.getWriter();
                       ...
                       request.getSession().setAttribute("dictionary",
dictionaryTO);
                       response.sendRedirect("dictionaryService");

3. dictionaryService is:
public class DictionaryServiceImpl extends RemoteServiceServlet
implements DictionaryService

which gets a transfer object from session, converts it in jdo entity
object - dictionary. A field with file content is being converted from
byte[] into Blob in this way - new Blob(dictionaryTO).getFile()). And
then the object is saved in a standard way: pm.makePersistent
(dictionary).

4. After that we need to process a request from client javafx
application. All I need is two methods:

import java.net.HttpURLConnection;
import java.net.URL;

   /**
    * Common method that performs http request to the servlet in
order to
    * retrieve required data
    *
    * @param urlString servlet name to send request
    * @param xml xml-body of request
    * @return xml-response from servlet
    * @throws java.lang.Exception
    */
   static private String performHttpPostRequest(String urlString,
String xml) throws Exception {
       URL url;
       HttpURLConnection connection;
       String response = "false";
       url = new URL(urlString);
       connection = (HttpURLConnection) url.openConnection();
       connection.setRequestMethod("POST");
       connection.setUseCaches(false);
       connection.setDoOutput(true);
       connection.setDoInput(true);
       connection.setAllowUserInteraction(true);
       connection.setRequestProperty("Content-Type", "application/x-
www-form-urlencoded;charset=utf8");
       //connection.setRequestProperty("Content-Type", "text/
xml;charset=utf8");
       connection.setRequestProperty("Accept-Charset", "utf8");
       connection.getOutputStream().write(xml.getBytes());

       InputStream inpStr;
       inpStr = connection.getInputStream();
       //System.out.println("+++ " + connection.getRequestProperty
("Content-Type"));

       response = convertStreamToString(inpStr);

       inpStr.close();

       return response;
   }

   /**
    * Converts input stream received from servlet into string.
    *
    * @param is input stream
    * @return input stream as a string
    */
   static private String convertStreamToString(InputStream is) /
*throws UnsupportedEncodingException*/ {

           BufferedReader reader = new BufferedReader(new
InputStreamReader(is));
           StringBuilder sb = new StringBuilder();
           String line = null;
           try {
               while ((line = reader.readLine()) != null) {
                   sb.append(line);
               }
           } catch (IOException e) {
               e.printStackTrace();
           } finally {
               try {
                   is.close();
               } catch (IOException e) {
                   e.printStackTrace();
               }
           }

           return sb.toString();
   }

5. On the server side this request receives
public class GetDictionary extends HttpServlet

       protected void doPost(HttpServletRequest request,
HttpServletResponse
response) throws ServletException, IOException {
               response.setCharacterEncoding("utf8");
               response.setContentType("text/plain");
               ...
Here I'm parse an xml-string containing an ID of dictionary to
retreive from datastore (and whose file content I need to send back to
client). dictId is String.
               ...
               request.getSession().setAttribute
("dictionaryToGetDictionary",
dictId);
               response.sendRedirect(response.encodeURL
("dictionaryService"));
       }

6. After that dictionaryService (public class DictionaryServiceImpl
extends RemoteServiceServlet implements DictionaryService) will get an
entity object from datastore:

       public DictionaryTransferObject get(Long id) {

               PersistenceManager pm = PersistenceManagerHelper
                               .getPersistenceManager();

               Query query = pm.newQuery(Dictionary.class);
               query.setFilter("id == idParam");
               query.declareParameters("Long idParam");
               ....
      }

will parse field with file content using ENCODING="utf8"

       public static List<WordBean> getLines(DictionaryTransferObject
dictionary) {

               List<WordBean> wordsList = new ArrayList<WordBean>();

               BufferedReader inputStream = null;
               try {
                       inputStream = new BufferedReader(new
InputStreamReader(
                                       new ByteArrayInputStream
(dictionary.getFile()), ENCODING));

                       String str;
                       while ((str = inputStream.readLine()) != null)
{
                       ...

and will form an xml-string like xmlString="<lines><s>line</
s><s>line</
s>...</lines>" and will send it to client:

protected void doGet(HttpServletRequest request,
                       HttpServletResponse response) throws
ServletException, IOException
{
               response.setCharacterEncoding("utf8");
               PrintWriter out = response.getWriter();
               ...
                       response.setContentType("text/
xml;charset=utf8");
                       out.print(xmlString);
                       out.close();

                       return;
}

On development environment everything works correctly on all stages,
but on production there are some problems and I cannot understand what
are the differences and where is a bug:
1. when I write a file content to datastore?
2. when I fetch it and send to client?
3. or when I receive it on the cient-side?


Any ideas?


Thank you,
Alexey
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Google App Engine for Java" group.
To post to this group, send email to google-appengine-java@googlegroups.com
To unsubscribe from this group, send email to 
google-appengine-java+unsubscr...@googlegroups.com
For more options, visit this group at 
http://groups.google.com/group/google-appengine-java?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to