com.rometools.modules.sse.SSE091Generator Maven / Gradle / Ivy
/*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package com.rometools.modules.sse;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import org.jdom2.Element;
import org.jdom2.Namespace;
import com.rometools.modules.sse.modules.Conflict;
import com.rometools.modules.sse.modules.Conflicts;
import com.rometools.modules.sse.modules.History;
import com.rometools.modules.sse.modules.Related;
import com.rometools.modules.sse.modules.SSEModule;
import com.rometools.modules.sse.modules.Sharing;
import com.rometools.modules.sse.modules.Sync;
import com.rometools.modules.sse.modules.Update;
import com.rometools.rome.feed.module.Module;
import com.rometools.rome.feed.rss.Item;
import com.rometools.rome.io.DelegatingModuleGenerator;
import com.rometools.rome.io.WireFeedGenerator;
import com.rometools.rome.io.impl.DateParser;
import com.rometools.rome.io.impl.RSS20Generator;
/**
* Generator for the SSE Module.
*
*
* @author Laird Dornin
*/
public class SSE091Generator implements DelegatingModuleGenerator {
private RSS20Generator parentGenerator;
public SSE091Generator() {
}
@Override
public void setFeedGenerator(final WireFeedGenerator feedGenerator) {
parentGenerator = (RSS20Generator) feedGenerator;
}
@Override
public String getNamespaceUri() {
return SSEModule.SSE_SCHEMA_URI;
}
/**
* Returns a set with all the URIs (JDOM Namespace elements) this module generator uses.
*
* It is used by the the feed generators to add their namespace definition in the root element
* of the generated document (forward-missing of Java 5.0 Generics).
*
*
* @return a set with all the URIs (JDOM Namespace elements) this module generator uses.
*/
@Override
public Set getNamespaces() {
return SSEModule.NAMESPACES;
}
@Override
public void generate(final Module module, final Element element) {
if (!(module instanceof SSEModule)) {
return;
}
final SSEModule sseModule = (SSEModule) module;
if (sseModule instanceof Sharing) {
final Sharing sharing = (Sharing) sseModule;
// add sse namespace
Element root = element;
while (root.getParent() != null && root.getParent() instanceof Element) {
root = (Element) root.getParent();
}
root.addNamespaceDeclaration(SSEModule.SSE_NS);
generateSharing(sharing, root);
} else if (sseModule instanceof Sync) {
generateSync((Sync) sseModule, element);
}
}
private void generateSharing(final Sharing sharing, final Element parent) {
// inject sse sharingModule element
final Element sharingElement = new Element(Sharing.NAME, SSEModule.SSE_NS);
generateAttribute(sharingElement, Sharing.UNTIL_ATTRIBUTE, sharing.getUntil());
generateAttribute(sharingElement, Sharing.SINCE_ATTRIBUTE, sharing.getSince());
generateAttribute(sharingElement, Sharing.ORDERED_ATTRIBUTE, sharing.getOrdered());
generateAttribute(sharingElement, Sharing.WINDOW_ATTRIBUTE, sharing.getWindow());
generateAttribute(sharingElement, Sharing.VERSION_ATTRIBUTE, sharing.getVersion());
// add sharing as the first element of the rss root
parent.addContent(0, sharingElement);
final Related related = sharing.getRelated();
if (related != null) {
generateRelated(related);
}
}
private void generateRelated(final Related related) {
final Element relatedElement = new Element(Related.NAME, SSEModule.SSE_NS);
generateAttribute(relatedElement, Related.SINCE_ATTRIBUTE, related.getSince());
generateAttribute(relatedElement, Related.UNTIL_ATTRIBUTE, related.getUntil());
generateAttribute(relatedElement, Related.LINK_ATTRIBUTE, related.getLink());
generateAttribute(relatedElement, Related.TITLE_ATTRIBUTE, related.getTitle());
generateAttribute(relatedElement, Related.TYPE_ATTRIBUTE, related.getType());
}
protected void generateSync(final Sync sync, final Element parent) {
final Element syncElement = new Element(Sync.NAME, SSEModule.SSE_NS);
generateAttribute(syncElement, Sync.DELETED_ATTRIBUTE, sync.isDeleted());
generateAttribute(syncElement, Sync.VERSION_ATTRIBUTE, sync.getVersion());
generateAttribute(syncElement, Sync.ID_ATTRIBUTE, sync.getId());
generateAttribute(syncElement, Sync.CONFLICT_ATTRIBUTE, sync.isConflict());
generateHistory(syncElement, sync.getHistory());
generateConflicts(syncElement, sync.getConflicts());
parent.addContent(syncElement);
}
private void generateConflicts(final Element syncElement, final List conflicts) {
if (conflicts != null) {
final Element conflictsElement = new Element(Conflicts.NAME, SSEModule.SSE_NS);
for (final Conflict conflict2 : conflicts) {
final Element conflictElement = new Element(Conflict.NAME, SSEModule.SSE_NS);
final Conflict conflict = conflict2;
generateAttribute(conflictElement, Conflict.BY_ATTRIBUTE, conflict.getBy());
generateAttribute(conflictElement, Conflict.VERSION_ATTRIBUTE, conflict.getVersion());
generateAttribute(conflictElement, Conflict.WHEN_ATTRIBUTE, conflict.getWhen());
generateItem(conflictElement, conflict.getItem());
conflictsElement.addContent(conflictElement);
}
syncElement.addContent(conflictsElement);
}
}
private void generateItem(final Element conflictElement, final Item item) {
if (item != null) {
final Element itemElement = new Element("item");
parentGenerator.populateItem(item, itemElement, 0);
parentGenerator.generateItemModules(item.getModules(), itemElement);
conflictElement.addContent(itemElement);
}
}
private void generateHistory(final Element syncElement, final History history) {
if (history != null) {
final Element historyElement = new Element(History.NAME, SSEModule.SSE_NS);
generateAttribute(historyElement, History.BY_ATTRIBUTE, history.getBy());
generateAttribute(historyElement, History.WHEN_ATTRIBUTE, history.getWhen());
generateUpdates(historyElement, history.getUpdates());
syncElement.addContent(historyElement);
}
}
private void generateUpdates(final Element historyElement, final List updates) {
if (updates != null) {
for (final Update update : updates) {
final Element updateElement = new Element(Update.NAME, SSEModule.SSE_NS);
generateAttribute(updateElement, Update.BY_ATTRIBUTE, update.getBy());
generateAttribute(updateElement, Update.WHEN_ATTRIBUTE, update.getWhen());
historyElement.addContent(updateElement);
}
}
}
private void generateAttribute(final Element syncElement, final String attrName, final Object attribute) {
if (attribute != null) {
syncElement.setAttribute(attrName, toString(attribute));
}
}
private String toString(final Object o) {
if (o != null) {
if (o instanceof Date) {
return DateParser.formatRFC822((Date) o, Locale.US);
} else {
return o.toString();
}
}
return "";
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy