/*
* Created on April 01, 2007
* Updated on May 03, 2007
* */
package net.sf.jabref.msbib;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import net.sf.jabref.BibtexDatabase;
import net.sf.jabref.BibtexEntry;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
/**
* @author S M Mahbub Murshed
* @email udvranto@yahoo.com
*
* @version 2.0.0
* @see http://mahbub.wordpress.com/2007/03/24/details-of-microsoft-office-2007-bibliographic-format-compared-to-bibtex/
* @see http://mahbub.wordpress.com/2007/03/22/deciphering-microsoft-office-2007-bibliography-format/
*
* Date: May 15, 2007; May 03, 2007
*
* History:
* May 03, 2007 - Added suport for export
* May 15, 2007 - Added suport for import
*/
public class MSBibDatabase {
protected Set<MSBibEntry> entries;
public MSBibDatabase() {
// maybe make this sorted later...
entries = new HashSet<MSBibEntry>();
}
public MSBibDatabase(InputStream stream) throws IOException {
importEntries(stream);
}
public MSBibDatabase(BibtexDatabase bibtex) {
Set<String> keySet = bibtex.getKeySet();
addEntries(bibtex, keySet);
}
public MSBibDatabase(BibtexDatabase bibtex, Set<String> keySet) {
if (keySet == null)
keySet = bibtex.getKeySet();
addEntries(bibtex, keySet);
}
public List<BibtexEntry> importEntries(InputStream stream) throws IOException {
entries = new HashSet<MSBibEntry>();
ArrayList<BibtexEntry> bibitems = new ArrayList<BibtexEntry>();
Document docin = null;
try {
DocumentBuilder dbuild = DocumentBuilderFactory.
newInstance().
newDocumentBuilder();
docin = dbuild.parse(stream);
} catch (Exception e) {
System.out.println("Exception caught..." + e);
e.printStackTrace();
}
String bcol = "b:";
NodeList rootLst = docin.getElementsByTagName("b:Sources");
if(rootLst.getLength()==0) {
rootLst = docin.getElementsByTagName("Sources");
bcol = "";
}
if(rootLst.getLength()==0)
return bibitems;
// if(docin!= null && docin.getDocumentElement().getTagName().contains("Sources") == false)
// return bibitems;
NodeList sourceList = ((Element)(rootLst.item(0))).getElementsByTagName(bcol+"Source");
for(int i=0; i<sourceList.getLength(); i++) {
MSBibEntry entry = new MSBibEntry((Element)sourceList.item(i),bcol);
entries.add(entry);
bibitems.add(entry.getBibtexRepresentation());
}
return bibitems;
}
private void addEntries(BibtexDatabase database, Set<String> keySet) {
entries = new HashSet<MSBibEntry>();
for (String s : keySet){
BibtexEntry entry = database.getEntryById(s);
MSBibEntry newMods = new MSBibEntry(entry);
entries.add(newMods);
}
}
public Document getDOMrepresentation() {
Document result = null;
try {
DocumentBuilder dbuild = DocumentBuilderFactory.
newInstance().
newDocumentBuilder();
result = dbuild.newDocument();
Element msbibCollection = result.createElement("b:Sources");
msbibCollection.setAttribute("SelectedStyle","");
msbibCollection.setAttribute("xmlns", "http://schemas.openxmlformats.org/officeDocument/2006/bibliography");
msbibCollection.setAttribute("xmlns:b", "http://schemas.openxmlformats.org/officeDocument/2006/bibliography");
for(Iterator<MSBibEntry> iter = entries.iterator(); iter.hasNext(); ) {
MSBibEntry entry = iter.next();
Node node = entry.getDOMrepresentation(result);
msbibCollection.appendChild(node);
}
result.appendChild(msbibCollection);
}
catch (Exception e)
{
System.out.println("Exception caught..." + e);
e.printStackTrace();
}
return result;
}
}