Skip to content

Instantly share code, notes, and snippets.

@mborodov
Last active August 29, 2015 14:06
Show Gist options
  • Save mborodov/9e2f4f6d2ebd5785e923 to your computer and use it in GitHub Desktop.
Save mborodov/9e2f4f6d2ebd5785e923 to your computer and use it in GitHub Desktop.
package news;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.jdo.JDOObjectNotFoundException;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringEscapeUtils;
import org.datanucleus.store.appengine.query.JDOCursorHelper;
import com.google.appengine.api.datastore.Cursor;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import comment.Comment;
import like.Like;
import engine.PMF;
import place.Place;
import place.PlaceHelper;
import profile.Profile;
import profile.ProfileHelper;
import push.PushHelper;
public class NewsHelper {
// Метод добавляет новость инициатору
public static void makeAddPlaceOwnerNews(Place place) {
PersistenceManager pm = PMF.get().getPersistenceManager();
Key PlaceKey = KeyFactory.createKey(Place.class.getSimpleName(),
place.getKey());
String stringForKey = place.getOwner() + place.getKey().toString();
News news = new News(System.currentTimeMillis() / 1000,
place.getOwner(), PlaceKey, stringForKey, News.typeAddedPlace,
Arrays.asList(place.getOwner()));
try {
pm.makePersistent(news);
} finally {
pm.close();
}
}
public static void makeAddPlaceNews(Long placeId) {
// Открываем PM
PersistenceManager pm = PMF.get().getPersistenceManager();
// достаем место по id
Place place = pm.getObjectById(Place.class, placeId);
// хозяин места
Profile ownerPlace = ProfileHelper.getProfileByLogin(place.getOwner());
// Если нет ресиверов то выходим из метода
if (ownerPlace.getRecievers().isEmpty()) {
return;
}
// профили ресиверов
List<Profile> receiversProfiles = ProfileHelper
.getProfilesByKeys(ownerPlace.getRecievers());
List<String> receiversLogins = new ArrayList<String>();
List<String> receiversTokens = new ArrayList<String>();
List<String> receiversLangs = new ArrayList<String>();
for (Profile profile : receiversProfiles) {
receiversLogins.add(profile.getLogin());
receiversTokens.add(profile.getDeviceToken());
receiversLangs.add(profile.getLang());
}
for (String currentLogin : receiversLogins) {
ProfileHelper.increaseNewsCount(currentLogin, pm);
}
Key PlaceKey = KeyFactory.createKey(Place.class.getSimpleName(),
place.getKey());
String stringForKey = place.getOwner() + place.getKey().toString()
+ "sub";
News news = new News(System.currentTimeMillis() / 1000,
place.getOwner(), PlaceKey, stringForKey, News.typeAddedPlace,
receiversLogins);
try {
pm.makePersistent(news);
String EventNick = ProfileHelper.getNickByLogin(place.getOwner());
// PushHelper.addPlacePush(EventNick, receiversTokens,
// receiversLogins, receiversLangs, place.getKey().toString());
for (int i=0; i<receiversTokens.size()-1; i++) {
// Создаем пуши подписчикам создателя места
Queue queueNews = QueueFactory.getQueue("pushPlace-queue");
queueNews.add(TaskOptions.Builder.withUrl("/task/place/push")
.param("eventNick", EventNick)
.param("rToken", receiversTokens.get(i))
.param("rLogin", receiversLogins.get(i))
.param("rLang", receiversLangs.get(i))
.param("placeKey", place.getKey().toString()));
}
} finally {
pm.close();
}
}
public static void makeAddLikeNews(Like like, PersistenceManager pm) {
String receiverLang = "en";
try {
// профиль инициатора
Profile ownerLikeProfile = pm.getObjectById(
Profile.class,
KeyFactory.createKey(Profile.class.getSimpleName(),
like.getLogin()));
List<Key> receiversKeys = new ArrayList<Key>(
ownerLikeProfile.getRecievers());
// логин хозяина места
String loginOwnerPlace = like.getPlace().getOwner();
// профиль хозяина места
Profile profileOwnerPlace = pm.getObjectById(Profile.class,
KeyFactory.createKey(Profile.class.getSimpleName(),
loginOwnerPlace));
receiverLang = profileOwnerPlace.getLang();
// убираем пересечение двух массивов
receiversKeys.removeAll(profileOwnerPlace.getRecievers());
// профили ресиверов
List<Profile> receiversProfiles = ProfileHelper
.getProfilesByKeys(receiversKeys);
if (receiversProfiles == null) {
receiversProfiles = new ArrayList<Profile>();
}
List<String> receiversLogins = new ArrayList<String>();
List<String> receiversTokens = new ArrayList<String>();
for (Profile profile : receiversProfiles) {
receiversLogins.add(profile.getLogin());
receiversTokens.add(profile.getDeviceToken());
}
//receiversLogins.add(loginOwnerPlace);
for (String currentLogin : receiversLogins) {
ProfileHelper.increaseNewsCount(currentLogin, pm);
}
String stringForKey = like.getLogin()
+ Long.toString(like.getKey().getParent().getId())
+ News.typeLiked.toString();
News news = new News(System.currentTimeMillis() / 1000,
like.getLogin(), like.getKey(), stringForKey,
News.typeLiked, receiversLogins);
Key checkNewsKey = KeyFactory.createKey(News.class.getSimpleName(),
stringForKey);
try {
pm.getObjectById(News.class, checkNewsKey);
} catch (JDOObjectNotFoundException e) {
pm.makePersistent(news);
}
} finally {
}
// шлем лайк если инициатор лайка != владельцу места
if (!like.getLogin().equals(like.getPlace().getOwner())) {
PushHelper.addLikePush(like.getPlace().getKey(),like.getLogin(), like.getPlace().getOwner(), receiverLang);
}
}
public static void makeAddCommentNews(Comment comment) {
PersistenceManager pm = PMF.get().getPersistenceManager();
// профиль инициатора
Profile ownerCommentProfile = pm.getObjectById(
Profile.class,
KeyFactory.createKey(Profile.class.getSimpleName(),
comment.getLogin()));
List<Key> receiversKeys = new ArrayList<Key>(
ownerCommentProfile.getRecievers());
//receiversKeys.get(0).getName();
List<String> receiversLogins = new ArrayList<String>();
for (Key receiverKey : receiversKeys) {
receiversLogins.add(receiverKey.getName());
}
//receiversLogins.add(loginOwnerPlace);
for (String currentLogin : receiversLogins) {
ProfileHelper.increaseNewsCount(currentLogin, pm);
}
String stringForKey = comment.getLogin()
+ Long.toString(comment.getKey().getId())
+ News.typeCommented.toString();
News news = new News(System.currentTimeMillis() / 1000,
comment.getLogin(), comment.getKey(), stringForKey,
News.typeCommented, receiversLogins);
try {
pm.makePersistent(news);
} finally {
pm.close();
}
}
public static void makeAddFriendRegisterNews(String currentLogin,
String registeredLogin) {
}
public static void makeAddSubscriptionNews(String gazetaLogin,
Profile recieverProfile) {
// достаем профиль газеты
Profile gazetaProfile = ProfileHelper.getProfileByLogin(gazetaLogin);
// достаем подписчиков газеты
List<Profile> receiversProfiles = ProfileHelper
.getProfilesByKeys(recieverProfile.getRecievers());
// проверим если нету ресиверов то создадим пустой массив ресиверов
if (receiversProfiles == null) {
receiversProfiles = new ArrayList<Profile>();
}
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
List<String> receiversLogins = new ArrayList<String>();
// пробегаем по всем профилям и достаем логины в массив
for (Profile profile : receiversProfiles) {
receiversLogins.add(profile.getLogin());
}
// к списку логинов добавляем логин газеты
receiversLogins.add(gazetaLogin);
// увеличиваем всем логинам новости счетчик новостей
for (String currentLogin : receiversLogins) {
ProfileHelper.increaseNewsCount(currentLogin, pm);
}
// формируем новость
String stringForKey = gazetaLogin + recieverProfile.getLogin()
+ News.typeFollowed.toString();
News news = new News(System.currentTimeMillis() / 1000,
recieverProfile.getLogin(), gazetaProfile.getKey(),
stringForKey, News.typeFollowed, receiversLogins);
Key checkNewsKey = KeyFactory.createKey(News.class.getSimpleName(),
stringForKey);
try {
pm.getObjectById(News.class, checkNewsKey);
} catch (JDOObjectNotFoundException e) {
pm.makePersistent(news);
PushHelper.addSubscriptionPush(recieverProfile.getNick(),
gazetaProfile.getDeviceToken(),
gazetaProfile.getLogin(), recieverProfile.getLogin(), recieverProfile.getLang());
}
}
finally {
pm.close();
}
}
@SuppressWarnings("unchecked")
public static List<News> getNewsByLogin(String login, int count,
int offset, HttpSession session) {
PersistenceManager pm = PMF.get().getPersistenceManager();
List<News> newsList = new ArrayList<News>();
@SuppressWarnings("rawtypes")
Map extensionMap = new HashMap();
try {
if (session.getAttribute("newsCountResponse") == null) {
session.setAttribute("newsCountResponse", 0);
}
Query query = pm.newQuery(News.class);
query.setFilter("receivers == receiverLoginParam");
query.declareParameters("String receiverLoginParam");
query.setOrdering("timeStamp desc");
if (offset != 0 && session.getAttribute("cursorString") != null) {
Cursor cursor = Cursor.fromWebSafeString((String) session.getAttribute("cursorString"));
extensionMap.put(JDOCursorHelper.CURSOR_EXTENSION, cursor);
query.setExtensions(extensionMap);
} else {
session.setAttribute("newsCountResponse", 0);
}
query.setRange(0, Long.valueOf(count));
newsList = (List<News>) query.execute(login);
session.setAttribute("newsCountResponse",
(Integer) session.getAttribute("newsCountResponse")
+ newsList.size());
Cursor cursor = JDOCursorHelper.getCursor(newsList);
String cursorString = cursor.toWebSafeString();
session.setAttribute("cursorString", cursorString);
for (News news : newsList) {
switch (news.getType()) {
case 0:
news.setObject(Long.toString(news.getObjectKey().getId()));
break;
case 1:
news.setObject(Long.toString(news.getObjectKey()
.getParent().getId()));
break;
case 2:
Comment newsComment = pm.getObjectById(Comment.class,
news.getObjectKey());
newsComment.setMessage(StringEscapeUtils
.unescapeJava(newsComment.getMessage()));
newsComment.setPlaceKey(news.getObjectKey().getParent()
.getId());
news.setObject(newsComment);
break;
case 3:
news.setObject(news.getObjectKey().getName());
default:
break;
}
}
newsList.size();
} finally {
pm.close();
}
return newsList;
}
public static Set<Place> preparePlacesForNews(List<News> newsList,
String login) {
HashSet<Place> resultMap = new HashSet<Place>();
PersistenceManager pm = PMF.get().getPersistenceManager();
for (News news : newsList) {
Place placeNewsType0, placeNewsType1, placeNewsType2;
List<Place> preparedPlaces = new ArrayList<Place>();
switch (news.getType()) {
case 0:
placeNewsType0 = pm.getObjectById(Place.class, news.getObjectKey());
preparedPlaces = PlaceHelper.preparePlacesForClient(Arrays.asList(placeNewsType0), login, pm);
if (!preparedPlaces.isEmpty()) {
// Удаляем забаненые места
preparedPlaces = PlaceHelper.removeBannedPlaces(preparedPlaces,login);
}
if (preparedPlaces.size() > 0) {
resultMap.add(preparedPlaces.get(0));
}
break;
case 1:
placeNewsType1 = pm.getObjectById(Place.class, news.getObjectKey().getParent());
preparedPlaces = PlaceHelper.removeBannedPlaces(Arrays.asList(placeNewsType1),login);
if (preparedPlaces.size() > 0) {
resultMap.add(placeNewsType1);
}
break;
case 2:
placeNewsType2 = pm.getObjectById(Place.class, news.getObjectKey().getParent());
preparedPlaces = PlaceHelper.removeBannedPlaces(Arrays.asList(placeNewsType2),login);
if (preparedPlaces.size() > 0) {
resultMap.add(placeNewsType2);
}
break;
default:
break;
}
}
return resultMap;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment