/** * myJerry | Evenstar * Copyright (C) 2010 myJerry Development Team * http://www.myjerry.org * * The file is licensed under the 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 org.myjerry.evenstar.service.impl; import java.util.ArrayList; import java.util.Collection; 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 org.myjerry.evenstar.constants.PreferenceConstants; import org.myjerry.evenstar.enums.BlogImportType; import org.myjerry.evenstar.helper.ImportBlogHelper; import org.myjerry.evenstar.model.Blog; import org.myjerry.evenstar.model.BlogPost; import org.myjerry.evenstar.model.Comment; import org.myjerry.evenstar.model.EvenstarUser; import org.myjerry.evenstar.model.blogimport.AuthorImport; import org.myjerry.evenstar.model.blogimport.BlogImport; import org.myjerry.evenstar.model.blogimport.CommentImport; import org.myjerry.evenstar.model.blogimport.PostImport; import org.myjerry.evenstar.persistence.PersistenceManagerFactoryImpl; import org.myjerry.evenstar.service.BlogPostService; import org.myjerry.evenstar.service.BlogService; import org.myjerry.evenstar.service.CommentService; import org.myjerry.evenstar.service.PreferenceService; import org.myjerry.evenstar.service.UserService; import org.myjerry.util.GAEUserUtil; import org.myjerry.util.ServerUtils; import org.myjerry.util.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import com.google.appengine.api.datastore.Key; import com.google.appengine.api.datastore.KeyFactory; public class BlogServiceImpl implements BlogService { @Autowired private PreferenceService preferenceService; @Autowired private BlogPostService blogPostService; @Autowired private UserService userService; @Autowired private CommentService commentService; @Override public boolean createBlog(String blogName, String blogAddress, String blogAlias) { // TODO Auto-generated method stub Blog blog = new Blog(); blog.setTitle(blogName); blog.setAddress(blogAddress); blog.setAlias(blogAlias); blog.setCreationDate(ServerUtils.getServerDate()); blog.setOwnerID(GAEUserUtil.getUserID()); PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { manager.makePersistent(blog); return true; } catch(Exception e) { e.printStackTrace(); return false; } finally { manager.close(); } } @Override public boolean deleteBlog(Long blogID) { if(blogID == null) { return false; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Key key = KeyFactory.createKey(Blog.class.getSimpleName(), blogID); Blog blog = manager.getObjectById(Blog.class, key); manager.deletePersistent(blog); return true; } catch(JDOObjectNotFoundException e) { // do nothing } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return false; } @SuppressWarnings("unchecked") @Override public boolean existsBlogAddress(String blogAddress) { if(StringUtils.isEmpty(blogAddress)) { return false; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Query query = manager.newQuery(Blog.class, "address == addressParam"); query.declareParameters("String addressParam"); List<Blog> blogs = (List<Blog>) query.execute(blogAddress); if(blogs != null && blogs.size() > 0) { return true; } return false; } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return true; } @SuppressWarnings("unchecked") @Override public boolean existsBlogAlias(String alias) { if(StringUtils.isEmpty(alias)) { return false; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Query query = manager.newQuery(Blog.class, "alias == aliasParam"); query.declareParameters("String aliasParam"); List<Blog> blogs = (List<Blog>) query.execute(alias); if(blogs != null && blogs.size() > 0) { return true; } return false; } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return true; } @SuppressWarnings("unchecked") @Override public boolean existsBlogName(String blogTitle) { if(StringUtils.isEmpty(blogTitle)) { return false; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Query query = manager.newQuery(Blog.class, "title == titleParam"); query.declareParameters("String titleParam"); List<Blog> blogs = (List<Blog>) query.execute(blogTitle); if(blogs != null && blogs.size() > 0) { return true; } return false; } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return true; } @SuppressWarnings("unchecked") @Override public Collection<Blog> getAllBlogs() { PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { List<Blog> blogs = (List<Blog>) manager.newQuery("select from " + Blog.class.getName()).execute(); return manager.detachCopyAll(blogs); } catch(Exception e) { e.printStackTrace(); return null; } finally { manager.close(); } } @Override public Long getDefaultBlogID() { String blogID = this.preferenceService.getPreference(PreferenceConstants.DEFAULT_BLOG_ID); if(StringUtils.isNotEmpty(blogID)) { return new Long(blogID); } return null; } @Override public boolean setDefaultBlogID(Long blogID) { if(blogID != null) { return this.preferenceService.setPreference(PreferenceConstants.DEFAULT_BLOG_ID, String.valueOf(blogID)); } else { return this.preferenceService.deletePreference(PreferenceConstants.DEFAULT_BLOG_ID); } } /** * @return the preferenceService */ public PreferenceService getPreferenceService() { return preferenceService; } /** * @param preferenceService the preferenceService to set */ public void setPreferenceService(PreferenceService preferenceService) { this.preferenceService = preferenceService; } @Override public Blog getBlog(Long blogID) { if(blogID == null) { return null; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Key key = KeyFactory.createKey(Blog.class.getSimpleName(), blogID); Blog blog = manager.getObjectById(Blog.class, key); // hack for GAE to fetch text fields blog.getDescription(); return manager.detachCopy(blog); } catch(JDOObjectNotFoundException e) { // do nothing } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return null; } @Override public boolean updateBlog(Blog blog) { if(blog == null) { return false; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Key key = KeyFactory.createKey(Blog.class.getSimpleName(), blog.getBlogID()); Blog b = manager.getObjectById(Blog.class, key); // hack for GAE to fetch text fields b.setAddress(blog.getAddress()); b.setAlias(blog.getAlias()); b.setDescription(blog.getDescription()); b.setTitle(blog.getTitle()); b.setRestrictedPostText(blog.getRestrictedPostText()); manager.makePersistent(b); return true; } catch(JDOObjectNotFoundException e) { // do nothing } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return false; } @SuppressWarnings("unchecked") @Override public Long getBlogIDForServerName(String serverName) { if(StringUtils.isEmpty(serverName)) { return null; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Query query = manager.newQuery(Blog.class, "address == addressParam"); query.declareParameters("String addressParam"); List<Blog> blogs = (List<Blog>) query.execute(serverName); if(blogs != null && blogs.size() > 0) { return blogs.get(0).getBlogID(); } } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return null; } @Override public boolean importBlog(Long blogID, BlogImportType importType, String blogData, boolean publishPosts) { if(blogID == null || StringUtils.isEmpty(blogData)) { return false; } BlogImport blogImport = null; switch(importType) { case BLOGGER: blogImport = ImportBlogHelper.parseBlogger(blogData); break; } if(blogImport != null) { try { importBlog(blogID, blogImport, publishPosts); return true; } catch(Exception e) { e.printStackTrace(); } } return false; } private void importBlog(final Long blogID, BlogImport blogImport, boolean publishPosts) { if(blogID == null || blogImport == null) { return; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); // get all authors too - we need them Set<EvenstarUser> authors = new HashSet<EvenstarUser>(); for(PostImport postImport : blogImport.getPosts()) { EvenstarUser author = ImportBlogHelper.getEvenstarUser(postImport.getAuthor()); if(author != null) { authors.add(author); } } for(CommentImport commentImport : blogImport.getComments()) { EvenstarUser author = ImportBlogHelper.getEvenstarUser(commentImport.getAuthor()); if(author != null) { authors.add(author); } } // check if these authors exist - if they do remove them from this list Set<EvenstarUser> unknownAuthors = new HashSet<EvenstarUser>(); for(EvenstarUser author : authors) { if(StringUtils.isNotEmpty(author.getHomePage())) { EvenstarUser user = this.userService.getEvenstarUserForUri(author.getHomePage()); if(user == null) { unknownAuthors.add(author); } } else if(StringUtils.isNotEmpty(author.getEmail())) { EvenstarUser user = this.userService.getEvenstarUser(author.getEmail()); if(user == null) { unknownAuthors.add(author); } } } // start the transaction try { // persist all authors for(EvenstarUser user : unknownAuthors) { this.userService.addEvenstarUser(user); } // re-populate the author IDs in posts List<BlogPost> posts = new ArrayList<BlogPost>(); for(PostImport postImport : blogImport.getPosts()) { AuthorImport author = postImport.getAuthor(); if(StringUtils.isNotEmpty(author.getUri())) { Long userID = this.userService.getEvenstarUserIDForUri(author.getUri()); BlogPost post = ImportBlogHelper.getBlogPost(blogID, postImport); post.setLastUpdateUser(userID); if(!publishPosts) { post.setPostedDate(null); } posts.add(post); } } // persist all posts // we dont persist them together because we want blog labels // to be persisted along too Map<String, Long> postCommentMapping = new HashMap<String, Long>(); if(publishPosts) { for(BlogPost post : posts) { this.blogPostService.publishPost(post); postCommentMapping.put(post.getUniqueImportID(), post.getPostID()); } } else { for(BlogPost post : posts) { this.blogPostService.saveDraftPost(post); postCommentMapping.put(post.getUniqueImportID(), post.getPostID()); } } // re-populate the IDs in comments for(CommentImport commentImport : blogImport.getComments()) { Comment comment = ImportBlogHelper.getComment(blogID, commentImport); comment.setBlogID(blogID); Long postID = postCommentMapping.get(commentImport.getUniquePostID()); comment.setPostID(postID); Long userID = this.userService.getEvenstarUserIDForUri(commentImport.getAuthor().getUri()); comment.setAuthorID(userID); // set permissions to PUBLIC comment.setPermissions(Comment.PRIVACY_MODE_PUBLIC); // we will make this change later // this.commentService.postComment(comment); manager.makePersistent(comment); } } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } } @SuppressWarnings("unchecked") @Override public Long getBlogIDForAlias(String alias) { if(StringUtils.isEmpty(alias)) { return null; } PersistenceManager manager = PersistenceManagerFactoryImpl.getPersistenceManager(); try { Query query = manager.newQuery(Blog.class, "alias == aliasParam"); query.declareParameters("String aliasParam"); List<Blog> blogs = (List<Blog>) query.execute(alias); if(blogs != null && blogs.size() > 0) { return blogs.get(0).getBlogID(); } } catch(Exception e) { e.printStackTrace(); } finally { manager.close(); } return null; } /** * @return the blogPostService */ public BlogPostService getBlogPostService() { return blogPostService; } /** * @param blogPostService the blogPostService to set */ public void setBlogPostService(BlogPostService blogPostService) { this.blogPostService = blogPostService; } /** * @return the userService */ public UserService getUserService() { return userService; } /** * @param userService the userService to set */ public void setUserService(UserService userService) { this.userService = userService; } }