/mail/src/main/java/org/jboss/as/mail/extension/MailSubsystemParser.java

https://github.com/tristantarrant/wildfly · Java · 236 lines · 179 code · 43 blank · 14 comment · 32 complexity · 5cfbfbd470557045906d425a713aeb41 MD5 · raw file

  1. package org.jboss.as.mail.extension;
  2. import org.jboss.as.controller.descriptions.ModelDescriptionConstants;
  3. import org.jboss.as.controller.parsing.ParseUtils;
  4. import org.jboss.as.controller.persistence.SubsystemMarshallingContext;
  5. import org.jboss.dmr.ModelNode;
  6. import org.jboss.dmr.Property;
  7. import org.jboss.logging.Logger;
  8. import org.jboss.staxmapper.XMLElementReader;
  9. import org.jboss.staxmapper.XMLElementWriter;
  10. import org.jboss.staxmapper.XMLExtendedStreamReader;
  11. import org.jboss.staxmapper.XMLExtendedStreamWriter;
  12. import javax.xml.stream.XMLStreamConstants;
  13. import javax.xml.stream.XMLStreamException;
  14. import java.util.LinkedList;
  15. import java.util.List;
  16. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.ADD;
  17. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP;
  18. import static org.jboss.as.controller.descriptions.ModelDescriptionConstants.OP_ADDR;
  19. import static org.jboss.as.controller.parsing.ParseUtils.unexpectedElement;
  20. /**
  21. * The subsystem parser, which uses stax to read and write to and from xml
  22. *
  23. * @author <a href="tomaz.cerar@gmail.com">Tomaz Cerar</a>
  24. */
  25. class MailSubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>, XMLElementWriter<SubsystemMarshallingContext> {
  26. private static final Logger log = Logger.getLogger(MailSubsystemParser.class);
  27. /**
  28. * {@inheritDoc}
  29. */
  30. public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {
  31. context.startSubsystemElement(Namespace.CURRENT.getUriString(), false);
  32. log.trace("model node: " + context.getModelNode());
  33. ModelNode model = context.getModelNode();
  34. List<Property> sessions = model.get(ModelKeys.MAIL_SESSION).asPropertyList();
  35. /*List<Property> props = mailSession.getValue().asPropertyList();
  36. log.info("properties: "+props);*/
  37. for (Property mailSession : sessions) {
  38. String jndi = mailSession.getName();
  39. log.debug("jndi: " + jndi);
  40. ModelNode sessionData = mailSession.getValue();
  41. writer.writeStartElement(Element.MAIL_SESSION.getLocalName());
  42. writer.writeAttribute(Attribute.JNDI_NAME.getLocalName(), jndi);
  43. if (sessionData.hasDefined(ModelKeys.DEBUG)) {
  44. writer.writeAttribute(Attribute.DEBUG.getLocalName(), sessionData.get(ModelKeys.DEBUG).asString());
  45. }
  46. if (sessionData.hasDefined(ModelKeys.SMTP_SERVER)) {
  47. writeServerModel(writer, sessionData, ModelKeys.SMTP_SERVER);
  48. }
  49. if (sessionData.hasDefined(ModelKeys.POP3_SERVER)) {
  50. writeServerModel(writer, sessionData, ModelKeys.POP3_SERVER);
  51. }
  52. if (sessionData.hasDefined(ModelKeys.IMAP_SERVER)) {
  53. writeServerModel(writer, sessionData, ModelKeys.IMAP_SERVER);
  54. }
  55. //writer.writeEndElement();
  56. writer.writeEndElement();
  57. }
  58. writer.writeEndElement();
  59. }
  60. private void writeServerModel(XMLExtendedStreamWriter writer, ModelNode sessionData, final String name) throws XMLStreamException {
  61. ModelNode server = sessionData.get(name);
  62. boolean credentials = server.hasDefined(ModelKeys.CREDENTIALS);
  63. if (credentials) {
  64. writer.writeStartElement(Element.forName(name).getLocalName());
  65. } else {
  66. writer.writeEmptyElement(Element.forName(name).getLocalName());
  67. }
  68. writer.writeAttribute(Attribute.SERVER_ADDRESS.getLocalName(), server.get(ModelKeys.SERVER_ADDRESS).asString());
  69. writer.writeAttribute(Attribute.SERVER_PORT.getLocalName(), server.get(ModelKeys.SERVER_PORT).asString());
  70. if (credentials) {
  71. writer.writeEmptyElement(Element.LOGIN.getLocalName());
  72. writer.writeAttribute(Attribute.USERNAME.getLocalName(), server.get(ModelKeys.CREDENTIALS).get(ModelKeys.USERNAME).asString());
  73. writer.writeAttribute(Attribute.PASSWORD.getLocalName(), server.get(ModelKeys.CREDENTIALS).get(ModelKeys.PASSWORD).asString());
  74. writer.writeEndElement();
  75. }
  76. }
  77. /**
  78. * {@inheritDoc}
  79. */
  80. public void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
  81. final ModelNode address = new ModelNode();
  82. address.add(ModelDescriptionConstants.SUBSYSTEM, MailExtension.SUBSYSTEM_NAME);
  83. address.protect();
  84. final ModelNode subsystem = new ModelNode();
  85. subsystem.get(OP).set(ADD);
  86. subsystem.get(OP_ADDR).set(address);
  87. list.add(subsystem);
  88. List<MailSessionConfig> sessionConfigList = new LinkedList<MailSessionConfig>();
  89. while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
  90. switch (Namespace.forUri(reader.getNamespaceURI())) {
  91. case MAIL_1_0: {
  92. final Element element = Element.forName(reader.getLocalName());
  93. switch (element) {
  94. case MAIL_SESSION: {
  95. sessionConfigList.add(parseMailSession(reader, list));
  96. break;
  97. }
  98. default: {
  99. reader.handleAny(list);
  100. break;
  101. }
  102. }
  103. break;
  104. }
  105. default: {
  106. throw unexpectedElement(reader);
  107. }
  108. }
  109. }
  110. for (MailSessionConfig c : sessionConfigList) {
  111. final ModelNode dsAddress = address.clone();
  112. dsAddress.add(ModelKeys.MAIL_SESSION, c.getJndiName());
  113. dsAddress.protect();
  114. final ModelNode operation = new ModelNode();
  115. operation.get(OP_ADDR).set(dsAddress);
  116. operation.get(OP).set(ADD);
  117. Util.fillFrom(operation, c);
  118. list.add(operation);
  119. }
  120. log.trace("parsing done, config is: " + sessionConfigList);
  121. log.trace("list is: " + list);
  122. }
  123. private MailSessionConfig parseMailSession(final XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
  124. log.debug("parsing mail session");
  125. MailSessionConfig cfg = new MailSessionConfig();
  126. for (int i = 0; i < reader.getAttributeCount(); i++) {
  127. Attribute attr = Attribute.forName(reader.getAttributeLocalName(i));
  128. String value = reader.getAttributeValue(i);
  129. if (attr == Attribute.JNDI_NAME) {
  130. String jndiName = value;
  131. log.trace("jndi name: " + jndiName);
  132. cfg.setJndiName(jndiName);
  133. }
  134. if (attr == Attribute.DEBUG) {
  135. boolean debug = Boolean.parseBoolean(value.trim());
  136. cfg.setDebug(debug);
  137. }
  138. }
  139. while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
  140. switch (Namespace.forUri(reader.getNamespaceURI())) {
  141. case MAIL_1_0: {
  142. final Element element = Element.forName(reader.getLocalName());
  143. switch (element) {
  144. case SMTP_SERVER: {
  145. cfg.setSmtpServer(parseServerConfig(reader));
  146. break;
  147. }
  148. case POP3_SERVER: {
  149. cfg.setPop3Server(parseServerConfig(reader));
  150. break;
  151. }
  152. case IMAP_SERVER: {
  153. cfg.setImapServer(parseServerConfig(reader));
  154. break;
  155. }
  156. default: {
  157. reader.handleAny(list);
  158. break;
  159. }
  160. }
  161. break;
  162. }
  163. default: {
  164. throw unexpectedElement(reader);
  165. }
  166. }
  167. }
  168. return cfg;
  169. }
  170. private MailSessionServer parseServerConfig(final XMLExtendedStreamReader reader) throws XMLStreamException {
  171. String[] attributes = ParseUtils.requireAttributes(reader, Attribute.SERVER_ADDRESS.getLocalName(), Attribute.SERVER_PORT.getLocalName());
  172. String username = null;
  173. String password = null;
  174. while (reader.hasNext() && reader.nextTag() != END_ELEMENT) {
  175. final Element element = Element.forName(reader.getLocalName());
  176. switch (element) {
  177. case LOGIN: {
  178. for (int i = 0; i < reader.getAttributeCount(); i++) {
  179. String att = reader.getAttributeLocalName(i);
  180. if (att.equals(Attribute.USERNAME.getLocalName())) {
  181. username = reader.getAttributeValue(i);
  182. } else if (att.equals(Attribute.PASSWORD.getLocalName())) {
  183. password = reader.getAttributeValue(i);
  184. }
  185. }
  186. ParseUtils.requireNoContent(reader);
  187. break;
  188. }
  189. }
  190. }
  191. return new MailSessionServer(attributes[0], Integer.parseInt(attributes[1]), username, password);
  192. }
  193. }