// YMarkImporter.java
// (C) 2012 by Stefan Foerster (apfelmaennchen), sof@gmx.de, Norderstedt, Germany
// first published 2012 on http://yacy.net
//
// This is a part of YaCy, a peer-to-peer based web search engine
//
// LICENSE
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
package net.yacy.data.ymark;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import net.yacy.cora.util.ConcurrentLog;
import net.yacy.search.Switchboard;
public abstract class YMarkImporter implements Runnable {
// Statics
public final static String XML_NAMESPACE_PREFIXES = "http://xml.org/sax/features/namespace-prefixes";
public final static String XML_NAMESPACES = "http://xml.org/sax/features/namespaces";
public final static String XML_VALIDATION = "http://xml.org/sax/features/validation";
protected String importer;
protected ArrayBlockingQueue<YMarkEntry> bookmarks;
protected final MonitoredReader bmk_file;
protected final String targetFolder;
protected final String sourceFolder;
public YMarkImporter(final MonitoredReader bmk_file, final int queueSize, final String sourceFolder, final String targetFolder) {
this.bookmarks = new ArrayBlockingQueue<YMarkEntry>(queueSize);
this.bmk_file = bmk_file;
this.sourceFolder = YMarkUtil.cleanFoldersString(sourceFolder);
this.targetFolder = YMarkUtil.cleanFoldersString(targetFolder);
}
@Override
public void run() {
try {
parse();
} catch (final Exception e) {
ConcurrentLog.logException(e);
} finally {
try {
ConcurrentLog.info(YMarkTables.BOOKMARKS_LOG, this.importer+" Importer inserted poison pill in queue");
this.bookmarks.put(YMarkEntry.POISON);
} catch (final InterruptedException e1) {
ConcurrentLog.logException(e1);
}
}
}
public YMarkEntry take() {
try {
return this.bookmarks.take();
} catch (final InterruptedException e) {
ConcurrentLog.logException(e);
return null;
}
}
public void setImporter(final String importer) {
this.importer = importer;
}
public long getProgress() {
return this.bmk_file.getProgress();
}
public long maxProgress() {
return this.bmk_file.maxProgress();
}
public abstract void parse() throws Exception;
public Consumer getConsumer(final Switchboard sb, final String bmk_user, final ArrayBlockingQueue<String> autoTaggingQueue,
final boolean autotag, final boolean empty, final String indexing, final boolean medialink) {
return new Consumer(sb, bmk_user, autoTaggingQueue, autotag, empty, indexing, medialink);
}
public class Consumer implements Runnable {
private final Switchboard sb;
private final String bmk_user;
private final ArrayBlockingQueue<String> autoTaggingQueue;
private final String indexing;
private final boolean autotag;
private final boolean empty;
private final boolean medialink;
public Consumer(final Switchboard sb, final String bmk_user, final ArrayBlockingQueue<String> autoTaggingQueue,
final boolean autotag, final boolean empty, final String indexing, final boolean medialink) {
this.sb = sb;
this.bmk_user = bmk_user;
this.autoTaggingQueue = autoTaggingQueue;
this.autotag = autotag;
this.empty = empty;
this.indexing = indexing;
this.medialink = medialink;
}
@Override
public void run() {
YMarkEntry bmk;
while ((bmk = take()) != YMarkEntry.POISON) {
try {
final String url = bmk.get(YMarkEntry.BOOKMARK.URL.key());
// other protocols could cause problems
if(url != null && url.startsWith("http")) {
this.sb.tables.bookmarks.addBookmark(this.bmk_user, bmk, true, true);
if(this.autotag) {
if(!this.empty) {
this.autoTaggingQueue.put(url);
} else if(!bmk.containsKey(YMarkEntry.BOOKMARK.TAGS.key()) || bmk.get(YMarkEntry.BOOKMARK.TAGS.key()).equals(YMarkEntry.BOOKMARK.TAGS.deflt())) {
this.autoTaggingQueue.put(url);
}
}
// fill crawler
if (this.indexing.equals("single")) {
bmk.crawl(YMarkCrawlStart.CRAWLSTART.SINGLE, this.medialink, this.sb);
} else if (this.indexing.equals("onelink")) {
bmk.crawl(YMarkCrawlStart.CRAWLSTART.ONE_LINK, this.medialink, this.sb);
} else if (this.indexing.equals("fulldomain")) {
bmk.crawl(YMarkCrawlStart.CRAWLSTART.FULL_DOMAIN, this.medialink, this.sb);
}
}
} catch (final IOException e) {
ConcurrentLog.logException(e);
} catch (final InterruptedException e) {
ConcurrentLog.logException(e);
}
}
if(this.autotag) {
try {
this.autoTaggingQueue.put(YMarkAutoTagger.POISON);
ConcurrentLog.info(YMarkTables.BOOKMARKS_LOG, YMarkImporter.this.importer+" inserted poison pill into autoTagging queue");
} catch (final InterruptedException e) {
ConcurrentLog.logException(e);
}
}
}
}
}