gt:                 Type collectionType = new TypeToken<MarketPlaceFile>() {
context: /*
   * To change this template, choose Tools | Templates
   * and open the template in the editor.
   */
  package it.freedomotic.marketplace.postplugin;
  
  import com.google.gson.Gson;
  import com.google.gson.reflect.TypeToken;
  import com.google.gson.stream.JsonReader;
  import it.freedomotic.marketplace.util.DrupalRestHelper;
  import it.freedomotic.marketplace.util.MarketPlaceFile;
  import it.freedomotic.marketplace.util.MarketPlacePlugin2;
  import java.io.*;
  import java.lang.reflect.Type;
  import java.util.List;
  import java.util.logging.Level;
  import java.util.logging.Logger;
  import org.restlet.Client;
  import org.restlet.Context;
  import org.restlet.Response;
  import org.restlet.data.CookieSetting;
  import org.restlet.data.Method;
  import org.restlet.data.Protocol;
  import org.restlet.engine.util.Base64;
  import org.restlet.ext.json.JsonRepresentation;
  import org.restlet.representation.Representation;
  import org.restlet.resource.ClientResource;
  import org.restlet.resource.ResourceException;
  
  /**
   *
   * @author gpt
   */
  public class JavaUploader {
  
      public static final String DRUPALPATH = "http://www.freedomotic.com/";
  
      /**
       * @param args the command line arguments
       */
      public static void main(String[] args) throws IOException {
  
          //change this for real username and password        
          //String loginJson = login("username", "password");
          //CookieSetting cS = parseCookie(loginJson);
          //String uid = parseUid(loginJson);
  
          //String test = postTaxonomySelectNodes("151",0);        
          //List<MarketPlacePlugin2> testlist = DrupalRestHelper.retrievePluginsByCategory("151");
          MarketPlacePlugin2 pluginTest = (MarketPlacePlugin2) DrupalRestHelper.retrievePluginPackage("http://www.freedomotic.com/rest/node/1196");
  //        MarketPlacePlugin2 pluginTest = (MarketPlacePlugin2) DrupalRestHelper.retrievePluginPackage("http://www.freedomotic.com/rest/node/394");
  //        putPlugin(cS, "394", pluginTest); 
  //        String nid = "394";
          //if (cS != null) {
          //String nid = postPlugin(cS, plugin);
          //String fid = postFile(cS, uid, "/home/gpt/Desarrollo/", "testfile1.zip");            
          //MarketPlacePluginFileField fileField = new MarketPlacePluginFileField(fid, "file asociated by code");
          //MarketPlaceFile fileField = postFile(cS, uid, "/home/gpt/Desarrollo/", "testfile1.zip", true);
          //plugin.setField_file(fileField);
          //putPlugin(cS, nid, plugin);
          //}        
      }
  
      /**
       * Obtains the user id from the login Json response
       *
       * @param loginResponse Drupal Json response to a login
       * @return String The uid of the user that matches the login
       */
      public static String parseUid(String loginResponse) {
          try {
              JsonReader reader = new JsonReader(new StringReader(loginResponse));
              reader.beginObject();
              String name = reader.nextName();
              while (!name.equals("user")) {
                  reader.nextString();
                  name = reader.nextName();
              }
              reader.beginObject();
              name = reader.nextName();
              String value = reader.nextString();
              reader.close();
              return value;
          } catch (IOException ex) {
              Logger.getLogger(JavaUploader.class.getName()).log(Level.SEVERE, null, ex);
          }
          return null;
  
      }
  
      /**
       *
       */
      public static CookieSetting parseCookie(String loginResponse) {
          try {
              String session_id = "";
              String session_name = "";
              JsonReader reader = new JsonReader(new StringReader(loginResponse));
              reader.beginObject();
              String name = reader.nextName();
              if (name.equals("sessid")) {
                  session_id = reader.nextString();
              }
              name = reader.nextName();
              if (name.equals("session_name")) {
                  session_name = reader.nextString();
              }
              reader.close();
              return new CookieSetting(0, session_name, session_id);
          } catch (IOException ex) {
              Logger.getLogger(JavaUploader.class.getName()).log(Level.SEVERE, null, ex);
          }
          return null;
      }
  
      /**
       * Login to the drupal web service.
       *
       * @param username Drupal valid username
       * @param password Drupal Valid password for the previous username
       * @return String the drupal Json response
       */
      public static String login(String username, String password) {
  
          ClientResource cr = new ClientResource(DRUPALPATH + "/rest/user/login");
          String jsonData = "{\"username\":\"" + username + "\",\"password\":\"" + password + "\"}";
          JsonRepresentation jsonRep = new JsonRepresentation(jsonData);
          cr.setMethod(Method.POST);
          Representation rep = cr.post(jsonRep);
          Response resp = cr.getResponse();
          if (resp.getStatus().isSuccess()) {
              try {
                  return resp.getEntity().getText();
  
              } catch (IOException e) {
                  System.out.println("IOException: " + e.getMessage());
              }
          } else {
              System.out.println(resp.getStatus().getName());
          }
          return null;
      }
  
      /**
       *
       *
       * @return the nid of the created plugin, "" if it has not been created
       */
      public static String postTaxonomyGetTree(String vocabularyNumber) {
          ClientResource cr2 = new ClientResource(DRUPALPATH + "/rest/taxonomy_vocabulary/getTree");
          String text = "{\"vid\":\"" + vocabularyNumber + "\"}";
  
          cr2.setMethod(Method.POST);
          Representation rep2 = cr2.post(new JsonRepresentation(text));
          Response resp = cr2.getResponse();
          String jsonResponse = "";
          String nid = "";
          if (resp.getStatus().isSuccess()) {
              try {
                  jsonResponse = resp.getEntity().getText();
                  System.out.println(jsonResponse);
                  return jsonResponse;
              } catch (IOException e) {
                  System.out.println("IOException: " + e.getMessage());
              }
          } else {
              System.out.println(resp.getStatus().getName());
          }
          return "";
      }
  
      /**
       *
       *
       * @return A string with the selected nodes information as JSON
       * representation
       */
      public static String postTaxonomySelectNodes(String taxonomyTreeNumber, int page) {
          //plugin post                 
          try {
              ClientResource cr2 = new ClientResource(DRUPALPATH + "/rest/taxonomy_term/selectNodes?page=" + page);
              //String text = "{\"tids\":\""+taxonomyTreeNumber+"\",\"pager\":false}";        
              String text = "{\"tids\":\"" + taxonomyTreeNumber + "\"}";
              cr2.setMethod(Method.POST);
              JsonRepresentation jsonRepresentation = new JsonRepresentation(text);
              if (jsonRepresentation != null) {
                  Representation rep2 = cr2.post(jsonRepresentation);
                  Response resp = cr2.getResponse();
                  String jsonResponse = "";
                  String nid = "";
                  if (resp.getStatus().isSuccess()) {
                      try {
                          jsonResponse = resp.getEntity().getText();
                          System.out.println(jsonResponse);
                          return jsonResponse;
                      } catch (IOException e) {
                          System.out.println("IOException: " + e.getMessage());
                      }
                  } else {
                      System.out.println(resp.getStatus().getName());
                  }
              }
          } catch (ResourceException resourceException) {
             // Freedomotic.logger.warning(resourceException.toString());
          }
          return "";
      }
  
      /**
       * Creates a new plugin info on the drupal site
       *
       * @param cS CookieSetting retrieved from the login method
       * @param plugin Plugin to be posted on the Drupal site
       * @return the nid of the created plugin, "" if it has not been created
       */
      public static String postPlugin(CookieSetting cS, MarketPlacePlugin plugin) {
          //plugin post                 
          ClientResource cr2 = new ClientResource(DRUPALPATH + "/rest/node");
          cr2.getRequest().getCookies().add(cS);
          String pluginData = plugin.toJson();
  //        String pluginData = "{\"node\":"
  //                + "{\"type\":\"plugin\","
  //                + "\"title\":\""+plugin.getTitle()+"\","
  //                + "\"language\":\"und\","
  //                //+ "\"field_category\":[{\"value\":\""+plugin.getField_category()+"\"}],"
  //                + "\"field_category\":{\"0\":{\"value\":\""+plugin.getField_category()+"\"}},"
  //                + "\"field_plugin_category\":{\"0\":{\"value\":\"151\"}},"
  //                + "\"field_developer\":{\"0\":{\"uid\":{\"uid\":\"gpulido\"}}},"
  //                + "\"field_status\":[{\"value\":\""+plugin.getField_status()+"\"}],"
  //                + "\"field_os\":{\"value\":{\"Linux\":\"Linux\",\"Windows\":\"Windows\"}},"
  //                + "\"taxonomy\":{\"tags\":{\"2\":\"modbus gabriel\"}},"
  //                + "\"field_description\":[{\"value\":\"Test of autocreated plugin.\"}],"
  //                + "\"field_file\":{\"0\":{\"fid\":\"318\",\"data\":{\"description\":\"FileNameDescription\"}}},"
  //                + "\"body\":{\"und\":{\"0\":{\"value\":\"This is the body of my node\"}}}"
  //                + "}"
  //                + "}";
  
          cr2.setMethod(Method.POST);
  
          Representation rep2 = cr2.post(new JsonRepresentation(pluginData));
          Response resp = cr2.getResponse();
          String jsonResponse = "";
          String nid = "";
          if (resp.getStatus().isSuccess()) {
              try {
                  jsonResponse = resp.getEntity().getText();
                  System.out.println(jsonResponse);
                  //extract the fid field
                  JsonReader reader = new JsonReader(new StringReader(jsonResponse));
                  reader.beginObject();
                  String jsonName = reader.nextName();
                  if (jsonName.equals("nid")) {
                      nid = reader.nextString();
                  }
                  reader.close();
  
              } catch (IOException e) {
                  System.out.println("IOException: " + e.getMessage());
              }
          } else {
              System.out.println(resp.getStatus().getName());
          }
          return nid;
  
      }
  
      /**
       * Update the plugin information of the drupal site with the plugin data
       *
       * @param cS CookieSetting retrieved from the login method
       * @param nodeId The nodeId of the node on the drupal site
       * @param plugin The plugin data that is going to be used on the update
       */
      @Deprecated
      public static void putPlugin(CookieSetting cS, String nodeId, MarketPlacePlugin plugin) {
  
          Client client = new Client(new Context(), Protocol.HTTP);
          client.getContext().getParameters().add("use ForwardedForHeader", "false");
          ClientResource pluginResource = new ClientResource(DRUPALPATH + "/rest/node/" + nodeId);
          pluginResource.setNext(client);
          pluginResource.getRequest().getCookies().add(cS);
          //the only data needed to update a plugin is the node, type, and field_os
          String pluginData = plugin.formatBaseData() + ",";
          pluginData += plugin.formatFieldOS() + ",";
          pluginData += "\"field_category\":{\"0\":{\"value\":\"" + plugin.getField_category() + "\"}},";
          pluginData += "\"field_plugin_category\":{\"0\":{\"value\":\"151\"}}";
  
  
          //pluginData += "\"field_plugin_category\":[{\"value\":\"151\"},{\"value\":null},{\"value\":null},{\"value\":null},{\"value\":null}]" +",";        
          //pluginData += plugin.formatFieldCategory();
          pluginData += plugin.formatFieldFile();
          pluginData += "}";
          //+ "}";
          Representation rep = pluginResource.put(new JsonRepresentation(pluginData));
          Response resp2 = pluginResource.getResponse();
          if (resp2.getStatus().isSuccess()) {
              try {
                  System.out.println(resp2.getEntity().getText());
              } catch (IOException e) {
                  System.out.println("IOException: " + e.getMessage());
              }
          } else {
              System.out.println(resp2.getStatus().getName());
          }
  
      }
  
      /**
       * Update the plugin information of the drupal site with the plugin data
       *
       * @param cS CookieSetting retrieved from the login method
       * @param nodeId The nodeId of the node on the drupal site
       * @param plugin The plugin data that is going to be used on the update
       */
      public static void putPlugin(CookieSetting cS, String nodeId, MarketPlacePlugin2 plugin) {
  
          Client client = new Client(new Context(), Protocol.HTTP);
          client.getContext().getParameters().add("use ForwardedForHeader", "false");
          ClientResource pluginResource = new ClientResource(DRUPALPATH + "/rest/node/" + nodeId);
          pluginResource.setNext(client);
          pluginResource.getRequest().getCookies().add(cS);
          //the only data needed to update a plugin is the node, type, field_os and plugin_category
          String pluginData = "{"
                  + plugin.formatBaseData() + ","
                  + plugin.formatFieldCategory() + ","
                  + plugin.formatFieldPluginCategory() + ","
                  + plugin.formatFieldOS() + ","
                  + plugin.formatFieldFile()
                  + "}";
          System.out.println("PluginData " + pluginData);
          Representation rep = pluginResource.put(new JsonRepresentation(pluginData));
          Response resp2 = pluginResource.getResponse();
          if (resp2.getStatus().isSuccess()) {
              try {
                  System.out.println(resp2.getEntity().getText());
              } catch (IOException e) {
                  System.out.println("IOException: " + e.getMessage());
              }
          } else {
              System.out.println(resp2.getStatus().getName());
          }
  
      }
  
      /**
       * Uploads a new file on the drupal site
       *
       * @param cS CookieSetting retrieved from the login method
       * @param uid User id. Must be the same as the login
       * @param pathName Local path to the file to be uploaded (without the name)
       * @param name name of the file to be uploaded
       * @return The MarketPlaceFile of the new posted file
       * @throws IOException
       */
      public static MarketPlaceFile postFile(CookieSetting cS, String uid, String pathName, String name) throws IOException {
          //TODO: check what happens when the file already exists
          // Instantiate the client connector, and configure it.
          Client client = new Client(new Context(), Protocol.HTTP);
          client.getContext().getParameters().add("use ForwardedForHeader", "false");
  
          ClientResource testFileResource = new ClientResource(DRUPALPATH + "/rest/file");
  
          testFileResource.setNext(client);
          testFileResource.getRequest().getCookies().add(cS);
  
          //   File zipFile = new File("/home/gpt/Desarrollo/testfile1.zip");
          File zipFile = new File(pathName + "/" + name);
          int size = (int) zipFile.length();
          String base64String = Base64.encode(fileToByteArray(zipFile), false);
          //we post the file as uid 0
          String fileData = "{\"uid\":\"" + uid + "\","
                  + "\"filename\":\"" + name + "\","
                  + "\"filesize\":\"" + size + "\","
                  + "\"file\":\"" + base64String + "\""
                  + "}";
          testFileResource.setMethod(Method.POST);
  
          Representation rep2 = testFileResource.post(new JsonRepresentation(fileData));
          Response resp = testFileResource.getResponse();
          // {"fid":"320","uri":"http://freedomotic.com/rest/file/320"}     
          String jsonResponse = "";
          String fid = "";
          if (resp.getStatus().isSuccess()) {
              try {
                  jsonResponse = resp.getEntity().getText();
                  System.out.println(jsonResponse);
                  Gson gson = new Gson();
  