/**
* 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.helper;
import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Element;
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.util.ServerUtils;
import com.sun.syndication.feed.synd.SyndCategory;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndLink;
import com.sun.syndication.feed.synd.SyndPerson;
import com.sun.syndication.io.SyndFeedInput;
public class ImportBlogHelper {
/**
* Parse blogger XML data and create the global {@link BlogImport} domain object.
*
* @param blogData
* @return
*/
@SuppressWarnings("unchecked")
public static BlogImport parseBlogger(String blogData) {
SyndFeedInput input = new SyndFeedInput();
Reader reader = new StringReader(blogData);
BlogImport blogImport = new BlogImport();
try {
SyndFeed feed = input.build(reader);
blogImport.setTitle(feed.getTitle());
List list = feed.getEntries();
for(Object o : list) {
SyndEntry entry = (SyndEntry) o;
if(entry.getCategories() != null && entry.getCategories().size() > 0) {
for(Object categoryObject : entry.getCategories()) {
SyndCategory category = (SyndCategory) categoryObject;
// check for POSTS
if("http://schemas.google.com/g/2005#kind".equals(category.getTaxonomyUri()) && "http://schemas.google.com/blogger/2008/kind#post".equals(category.getName())) {
blogImport.addPostImport(getBloggerPost(entry));
continue;
}
// check for COMMENTS
if("http://schemas.google.com/g/2005#kind".equals(category.getTaxonomyUri()) && "http://schemas.google.com/blogger/2008/kind#comment".equals(category.getName())) {
blogImport.addCommentImport(getBloggerComment(entry));
}
}
}
}
} catch(Exception e) {
e.printStackTrace();
}
return blogImport;
}
@SuppressWarnings("unchecked")
private static CommentImport getBloggerComment(SyndEntry entry) {
CommentImport commentImport = null;
if(entry.getContents() != null && entry.getContents().size() > 0) {
commentImport = new CommentImport();
SyndContent content = (SyndContent) entry.getContents().get(0);
commentImport.setContent(content.getValue());
commentImport.setPublished(entry.getPublishedDate());
commentImport.setUpdated(entry.getUpdatedDate());
// get author
if(entry.getAuthors() != null && entry.getAuthors().size() > 0) {
SyndPerson person = (SyndPerson) entry.getAuthors().get(0);
AuthorImport authorImport = new AuthorImport();
String email = person.getEmail();
if(!("noreply@blogger.com".equals(email))) {
authorImport.setEmail(person.getEmail());
}
authorImport.setName(person.getName());
authorImport.setUri(person.getUri());
commentImport.setAuthor(authorImport);
}
// get the unique post ID
// this is needed to relate to which post actually has the comment
Object foreign = entry.getForeignMarkup();
if(foreign != null) {
if(foreign instanceof List) {
List elements = (List) foreign;
if(elements != null && elements.size() > 0) {
for(Object elementObject : elements) {
Element element = (Element) elementObject;
if("in-reply-to".equals(element.getName()) && "thr".equals(element.getNamespace().getPrefix())) {
String ref = element.getAttributeValue("ref");
commentImport.setUniquePostID(ref.trim());
}
}
}
}
}
}
return commentImport;
}
private static PostImport getBloggerPost(SyndEntry entry) {
PostImport postImport = null;
if(entry.getContents() != null && entry.getContents().size() > 0) {
postImport = new PostImport();
SyndContent content = (SyndContent) entry.getContents().get(0);
postImport.setHtmlContent(content.getValue());
postImport.setTitle(entry.getTitle());
postImport.setPublished(entry.getPublishedDate());
postImport.setUpdated(entry.getUpdatedDate());
postImport.setUniqueID(entry.getUri().trim());
// get post link
if(entry.getLinks() != null && entry.getLinks().size() > 0) {
for(Object linkObject : entry.getLinks()) {
SyndLink link = (SyndLink) linkObject;
if("alternate".equals(link.getRel()) && "text/html".equals(link.getType())) {
postImport.setHref(ServerUtils.getRelativeLink(link.getHref()));
break;
}
}
}
// get author
if(entry.getAuthors() != null && entry.getAuthors().size() > 0) {
SyndPerson person = (SyndPerson) entry.getAuthors().get(0);
AuthorImport authorImport = new AuthorImport();
authorImport.setEmail(person.getEmail());
authorImport.setName(person.getName());
authorImport.setUri(person.getUri());
postImport.setAuthor(authorImport);
}
// get labels
List<String> labels = new ArrayList<String>();
String labelString = null;
for(Object categoryObject : entry.getCategories()) {
SyndCategory category = (SyndCategory) categoryObject;
if("http://www.blogger.com/atom/ns#".equals(category.getTaxonomyUri())) {
String labelName = category.getName();
labels.add(labelName);
}
}
if(labels != null && labels.size() > 0) {
for(int index = 0; index < labels.size(); index++) {
if(index == 0) {
labelString = labels.get(0);
} else {
labelString += ";" + labels.get(index);
}
}
}
postImport.setTags(labelString);
}
return postImport;
}
/**
* Convert and imported blog post to {@link BlogPost} domain object.
* @param blogID
* @param postImport
* @return
*/
public static BlogPost getBlogPost(Long blogID, PostImport postImport) {
BlogPost post = new BlogPost();
post.setBlogID(blogID);
post.setContents(postImport.getHtmlContent());
post.setLastUpdated(postImport.getUpdated());
post.setPostedDate(postImport.getPublished());
post.setLabels(postImport.getTags());
post.setTitle(postImport.getTitle());
post.setCreationDate(ServerUtils.getServerDate());
post.setUniqueImportID(postImport.getUniqueID());
post.setUrl(postImport.getHref());
return post;
}
/**
* Convert an imported comment to {@link Comment} domain object.
*
* @param blogID
* @param commentImport
* @return
*/
public static Comment getComment(Long blogID, CommentImport commentImport) {
Comment comment = new Comment();
comment.setContent(commentImport.getContent());
comment.setPublished(commentImport.getPublished());
comment.setTimestamp(commentImport.getUpdated());
return comment;
}
/**
* Convert an imported user to {@link EvenstarUser} domain object.
*
* @param authorImport
* @return
*/
public static EvenstarUser getEvenstarUser(AuthorImport authorImport) {
EvenstarUser user = new EvenstarUser();
user.setUserName(authorImport.getName());
user.setEmail(authorImport.getEmail());
user.setHomePage(authorImport.getUri());
return user;
}
}