Про блог
неделю назад
и его жены
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));
}
}








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 TestBlogEditor
{
public static void main(String args[]) throws IOException, ServiceException
{
BlogEditor bedit = new BlogEditor();
String blogname = JOptionPane.showInputDialog(null,
"For example, if blog addresss is lotrex.blogspot.com, input \"lotrex\"",
"Input name of blog");
System.out.println("Blog posts of " + blogname + ":");
List<Entry> postlist = bedit.getPostEntryList(blogname);
for(Entry p: postlist)
{
System.out.println("Post caption: " + p.getTitle().getPlainText());
System.out.println("Date and time: " + p.getPublished());
}
}
}JVM = java
JFLAGS = -cp .;.\gdata-core-1.0.jar -ea -esa
test:
$(JVM) $(JFLAGS) test.blogeditutil.TestBlogEditor >res.txt
public List<Entry> getPostEntryList(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);
//Запрос на получение постов:
Query query = new Query(new URL (BLOGGER_FEED + blog_id + POST_LOCATION));
return bservice.getFeed(query, Feed.class).getEntries();
}
private final int MAX_RESULTS = 10000000;
public List<Entry> getPostEntryList(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);
//Запрос на получение постов:
Query query = new Query(new URL (BLOGGER_FEED + blog_id + POST_LOCATION));
query.setMaxResults(MAX_RESULTS);
return bservice.getFeed(query, Feed.class).getEntries();
}
class QueryBlogName
{
static String getBlogName()
{
return JOptionPane.showInputDialog(null,
"For example, if blog addresss is lotrex.blogspot.com, input \"lotrex\"",
"Input name of blog");
}
}
class TestBlogEditor
{
public static void main(String args[]) throws IOException, ServiceException
{
BlogEditor bedit = new BlogEditor();
String blogname = QueryBlogName.getBlogName();
List<Entry> postlist = bedit.getPostEntryList(blogname);
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());
}
}
}
class TestBlogEditTextContent
{
public static void main(String args[]) throws IOException, ServiceException
{
BlogEditor bedit = new BlogEditor();
String blogname = QueryBlogName.getBlogName();
List<Entry> postlist = bedit.getPostEntryList(blogname);
System.out.println("Blog posts of " + blogname + ":");
for(Entry p: postlist)
{
System.out.println("-----------------------");
System.out.println("Post caption: " + p.getTitle().getPlainText());
System.out.println("Content:");
System.out.println(p.getPlainTextContent());
}
}
}JVM = java
JFLAGS = -cp .;.\gdata-core-1.0.jar -ea -esa
test:
$(JVM) $(JFLAGS) test.blogeditutil.TestBlogEditor >res.txt
$(JVM) $(JFLAGS) test.blogeditutil.TestBlogEditTextContent >rescontent.txt
String textcontent = p.getTextContent().getContent().getPlainText();
TextConstruct textconstr = p.getTextContent().getContent();
for(Entry p: postlist)
{
System.out.println("<h3>Post caption:<br>" +
p.getTitle().getPlainText() + "<br>");
System.out.println("Content:<br></h3>");
HtmlTextConstruct htmlconstr = (HtmlTextConstruct)(p.getTextContent().getContent());
System.out.println(htmlconstr.getHtml());
System.out.println("<br>----------------------- end of post.<br>");
}
$(JVM) $(JFLAGS) test.blogeditutil.TestBlogEditHtmlContent >res.html
Теперь мона открывать файл res.html в браузере и любоваться пейзажем :)))