package ecologylab.serialization.deserializers.pullhandlers.stringformats; import java.io.File; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Collection; import ecologylab.net.ParsedURL; import ecologylab.serialization.ClassDescriptor; import ecologylab.serialization.FieldDescriptor; import ecologylab.serialization.FieldType; import ecologylab.serialization.SIMPLTranslationException; import ecologylab.serialization.ScalarUnmarshallingContext; import ecologylab.serialization.SimplTypesScope; import ecologylab.serialization.TranslationContext; import ecologylab.serialization.deserializers.parsers.bibtex.BibTeXEvents; public class BibTeXPullDeserializer extends StringPullDeserializer implements BibTeXEvents, ScalarUnmarshallingContext { ParsedURL purlContext; File fileContext; Object root = null; String currentTag; FieldDescriptor currentFD; public BibTeXPullDeserializer(SimplTypesScope tscope) { this(tscope, null); } public BibTeXPullDeserializer(SimplTypesScope tscope, TranslationContext tcontext) { super(tscope, tcontext); } @Override public void startBibTeX() { // System.out.println("started:"); root = null; } @Override public void startEntity(String typeName) { // System.out.println("entity: " + typeName); if (root == null && typeName != null) { ClassDescriptor rootClassD = translationScope.getClassDescriptorByBibTeXType(typeName.toLowerCase()); if (rootClassD != null) { try { root = rootClassD.getInstance(); } catch (SIMPLTranslationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } else { warning("no ClassDescriptor found for bibTeX type " + typeName); } } } @Override public void key(String key) { // System.out.println("key: " + key); if (root != null) { FieldDescriptor keyFD = ClassDescriptor.getClassDescriptor(root) .getFieldDescriptorForBibTeXKey(); if (keyFD != null) { keyFD.setFieldToScalar(root, key, this); } } } @Override public void startTag(String tagName) { // System.out.println("tag: " + tagName); if (root != null && tagName != null) { currentTag = tagName.toLowerCase(); currentFD = ClassDescriptor.getClassDescriptor(root).getFieldDescriptorByBibTeXTag(tagName); if (currentFD == null) { warning("ignoring bibTeX tag: " + tagName); } } } @Override public void endTag() { // System.out.println("endtag;"); currentFD = null; currentTag = null; } @Override public void value(String value) { // System.out.println("value: " + value); if (currentFD != null && root != null) { FieldType type = currentFD.getType(); switch (type) { case SCALAR: currentFD.setFieldToScalar(root, value, this); break; case COLLECTION_SCALAR: Collection collection = (Collection) currentFD.automaticLazyGetCollectionOrMap(root); if ("author".equals(currentTag)) { String[] authorNames = value.split("and"); for (String authorName : authorNames) { collection.add(authorName.trim()); } } else { String[] items = value.split(translationContext.getDelimiter()); for (String item : items) { collection.add(item); } } break; } } } @Override public void endEntity() { // System.out.println("endentity;"); root = null; } @Override public void endBibTeX() { // System.out.println("end."); } @Override public Object getBibTeXObject() { return root; } @Override public ParsedURL purlContext() { return purlContext; } @Override public File fileContext() { if (fileContext != null) return fileContext; ParsedURL purlContext = purlContext(); if (purlContext != null) { return purlContext.file(); } return null; } @Override public Object parse(CharSequence charSequence) throws SIMPLTranslationException { // TODO Auto-generated method stub return null; } @Override public Object parse(InputStream inputStream) throws SIMPLTranslationException { // TODO Auto-generated method stub return null; } @Override public Object parse(InputStream inputStream, Charset charSet) throws SIMPLTranslationException { // TODO Auto-generated method stub return null; } }