Skip to content

Commit

Permalink
Merge pull request #35 from daweibayu/avfile_missing_data
Browse files Browse the repository at this point in the history
Avfile missing data
  • Loading branch information
daweibayu committed Aug 11, 2017
2 parents 26ec230 + 32b4256 commit c364581
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 90 deletions.
125 changes: 96 additions & 29 deletions src/main/java/com/avos/avoscloud/AVFile.java
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import com.avos.avoscloud.internal.InternalConfigurationController;
import com.avos.avoscloud.internal.InternalFileDownloader;
import com.avos.avoscloud.utils.MimeTypeMap;
import org.json.JSONObject;


/**
Expand All @@ -32,6 +33,15 @@
*/
public final class AVFile {

private static final String KEY_URL = "url";
private static final String KEY_TYPE = "__type";
private static final String KEY_NAME = "_name";
private static final String KEY_METADATA_SIZE = "size";
private static final String KEY_METADATA_OWNER = "owner";
private static final String KEY_SOURCE = "__source";
private static final String KEY_METADATA = "metaData";
private static final String KEY_METADATA_CHECK_SUM = "_checksum";

/**
* 需要上传但是未上传的 dirty 会标记为 true
*/
Expand Down Expand Up @@ -59,12 +69,11 @@ public final class AVFile {
// metadata for file,added by dennis<xzhuang@avos.com>,2013-09-06
private final HashMap<String, Object> metaData = new HashMap<String, Object>();
private static String defaultMimeType = "application/octet-stream";
private static final String FILE_SUM_KEY = "_checksum";
static final String FILE_NAME_KEY = "_name";


private String objectId;
private AVObject fileObject;
private String bucket;
private static final String ELDERMETADATAKEYFORIOSFIX = "metadata";
private AVACL acl;
private byte[] data;

Expand Down Expand Up @@ -107,7 +116,7 @@ public AVFile(String name, String url, Map<String, Object> metaData) {
if (metaData != null) {
this.metaData.putAll(metaData);
}
this.metaData.put("__source", "external");
this.metaData.put(KEY_SOURCE, "external");
}


Expand Down Expand Up @@ -142,15 +151,15 @@ public AVFile(String name, byte[] data) {
this.data = data;
}

this.metaData.put(FILE_SUM_KEY, md5);
this.metaData.put("size", data.length);
this.metaData.put(KEY_METADATA_CHECK_SUM, md5);
this.metaData.put(KEY_METADATA_SIZE, data.length);
} else {
this.metaData.put("size", 0);
this.metaData.put(KEY_METADATA_SIZE, 0);
}

AVUser currentUser = AVUser.getCurrentUser();
this.metaData.put("owner", currentUser != null ? currentUser.getObjectId() : "");
this.metaData.put(FILE_NAME_KEY, name);
this.metaData.put(KEY_METADATA_OWNER, currentUser != null ? currentUser.getObjectId() : "");
this.metaData.put(KEY_NAME, name);
}

