/*
* Copyright 2008-present MongoDB, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.mongodb.gridfs;
import com.mongodb.BasicDBObject;
import com.mongodb.DBObject;
import com.mongodb.MongoException;
import org.bson.BSONObject;
import java.util.Collections;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import static java.util.Arrays.asList;
The abstract class representing a GridFS file.
@mongodb.driver.manual core/gridfs/ GridFS
/**
* The abstract class representing a GridFS file.
*
* @mongodb.driver.manual core/gridfs/ GridFS
*/
public abstract class GridFSFile implements DBObject {
private static final Set<String> VALID_FIELDS = Collections.unmodifiableSet(new HashSet<String>(asList("_id",
"filename",
"contentType",
"length",
"chunkSize",
"uploadDate",
"aliases",
"md5")));
final DBObject extra = new BasicDBObject();
GridFS fs;
Object id;
String filename;
String contentType;
long length;
long chunkSize;
Date uploadDate;
String md5;
Saves the file entry to the files collection
Throws: - MongoException – if there's a failure
/**
* Saves the file entry to the files collection
*
* @throws MongoException if there's a failure
*/
public void save() {
if (fs == null) {
throw new MongoException("need fs");
}
fs.getFilesCollection().save(this);
}
Verifies that the MD5 matches between the database and the local file. This should be called after transferring a file.
Throws: - MongoException – if there's a failure
Deprecated: there is no replacement for this method
/**
* Verifies that the MD5 matches between the database and the local file. This should be called after transferring a file.
*
* @throws MongoException if there's a failure
* @deprecated there is no replacement for this method
*/
@Deprecated
public void validate() {
if (fs == null) {
throw new MongoException("no fs");
}
if (md5 == null) {
throw new MongoException("no md5 stored");
}
DBObject cmd = new BasicDBObject("filemd5", id);
cmd.put("root", fs.getBucketName());
DBObject res = fs.getDB().command(cmd);
if (res != null && res.containsField("md5")) {
String m = res.get("md5").toString();
if (m.equals(md5)) {
return;
}
throw new MongoException("md5 differ. mine [" + md5 + "] theirs [" + m + "]");
}
// no md5 from the server
throw new MongoException("no md5 returned from server: " + res);
}
Returns the number of chunks that store the file data.
Returns: number of chunks
/**
* Returns the number of chunks that store the file data.
*
* @return number of chunks
*/
public int numChunks() {
double d = length;
d = d / chunkSize;
return (int) Math.ceil(d);
}
Gets the id.
Returns: the id of the file.
/**
* Gets the id.
*
* @return the id of the file.
*/
public Object getId() {
return id;
}
Gets the filename.
Returns: the name of the file
/**
* Gets the filename.
*
* @return the name of the file
*/
public String getFilename() {
return filename;
}
Gets the content type.
Returns: the content type
/**
* Gets the content type.
*
* @return the content type
*/
public String getContentType() {
return contentType;
}
Gets the file's length.
Returns: the length of the file
/**
* Gets the file's length.
*
* @return the length of the file
*/
public long getLength() {
return length;
}
Gets the size of a chunk.
Returns: the chunkSize
/**
* Gets the size of a chunk.
*
* @return the chunkSize
*/
public long getChunkSize() {
return chunkSize;
}
Gets the upload date.
Returns: the date
/**
* Gets the upload date.
*
* @return the date
*/
public Date getUploadDate() {
return uploadDate;
}
Gets the aliases from the metadata. note: to set aliases, call put(String, Object)
with "aliases" , List<String>
. Returns: list of aliases
/**
* Gets the aliases from the metadata. note: to set aliases, call {@link #put(String, Object)} with {@code "aliases" , List<String>}.
*
* @return list of aliases
*/
@SuppressWarnings("unchecked")
public List<String> getAliases() {
return (List<String>) extra.get("aliases");
}
Gets the file metadata.
Returns: the metadata
/**
* Gets the file metadata.
*
* @return the metadata
*/
public DBObject getMetaData() {
return (DBObject) extra.get("metadata");
}
Gets the file metadata.
Params: - metadata – metadata to be set
/**
* Gets the file metadata.
*
* @param metadata metadata to be set
*/
public void setMetaData(final DBObject metadata) {
extra.put("metadata", metadata);
}
Gets the observed MD5 during transfer
Returns: md5 Deprecated: there is no replacement for this method
/**
* Gets the observed MD5 during transfer
*
* @return md5
* @deprecated there is no replacement for this method
*/
@Deprecated
public String getMD5() {
return md5;
}
@Override
public Object put(final String key, final Object v) {
if (key == null) {
throw new RuntimeException("key should never be null");
} else if (key.equals("_id")) {
id = v;
} else if (key.equals("filename")) {
filename = v == null ? null : v.toString();
} else if (key.equals("contentType")) {
contentType = (String) v;
} else if (key.equals("length")) {
length = ((Number) v).longValue();
} else if (key.equals("chunkSize")) {
chunkSize = ((Number) v).longValue();
} else if (key.equals("uploadDate")) {
uploadDate = (Date) v;
} else if (key.equals("md5")) {
md5 = (String) v;
} else {
extra.put(key, v);
}
return v;
}
@Override
public Object get(final String key) {
if (key == null) {
throw new IllegalArgumentException("Key should never be null");
} else if (key.equals("_id")) {
return id;
} else if (key.equals("filename")) {
return filename;
} else if (key.equals("contentType")) {
return contentType;
} else if (key.equals("length")) {
return length;
} else if (key.equals("chunkSize")) {
return chunkSize;
} else if (key.equals("uploadDate")) {
return uploadDate;
} else if (key.equals("md5")) {
return md5;
}
return extra.get(key);
}
@Override
@Deprecated
public boolean containsKey(final String key) {
return containsField(key);
}
@Override
public boolean containsField(final String s) {
return keySet().contains(s);
}
@Override
public Set<String> keySet() {
Set<String> keys = new HashSet<String>();
keys.addAll(VALID_FIELDS);
keys.addAll(extra.keySet());
return keys;
}
@Override
public boolean isPartialObject() {
return false;
}
@Override
public void markAsPartialObject() {
throw new MongoException("Can't load partial GridFSFile file");
}
@Override
@SuppressWarnings("deprecation")
public String toString() {
return com.mongodb.util.JSON.serialize(this);
}
Sets the GridFS associated with this file.
Params: - fs – gridFS instance
/**
* Sets the GridFS associated with this file.
*
* @param fs gridFS instance
*/
protected void setGridFS(final GridFS fs) {
this.fs = fs;
}
Gets the GridFS associated with this file
Returns: gridFS instance
/**
* Gets the GridFS associated with this file
*
* @return gridFS instance
*/
protected GridFS getGridFS() {
return this.fs;
}
@Override
public void putAll(final BSONObject o) {
throw new UnsupportedOperationException();
}
@Override
public void putAll(@SuppressWarnings("rawtypes") final Map m) {
throw new UnsupportedOperationException();
}
@Override
public Map<?, ?> toMap() {
throw new UnsupportedOperationException();
}
@Override
public Object removeField(final String key) {
throw new UnsupportedOperationException();
}
}