@Override
  public TemplateModel get(String key) throws TemplateModelException {
    Object result = null;

    if (key.startsWith("@")) {
      if (key.equals("@handle")) {
        result = binaryNodeData.getHandle();
      }
    } else if (key.equals(FileProperties.CONTENT_TYPE)) {
      result = binaryNodeData.getAttribute(FileProperties.PROPERTY_CONTENTTYPE);
    } else if (key.equals(FileProperties.NAME)) {
      String filename = binaryNodeData.getAttribute(FileProperties.PROPERTY_FILENAME);
      String ext = binaryNodeData.getAttribute(FileProperties.PROPERTY_EXTENSION);
      result = filename + ((StringUtils.isEmpty(ext)) ? "" : "." + ext);
    } else if (key.equals(FileProperties.PROPERTY_FILENAME)) {
      result = binaryNodeData.getAttribute(FileProperties.PROPERTY_FILENAME);
    } else if (key.equals(FileProperties.PROPERTY_EXTENSION)) {
      result = binaryNodeData.getAttribute(FileProperties.PROPERTY_EXTENSION);
    } else if (key.equals(FileProperties.PROPERTY_LASTMODIFIED)) {
      try {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        result = format.parse(binaryNodeData.getAttribute(FileProperties.PROPERTY_LASTMODIFIED));
      } catch (ParseException e) {
        // do nothing.
      }
    } else {
      result = binaryNodeData.getAttribute(key);
    }
    return wrapper.wrap(result);
  }
 @Override
 public TemplateCollectionModel keys() throws TemplateModelException {
   Iterator<String> result = null;
   try {
     result = binaryNodeData.getAttributeNames().iterator();
   } catch (RepositoryException e) {
     // don't care
   }
   return (TemplateCollectionModel) wrapper.wrap(result);
 }
 @Override
 public TemplateCollectionModel values() throws TemplateModelException {
   ArrayList<String> result = new ArrayList<String>();
   try {
     Iterator<String> iter = binaryNodeData.getAttributeNames().iterator();
     while (iter.hasNext()) {
       result.add(iter.next());
     }
   } catch (RepositoryException e) {
     // don't care
   }
   return (TemplateCollectionModel) wrapper.wrap(result.iterator());
 }