package org.tizzit.plugins.server.transformer; import java.util.Date; import java.util.Stack; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.tizzit.util.xml.SAXHelper; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import de.juwimm.cms.beans.WebServiceSpring; import de.juwimm.cms.components.vo.AddressValue; import de.juwimm.cms.components.vo.PersonValue; import de.juwimm.cms.components.vo.TalktimeValue; import de.juwimm.cms.plugins.server.Request; import de.juwimm.cms.plugins.server.Response; import de.juwimm.cms.vo.UnitValue; import de.juwimm.cms.vo.ViewComponentValue; /** * <p> * <b>Namespace: <code>http://plugins.tizzit.org/AggregationTransformerPlugin</code></b> * </p> * * @author <a href="mailto:rene.hertzfeldt@juwimm.com">Rene Hertzfeldt</a> * company Juwi MacMillan Group GmbH, Walsrode, Germany * @version $Id: AggregationTransformerPlugin.java 759 2010-05-05 13:34:28Z rene.hertzfeldt $ */ public class AggregationTransformerPlugin implements ManagedTizzitPlugin { private static final Log log = LogFactory.getLog(AggregationTransformerPlugin.class); private ContentHandler parent; private Integer viewComponentId = null; private WebServiceSpring webSpringBean = null; private ContentHandler manager; private String nameSpace; private final Stack<Object> lastOpenedObject = new Stack<Object>(); private boolean hasValue = false; public void setup(ContentHandler pluginManager, String nameSpace, WebServiceSpring wss, ViewComponentValue viewComponent, boolean liveServer) { this.manager = pluginManager; this.nameSpace = nameSpace; this.webSpringBean = wss; } /* (non-Javadoc) * @see de.juwimm.cms.plugins.server.ConquestPlugin#configurePlugin(de.juwimm.cms.plugins.server.Request, de.juwimm.cms.plugins.server.Response, org.xml.sax.ContentHandler, java.lang.Integer) */ public void configurePlugin(Request req, Response resp, ContentHandler ch, Integer uniquePageId) { if (log.isDebugEnabled()) log.debug("configurePlugin() -> begin"); this.parent = ch; viewComponentId = uniquePageId; if (log.isDebugEnabled()) log.debug("configurePlugin() -> end"); } /* (non-Javadoc) * @see de.juwimm.cms.plugins.server.ConquestPlugin#getLastModifiedDate() */ public Date getLastModifiedDate() { return new Date(); } /* (non-Javadoc) * @see de.juwimm.cms.plugins.server.ConquestPlugin#isCacheable() */ public boolean isCacheable() { return false; } /* (non-Javadoc) * @see de.juwimm.cms.plugins.server.ConquestPlugin#processContent() */ public void processContent() { if (log.isDebugEnabled()) log.debug("processContent() -> begin"); if (log.isDebugEnabled()) log.debug("processContent() -> end"); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startElement(java.lang.String, java.lang.String, java.lang.String, org.xml.sax.Attributes) */ public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException { if (log.isDebugEnabled()) log.debug("startElement: " + localName + " in nameSpace: " + uri + " found " + attrs.getLength() + " attributes"); AttributesImpl newAttrs = null; if (localName.equalsIgnoreCase("include")) { try { Object o = null; try { if (attrs.getValue("type").compareTo("unit") == 0) { o = webSpringBean.getUnit(Integer.decode(attrs.getValue("id"))); } else if (attrs.getValue("type").compareTo("person") == 0) { o = webSpringBean.getPerson(Long.decode(attrs.getValue("id"))); try { newAttrs = new AttributesImpl(attrs); SAXHelper.setSAXAttr(newAttrs, "sortOrder", "" + ((PersonValue) o).getPosition()); } catch (Exception e) { log.warn("Error getting sortOrder for person ", e); } } else if (attrs.getValue("type").compareTo("talktime") == 0) { o = webSpringBean.getTalktime(Long.decode(attrs.getValue("id"))); } else if (attrs.getValue("type").compareTo("department") == 0) { o = webSpringBean.getDepartment(Long.decode(attrs.getValue("id"))); } else if (attrs.getValue("type").compareTo("address") == 0) { o = webSpringBean.getAddress(Long.decode(attrs.getValue("id"))); } } catch (Exception e) { if (log.isInfoEnabled()) log.info("could not load: " + attrs.getValue("type") + " with id: " + attrs.getValue("id")); parent.startElement(uri, localName, qName, attrs); } if (o != null) { lastOpenedObject.push(o); } } catch (Exception e) { log.warn("Error while creating start element", e); } } else { parent.startElement(uri, localName, qName, attrs); } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#characters(char[], int, int) */ public void characters(char[] ch, int start, int length) throws SAXException { if (log.isDebugEnabled()) log.debug("characters: " + length + " long"); if (!(new String(ch, start, length).trim().isEmpty())) { hasValue = true; } parent.characters(ch, start, length); } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endElement(java.lang.String, java.lang.String, java.lang.String) */ public void endElement(String uri, String localName, String qName) throws SAXException { if (log.isDebugEnabled()) log.debug("endElement: " + localName + " in nameSpace: " + uri); if (!lastOpenedObject.isEmpty()) { if (!hasValue) { Object o = lastOpenedObject.pop(); if (o instanceof AddressValue) { fillAddress((AddressValue) o, localName); } else if (o instanceof PersonValue) { fillPerson((PersonValue) o, localName); } else if (o instanceof UnitValue) { fillUnit((UnitValue) o, localName); } else if (o instanceof TalktimeValue) { fillTalktime((TalktimeValue) o, localName); } } else { lastOpenedObject.pop(); } } if (!localName.equalsIgnoreCase("include")) { parent.endElement(uri, localName, qName); } } private void fillPerson(PersonValue value, String name) { char[] ch = null; try { if (name.equalsIgnoreCase("firstname")) { ch = value.getFirstname().toCharArray(); } else if (name.equalsIgnoreCase("lastname")) { ch = value.getLastname().toCharArray(); } else if (name.equalsIgnoreCase("birthDay")) { ch = value.getBirthDay().toCharArray(); } else if (name.equalsIgnoreCase("salutation")) { ch = value.getSalutation().toCharArray(); } else if (name.equalsIgnoreCase("title")) { ch = value.getTitle().toCharArray(); } else if (name.equalsIgnoreCase("job")) { ch = value.getJob().toCharArray(); } else if (name.equalsIgnoreCase("jobTitle")) { ch = value.getJobTitle().toCharArray(); } else if (name.equalsIgnoreCase("medicalAssociation")) { ch = value.getMedicalAssociation().toCharArray(); } else if (name.equalsIgnoreCase("linkMedicalAssociation")) { ch = value.getLinkMedicalAssociation().toCharArray(); } else if (name.equalsIgnoreCase("countryJob")) { ch = value.getCountryJob().toCharArray(); } else if (name.equalsIgnoreCase("image")) { ch = value.getImageId().toString().toCharArray(); } else if (name.equalsIgnoreCase("sex")) { ch = Byte.toString(value.getSex()).toCharArray(); } characters(ch, 0, ch.length); } catch (Exception e) { log.warn("Error while filling xml with values from Person: " + value.getPersonId() + " - valueName: " + name, e); } } private void fillAddress(AddressValue value, String name) { char[] ch = null; try { if (name.equalsIgnoreCase("roomNr")) { ch = value.getRoomNr().toCharArray(); } else if (name.equalsIgnoreCase("buildingLevel")) { ch = value.getBuildingLevel().toCharArray(); } else if (name.equalsIgnoreCase("buildingNr")) { ch = value.getBuildingNr().toCharArray(); } else if (name.equalsIgnoreCase("street")) { ch = value.getStreet().toCharArray(); } else if (name.equalsIgnoreCase("streetNr")) { ch = value.getStreetNr().toCharArray(); } else if (name.equalsIgnoreCase("zipcode")) { ch = value.getZipCode().toCharArray(); } else if (name.equalsIgnoreCase("country")) { ch = value.getCountry().toCharArray(); } else if (name.equalsIgnoreCase("countryCode")) { ch = value.getCountryCode().toCharArray(); } else if (name.equalsIgnoreCase("city")) { ch = value.getCity().toCharArray(); } else if (name.equalsIgnoreCase("postOfficeBox")) { ch = value.getPostOfficeBox().toCharArray(); } else if (name.equalsIgnoreCase("phone1")) { ch = value.getPhone1().toCharArray(); } else if (name.equalsIgnoreCase("phone2")) { ch = value.getPhone2().toCharArray(); } else if (name.equalsIgnoreCase("fax")) { ch = value.getFax().toCharArray(); } else if (name.equalsIgnoreCase("homepage")) { ch = value.getHomepage().toCharArray(); } else if (name.equalsIgnoreCase("misc")) { ch = value.getMisc().toCharArray(); } else if (name.equalsIgnoreCase("mobilePhone")) { ch = value.getMobilePhone().toCharArray(); } else if (name.equalsIgnoreCase("email")) { ch = value.getEmail().toCharArray(); } characters(ch, 0, ch.length); } catch (Exception e) { log.warn("Error while filling xml with values from Address: " + value.getAddressId() + " - valueName: " + name, e); } } private void fillTalktime(TalktimeValue value, String name) { char[] ch = null; try { if (name.equalsIgnoreCase("talkTimeType")) { ch = value.getTalkTimeType().toCharArray(); } else if (name.equalsIgnoreCase("talkTimes")) { ch = value.getTalkTimes().toCharArray(); } characters(ch, 0, ch.length); } catch (Exception e) { log.warn("Error while filling xml with values from TalkTime: " + value.getTalkTimeId() + " - valueName: " + name, e); } } private void fillUnit(UnitValue value, String name) { char[] ch = null; try { if (name.equalsIgnoreCase("name")) { ch = value.getName().toCharArray(); } if (ch != null) characters(ch, 0, ch.length); } catch (Exception e) { log.warn("Error while filling xml with values from Unit: " + value.getUnitId() + " - valueName: " + name, e); } } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endDocument() */ public void endDocument() throws SAXException { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#endPrefixMapping(java.lang.String) */ public void endPrefixMapping(String prefix) throws SAXException { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#ignorableWhitespace(char[], int, int) */ public void ignorableWhitespace(char[] ch, int start, int length) throws SAXException { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#processingInstruction(java.lang.String, java.lang.String) */ public void processingInstruction(String target, String data) throws SAXException { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#setDocumentLocator(org.xml.sax.Locator) */ public void setDocumentLocator(Locator locator) { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#skippedEntity(java.lang.String) */ public void skippedEntity(String name) throws SAXException { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startDocument() */ public void startDocument() throws SAXException { // do nothing } /* (non-Javadoc) * @see org.xml.sax.ContentHandler#startPrefixMapping(java.lang.String, java.lang.String) */ public void startPrefixMapping(String prefix, String uri) throws SAXException { // do nothing } }