l4 written, unchecked
This commit is contained in:
parent
e90138636e
commit
a44039a554
|
@ -13,8 +13,7 @@ is_rss2_feed(Name)->
|
||||||
|
|
||||||
% Возвращает список элементов
|
% Возвращает список элементов
|
||||||
get_feed_items(N) ->
|
get_feed_items(N) ->
|
||||||
{Doc,_} = xmerl_scan:file(N),
|
xmerl_xpath:string("//channel/item", N).
|
||||||
xmerl_xpath:string("//channel/item", Doc).
|
|
||||||
|
|
||||||
% пока не проверена (не на чем, а функцию поэлементоно разбирающую список есть ощущение, что я буду писать в одном из следующих пунктов)
|
% пока не проверена (не на чем, а функцию поэлементоно разбирающую список есть ощущение, что я буду писать в одном из следующих пунктов)
|
||||||
get_item_time(Item) ->
|
get_item_time(Item) ->
|
||||||
|
|
|
@ -0,0 +1,80 @@
|
||||||
|
-module(rss_queue). % 1.Создайте модуль с именем
|
||||||
|
|
||||||
|
-compile(export_all).
|
||||||
|
|
||||||
|
% 4 Создайте и экспортируйте вспомогательные функции для запуска нового серверного процесса, обслуживающего очередь
|
||||||
|
start() ->
|
||||||
|
Queue = [],
|
||||||
|
spawn(?MODULE, server, [Queue]).
|
||||||
|
|
||||||
|
%% @doc Функция для сравнения дат
|
||||||
|
date_comporator(A, B) ->
|
||||||
|
rss_parse:get_item_time(A) < rss_parse:get_item_time(B).
|
||||||
|
|
||||||
|
%% @doc Добавление RSS-элемента очередь -- процедуру определенно требуется разделить на несколько вспомогательных функций
|
||||||
|
push_item(RSSItem, Queue) ->
|
||||||
|
{State, FoundItem} = search_item(RSSItem, Queue), %3.1.2
|
||||||
|
case State of
|
||||||
|
same ->
|
||||||
|
Queue; % 3.1.4.1 мы просто игнорируем его.
|
||||||
|
updated ->
|
||||||
|
QueueUpdated = Queue--[FoundItem], % 3.1.5.1 старую версию удалить из очереди
|
||||||
|
lists:sort(fun date_comporator/2, QueueUpdated++[RSSItem]); % 3.1.5.2 прежде чем добавлять новую
|
||||||
|
different ->
|
||||||
|
lists:sort(fun date_comporator/2, Queue++[RSSItem])
|
||||||
|
end.
|
||||||
|
|
||||||
|
% 2. Модуль должен содержать функцию server, в которой реализован цикл сервера
|
||||||
|
server(Queue) -> % 2.1 Пока состояние очереди должно хранить только список элементов ленты
|
||||||
|
receive % 3. Функция server должна обрабатывать следующие сообщения
|
||||||
|
{add_item, RSSItem} -> % 3.1 Это наиболее сложная операция поддерживаемая очередью
|
||||||
|
UpdatedQueue = push_item(RSSItem, Queue), % 3.1.1 обновить список, включив в него новый элемент
|
||||||
|
server(UpdatedQueue);
|
||||||
|
{get_all, RegPid} -> % 3.2 Другой процесс может получить все содержимое очереди
|
||||||
|
RegPid ! {self(), Queue},
|
||||||
|
server(Queue)
|
||||||
|
end.
|
||||||
|
|
||||||
|
%% @doc Поиск элемента
|
||||||
|
search_item(RSSItem, Queue) ->
|
||||||
|
[Head | Tail] = Queue,
|
||||||
|
case rss_parse:compare_feed_items(RSSItem, Head) of % 3.1.3 помощью функции, из задания 3,
|
||||||
|
same -> {same, Head}; % 3.1.4 Если в очереди есть элемент same
|
||||||
|
updated -> {updated, Head}; % 3.1.5 Если в очереди есть элемент updated
|
||||||
|
different -> search_item(RSSItem, Tail) % 3.1.6 Если в очереди отсутствует такой же элемент
|
||||||
|
end.
|
||||||
|
|
||||||
|
%% @doc 5. Добавление элемента
|
||||||
|
add_item(QPid, Item)
|
||||||
|
when is_pid(QPid) ->
|
||||||
|
QPid ! {add_item, Item},
|
||||||
|
ok.
|
||||||
|
|
||||||
|
%% @doc 6. Добавление Фида (не сложно написать, с учетом ранее проделанной работы)
|
||||||
|
add_feed(QPid, RSS2Feed) ->
|
||||||
|
Items = rss_parse:get_feed_items(RSS2Feed),
|
||||||
|
lists:foreach(fun(Item) ->
|
||||||
|
add_item(QPid, Item)
|
||||||
|
end, Items),
|
||||||
|
ok.
|
||||||
|
|
||||||
|
|
||||||
|
%% @doc 7. Получения RSS
|
||||||
|
get_all(QPid) when is_pid(QPid) ->
|
||||||
|
QPid ! {get_all, self()},
|
||||||
|
receive
|
||||||
|
{QPid, List} ->
|
||||||
|
List
|
||||||
|
after 1000 ->
|
||||||
|
{error, timeout}
|
||||||
|
end.
|
||||||
|
|
||||||
|
%%% функция для тестирования
|
||||||
|
test() ->
|
||||||
|
PID = start(),
|
||||||
|
{XML, _} = xmerl_scan:file("digg-science-rss2.xml"),
|
||||||
|
{XMLOTHER, _} = xmerl_scan:file("digg-science-rss1.xml"),
|
||||||
|
add_feed(PID, XML),
|
||||||
|
add_feed(PID, XMLOTHER),
|
||||||
|
add_feed(PID, XML),
|
||||||
|
get_all(PID).
|
Loading…
Reference in New Issue