@Override
  protected void javaToNative(Object data, TransferData transferData) {
    if (!(data instanceof ArtifactData)) {
      return;
    }

    ArtifactData artData = (ArtifactData) data;
    /**
     * The resource serialization format is: (int) number of artifacts Then, the following for each
     * resource: (int) artID (int) tagID Then the following (int) urlLength (int) sourceLength
     * (chars) url (chars) source
     */
    try {
      ByteArrayOutputStream out = new ByteArrayOutputStream();
      DataOutputStream dataOut = new DataOutputStream(out);

      // write the number of resources
      dataOut.writeInt(artData.getArtifacts().length);

      for (Artifact artifact : artData.getArtifacts()) {
        writeArtifact(dataOut, artifact);
      }
      dataOut.writeInt(artData.getUrl().length());
      dataOut.writeInt(artData.getSource().length());
      dataOut.writeChars(artData.getUrl());
      dataOut.writeChars(artData.getSource());

      // cleanup
      dataOut.close();
      out.close();
      byte[] bytes = out.toByteArray();
      super.javaToNative(bytes, transferData);
    } catch (Exception e) {
      // it's best to send nothing if there were problems
    }
  }