XmlEnvironment.java

  1. /**
  2.  *
  3.  * Copyright 2019-2021 Florian Schmaus
  4.  *
  5.  * Licensed under the Apache License, Version 2.0 (the "License");
  6.  * you may not use this file except in compliance with the License.
  7.  * You may obtain a copy of the License at
  8.  *
  9.  *     http://www.apache.org/licenses/LICENSE-2.0
  10.  *
  11.  * Unless required by applicable law or agreed to in writing, software
  12.  * distributed under the License is distributed on an "AS IS" BASIS,
  13.  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14.  * See the License for the specific language governing permissions and
  15.  * limitations under the License.
  16.  */
  17. package org.jivesoftware.smack.packet;

  18. import org.jivesoftware.smack.util.ParserUtils;
  19. import org.jivesoftware.smack.util.StringUtils;
  20. import org.jivesoftware.smack.xml.XmlPullParser;

  21. public class XmlEnvironment {

  22.     public static final XmlEnvironment EMPTY = new XmlEnvironment((String) null);

  23.     private final String namespace;
  24.     private final String language;
  25.     private final XmlEnvironment next;

  26.     private transient boolean effectiveNamespaceDetermined;
  27.     private transient boolean effectiveLanguageDetermined;
  28.     private transient String effectiveNamespace;
  29.     private transient String effectiveLanguage;

  30.     public XmlEnvironment(String namespace) {
  31.         this(namespace, null);
  32.     }

  33.     public XmlEnvironment(String namespace, String language) {
  34.         this(namespace, language, null);
  35.     }

  36.     private XmlEnvironment(Builder builder) {
  37.         this(builder.namespace, builder.language, builder.next);
  38.     }

  39.     public XmlEnvironment(String namespace, String language, XmlEnvironment next) {
  40.         this.namespace = namespace;
  41.         this.language = language;
  42.         this.next = next;
  43.     }

  44.     public String getNamespace() {
  45.         return namespace;
  46.     }

  47.     public String getEffectiveNamespace() {
  48.         if (effectiveNamespaceDetermined) {
  49.             return effectiveNamespace;
  50.         }

  51.         if (StringUtils.isNotEmpty(namespace)) {
  52.             effectiveNamespace = namespace;
  53.         } else if (next != null) {
  54.             effectiveNamespace = next.getEffectiveNamespace();
  55.         }

  56.         effectiveNamespaceDetermined = true;
  57.         return effectiveNamespace;
  58.     }

  59.     public String getEffectiveNamespaceOrUse(String namespace) {
  60.         String effectiveNamespace = getEffectiveNamespace();
  61.         if (StringUtils.isNullOrEmpty(effectiveNamespace)) {
  62.             return namespace;
  63.         }
  64.         return effectiveNamespace;
  65.     }

  66.     public boolean effectiveNamespaceEquals(String namespace) {
  67.         String effectiveNamespace = getEffectiveNamespace();
  68.         if (effectiveNamespace == null) {
  69.             return false;
  70.         }
  71.         return effectiveNamespace.equals(namespace);
  72.     }

  73.     public String getLanguage() {
  74.         return language;
  75.     }

  76.     public String getEffectiveLanguage() {
  77.         if (effectiveLanguageDetermined) {
  78.             return effectiveLanguage;
  79.         }

  80.         if (StringUtils.isNotEmpty(language)) {
  81.             effectiveLanguage = language;
  82.         } else if (next != null) {
  83.             effectiveLanguage = next.getEffectiveLanguage();
  84.         }

  85.         effectiveLanguageDetermined = true;
  86.         return effectiveLanguage;
  87.     }

  88.     public boolean effectiveLanguageEquals(String language) {
  89.         String effectiveLanguage = getEffectiveLanguage();
  90.         if (effectiveLanguage == null) {
  91.             return false;
  92.         }
  93.         return effectiveLanguage.equals(language);
  94.     }

  95.     private transient String toStringCache;

  96.     @Override
  97.     public String toString() {
  98.         if (toStringCache == null) {
  99.             StringBuilder sb = new StringBuilder();
  100.             sb.append(XmlEnvironment.class.getSimpleName()).append(' ');
  101.             sb.append("xmlns=").append(getEffectiveNamespace()).append(' ');
  102.             sb.append("xmllang=").append(getEffectiveLanguage()).append(' ');

  103.             toStringCache = sb.toString();
  104.         }
  105.         return toStringCache;
  106.     }

  107.     public static XmlEnvironment from(XmlPullParser parser) {
  108.         return from(parser, null);
  109.     }

  110.     public static XmlEnvironment from(XmlPullParser parser, XmlEnvironment outerXmlEnvironment) {
  111.         String namespace = parser.getDefaultNamespace();
  112.         String xmlLang = ParserUtils.getXmlLang(parser);
  113.         return new XmlEnvironment(namespace, xmlLang, outerXmlEnvironment);
  114.     }

  115.     public static Builder builder() {
  116.         return new Builder();
  117.     }

  118.     public static class Builder {
  119.         private String namespace;
  120.         private String language;
  121.         private XmlEnvironment next;

  122.         public Builder withNamespace(String namespace) {
  123.             this.namespace = namespace;
  124.             return this;
  125.         }

  126.         public Builder withLanguage(String language) {
  127.             this.language = language;
  128.             return this;
  129.         }

  130.         public Builder withNext(XmlEnvironment next) {
  131.             this.next = next;
  132.             return this;
  133.         }

  134.         public Builder with(AbstractStreamOpen streamOpen) {
  135.             withNamespace(streamOpen.getNamespace());
  136.             withLanguage(streamOpen.getLanguage());
  137.             return this;
  138.         }

  139.         public XmlEnvironment build() {
  140.             return new XmlEnvironment(this);
  141.         }
  142.     }
  143. }