/*
* Aipo is a groupware program developed by TOWN, Inc.
* Copyright (C) 2004-2015 TOWN, Inc.
* http://www.aipo.com
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aimluck.eip.services.social.impl;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.cayenne.access.DataContext;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.turbine.services.TurbineServices;
import com.aimluck.eip.cayenne.om.portlet.EipTTimeline;
import com.aimluck.eip.cayenne.om.portlet.EipTTimelineMap;
import com.aimluck.eip.cayenne.om.social.Activity;
import com.aimluck.eip.cayenne.om.social.ActivityMap;
import com.aimluck.eip.cayenne.om.social.AppData;
import com.aimluck.eip.cayenne.om.social.Application;
import com.aimluck.eip.cayenne.om.social.ContainerConfig;
import com.aimluck.eip.cayenne.om.social.ModuleId;
import com.aimluck.eip.cayenne.om.social.OAuthConsumer;
import com.aimluck.eip.common.ALActivity;
import com.aimluck.eip.common.ALActivityCount;
import com.aimluck.eip.common.ALApplication;
import com.aimluck.eip.common.ALDBErrorException;
import com.aimluck.eip.common.ALEipManager;
import com.aimluck.eip.common.ALEipUser;
import com.aimluck.eip.common.ALOAuthConsumer;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.Operations;
import com.aimluck.eip.orm.query.ResultList;
import com.aimluck.eip.orm.query.SelectQuery;
import com.aimluck.eip.services.accessctl.ALAccessControlConstants;
import com.aimluck.eip.services.accessctl.ALAccessControlFactoryService;
import com.aimluck.eip.services.accessctl.ALAccessControlHandler;
import com.aimluck.eip.services.push.ALPushService;
import com.aimluck.eip.services.social.ALContainerConfigService;
import com.aimluck.eip.services.social.ALSocialApplicationConstants;
import com.aimluck.eip.services.social.ALSocialApplicationHandler;
import com.aimluck.eip.services.social.gadgets.ALGadgetSpec;
import com.aimluck.eip.services.social.gadgets.ALOAuthService;
import com.aimluck.eip.services.social.model.ALActivityGetRequest;
import com.aimluck.eip.services.social.model.ALActivityPutRequest;
import com.aimluck.eip.services.social.model.ALApplicationGetRequest;
import com.aimluck.eip.services.social.model.ALApplicationGetRequest.Status;
import com.aimluck.eip.services.social.model.ALApplicationPutRequest;
import com.aimluck.eip.services.social.model.ALOAuthConsumerPutRequest;
import com.aimluck.eip.util.ALCommonUtils;
import com.aimluck.eip.util.ALEipUtils;
/**
*
*/
public class ALDefaultSocialApplicationHanlder extends
ALSocialApplicationHandler {
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ALDefaultSocialApplicationHanlder.class.getName());
private static ALSocialApplicationHandler instance;
public static ALSocialApplicationHandler getInstance() {
if (instance == null) {
instance = new ALDefaultSocialApplicationHanlder();
}
return instance;
}
/**
* @return
*/
@Override
public ResultList<ALApplication> getApplicationList(
ALApplicationGetRequest request) {
SelectQuery<Application> query = buildApplicationQuery(request);
ResultList<Application> resultList = query.getResultList();
List<ALApplication> list = new ArrayList<ALApplication>(resultList.size());
List<String> specUrls = new ArrayList<String>(list.size());
boolean fetchXml = request.isFetchXml();
for (Application app : resultList) {
specUrls.add(app.getUrl());
}
Map<String, ALGadgetSpec> metaData = null;
if (fetchXml) {
metaData = getMetaData(specUrls, "home", request.isDetail(), true);
}
for (Application app : resultList) {
ALApplication model = new ALApplication();
model.setAppId(String.valueOf(app.getId()));
model.setTitle(app.getTitle());
model.setConsumerKey(app.getConsumerKey());
model.setConsumerSecret(app.getConsumerSecret());
model.setUrl(app.getUrl());
model.setStatus(app.getStatus());
model.setDescription(app.getDescription());
if (fetchXml) {
ALGadgetSpec gadgetSpec = metaData.get(app.getUrl());
model.setUserPrefs(gadgetSpec.getUserPrefs());
}
list.add(model);
}
ResultList<ALApplication> result =
new ResultList<ALApplication>(list, resultList.getLimit(), resultList
.getPage(), resultList.getTotalCount());
return result;
}
/**
* @param appId
* @return
*/
@Override
public ALApplication getApplication(ALApplicationGetRequest request) {
SelectQuery<Application> query = buildApplicationQuery(request);
Application app = query.fetchSingle();
if (app == null) {
return null;
}
ALApplication model = new ALApplication();
model.setAppId(String.valueOf(app.getId()));
model.setTitle(app.getTitle());
model.setConsumerKey(app.getConsumerKey());
model.setConsumerSecret(app.getConsumerSecret());
model.setUrl(app.getUrl());
model.setStatus(app.getStatus());
model.setIcon(app.getIcon());
model.setDescription(app.getDescription());
boolean fetchXml = request.isFetchXml();
ALGadgetSpec gadgetSpec = null;
if (fetchXml) {
gadgetSpec = getMetaData(app.getUrl(), request.isDetail());
}
if (gadgetSpec != null) {
model.setUserPrefs(gadgetSpec.getUserPrefs());
}
if (gadgetSpec != null && request.isDetail()) {
List<ALOAuthConsumer> consumers = new ArrayList<ALOAuthConsumer>();
List<ALOAuthService> services = gadgetSpec.getOAuthServices();
@SuppressWarnings("unchecked")
List<OAuthConsumer> consumerModels = app.getOauthConsumer();
for (ALOAuthService service : services) {
ALOAuthConsumer consumer = new ALOAuthConsumer();
consumer.setAppId(app.getAppId());
consumer.setName(service.getName());
consumer.setAuthorizationUrl(service.getAuthorizationUrl());
consumer.setRequestUrl(service.getRequestUrl());
consumer.setAccessUrl(service.getAccessUrl());
for (OAuthConsumer consumerModel : consumerModels) {
if (service.getName().equals(consumerModel.getName())) {
consumer.setType(consumerModel.getType());
consumer.setConsumerKey(consumerModel.getConsumerKey());
consumer.setConsumerSecret(consumerModel.getConsumerSecret());
}
}
consumers.add(consumer);
}
model.addOAuthConsumers(consumers);
}
return model;
}
@Override
public List<ALOAuthConsumer> getOAuthConsumer(String appId) {
ALApplication app =
getApplication(new ALApplicationGetRequest()
.withAppId(appId)
.withIsDetail(true)
.withStatus(Status.ALL));
return app.getOAuthConsumers();
}
@Override
public void putOAuthConsumer(ALOAuthConsumerPutRequest request) {
try {
Date date = new Date();
String appId = request.getAppId();
String name = request.getName();
Application app = Database.get(Application.class, "APP_ID", appId);
if (app == null) {
return;
}
@SuppressWarnings("unchecked")
List<OAuthConsumer> oauthConsumers = app.getOauthConsumer();
boolean has = false;
if (oauthConsumers != null) {
for (OAuthConsumer oauthConsumer : oauthConsumers) {
if (oauthConsumer.getName().equals(name)) {
oauthConsumer.setType(request.getType().value());
oauthConsumer.setConsumerKey(request.getConsumerKey());
oauthConsumer.setConsumerSecret(request.getConsumerSecret());
oauthConsumer.setUpdateDate(date);
has = true;
}
}
}
if (!has) {
OAuthConsumer oauthConsumer = Database.create(OAuthConsumer.class);
oauthConsumer.setApplication(app);
oauthConsumer.setName(request.getName());
oauthConsumer.setType(request.getType().value());
oauthConsumer.setConsumerKey(request.getConsumerKey());
oauthConsumer.setConsumerSecret(request.getConsumerSecret());
oauthConsumer.setCreateDate(date);
oauthConsumer.setUpdateDate(date);
}
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
* @param url
*/
@Override
public void createApplication(ALApplicationPutRequest request) {
String url = request.getUrl();
Date date = new Date();
try {
Application app = Database.create(Application.class);
app.setAppId("");
app.setUrl(url);
app.setTitle(request.getTitle());
// TODO: Restful API サポート時に ConsumerKey ConsumerSecret を発行する必要があります。
// app.setConsumerKey(generateConsumerKey(url));
// app.setConsumerSecret(generateConsumerSecret());
app.setStatus(ALSocialApplicationConstants.STATUS_ACTIVE);
app.setDescription(request.getDescription());
app.setIcon(request.getIcon());
app.setCreateDate(date);
app.setUpdateDate(date);
Database.commit();
app.setAppId(String.valueOf(app.getId()));
Database.commit();
// Activity
if (request.getActivityLoginName() != null
&& request.getActivityLoginName().length() > 0) {
String title =
new StringBuilder("アプリ「")
.append(
ALCommonUtils.compressString(request.getTitle().toString(), 30))
.append("」をインストールしました。")
.toString();
String portletParams =
new StringBuilder("?template=GadgetsAdminDetailScreen").append(
"&entityid=").append(app.getAppId().toString()).toString();
createActivity(new ALActivityPutRequest()
.withAppId("GadgetAdd")
.withPortletParams(portletParams)
.withUserId(request.getActivityUserId())
.withTitle(title)
.withPriority(0f)
.withLoginName(request.getActivityLoginName())
.withExternalId(String.valueOf(app.getAppId().toString())));
}
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
*
* @param appId
* @param request
*/
@Override
public void updateApplication(String appId, ALApplicationPutRequest request) {
Date date = new Date();
try {
Application app = Database.get(Application.class, "APP_ID", appId);
app.setTitle(request.getTitle());
app.setDescription(request.getDescription());
app.setIcon(request.getIcon());
app.setUpdateDate(date);
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
*
* @param appIdList
*/
@Override
public void enableApplication(String... appIdList) {
try {
for (String appId : appIdList) {
Application app = Database.get(Application.class, "APP_ID", appId);
if (app != null) {
app.setStatus(1);
}
}
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
*
* @param appIdList
*/
@Override
public void enableApplication(List<String> appIdList) {
enableApplication(appIdList.toArray(new String[appIdList.size()]));
}
/**
*
* @param appIdList
*/
@Override
public void disableApplication(String... appIdList) {
try {
for (String appId : appIdList) {
Application app = Database.get(Application.class, "APP_ID", appId);
if (app != null) {
app.setStatus(0);
}
}
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
*
* @param appIdList
*/
@Override
public void disableApplication(List<String> appIdList) {
disableApplication(appIdList.toArray(new String[appIdList.size()]));
}
/**
*
* @param appIdList
*/
@Override
public void deleteApplication(String... appIdList) {
try {
for (String appId : appIdList) {
Database.delete(Database.get(Application.class, "APP_ID", appId));
String sql1 = "delete from app_data where app_id = #bind($appId)";
Database.sql(AppData.class, sql1).param("appId", appId).execute();
String sql2 = "delete from activity where app_id = #bind($appId)";
Database.sql(Activity.class, sql2).param("appId", appId).execute();
}
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
* @param appIdList
*/
@Override
public void deleteApplication(List<String> appIdList) {
deleteApplication(appIdList.toArray(new String[appIdList.size()]));
}
@Override
public boolean checkApplicationAvailability(String appId) {
try {
Application app = Database.get(Application.class, "APP_ID", appId);
if (app == null) {
return false;
}
Integer status = app.getStatus();
if (status == null) {
return false;
}
return status.intValue() == 1;
} catch (Throwable t) {
// logger.warn("[ALDefaultSocialApplicationHanlder]", t);
return false;
}
}
protected SelectQuery<Application> buildApplicationQuery(
ALApplicationGetRequest request) {
SelectQuery<Application> query = Database.query(Application.class);
int limit = request.getLimit();
int page = request.getPage();
Status status = request.getStatus();
if (limit > 0) {
query.limit(limit);
}
if (page > 0) {
query.page(page);
}
switch (status) {
case ACTIVE:
query.where(Operations.eq(Application.STATUS_PROPERTY, 1));
break;
case INACTIVE:
query.where(Operations.eq(Application.STATUS_PROPERTY, 0));
break;
default:
// ignore
}
String appId = request.getAppId();
if (appId != null && appId.length() > 0) {
query.where(Operations.eq(Application.APP_ID_PROPERTY, appId));
}
query.orderAscending(Application.TITLE_PROPERTY);
return query;
}
/**
*
* @param property
* @return
*/
@Override
public String getContainerConfig(Property property) {
ContainerConfig config = null;
Object obj =
ALEipManager.getInstance().getContainerConfig(property.toString());
if (obj != null) {
return (String) obj;
} else {
config =
Database
.query(ContainerConfig.class)
.where(
Operations.eq(ContainerConfig.NAME_PROPERTY, property.toString()))
.fetchSingle();
if (config == null) {
ALEipManager.getInstance().setContainerConfig(
property.toString(),
property.defaultValue());
return property.defaultValue();
} else {
ALEipManager.getInstance().setContainerConfig(
property.toString(),
config.getValue());
return config.getValue();
}
}
}
/**
*
* @param property
* @param value
*/
@Override
public void putContainerConfig(Property property, String value) {
try {
ContainerConfig config =
Database
.query(ContainerConfig.class)
.where(
Operations.eq(ContainerConfig.NAME_PROPERTY, property.toString()))
.fetchSingle();
if (config == null) {
config = Database.create(ContainerConfig.class);
config.setName(property.toString());
}
config.setValue(value);
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
@Override
public ResultList<ALActivity> getActivityList(ALActivityGetRequest request) {
SelectQuery<Activity> query = buildActivityQuery(request);
ResultList<Activity> resultList = query.getResultList();
List<ALActivity> list = new ArrayList<ALActivity>(resultList.size());
for (Activity model : resultList) {
ALActivity activity = new ALActivity();
activity.setId(model.getId());
activity.setLoginName(model.getLoginName());
activity.setAppId(model.getAppId());
activity.setTitle(model.getTitle());
activity.setUpdateDate(model.getUpdateDate());
activity.setExternalId(model.getExternalId());
activity.setPortletParams(model.getPortletParams());
activity.setIcon(model.getIcon());
activity.setModuleId(model.getModuleId());
try {
ALEipUser user = ALEipUtils.getALEipUser(model.getLoginName());
if (user == null && model.getAppId().equals("timeline")) {
activity.setDisplayName(model.getLoginName());
} else {
if (user != null) {
activity.setDisplayName(user.getAliasName().getValue());
activity.setUserId(user.getUserId().getValueWithInt());
}
}
} catch (Throwable t) {
//
}
String loginName = request.getTargetLoginName();
if (loginName != null && loginName.length() > 0) {
activity.setRead(isReadActivity(model.getId(), loginName));
} else {
activity.setRead(true);
}
list.add(activity);
}
ResultList<ALActivity> result =
new ResultList<ALActivity>(list, resultList.getLimit(), resultList
.getPage(), resultList.getTotalCount());
return result;
}
@Override
public ALActivity getActivity(ALActivityGetRequest request) {
SelectQuery<Activity> query = buildActivityQuery(request);
Activity model = query.fetchSingle();
if (model == null) {
return null;
}
ALActivity activity = new ALActivity();
activity.setId(model.getId());
activity.setAppId(model.getAppId());
activity.setLoginName(model.getLoginName());
activity.setTitle(model.getTitle());
activity.setUpdateDate(model.getUpdateDate());
activity.setExternalId(model.getExternalId());
activity.setPortletParams(model.getPortletParams());
activity.setIcon(model.getIcon());
String loginName = request.getTargetLoginName();
if (loginName != null && loginName.length() > 0) {
activity.setRead(isReadActivity(model.getId(), loginName));
} else {
activity.setRead(false);
}
try {
ALEipUser user = ALEipUtils.getALEipUser(model.getLoginName());
activity.setDisplayName(user.getAliasName().getValue());
} catch (ALDBErrorException e) {
//
}
return activity;
}
@Override
public ALActivityCount getActivityCount(ALActivityGetRequest request) {
ALActivityCount result = new ALActivityCount();
result.setCount(buildActivityQuery(request).getCount());
request.setRead(-1);
Activity activity = buildActivityQuery(request).limit(1).fetchSingle();
if (activity != null) {
result.setMax(activity.getUpdateDate().getTime());
}
return result;
}
@Override
public void setAllReadActivity(String loginName) {
try {
DataContext dataContext = DataContext.getThreadDataContext();
String url =
dataContext
.getParentDataDomain()
.getNode(Database.getDomainName() + "domainNode")
.getDataSource()
.getConnection()
.getMetaData()
.getURL();
String sql = "";
if (url != null && url.startsWith("jdbc:postgresql")) {
StringBuilder b =
new StringBuilder("update activity_map set is_read = 1 ");
b
.append(" from activity where activity_map.activity_id = activity.id ");
b.append(" and activity_map.login_name = #bind($loginName) ");
sql = b.toString();
} else {
StringBuilder b =
new StringBuilder("update activity_map, activity set is_read = 1 ");
b.append(" where activity_map.activity_id = activity.id ");
b.append(" and activity_map.login_name = #bind($loginName) ");
sql = b.toString();
}
Database
.sql(ActivityMap.class, sql)
.param("loginName", loginName)
.execute();
} catch (Throwable t) {
Database.rollback();
logger.warn("[ALDefaultSocialApplicationHanlder]", t);
}
}
@Override
public void setReadActivity(int activityId, String loginName) {
try {
DataContext dataContext = DataContext.getThreadDataContext();
String url =
dataContext
.getParentDataDomain()
.getNode(Database.getDomainName() + "domainNode")
.getDataSource()
.getConnection()
.getMetaData()
.getURL();
String sql = "";
if (url != null && url.startsWith("jdbc:postgresql")) {
StringBuilder b =
new StringBuilder("update activity_map set is_read = 1 ");
b
.append(" from activity where activity_map.activity_id = activity.id ");
b.append(" and activity.id = #bind($activityId) ");
b.append(" and activity_map.login_name = #bind($loginName) ");
sql = b.toString();
} else {
StringBuilder b =
new StringBuilder("update activity_map, activity set is_read = 1 ");
b.append(" where activity_map.activity_id = activity.id ");
b.append(" and activity.id = #bind($activityId) ");
b.append(" and activity_map.login_name = #bind($loginName) ");
sql = b.toString();
}
Database
.sql(ActivityMap.class, sql)
.param("activityId", activityId)
.param("loginName", loginName)
.execute();
} catch (Throwable t) {
Database.rollback();
logger.warn("[ALDefaultSocialApplicationHanlder]", t);
}
}
public boolean isReadActivity(int activityId, String loginName) {
StringBuilder b =
new StringBuilder(
"select activity_map.is_read from activity_map inner join activity on activity_map.activity_id = activity.id ");
b.append(" and activity.id = #bind($activityId) ");
b.append(" and activity_map.login_name = #bind($loginName) ");
String sql = b.toString();
try {
ActivityMap activityMap =
Database
.sql(ActivityMap.class, sql)
.param("activityId", activityId)
.param("loginName", loginName)
.fetchSingle();
if (activityMap != null) {
return activityMap.getIsRead().intValue() == 1;
}
} catch (Throwable t) {
Database.rollback();
logger.warn("[ALDefaultSocialApplicationHanlder]", t);
}
return true;
}
protected SelectQuery<Activity> buildActivityQuery(
ALActivityGetRequest request) {
ALAccessControlFactoryService aclservice =
(ALAccessControlFactoryService) ((TurbineServices) TurbineServices
.getInstance()).getService(ALAccessControlFactoryService.SERVICE_NAME);
ALAccessControlHandler aclhandler = aclservice.getAccessControlHandler();
SelectQuery<Activity> query = Database.query(Activity.class);
int limit = request.getLimit();
if (limit > 0) {
query.limit(limit);
}
int page = request.getPage();
if (page > 0) {
query.page(page);
}
int isRead = request.isRead();
if (isRead >= 0) {
query.where(Operations.eq(Activity.ACTIVITY_MAPS_PROPERTY
+ "."
+ ActivityMap.IS_READ_PROPERTY, isRead));
}
int external_id = request.getExternalId();
if (external_id > 0) {
query.where(Operations.eq(Activity.EXTERNAL_ID_PROPERTY, external_id));
}
float priority = request.getPriority();
if (priority >= 0f) {
query.where(Operations.eq(Activity.PRIORITY_PROPERTY, priority));
}
String keyword = request.getKeyword();
if ((keyword != null) && (!keyword.equals(""))) {
// 選択したキーワードを指定する.
query.where(Operations.contains(Activity.TITLE_PROPERTY, keyword).or(
Operations.contains(Activity.LOGIN_NAME_PROPERTY, keyword)));
}
String loginName = request.getLoginName();
if (loginName != null && loginName.length() > 0) {
ALEipUser user = null;
try {
user = ALEipUtils.getALEipUser(loginName);
} catch (ALDBErrorException e) {
throw new RuntimeException(e);
}
if (priority < 1f) {
if (!aclhandler.hasAuthority(
(int) user.getUserId().getValue(),
ALAccessControlConstants.POERTLET_FEATURE_MSGBOARD_TOPIC,
ALAccessControlConstants.VALUE_ACL_LIST)) {
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "Msgboard"));
}
if (!aclhandler.hasAuthority(
(int) user.getUserId().getValue(),
ALAccessControlConstants.POERTLET_FEATURE_BLOG_ENTRY_OTHER,
ALAccessControlConstants.VALUE_ACL_LIST)) {
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "blog"));
}
}
query.where(Operations.ne(Activity.LOGIN_NAME_PROPERTY, loginName));
}
String targetLoginName = request.getTargetLoginName();
boolean targetLoginNameLimit = request.isTargetLoginNameLimit();
if (targetLoginName != null && targetLoginName.length() > 0) {
if (!targetLoginNameLimit) {
// 更新情報
query.where(Operations.in(Activity.ACTIVITY_MAPS_PROPERTY
+ "."
+ ActivityMap.LOGIN_NAME_PROPERTY, targetLoginName, "-1"));
} else {
// あなた(自分)宛のお知らせ
query.where(Operations.in(Activity.ACTIVITY_MAPS_PROPERTY
+ "."
+ ActivityMap.LOGIN_NAME_PROPERTY, targetLoginName));
}
}
String appId = request.getAppId();
if (appId != null && appId.length() > 0) {
if (appId.equals("Gadget")) {
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "Schedule"));
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "Blog"));
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "Msgboard"));
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "ToDo"));
query.where(Operations.ne(Activity.APP_ID_PROPERTY, "Cabinet"));
} else {
query.where(Operations.eq(Activity.APP_ID_PROPERTY, appId));
}
}
String postId = request.getPostId();
if (postId != null && !"".equals(postId)) {
List<Integer> userIds = ALEipUtils.getUserIds(postId);
List<String> loginNameList = new ArrayList<String>();
for (int userId : userIds) {
try {
String name = ALEipUtils.getALEipUser(userId).getName().getValue();
loginNameList.add(name);
} catch (ALDBErrorException e) {
}
}
if (!loginNameList.isEmpty()) {
query.where(Operations.in(Activity.LOGIN_NAME_PROPERTY, loginNameList));
}
}
long max = request.getMax();
if (max > 0) {
Date date = new Date();
date.setTime(max);
query.where(Operations.gt(Activity.UPDATE_DATE_PROPERTY, date));
}
query.orderDesending(Activity.UPDATE_DATE_PROPERTY);
return query;
}
/**
* @param request
*/
@Override
public void createActivity(ALActivityPutRequest request) {
try {
Activity activity = Database.create(Activity.class);
activity.setAppId(request.getAppId());
activity.setLoginName(request.getLoginName());
activity.setBody(request.getBody());
activity.setExternalId(request.getExternalId());
activity.setModuleId(0);
// priority は 0 <= 1 の間
Float priority = request.getPriority();
if (priority < 0) {
priority = 0f;
}
if (priority > 1) {
priority = 1f;
}
activity.setPriority(priority);
activity.setTitle(request.getTitle());
activity.setPortletParams(request.getPortletParams());
activity.setUpdateDate(new Date());
List<String> recipients = request.getRecipients();
if (recipients != null && recipients.size() > 0) {
for (String recipient : recipients) {
ActivityMap activityMap = Database.create(ActivityMap.class);
activityMap.setLoginName(recipient);
activityMap.setActivity(activity);
activityMap.setIsRead(priority == 1f ? 0 : 1);
}
if (priority == 1f) {
Map<String, String> params = new HashMap<String, String>();
ALPushService.pushAsync("activity", params, recipients);
}
} else {
ActivityMap activityMap = Database.create(ActivityMap.class);
activityMap.setLoginName("-1");
activityMap.setActivity(activity);
activityMap.setIsRead(1);
}
ALApplication application =
getApplication(new ALApplicationGetRequest().withAppId(request
.getAppId()));
if (application != null) {
activity.setIcon(application.getIcon().getValue());
}
String activitySaveLimit =
ALContainerConfigService.get(Property.ACTIVITY_SAVE_LIMIT);
int limit = 30;
try {
limit = Integer.valueOf(activitySaveLimit).intValue();
} catch (Throwable ignore) {
}
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -limit);
Database.query(ActivityMap.class).where(
Operations.lt(ActivityMap.ACTIVITY_PROPERTY
+ "."
+ Activity.UPDATE_DATE_PROPERTY, cal.getTime())).deleteAll();
String sql =
"delete from activity where update_date < '"
+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime())
+ "'";
Database.sql(Activity.class, sql).execute();
Database.commit();
// タイムラインに更新情報を追加
if (priority == 0f) {
Calendar tCal = Calendar.getInstance();
int parentId = 0;
Calendar tCalBefore = Calendar.getInstance();
tCalBefore.set(tCal.get(Calendar.YEAR), tCal.get(Calendar.MONTH), tCal
.get(Calendar.DATE), 0, 0, 0);
Calendar tCalAfter = Calendar.getInstance();
tCalAfter.set(tCal.get(Calendar.YEAR), tCal.get(Calendar.MONTH), tCal
.get(Calendar.DATE), 0, 0, 0);
tCalAfter.add(Calendar.DATE, 1);
Expression exp1 =
ExpressionFactory.matchExp(EipTTimeline.OWNER_ID_PROPERTY, Integer
.valueOf(request.getUserId()));
Expression exp2 =
ExpressionFactory.matchExp(
EipTTimeline.TIMELINE_TYPE_PROPERTY,
EipTTimeline.TIMELINE_TYPE_ACTIVITY);
Expression exp3 =
ExpressionFactory.matchExp(EipTTimeline.PARENT_ID_PROPERTY, 0);
Expression exp4 =
ExpressionFactory.betweenExp(
EipTTimeline.CREATE_DATE_PROPERTY,
tCalBefore.getTime(),
tCalAfter.getTime());
Expression exp5 =
ExpressionFactory.matchExp(
EipTTimeline.APP_ID_PROPERTY,
"ACTIVITY_PARENT");
Expression exp6 =
ExpressionFactory.matchExp(EipTTimeline.EXTERNAL_ID_PROPERTY, "0");
SelectQuery<EipTTimeline> tQuery = Database.query(EipTTimeline.class);
tQuery.andQualifier(exp1.andExp(exp2.andExp(exp3.andExp(exp4.andExp(
exp5).andExp(exp6)))));
tQuery.distinct(true);
List<EipTTimeline> parents = tQuery.fetchList();
if (parents != null && parents.size() != 0) {
parentId = parents.get(0).getTimelineId();
EipTTimeline parent =
Database.get(EipTTimeline.class, Integer.valueOf(parentId));
parent.setUpdateDate(tCal.getTime());
} else {
// 親ダミー生成
EipTTimeline timeline = Database.create(EipTTimeline.class);
timeline.setParentId(0);
timeline.setOwnerId(request.getUserId());
timeline.setAppId("ACTIVITY_PARENT");
timeline.setExternalId("0");
timeline.setNote("");
timeline.setTimelineType(EipTTimeline.TIMELINE_TYPE_ACTIVITY);
timeline.setParams(new SimpleDateFormat("yyyyMMdd").format(cal
.getTime()));
// 作成日
timeline.setCreateDate(tCal.getTime());
// 更新日
timeline.setUpdateDate(tCal.getTime());
Database.commit();
this.daysFirstActivate(request.getLoginName());
ALApplication application2 =
getApplication(new ALApplicationGetRequest().withAppId(request
.getAppId()));
if (application2 != null) {
activity.setIcon(application2.getIcon().getValue());
}
String activitySaveLimit2 =
ALContainerConfigService.get(Property.ACTIVITY_SAVE_LIMIT);
int limit2 = 30;
try {
limit2 = Integer.valueOf(activitySaveLimit2).intValue();
} catch (Throwable ignore) {
}
Calendar cal2 = Calendar.getInstance();
cal2.add(Calendar.DAY_OF_MONTH, -limit2);
// 親データ再検索
tQuery = Database.query(EipTTimeline.class);
tQuery.andQualifier(exp1.andExp(exp2.andExp(exp3.andExp(exp4.andExp(
exp5).andExp(exp6)))));
tQuery.distinct(true);
parents = tQuery.fetchList();
if (parents != null && parents.size() != 0) {
parentId = parents.get(0).getTimelineId();
EipTTimeline parent =
Database.get(EipTTimeline.class, Integer.valueOf(parentId));
parent.setUpdateDate(tCal.getTime());
}
}
exp1 =
ExpressionFactory.matchExp(
EipTTimeline.TIMELINE_TYPE_PROPERTY,
EipTTimeline.TIMELINE_TYPE_ACTIVITY);
exp2 =
ExpressionFactory.matchExp(EipTTimeline.OWNER_ID_PROPERTY, Integer
.valueOf(request.getUserId()));
exp3 =
ExpressionFactory.matchExp(EipTTimeline.APP_ID_PROPERTY, request
.getAppId());
exp4 =
ExpressionFactory.matchExp(EipTTimeline.EXTERNAL_ID_PROPERTY, request
.getExternalId()
.toString());
tQuery = Database.query(EipTTimeline.class);
tQuery.andQualifier(exp1.andExp(exp2.andExp(exp3.andExp(exp4))));
// tQuery.andQualifier(exp3);
tQuery.distinct(true);
List<EipTTimeline> olders = tQuery.fetchList();
if (olders != null && olders.size() != 0) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String timelineSql =
"UPDATE eip_t_timeline"
+ " SET parent_id = #bind($parentId) "
+ ", note = #bind($title) "
+ ", params = #bind($portletParams) "
+ ", update_date = '"
+ sdf.format(tCal.getTime())
+ "'"
+ " WHERE timeline_type = 'A' "
+ " AND owner_id = #bind($userId) "
+ " AND app_id = #bind($appId) "
+ " AND external_id = #bind($externalId); ";
Database
.sql(EipTTimeline.class, timelineSql)
.param("parentId", parentId)
.param("title", request.getTitle())
.param("portletParams", request.getPortletParams())
.param("userId", request.getUserId())
.param("appId", request.getAppId())
.param("externalId", request.getExternalId())
.execute();
} else {
EipTTimeline timeline = Database.create(EipTTimeline.class);
timeline.setParentId(parentId);
timeline.setOwnerId(request.getUserId());
timeline.setAppId(request.getAppId());
timeline.setExternalId(request.getExternalId());
timeline.setNote(request.getTitle());
timeline.setTimelineType(EipTTimeline.TIMELINE_TYPE_ACTIVITY);
timeline.setParams(request.getPortletParams());
// 作成日
timeline.setCreateDate(tCal.getTime());
// 更新日
timeline.setUpdateDate(tCal.getTime());
// タイムラインマップ追加
if (recipients != null && recipients.size() > 0) {
for (String recipient : recipients) {
EipTTimelineMap timelineMap =
Database.create(EipTTimelineMap.class);
timelineMap.setLoginName(recipient);
timelineMap.setEipTTimeline(timeline);
timelineMap.setIsRead(priority == 1f ? 0 : 1);
}
} else {
EipTTimelineMap timelineMap =
Database.create(EipTTimelineMap.class);
timelineMap.setLoginName("-1");
timelineMap.setEipTTimeline(timeline);
timelineMap.setIsRead(1);
}
}
Database.commit();
}
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
/**
* @return
*/
@Override
public long getNextModuleId() {
ModuleId moduleId = null;
try {
moduleId = Database.create(ModuleId.class);
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
long next = moduleId.getId().longValue();
try {
String sql = "delete from module_id";
Database.sql(ModuleId.class, sql).execute();
} catch (Throwable t) {
Database.rollback();
// ignore
}
return next;
}
@Override
public void deleteUserData(String... loginNameList) {
try {
for (String loginName : loginNameList) {
String sql1 =
"delete from app_data where login_name = #bind($loginName)";
Database
.sql(AppData.class, sql1)
.param("loginName", loginName)
.execute();
String sql2 =
"delete from activity where login_name = #bind($loginName)";
Database
.sql(Activity.class, sql2)
.param("loginName", loginName)
.execute();
String sql3 =
"delete from activity_map where login_name = #bind($loginName)";
Database
.sql(Activity.class, sql3)
.param("loginName", loginName)
.execute();
}
Database.commit();
} catch (Throwable t) {
Database.rollback();
throw new RuntimeException(t);
}
}
@Override
public void deleteUserData(List<String> loginNameList) {
deleteUserData(loginNameList.toArray(new String[loginNameList.size()]));
}
/**
*
*/
@Override
protected void daysFirstActivate(String uid) {
// noop
}
}