Блог csgpblog
4 месяца назад
и его жены
package test.blogeditutil;
import com.google.gdata.client.*;
import com.google.gdata.data.*;
import com.google.gdata.util.*;
import java.io.*;
import javax.swing.*;
import java.util.*;
import blogeditutil.*;
//Распечатка избранных постов
class TestBlogEditorSelective
{
public static void main(String args[]) throws IOException, ServiceException
{
BlogEditor bedit = new BlogEditor();
String blogname = QueryBlogName.getBlogName();
List<Entry> postlist = bedit.getPostEntryList(blogname, 1, 15);
assert(postlist.size() <= 15);
System.out.println("Blog posts of " + blogname + ":");
for(Entry p: postlist)
{
System.out.println("Post caption: " + p.getTitle().getPlainText());
System.out.println("Date and time: " + p.getPublished());
}
}
}
Класс BlogEditor описан мной в предыдущих постах. Класс QueryBlogName содержит всего один метод, который возвращает строку, введенную пользователем. Как видно, нам хочется получить 15 последних постов. Компилируем, и... конечно, ничего не компилируется, поскольку метод getPostEntryList(String, int, int) в классе BlogEditor мной пока не реализован. Сделать его из существующего варианта класса - дело нескольких минут:
public class BlogEditor
{
...
...
public List<Entry> getPostEntryList(String blogname, int start, int nres)
throws IOException, ServiceException
{
String blog_id = getBloggerID("http://"+blogname+BLOGGER_SERVER);
if(blog_id == null)
throw new IOException("Can't get blogID for " + blogname+BLOGGER_SERVER);
//Запрос на получение постов:
Query query = new Query(new URL (BLOGGER_FEED + blog_id + POST_LOCATION));
query.setStartIndex(start);
query.setMaxResults(nres);
return bservice.getFeed(query, Feed.class).getEntries();
}
}
public class BlogEditor
{
...
...
private final int MAX_RESULTS = 10000000;
public List<Entry> getPostEntryList(String blogname)
throws IOException, ServiceException
{
return getPostEntryList(blogname, 1, MAX_RESULTS);
}
}
После этого все нормально компилится и тест TestBlogEditorSelective тоже запускается без проблем. Еще одна полезная возможность - получить список постов, опубликованных в определенный интервал времени. Заново переписывать тест мне лень, и я просто вставляю еще один вызов в конец метода main класса TestBlogEditorSelective:
class TestBlogEditorSelective
{
public static void main(String args[]) throws IOException, ServiceException
{
...
.
.
//Посты, опубликованные между 1 декабря 2008 и 25 января 2009 года:
postlist = bedit.getPostEntryList(blogname, new GregorianCalendar(2008, 11, 1),
new GregorianCalendar(2009, 0, 25) );
assert(postlist.size() == 8);
}
Сейчас тест естественно, даже не компилируется. Я пока добавлю в класс BlogEditor самую простую реализацию этого метода, дабы убедится в том, что тест будет обнаруживать ошибку:
public class BlogEditor
{
...
.
public List<Entry> getPostEntryList(String blogname, Calendar date1, Calendar date2)
{ return new ArrayList<Entry>(); }
}
После запуска теста, он вылетел на assert, как и ожидалось. Хорошо, теперь можно сварганить нормальную реализацию. Заглянув в документацию по GData API, можно увидеть, что там используются собственная структура данных, описывающая дату - DateTime. К сожалению, объект класса DateTime нельзя напрямую создать из java.util.Calendar, а можно лишь из java.util.Date. И это при том, что большинство удобных конструкторов и методов в классе java.util.Date объявлены как deprecated (нежелательными в изпользовании, устаревшими); Ну, ничего страшного, всего лишь код будет чуть длиннее. Итак, новая реализация, которая уже делает то, что нужно:
public class BlogEditor
{
private final String BLOGGER_FEED = "http://www.blogger.com/feeds/",
POST_LOCATION = "/posts/default",
BLOGGER_SERVER = ".blogspot.com";
private GoogleService bservice;
public BlogEditor()
{ bservice = new GoogleService("blogger", "lotrex-BlogEditor-0.0");}
...
.
.
public List<Entry> getPostEntryList(String blogname, Calendar date1,
Calendar date2)
throws IOException, ServiceException
{
String blog_id = getBloggerID("http://"+blogname+BLOGGER_SERVER);
if(blog_id == null)
throw new IOException("Can't get blogID for " + blogname+BLOGGER_SERVER);
//Запрос на получение постов:
Query query = new Query(new URL (BLOGGER_FEED + blog_id + POST_LOCATION));
query.setPublishedMin(new DateTime(date1.getTime()));
query.setPublishedMax(new DateTime(date2.getTime()));
return bservice.getFeed(query, Feed.class).getEntries();
}
}
public class BlogEditor
{
private final String BLOGGER_FEED = "http://www.blogger.com/feeds/",
POST_LOCATION = "/posts/default",
BLOGGER_SERVER = ".blogspot.com";
...
.
private Query getPostQuery(String blogname) throws IOException,
ServiceException
{
String blog_id = getBloggerID("http://"+blogname+BLOGGER_SERVER);
if(blog_id == null)
throw new IOException("Can't get blogID for " + blogname + BLOGGER_SERVER);
//Запрос на получение постов:
return new Query(new URL (BLOGGER_FEED + blog_id + POST_LOCATION));
}
}