/* * Copyright (c) 2014. * * BaasBox - info-at-baasbox.com * * 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.baasbox.dao; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.lang3.StringUtils; import org.json.simple.JSONObject; import com.baasbox.dao.exception.InvalidModelException; import com.baasbox.dao.exception.SqlInjectionException; import com.baasbox.util.QueryParams; import com.orientechnologies.orient.core.exception.OConcurrentModificationException; import com.orientechnologies.orient.core.exception.OSecurityException; import com.orientechnologies.orient.core.id.ORID; import com.orientechnologies.orient.core.record.impl.ODocument; import com.orientechnologies.orient.core.record.impl.ORecordBytes; public class FileDao extends NodeDao { public final static String MODEL_NAME="_BB_File"; public final static String BINARY_FIELD_NAME = "file"; public final static String CONTENT_TYPE_FIELD_NAME="contentType"; public final static String CONTENT_LENGTH_FIELD_NAME="contentLength"; public static final String FILENAME_FIELD_NAME="fileName"; private static final String RESIZED_IMAGE_FIELD_NAME="resized"; public static final String METADATA_FIELD_NAME = "metadata"; private static final String FILE_CONTENT_CLASS = "_BB_FILE_CONTENT"; public static final String FILE_CONTENT_FIELD_NAME = "text_content"; protected FileDao(String modelName) { super(modelName); } public static FileDao getInstance(){ return new FileDao(MODEL_NAME); } @Override @Deprecated public ODocument create() throws Throwable{ throw new IllegalAccessError("Use create(String name, String fileName, String contentType, byte[] content) instead"); } public ODocument create(String fileName, String contentType, byte[] content) throws Throwable{ ODocument file=super.create(); ORecordBytes record = new ORecordBytes(content); file.field(BINARY_FIELD_NAME,record); file.field(FILENAME_FIELD_NAME,fileName); file.field(CONTENT_TYPE_FIELD_NAME,contentType); file.field(CONTENT_LENGTH_FIELD_NAME,new Long(content.length)); return file; } public ODocument create(String fileName, String contentType, long contentLength, InputStream content) throws Throwable{ return this.create(fileName, contentType, contentLength, content, null, null); } public ODocument create(String fileName, String contentType, long contentLength, InputStream is, HashMap<String, ?> metadata, String contentString) throws Throwable { ODocument file=super.create(); ORecordBytes record = new ORecordBytes(); record.fromInputStream(is, (int) contentLength); file.field(BINARY_FIELD_NAME,record); file.field(FILENAME_FIELD_NAME,fileName); file.field(CONTENT_TYPE_FIELD_NAME,contentType); file.field(CONTENT_LENGTH_FIELD_NAME,new Long(contentLength)); if (metadata!=null){ ODocument doc = new ODocument(); doc = doc.fromJSON(new JSONObject(metadata).toString()); file.field(METADATA_FIELD_NAME,doc); } if (!StringUtils.isEmpty(contentString)){ file.field(FILE_CONTENT_FIELD_NAME,(new ODocument(FILE_CONTENT_CLASS)).field("content",contentString)); } return file; } @Override public void save(ODocument document) throws InvalidModelException{ super.save(document); } public ODocument getById(String id) throws SqlInjectionException, InvalidModelException { QueryParams criteria=QueryParams.getInstance().where("id=?").params(new String[]{id}); List<ODocument> listOfFiles = this.get(criteria); if (listOfFiles==null || listOfFiles.size()==0) return null; ODocument doc=listOfFiles.get(0); try{ checkModelDocument((ODocument)doc); }catch(InvalidModelException e){ //the id may reference a ORecordBytes which is not a ODocument throw new InvalidModelException("the id " + id + " is not a file " + this.MODEL_NAME); } return doc; } public byte[] getStoredResizedPicture(ODocument file, String sizePattern) throws InvalidModelException{ super.checkModelDocument(file); Map<String,ORID> resizedMap=(Map<String,ORID>) file.field(RESIZED_IMAGE_FIELD_NAME); if (resizedMap!=null && resizedMap.containsKey(sizePattern)){ ORecordBytes obytes = (ORecordBytes) resizedMap.get(sizePattern); return obytes.toStream(); } return null; } public void storeResizedPicture(ODocument file,String sizePattern, byte[] resizedImage) throws InvalidModelException { super.checkModelDocument(file); Map<String,ORID> resizedMap=(Map<String,ORID>) file.field(RESIZED_IMAGE_FIELD_NAME); if (resizedMap==null) resizedMap=new HashMap<String,ORID>(); resizedMap.put(sizePattern, new ORecordBytes().fromStream(resizedImage).save().getIdentity()); file.field(RESIZED_IMAGE_FIELD_NAME,resizedMap); try{ this.save(file); }catch (OConcurrentModificationException e){ //just ignore it... }catch (OSecurityException e){ //just ignore it because it happens when someone who has read access to the file, but not the right to update it, are asking for it } } public String getExtractedContent(ODocument file) { ODocument extractedContentDocument=file.field(FILE_CONTENT_FIELD_NAME); if (extractedContentDocument==null) return ""; String content=extractedContentDocument.field("content"); return content; } }