// YMarkDMOZImporter.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
//
// $LastChangedDate$
// $LastChangedRevision$
// $LastChangedBy$
//
// 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 net.yacy.cora.lod.vocabulary.DMOZ;
import net.yacy.cora.lod.vocabulary.DublinCore;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;
public class YMarkDMOZImporter extends YMarkImporter {
// Statics
public static String IMPORTER = "DMOZ";
// Importer Variables
private final XMLReader xmlReader;
private int depth;
public YMarkDMOZImporter(final MonitoredReader dmoz_file, final int queueSize, final String targetFolder, final String sourceFolder) throws SAXException {
super(dmoz_file, queueSize, sourceFolder, targetFolder);
setImporter(IMPORTER);
this.xmlReader = XMLReaderFactory.createXMLReader();
this.xmlReader.setFeature(XML_NAMESPACE_PREFIXES, false);
this.xmlReader.setFeature(XML_NAMESPACES, false);
this.xmlReader.setFeature(XML_VALIDATION, false);
this.xmlReader.setContentHandler(new DMOZParser());
this.depth = Integer.MAX_VALUE;
}
@Override
public void parse() throws Exception {
xmlReader.parse(new InputSource(bmk_file));
}
public void setDepth(int d) {
this.depth = d + YMarkUtil.FOLDERS_SEPARATOR_PATTERN.split(this.targetFolder).length-1;
}
public class DMOZParser extends DefaultHandler {
private YMarkEntry bmk;
private boolean isNewEntry;
private boolean isSubtopic;
private String tag;
private final StringBuilder buffer;
public DMOZParser() {
this.bmk = new YMarkEntry();
this.isNewEntry = false;
this.isSubtopic = false;
this.buffer = new StringBuilder(512);
}
@Override
public void startElement(final String uri, String localName, final String qName, final Attributes attributes) throws SAXException {
// get rid of namespace prefixes
if (localName.isEmpty()) {
localName = qName.substring(qName.indexOf(':')+1);
}
this.tag = null;
if (localName.equals(DMOZ.ExternalPage.name())) {
this.bmk = new YMarkEntry();
this.bmk.put(YMarkEntry.BOOKMARK.URL.key(), attributes.getValue(0));
this.isNewEntry = true;
}
if(isNewEntry && localName.equals(DublinCore.Title.name())) {
this.tag = YMarkEntry.BOOKMARK.TITLE.key();
}
if(isNewEntry && localName.equals(DublinCore.Description.name())) {
this.tag = YMarkEntry.BOOKMARK.DESC.key();
}
if(isNewEntry && localName.equals(DMOZ.topic.name())) {
this.tag = YMarkEntry.BOOKMARK.FOLDERS.key();
buffer.append(targetFolder);
buffer.append(YMarkUtil.FOLDERS_SEPARATOR);
}
}
@Override
public void endElement(final String uri, String localName, final String qName) throws SAXException {
// get rid of namespace prefixes
if (localName.isEmpty()) {
localName = qName.substring(qName.indexOf(':')+1);
}
if (this.isNewEntry && this.isSubtopic && localName.equals(DMOZ.ExternalPage.name())) {
try {
bookmarks.put(this.bmk);
} catch (final InterruptedException e) {
e.printStackTrace();
} finally {
this.isSubtopic = false;
this.isNewEntry = false;
}
} else if(localName.equals(DMOZ.topic.name())) {
int d = 0;
for(int i=0; i<this.buffer.length(); i++) {
if (this.buffer.charAt(i) == '/') {
d++;
if (d > depth) {
this.buffer.setLength(i);
break;
}
}
}
if (this.buffer.substring(targetFolder.length()+1).startsWith(sourceFolder)) {
this.isSubtopic = true;
this.bmk.put(this.tag, YMarkUtil.cleanFoldersString(buffer));
} else {
this.isSubtopic = false;
this.isNewEntry = false;
}
} else if (this.tag != null) {
this.bmk.put(this.tag, buffer.toString());
}
this.tag = null;
this.buffer.setLength(0);
}
@Override
public void characters(final char ch[], final int start, final int length) throws SAXException {
// no processing here, as the SAX Parser characters method could be called more than once per tag!
if(this.tag != null) {
buffer.append(ch, start, length);
}
}
}
}