/*
* 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.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import jp.co.nemuzuka.common.Authority;
import jp.co.nemuzuka.common.ProjectAuthority;
import jp.co.nemuzuka.core.entity.LabelValueBean;
import jp.co.nemuzuka.core.entity.UserInfo;
import jp.co.nemuzuka.dao.ProjectDao;
import jp.co.nemuzuka.dao.ProjectMemberDao;
import jp.co.nemuzuka.entity.ProjectModelEx;
import jp.co.nemuzuka.form.ProjectForm;
import jp.co.nemuzuka.model.MemberModel;
import jp.co.nemuzuka.model.ProjectMemberModel;
import jp.co.nemuzuka.model.ProjectModel;
import jp.co.nemuzuka.service.MemberService;
import jp.co.nemuzuka.service.ProjectService;
import jp.co.nemuzuka.utils.ConvertUtils;
import jp.co.nemuzuka.utils.HtmlStringUtils;
import org.apache.commons.lang.StringUtils;
import org.slim3.datastore.Datastore;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Text;
public class ProjectServiceImpl implements ProjectService {
ProjectDao projectDao = ProjectDao.getInstance();
ProjectMemberDao projectMemberDao = ProjectMemberDao.getInstance();
MemberService memberService = MemberServiceImpl.getInstance();
private static ProjectServiceImpl impl = new ProjectServiceImpl();
/**
* インスタンス取得.
* @return インスタンス
*/
public static ProjectServiceImpl getInstance() {
return impl;
}
/**
* デフォルトコンストラクタ.
*/
private ProjectServiceImpl(){}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#get(java.lang.String)
*/
@Override
public ProjectForm get(String keyString) {
ProjectForm form = new ProjectForm();
if(StringUtils.isNotEmpty(keyString)) {
ProjectModel model = projectDao.get(keyString);
setForm(form, model);
}
//Formに対して画面表示情報を設定する
setFormCommon(form);
return form;
}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#put(jp.co.nemuzuka.form.ProjectForm)
*/
@Override
public void put(ProjectForm form) {
ProjectModel model = null;
boolean isAdd = false;
if(StringUtils.isNotEmpty(form.keyToString)) {
//更新の場合
Key key = Datastore.stringToKey(form.keyToString);
Long version = ConvertUtils.toLong(form.versionNo);
//versionとKeyで情報を取得
model = projectDao.get(key, version);
if(model == null) {
//該当レコードが存在しない場合、Exceptionをthrow
throw new ConcurrentModificationException();
}
} else {
//新規の場合
model = new ProjectModel();
isAdd = true;
}
setModel(model, form);
projectDao.put(model);
//新規の場合、管理者情報としてメンバーを登録する
if(isAdd) {
addProjectMember4Admin(model.getKey(), form.adminMemberId);
}
}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#delete(jp.co.nemuzuka.form.ProjectForm)
*/
@Override
public void delete(ProjectForm form) {
//versionとKeyで情報を取得
Key key = Datastore.stringToKey(form.keyToString);
Long version = ConvertUtils.toLong(form.versionNo);
ProjectModel model = projectDao.get(key, version);
if(model == null) {
//該当レコードが存在しない場合、Exceptionをthrow
throw new ConcurrentModificationException();
}
//削除
projectDao.delete(model.getKey());
//プロジェクトメンバーも削除
List<ProjectMemberModel> list = projectMemberDao.getList(form.keyToString, null);
List<Key> keyList = new ArrayList<Key>();
for(ProjectMemberModel target : list) {
keyList.add(target.getKey());
}
projectMemberDao.delete(keyList.toArray(new Key[0]));
}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#getList(java.lang.String)
*/
@Override
public List<ProjectModelEx> getList(String projectName) {
List<ProjectModel> list = projectDao.getList(projectName);
List<ProjectModelEx> retList = new ArrayList<ProjectModelEx>();
for(ProjectModel target : list) {
retList.add(createProjectModelEx(target));
}
return retList;
}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#getUserProjectList(java.lang.String, boolean)
*/
@Override
public TargetProjectResult getUserProjectList(String email, boolean gaeAdmin){
TargetProjectResult result = new TargetProjectResult();
MemberModel model = memberService.getModel(email);
if(model == null) {
return result;
}
if(gaeAdmin || model.getAuthority() == Authority.admin) {
result.admin = true;
//管理者権限を有する場合、全てのプロジェクトが対象
List<ProjectModel> list = projectDao.getAllList();
result.projectList = createUserProjectList(list);
} else {
//一般の場合、ログインユーザが紐付くプロジェクト情報を取得する
List<ProjectMemberModel> list = projectMemberDao.getList(null, model.getKeyToString());
Set<Key> projectKeySet = new LinkedHashSet<Key>();
for(ProjectMemberModel target : list) {
projectKeySet.add(target.getProjectKey());
}
result.projectList = createUserProjectList(projectKeySet);
}
return result;
}
/* (non-Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#getUserProjectList(java.lang.String)
*/
@Override
public List<ProjectModelEx> getUserProjectList(String email) {
List<ProjectModelEx> retList = new ArrayList<ProjectModelEx>();
MemberModel model = memberService.getModel(email);
if(model == null) {
return retList;
}
//ログインユーザが紐付くプロジェクト情報を取得する
List<ProjectMemberModel> list = projectMemberDao.getList(null, model.getKeyToString());
Set<Key> projectKeySet = new LinkedHashSet<Key>();
for(ProjectMemberModel target : list) {
projectKeySet.add(target.getProjectKey());
}
if(projectKeySet.size() == 0) {
return retList;
}
//戻りListを作成する
List<ProjectModel> projectList = projectDao.getList(projectKeySet.toArray(new Key[0]));
for(ProjectModel target : projectList) {
retList.add(createProjectModelEx(target));
}
return retList;
}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#getAllList()
*/
@Override
public List<ProjectModel> getAllList() {
return projectDao.getAllList();
}
/* (非 Javadoc)
* @see jp.co.nemuzuka.service.ProjectService#setUserInfo(java.lang.String, java.lang.String, jp.co.nemuzuka.core.entity.UserInfo)
*/
@Override
public void setUserInfo(String projectKeyString, String mail,
UserInfo userInfo) {
//初期化
userInfo.initProjectInfo();
userInfo.setSelectedProject(projectKeyString);
if(StringUtils.isEmpty(projectKeyString)) {
//選択プロジェクトが未選択にされた場合、初期化して終了
return;
}
MemberModel memberModel = memberService.getModel(mail);
if(memberModel == null) {
return;
}
//管理者ユーザである場合、管理者権限ありと設定する
if(userInfo.isSystemManager()) {
userInfo.setProjectManager(true);
}
Key projectKey = Datastore.stringToKey(projectKeyString);
//プロジェクトに紐付くメンバー情報を取得する
ProjectMemberModel projectMemberModel = projectMemberDao.get(projectKey, memberModel.getKey());
if(projectMemberModel == null) {
return;
}
//データが取得できたので、プロジェクトメンバーである
userInfo.setProjectMember(true);
//GAE、アプリケーション管理者でなく、プロジェクト管理者の権限を取得している場合
//プロジェクト管理者であると設定
if(userInfo.isProjectManager() == false) {
if(projectMemberModel.getProjectAuthority() == ProjectAuthority.type1) {
userInfo.setProjectManager(true);
}
}
userInfo.setProjectAuthority(projectMemberModel.getProjectAuthority());
}
/**
* プロジェクトLabelValueBean情報取得.
* @param projectKeySet プロジェクトKeySet
* @return プロジェクトLabelValueBeanList(先頭には空データ格納)
*/
protected List<LabelValueBean> createUserProjectList(Set<Key> projectKeySet) {
List<ProjectModel> projectList = projectDao.getList(projectKeySet.toArray(new Key[0]));
return createUserProjectList(projectList);
}
/**
* プロジェクトLabelValueBeanList作成.
* @param projectList プロジェクトList
* @return 生成List
*/
private List<LabelValueBean> createUserProjectList(List<ProjectModel> projectList) {
List<LabelValueBean> list = new ArrayList<LabelValueBean>();
list.add(new LabelValueBean("--プロジェクトを選択--", ""));
for(ProjectModel target : projectList) {
list.add(new LabelValueBean(target.getProjectName(), target.getKeyToString()));
}
return list;
}
/**
* Form情報設定.
* @param form 設定対象Form
* @param model 設定元Model
*/
private void setForm(ProjectForm form, ProjectModel model) {
if(model == null) {
return;
}
form.keyToString = model.getKeyToString();
form.projectName = model.getProjectName();
form.projectId = model.getProjectId();
form.projectSummary = model.getProjectSummary().getValue();
form.versionNo = ConvertUtils.toString(model.getVersion());
}
/**
* 共通Form情報設定.
* 画面表示用情報を設定します。
* @param form 設定対象Form
*/
private void setFormCommon(ProjectForm form) {
List<LabelValueBean> targetList = new ArrayList<LabelValueBean>();
//登録されているメンバー情報を取得
List<MemberModel> list = memberService.getAllList();
for(MemberModel target : list) {
targetList.add(new LabelValueBean(target.getName(), target.getKeyToString()));
}
form.setMemberList(targetList);
}
/**
* Model情報設定.
* @param model 設定対象Model
* @param form 設定Form
*/
private void setModel(ProjectModel model, ProjectForm form) {
model.setProjectName(form.projectName);
model.setProjectId(form.projectId);
model.setProjectSummary(new Text(form.projectSummary));
}
/**
* 管理者用メンバー追加.
* 引数の情報を元に管理者権限を所有するプロジェクトメンバーを登録します。
* @param projectKey プロジェクトKey
* @param adminMemberId 管理者Key文字列
*/
private void addProjectMember4Admin(Key projectKey, String adminMemberId) {
Key memberKey = Datastore.stringToKey(adminMemberId);
ProjectMemberModel model = new ProjectMemberModel();
model.createKey(projectKey, memberKey);
model.setProjectAuthority(ProjectAuthority.type1);
projectMemberDao.put(model);
}
/**
* ProjectModelEx生成.
* プロジェクト概要を設定した後、Modelの値を初期化します。
* @param target 生成元Model
* @return 生成Model
*/
private ProjectModelEx createProjectModelEx(ProjectModel target) {
ProjectModelEx model = new ProjectModelEx();
model.setModel(target);
String summaryString = "";
Text summary = target.getProjectSummary();
if(summary != null) {
summaryString = summary.getValue();
}
model.setProjectSummaryView(HtmlStringUtils.escapeTextAreaString(summaryString));
target.setProjectSummary(null);
return model;
}
}