/*
* 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;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.StringRequestEntity;
import org.apache.jetspeed.services.logging.JetspeedLogFactoryService;
import org.apache.jetspeed.services.logging.JetspeedLogger;
import org.apache.jetspeed.services.resources.JetspeedResources;
import com.aimluck.eip.common.ALActivity;
import com.aimluck.eip.common.ALActivityCount;
import com.aimluck.eip.common.ALApplication;
import com.aimluck.eip.common.ALOAuthConsumer;
import com.aimluck.eip.http.HttpServletRequestLocator;
import com.aimluck.eip.orm.Database;
import com.aimluck.eip.orm.query.ResultList;
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.ALApplicationPutRequest;
import com.aimluck.eip.services.social.model.ALOAuthConsumerPutRequest;
/**
*
*/
public abstract class ALSocialApplicationHandler {
private static final JetspeedLogger logger = JetspeedLogFactoryService
.getLogger(ALSocialApplicationHandler.class.getName());
public abstract ResultList<ALApplication> getApplicationList(
ALApplicationGetRequest request);
public abstract ALApplication getApplication(ALApplicationGetRequest request);
public abstract void createApplication(ALApplicationPutRequest request);
public abstract void updateApplication(String appId,
ALApplicationPutRequest request);
public abstract void deleteApplication(String... appIdList);
public abstract void deleteApplication(List<String> appIdList);
public abstract void enableApplication(String... appIdList);
public abstract void enableApplication(List<String> appIdList);
public abstract void disableApplication(String... appIdList);
public abstract void disableApplication(List<String> appIdList);
public abstract boolean checkApplicationAvailability(String appId);
public abstract List<ALOAuthConsumer> getOAuthConsumer(String appId);
public abstract void putOAuthConsumer(ALOAuthConsumerPutRequest request);
public abstract String getContainerConfig(Property property);
public abstract void putContainerConfig(Property property, String value);
public abstract ResultList<ALActivity> getActivityList(
ALActivityGetRequest request);
public abstract ALActivity getActivity(ALActivityGetRequest request);
public abstract ALActivityCount getActivityCount(ALActivityGetRequest request);
public abstract void setAllReadActivity(String loginName);
public abstract void setReadActivity(int activityId, String loginName);
public abstract void createActivity(ALActivityPutRequest request);
public abstract long getNextModuleId();
public abstract void deleteUserData(String... loginNameList);
public abstract void deleteUserData(List<String> loginNameList);
protected abstract void daysFirstActivate(String uid);
public static enum Property {
LOCKED_DOMAIN_REQUIRED("lockedDomainRequired") {
@Override
public String defaultValue() {
return "false";
}
},
LOCKED_DOMAIN_SUFFIX("lockedDomainSuffix") {
@Override
public String defaultValue() {
return "";
}
},
UNLOCKED_DOMAIN("unLockedDomain") {
@Override
public String defaultValue() {
return "";
}
},
CACHE_GADGET_XML("cacheGadgetXml") {
@Override
public String defaultValue() {
return "true";
}
},
ACTIVITY_SAVE_LIMIT("activitySaveLimit") {
@Override
public String defaultValue() {
return "30";
}
},
CONTAINER_URL("containerUrl") {
@Override
public String defaultValue() {
return JetspeedResources.getString("aipo.container.url");
}
};
private final String property;
private Property(String property) {
this.property = property;
}
@Override
public String toString() {
return this.property;
}
public abstract String defaultValue();
}
protected String generateConsumerKey(String url) {
return new StringBuilder(Database.getDomainName()).append(":").append(
new String(Base64.encodeBase64(DigestUtils.sha(new StringBuilder()
.append(System.nanoTime())
.append("::")
.append(url)
.toString()
.getBytes()))).replace("=", "")).toString();
}
protected String generateConsumerSecret() {
return DigestUtils.shaHex(new StringBuilder(UUID.randomUUID().toString())
.append(System.nanoTime())
.toString());
}
public ALGadgetSpec getMetaData(String specUrl) {
return getMetaData(specUrl, false);
}
public ALGadgetSpec getMetaData(String specUrl, boolean isDetail) {
List<String> specUrls = new ArrayList<String>();
specUrls.add(specUrl);
Map<String, ALGadgetSpec> metaData =
getMetaData(specUrls, "home", isDetail, true);
return metaData.get(specUrl);
}
public Map<String, ALGadgetSpec> getMetaData(List<String> specUrls) {
return getMetaData(specUrls, "home", false, true);
}
protected String getMetaDataUrl() {
String baseUrl = ALContainerConfigService.get(Property.CONTAINER_URL);
if (baseUrl == null || baseUrl.length() == 0) {
HttpServletRequest request = HttpServletRequestLocator.get();
Integer port = request.getServerPort();
String scheme = request.getScheme();
String continerPath = JetspeedResources.getString("aipo.container.path");
baseUrl =
scheme
+ "://127.0.0.1:"
+ port
+ (continerPath == null ? "" : continerPath);
}
return baseUrl + "/gadgets/metadata";
}
public Map<String, ALGadgetSpec> getMetaData(List<String> specUrls,
String view, boolean isDetail, boolean nocache) {
Map<String, ALGadgetSpec> maps = new HashMap<String, ALGadgetSpec>();
if (specUrls == null || specUrls.size() == 0) {
return maps;
}
try {
HttpClient httpClient = new HttpClient();
httpClient.getParams().setParameter("http.connection.timeout", 10000);
httpClient.getParams().setParameter("http.socket.timeout", 10000);
PostMethod postMethod = new PostMethod(getMetaDataUrl());
postMethod.addRequestHeader("Content-Type", "application/javascript");
postMethod.addParameter("st", "default:st");
postMethod.addParameter("req", "1");
postMethod.addParameter("callback", "1");
JSONObject jsonObject = new JSONObject();
JSONObject context = new JSONObject();
context.put("country", "JP");
context.put("language", "ja");
context.put("view", view == null ? "home" : view);
context.put("container", "default");
context.put("nocache", nocache ? 1 : 0);
if (isDetail) {
context.put("withDescription", "1");
context.put("withOAuthService", "1");
}
JSONArray gadgets = new JSONArray();
for (String specUrl : specUrls) {
JSONObject gadget = new JSONObject();
gadget.put("url", specUrl);
gadget.put("moduleId", 1);
gadgets.add(gadget);
}
jsonObject.put("context", context);
jsonObject.put("gadgets", gadgets);
postMethod.setRequestEntity(new StringRequestEntity(
jsonObject.toString(),
"application/javascript",
"UTF-8"));
httpClient.executeMethod(postMethod);
String result = postMethod.getResponseBodyAsString();
JSONObject fromObject = JSONObject.fromObject(result);
JSONArray jsonArray = (JSONArray) fromObject.get("gadgets");
Map<String, Class<?>> classMap = new HashMap<String, Class<?>>();
classMap.put("oauthService", ALOAuthService.class);
classMap.put("userPrefs", HashMap.class);
if (jsonArray == null) {
return maps;
}
int size = jsonArray.size();
for (int i = 0; i < size; i++) {
try {
JSONObject object = jsonArray.getJSONObject(i);
Object e = object.get("errors");
if (e == null) {
ALGadgetSpec spec =
(ALGadgetSpec) JSONObject.toBean(
object,
ALGadgetSpec.class,
classMap);
maps.put(spec.getUrl(), spec);
}
} catch (Throwable t) {
logger.warn("[ALSocialApplicationHandler]", t);
}
}
} catch (Throwable t) {
logger.warn("[ALSocialApplicationHandler]", t);
}
return maps;
}
}