protected AVFile(String name, String url) {
Expand Down Expand Up @@ -294,19 +303,19 @@ public static AVFile withAVObject(AVObject obj) {
}

private static AVFile createFileFromAVObject(AVObject object) {
AVFile file = new AVFile(object.getObjectId(), object.getString("url"));
if (object.getMap(ELDERMETADATAKEYFORIOSFIX) != null
&& !object.getMap(ELDERMETADATAKEYFORIOSFIX).isEmpty()) {
file.metaData.putAll(object.getMap(ELDERMETADATAKEYFORIOSFIX));
AVFile file = new AVFile(object.getObjectId(), object.getString(KEY_URL));
if (object.getMap(KEY_METADATA) != null
&& !object.getMap(KEY_METADATA).isEmpty()) {
file.metaData.putAll(object.getMap(KEY_METADATA));
}
if (object.getMap("metaData") != null) {
file.metaData.putAll(object.getMap("metaData"));
if (object.getMap(KEY_METADATA) != null) {
file.metaData.putAll(object.getMap(KEY_METADATA));
}
file.setObjectId(object.getObjectId());
file.fileObject = object;
file.setBucket((String) object.get("bucket"));
if (!file.metaData.containsKey(FILE_NAME_KEY)) {
file.metaData.put(FILE_NAME_KEY, object.getString("name"));
if (!file.metaData.containsKey(KEY_NAME)) {
file.metaData.put(KEY_NAME, object.getString("name"));
}
return file;
}
Expand Down Expand Up @@ -384,14 +393,14 @@ public static AVFile withFile(String name, File file) throws FileNotFoundExcepti
InternalConfigurationController.globalInstance().getInternalPersistence()
.readContentBytesFromFile(file);
if (null != data) {
avFile.metaData.put(FILE_SUM_KEY, AVUtils.computeMD5(data));
avFile.metaData.put("size", file.length());
avFile.metaData.put(KEY_METADATA_CHECK_SUM, AVUtils.computeMD5(data));
avFile.metaData.put(KEY_METADATA_SIZE, file.length());
} else {
avFile.metaData.put("size", 0);
avFile.metaData.put(KEY_METADATA_SIZE, 0);
}
AVUser currentUser = AVUser.getCurrentUser();
avFile.metaData.put("owner", currentUser != null ? currentUser.getObjectId() : "");
avFile.metaData.put(FILE_NAME_KEY, name);
avFile.metaData.put(KEY_METADATA_OWNER, currentUser != null ? currentUser.getObjectId() : "");
avFile.metaData.put(KEY_NAME, name);
return avFile;
}

Expand Down Expand Up @@ -435,7 +444,7 @@ public Object getMetaData(String key) {
* @since 1.3.4
*/
public int getSize() {
Number size = (Number) getMetaData("size");
Number size = (Number) getMetaData(KEY_METADATA_SIZE);
if (size != null)
return size.intValue();
else
Expand All @@ -449,7 +458,7 @@ public int getSize() {
* @since 1.3.4
*/
public String getOwnerObjectId() {
return (String) getMetaData("owner");
return (String) getMetaData(KEY_METADATA_OWNER);
}

/**
Expand Down Expand Up @@ -484,7 +493,7 @@ public String getName() {
* @return get file name
*/
public String getOriginalName() {
return (String) metaData.get(FILE_NAME_KEY);
return (String) metaData.get(KEY_NAME);
}

/**
Expand Down Expand Up @@ -924,9 +933,67 @@ public void setACL(AVACL acl) {
}

protected org.json.JSONObject toJSONObject() {
org.json.JSONObject object = new org.json.JSONObject();
Map<String, Object> data = AVUtils.mapFromFile(this);
data.put("url", url);
return object;
return new JSONObject(toMap());
}

public Map<String, Object> toMap() {
Map<String, Object> result = new HashMap<String, Object>();
result.put(KEY_TYPE, AVFile.className());
result.put(KEY_METADATA, getMetaData());

if (!AVUtils.isBlankString(getUrl())) {
result.put(KEY_URL, url);
}

if (!AVUtils.isBlankString(getObjectId())) {
result.put(AVObject.OBJECT_ID, getObjectId());
}

switch (InternalConfigurationController.globalInstance().getAppConfiguration().getStorageType()) {
case StorageTypeAV:
result.put("name", getName());
break;
case StorageTypeQiniu:
case StorageTypeS3:
// we store the objectId in file.name
result.put("id", getName());
break;
default:
break;
}

return result;
}

public static AVFile fileFromMap(Map<String, Object> map) {
AVFile file = new AVFile("", "");
AVUtils.copyPropertiesFromMapToObject(map, file);
Object metadata = map.get(KEY_METADATA);
if (metadata != null && metadata instanceof Map) {
file.getMetaData().putAll((Map) metadata);
}
if (AVUtils.isBlankString((String) file.getMetaData(KEY_NAME))) {
file.getMetaData().put(KEY_NAME, file.getName());
}

if (map.containsKey(KEY_URL)) {
file.setUrl((String)map.get(KEY_URL));
}

// maybe there isnt url in dict, so we need do some trick
switch (InternalConfigurationController.globalInstance().getAppConfiguration().getStorageType()) {
case StorageTypeAV:
break;
case StorageTypeQiniu:
// file.setUrl(QiniuUploader.getFileLink((String) map.get("bucket"),
// (String) map.get("key")));
case StorageTypeS3:
file.setName((String) map.get(AVObject.OBJECT_ID));
break;
default:
break;
}

return file;
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/avos/avoscloud/AVObject.java
Original file line number Diff line number Diff line change
Expand Up @@ -2198,7 +2198,7 @@ private void parseObjectValue(List<AVObject> unSavedChildren, Map<String, Object
} else if (o instanceof byte[]) {
body.put(key, AVUtils.mapFromByteArray((byte[]) o));
} else if (o instanceof AVFile) {
body.put(key, AVUtils.mapFromFile((AVFile) o));
body.put(key, ((AVFile) o).toMap());
} else {
body.put(key, AVUtils.getParsedObject(o));
}
Expand Down
67 changes: 9 additions & 58 deletions src/main/java/com/avos/avoscloud/AVUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -310,63 +310,14 @@ public static String jsonStringFromObjectWithNull(Object map) {
}
}

/*
* // from parse { "__type": "File", "url":
* "http://files.parse.com/bc9f32df-2957-4bb1-93c9-ec47d9870a05/db295fb2-8a8b-49f3-aad3-dd911142f64f-hello.txt"
* , "name": "db295fb2-8a8b-49f3-aad3-dd911142f64f-hello.txt" } // from urulu(qiniu) { "__type":
* "File", "bucket": "x5ocz6du3qyn5jiay7xw", "createdAt": "2013-05-23T07:38:18.000Z", "key":
* "8dyu9yShs6hi47co", "mime_type": "application/octet-stream", "name": "sample.apk", "objectId":
* "519dc76ae4b034b9cc5170a8", "updatedAt": "2013-05-23T07:38:18.000Z" } // from urulu(s3) {
* "__type": "File", "createdAt": "2013-05-27T07:10:52.000Z", "objectId":
* "51a306fce4b06e53feb1d95f", "updatedAt": "2013-05-27T07:10:52.000Z", "url":
* "https://s3-ap-northeast-1.amazonaws.com/avos-cloud/b60b1e29-5314-4538-9759-2cb6d6c74185" }
*/
@Deprecated
public static Map<String, Object> mapFromFile(AVFile file) {
Map<String, Object> result = new HashMap<String, Object>();
result.put("__type", AVFile.className());
result.put("metaData", file.getMetaData());

switch (InternalConfigurationController.globalInstance().getAppConfiguration().getStorageType()) {
case StorageTypeAV:
result.put("name", file.getName());
break;
case StorageTypeQiniu:
case StorageTypeS3:
// we store the objectId in file.name
result.put("id", file.getName());
break;
default:
break;
}

return result;
return file.toMap();
}

@Deprecated
public static AVFile fileFromMap(Map<String, Object> map) {
AVFile file = new AVFile("", "");
AVUtils.copyPropertiesFromMapToObject(map, file);
Object metadata = map.get("metaData");
if (metadata != null && metadata instanceof Map)
file.getMetaData().putAll((Map) metadata);
if (AVUtils.isBlankString((String) file.getMetaData(AVFile.FILE_NAME_KEY))) {
file.getMetaData().put(AVFile.FILE_NAME_KEY, file.getName());
}

// maybe there isnt url in dict, so we need do some trick
switch (InternalConfigurationController.globalInstance().getAppConfiguration().getStorageType()) {
case StorageTypeAV:
break;
case StorageTypeQiniu:
// file.setUrl(QiniuUploader.getFileLink((String) map.get("bucket"),
// (String) map.get("key")));
case StorageTypeS3:
file.setName((String) map.get("objectId"));
break;
default:
break;
}

return file;
return AVFile.fileFromMap(map);
}

public static AVObject parseObjectFromMap(Map<String, Object> map) {
Expand Down Expand Up @@ -400,7 +351,7 @@ public static String restfulCloudData(Object object) {
} else if (object instanceof byte[]) {
return jsonStringFromMapWithNull(mapFromByteArray((byte[]) object));
} else if (object instanceof AVFile) {
return jsonStringFromMapWithNull(mapFromFile((AVFile) object));
return jsonStringFromMapWithNull(((AVFile) object).toMap());
} else if (object instanceof org.json.JSONObject) {
return jsonStringFromObjectWithNull(JSON.parse(object.toString()));
} else if (object instanceof org.json.JSONArray) {
Expand Down Expand Up @@ -545,10 +496,10 @@ public static void updatePropertyFromMap(AVObject parent, String key, Map<String
byte[] data = dataFromMap(map);
parent.put(key, data, false);
} else if (isFile(type)) {
AVFile file = AVUtils.fileFromMap(map);
AVFile file = AVFile.fileFromMap(map);
parent.put(key, file, false);
} else if (isFileFromUrulu(map)) {
AVFile file = AVUtils.fileFromMap(map);
AVFile file = AVFile.fileFromMap(map);
parent.put(key, file, false);
} else if (isRelation(type)) {
parent.addRelationFromServer(key, (String) map.get(classNameTag), false);
Expand Down Expand Up @@ -830,7 +781,7 @@ public Object parse(Object object) {
} else if (object instanceof byte[]) {
return mapFromByteArray((byte[]) object);
} else if (object instanceof AVFile) {
return mapFromFile((AVFile) object);
return ((AVFile) object).toMap();
} else if (object instanceof org.json.JSONObject) {
return JSON.parse(object.toString());
} else if (object instanceof org.json.JSONArray) {
Expand Down Expand Up @@ -892,7 +843,7 @@ static Object getObjectFrom(Map<String, Object> map) {
} else if (type.equals("Relation")) {
return AVUtils.objectFromRelationMap(map);
} else if (type.equals("File")) {
return AVUtils.fileFromMap(map);
return AVFile.fileFromMap(map);
}
return map;
}
Expand Down
3 changes: 1 addition & 2 deletions src/main/java/com/avos/avoscloud/ops/CollectionOp.java
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,7 @@ public List getParsedValues() {
Object realValue = AVUtils.mapFromPointerObject((AVObject) v);
result.add(realValue);
} else if (v instanceof AVFile) {
Object realValue = AVUtils.mapFromFile((AVFile) v);
result.add(realValue);
result.add(((AVFile) v).toMap());
} else {
result.add(v);
}
Expand Down
33 changes: 33 additions & 0 deletions src/test/java/com/avos/avoscloud/AVFileTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.avos.avoscloud;

import com.alibaba.fastjson.JSON;
import junit.framework.Assert;
import junit.framework.TestCase;

import java.util.Map;

/**
* Created by wli on 2017/8/11.
*/
public class AVFileTest extends TestCase {

public void testFileFromMap() {
String FILE_JSON_STR = "{\"mime_type\":\"image\\/png\",\"updatedAt\":\"2017-08-09T03:41:53.225Z\",\"key\":\"1bf9754d1ec4e16bb7f8.png\",\"name\":\"name.png\",\"objectId\":\"598a848161ff4b006c409d80\",\"createdAt\":\"2017-08-09T03:41:53.225Z\",\"__type\":\"File\",\"url\":\"testurl\",\"provider\":\"qiniu\",\"metaData\":{\"size\":2860076,\"owner\":\"unknown\"},\"bucket\":\"I4ObRReg\"}";
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(FILE_JSON_STR);
AVFile file = AVFile.fileFromMap(jsonObject);
Assert.assertEquals(file.getUrl(), "testurl");
Assert.assertEquals(file.getObjectId(), "598a848161ff4b006c409d80");
Assert.assertEquals(file.getSize(), 2860076);
}

public void testToMap() {
String FILE_JSON_STR = "{\"mime_type\":\"image\\/png\",\"updatedAt\":\"2017-08-09T03:41:53.225Z\",\"key\":\"1bf9754d1ec4e16bb7f8.png\",\"name\":\"name.png\",\"objectId\":\"598a848161ff4b006c409d80\",\"createdAt\":\"2017-08-09T03:41:53.225Z\",\"__type\":\"File\",\"url\":\"testurl\",\"provider\":\"qiniu\",\"metaData\":{\"size\":2860076,\"owner\":\"unknown\"},\"bucket\":\"I4ObRReg\"}";
com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(FILE_JSON_STR);
AVFile file = AVFile.fileFromMap(jsonObject);
Map<String, Object> map = file.toMap();

Assert.assertEquals(map.get("url"), "testurl");
Assert.assertEquals(map.get("objectId"), "598a848161ff4b006c409d80");
Assert.assertEquals(((Map<String, Object>)map.get("metaData")).get("size"), 2860076);
}
}

0 comments on commit c364581

Please sign in to comment.