package org.atomnuke.atom.io.reader.sax;
import org.atomnuke.atom.model.builder.AuthorBuilder;
import org.atomnuke.atom.model.builder.CategoryBuilder;
import org.atomnuke.atom.model.builder.ContentBuilder;
import org.atomnuke.atom.model.builder.ContributorBuilder;
import org.atomnuke.atom.model.builder.EntryBuilder;
import org.atomnuke.atom.model.builder.FeedBuilder;
import org.atomnuke.atom.model.builder.LinkBuilder;
import org.atomnuke.atom.model.builder.SourceBuilder;
import org.atomnuke.atom.model.builder.IdBuilder;
import org.atomnuke.atom.model.builder.PublishedBuilder;
import org.atomnuke.atom.model.builder.RightsBuilder;
import org.atomnuke.atom.model.builder.SummaryBuilder;
import org.atomnuke.atom.model.builder.TitleBuilder;
import org.atomnuke.atom.model.builder.UpdatedBuilder;
import org.atomnuke.atom.xml.AtomElement;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
/**
*
* @author zinic
*/
public class EntryHandler extends AtomHandler {
public EntryHandler(AtomHandler delegate) {
super(delegate);
}
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
final AtomElement currentElement = AtomElement.find(localName, AtomElement.ENTRY_ELEMENTS);
if (currentElement == null) {
// TODO:Implement - Error case. Unknown element...
return;
}
switch (currentElement) {
case SOURCE:
startSource(this, contextManager, attributes);
break;
case AUTHOR:
startPersonConstruct(new AuthorBuilder(), contextManager, currentElement, attributes);
break;
case CONTRIBUTOR:
startPersonConstruct(new ContributorBuilder(), contextManager, currentElement, attributes);
break;
case CONTENT:
startContent(this, contextManager, currentElement, attributes);
break;
case CATEGORY:
startCategory(contextManager, attributes);
break;
case LINK:
startLink(contextManager, attributes);
break;
case ID:
startSimpleContentElement(new IdBuilder(), contextManager, currentElement, attributes);
break;
case NAME:
case EMAIL:
case URI:
startFieldContentElement(contextManager, currentElement);
break;
case PUBLISHED:
startDateConstruct(new PublishedBuilder(), contextManager, currentElement, attributes);
break;
case UPDATED:
startDateConstruct(new UpdatedBuilder(), contextManager, currentElement, attributes);
break;
case RIGHTS:
startTypedContent(new RightsBuilder(), this, contextManager, currentElement, attributes);
break;
case TITLE:
startTypedContent(new TitleBuilder(), this, contextManager, currentElement, attributes);
break;
case SUMMARY:
startTypedContent(new SummaryBuilder(), this, contextManager, currentElement, attributes);
break;
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
final AtomElement currentElement = contextManager.peek().getElementDef();
if (!currentElement.elementName().equals(localName)) {
return;
}
switch (currentElement) {
case ENTRY:
endEntry(this, contextManager, result);
break;
case AUTHOR:
endAuthor(contextManager);
break;
case CONTRIBUTOR:
endContributor(contextManager);
break;
case PUBLISHED:
endPublished(contextManager);
break;
case UPDATED:
endUpdated(contextManager);
break;
case CONTENT:
endContent(contextManager);
break;
case LINK:
endLink(contextManager);
break;
case CATEGORY:
endCategory(contextManager);
break;
case ID:
endId(contextManager);
break;
case RIGHTS:
endRights(contextManager);
break;
case TITLE:
endTitle(contextManager);
break;
case SUMMARY:
endSummary(contextManager);
break;
case NAME:
case URI:
case EMAIL:
contextManager.pop();
break;
}
}
private static void startSource(EntryHandler self, DocumentContextManager contextManager, Attributes attributes) {
final SourceBuilder sourceBuilder = new SourceBuilder();
sourceBuilder.setBase(toUri(attributes.getValue("base")));
sourceBuilder.setLang(attributes.getValue("lang"));
contextManager.push(AtomElement.SOURCE, sourceBuilder);
self.delegateTo(new SourceHandler(self));
}
private static void startContent(EntryHandler self, DocumentContextManager contextManager, AtomElement element, Attributes attributes) {
final ContentBuilder contentBuilder = new ContentBuilder();
contentBuilder.setBase(toUri(attributes.getValue("base")));
contentBuilder.setLang(attributes.getValue("lang"));
contentBuilder.setType(attributes.getValue("type"));
contentBuilder.setSrc(attributes.getValue("src"));
contextManager.push(element, contentBuilder);
self.delegateTo(new MixedContentHandler(contentBuilder, self));
}
private static void endEntry(EntryHandler self, DocumentContextManager contextManager, SaxAtomReaderResult result) {
final HandlerContext<EntryBuilder> entryContext = contextManager.pop(EntryBuilder.class);
if (contextManager.hasContext()) {
final HandlerContext<FeedBuilder> feedBuilderContext = contextManager.peek(FeedBuilder.class);
feedBuilderContext.builder().addEntry(entryContext.builder().build());
} else {
result.setEntryResult(entryContext.builder().build());
}
self.releaseToParent();
}
private static void endAuthor(DocumentContextManager contextManager) {
final HandlerContext<AuthorBuilder> authorContext = contextManager.pop(AuthorBuilder.class);
contextManager.peek(EntryBuilder.class).builder().addAuthor(authorContext.builder().build());
}
private static void endContributor(DocumentContextManager contextManager) {
final HandlerContext<ContributorBuilder> contributorContext = contextManager.pop(ContributorBuilder.class);
contextManager.peek(EntryBuilder.class).builder().addContributor(contributorContext.builder().build());
}
private static void endId(DocumentContextManager contextManager) {
final HandlerContext<IdBuilder> idContext = contextManager.pop(IdBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setId(idContext.builder().build());
}
private static void endUpdated(DocumentContextManager contextManager) {
final HandlerContext<UpdatedBuilder> updatedContext = contextManager.pop(UpdatedBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setUpdated(updatedContext.builder().build());
}
private static void endPublished(DocumentContextManager contextManager) {
final HandlerContext<PublishedBuilder> publishedContext = contextManager.pop(PublishedBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setPublished(publishedContext.builder().build());
}
private static void endContent(DocumentContextManager contextManager) {
final HandlerContext<ContentBuilder> content = contextManager.pop(ContentBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setContent(content.builder().build());
}
private static void endCategory(DocumentContextManager contextManager) {
final HandlerContext<CategoryBuilder> category = contextManager.pop(CategoryBuilder.class);
contextManager.peek(EntryBuilder.class).builder().addCategory(category.builder().build());
}
private static void endLink(DocumentContextManager contextManager) {
final HandlerContext<LinkBuilder> category = contextManager.pop(LinkBuilder.class);
contextManager.peek(EntryBuilder.class).builder().addLink(category.builder().build());
}
private static void endRights(DocumentContextManager contextManager) {
final HandlerContext<RightsBuilder> textConstructContext = contextManager.pop(RightsBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setRights(textConstructContext.builder().build());
}
private static void endSummary(DocumentContextManager contextManager) {
final HandlerContext<SummaryBuilder> textConstructContext = contextManager.pop(SummaryBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setSummary(textConstructContext.builder().build());
}
private static void endTitle(DocumentContextManager contextManager) {
final HandlerContext<TitleBuilder> textConstructContext = contextManager.pop(TitleBuilder.class);
contextManager.peek(EntryBuilder.class).builder().setTitle(textConstructContext.builder().build());
}
}