/* * Copyright 2012 Kazumune Katagiri. (http://d.hatena.ne.jp/nemuzuka) * * 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 jp.co.nemuzuka.service.impl; import java.nio.ByteBuffer; import java.util.ConcurrentModificationException; import java.util.List; import jp.co.nemuzuka.dao.UploadFileDao; import jp.co.nemuzuka.model.UploadFileModel; import jp.co.nemuzuka.service.UploadFileService; import org.apache.commons.lang.StringUtils; import org.slim3.controller.upload.FileItem; import org.slim3.datastore.Datastore; import org.slim3.util.BeanUtil; import org.slim3.util.CopyOptions; import com.google.appengine.api.blobstore.BlobInfo; import com.google.appengine.api.blobstore.BlobInfoFactory; import com.google.appengine.api.blobstore.BlobKey; import com.google.appengine.api.blobstore.BlobstoreService; import com.google.appengine.api.blobstore.BlobstoreServiceFactory; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.Text; import com.google.appengine.api.files.AppEngineFile; import com.google.appengine.api.files.FileService; import com.google.appengine.api.files.FileServiceFactory; import com.google.appengine.api.files.FileWriteChannel; /** * UploadFileServiceの実装クラス. * @author k-katagiri */ public class UploadFileServiceImpl implements UploadFileService { UploadFileDao uploadFileDao = UploadFileDao.getInstance(); private static UploadFileServiceImpl impl = new UploadFileServiceImpl(); /** * インスタンス取得. * @return インスタンス */ public static UploadFileServiceImpl getInstance() { return impl; } /** * デフォルトコンストラクタ. */ private UploadFileServiceImpl(){} /* (non-Javadoc) * @see jp.co.nemuzuka.service.UploadFileService#put(org.slim3.controller.upload.FileItem, java.lang.String, java.lang.String, java.lang.String) */ @Override public String put(FileItem fileItem, String comment, String ticketKeyToString, String projectKeyString) { BlobKey blobKey = null; try { FileService fileService = FileServiceFactory.getFileService(); AppEngineFile blobFile = fileService.createNewBlobFile(fileItem.getContentType()); FileWriteChannel writeChannel = fileService.openWriteChannel(blobFile, true); writeChannel.write(ByteBuffer.wrap(fileItem.getData())); writeChannel.closeFinally(); blobKey = fileService.getBlobKey(blobFile); } catch(Exception e) { throw new RuntimeException(e); } //登録するデータを設定 UploadFileModel model = new UploadFileModel(); BlobInfoFactory factory = new BlobInfoFactory(); model.setBlobKey(blobKey.getKeyString()); BlobInfo blobInfo = factory.loadBlobInfo(blobKey); BeanUtil.copy(blobInfo, model, new CopyOptions().exclude("blobKey")); model.setParentKey(Datastore.stringToKey(ticketKeyToString)); model.setProjectKey(Datastore.stringToKey(projectKeyString)); model.setFilename(fileItem.getShortFileName()); model.setComment(new Text(StringUtils.defaultString(comment))); //登録 Datastore.put(model); return Datastore.keyToString(model.getKey()); } /* (non-Javadoc) * @see jp.co.nemuzuka.service.UploadFileService#delete(java.lang.String, java.lang.String, java.lang.String, java.lang.Long) */ @Override public void delete(String uploadFileKeyString, String ticketKeyToString, String projectKeyString, Long version) { //該当レコード取得 UploadFileModel model = uploadFileDao.get(uploadFileKeyString, ticketKeyToString, projectKeyString, version); if(model == null) { //該当レコードが存在しない場合、Exception throw new ConcurrentModificationException(); } delete(model); } /* (non-Javadoc) * @see jp.co.nemuzuka.service.UploadFileService#getList(java.lang.String, java.lang.String) */ @Override public List<UploadFileModel> getList(String ticketKeyToString, String projectKeyString) { return uploadFileDao.getList(ticketKeyToString, projectKeyString); } /* (非 Javadoc) * @see jp.co.nemuzuka.service.UploadFileService#get(java.lang.String, java.lang.String, java.lang.String) */ @Override public UploadFileModel get(String keyString, String ticketKeyToString, String projectKeyString) { Key key = Datastore.stringToKey(keyString); Key parentKey = Datastore.stringToKey(ticketKeyToString); Key projectKey = Datastore.stringToKey(projectKeyString); UploadFileModel model = uploadFileDao.get(key); if(model == null || model.getParentKey().equals(parentKey) == false || model.getProjectKey().equals(projectKey) == false) { return null; } return model; } /* (non-Javadoc) * @see jp.co.nemuzuka.service.UploadFileService#delete4ticketKeyString(java.lang.String, java.lang.String) */ @Override public void delete4ticketKeyString(String ticketKeyToString, String projectKeyString) { //該当レコードを全て取得 List<UploadFileModel> list = getList(ticketKeyToString, projectKeyString); for(UploadFileModel target : list) { //該当レコードに紐付くデータを削除 delete(target); } } /** * データ削除. * Modelとblobデータを削除します。 * @param model 削除対象Model */ void delete(UploadFileModel model) { //blobKeyから削除し、Entityから削除 BlobKey blobKey = new BlobKey(model.getBlobKey()); BlobstoreService bs = BlobstoreServiceFactory.getBlobstoreService(); bs.delete(blobKey); uploadFileDao.delete(model.getKey()); } }