docs: @Override
      public JivePropertiesExtension parse(XmlPullParser parser,
                      int initialDepth, XmlEnvironment xmlEnvironment) throws XmlPullParserException,
                      IOException {
          Map<String, Object> properties = new HashMap<>();
          while (true) {
              int eventType = parser.next();
              if (eventType == XmlPullParser.START_TAG && parser.getName().equals("property")) {
                  // Parse a property
                  boolean done = false;
                  String name = null;
                  String type = null;
                  String valueText = null;
                  Object value = null;
                  while (!done) {
                      eventType = parser.next();
                      if (eventType == XmlPullParser.START_TAG) {
                          String elementName = parser.getName();
                          if (elementName.equals("name")) {
                              name = parser.nextText();
                          }
                          else if (elementName.equals("value")) {
                              type = parser.getAttributeValue("", "type");
                              valueText = parser.nextText();
                          }
                      }
                      else if (eventType == XmlPullParser.END_TAG) {
                          if (parser.getName().equals("property")) {
                              if ("integer".equals(type)) {
                                  value = Integer.valueOf(valueText);
                              }
                              else if ("long".equals(type))  {
                                  value = Long.valueOf(valueText);
                              }
                              else if ("float".equals(type)) {
                                  value = Float.valueOf(valueText);
                              }
                              else if ("double".equals(type)) {
                                  value = Double.valueOf(valueText);
                              }
                              else if ("boolean".equals(type)) {
                                  // CHECKSTYLE:OFF
                                  value = Boolean.valueOf(valueText);
                                  // CHECKSTYLE:ON
                              }
                              else if ("string".equals(type)) {
                                  value = valueText;
                              }
                              else if ("java-object".equals(type)) {
                                  if (JivePropertiesManager.isJavaObjectEnabled()) {
                                      try {
                                          byte[] bytes = Base64.decode(valueText);
                                          ObjectInputStream in = new ObjectInputStream(
                                                          new ByteArrayInputStream(bytes));
                                          value = in.readObject();
                                      }
                                      catch (Exception e) {
                                          LOGGER.log(Level.SEVERE, "Error parsing java object", e);
                                      }
                                  }
                                  else {
                                      LOGGER.severe("JavaObject is not enabled. Enable with JivePropertiesManager.setJavaObjectEnabled(true)");
                                  }
                              }
                              if (name != null && value != null) {
                                  properties.put(name, value);
                              }
                              done = true;
                          }
                      }
                  }
              }
              else if (eventType == XmlPullParser.END_TAG) {
                  if (parser.getName().equals(JivePropertiesExtension.ELEMENT)) {
                      break;
                  }
              }
          }
          return new JivePropertiesExtension(properties);
      }