/*
 * Copyright 2015-2018 OpenEstate.org.
 *
 * 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 org.openestate.io.openimmo.converters;

import java.util.List;
import javax.xml.bind.DatatypeConverter;
import org.apache.commons.lang3.StringUtils;
import org.jaxen.JaxenException;
import org.openestate.io.core.XmlConverter;
import org.openestate.io.core.XmlUtils;
import org.openestate.io.openimmo.OpenImmoDocument;
import org.openestate.io.openimmo.OpenImmoTransferDocument;
import org.openestate.io.openimmo.OpenImmoVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * Converter for version 1.2.
 *
 * @author Andreas Rudolph
 * @since 1.0
 */
@SuppressWarnings({"SpellCheckingInspection", "WeakerAccess"})
public class OpenImmo_1_2_0 extends XmlConverter<OpenImmoDocument, OpenImmoVersion> {
    @SuppressWarnings("unused")
    private final static Logger LOGGER = LoggerFactory.getLogger(OpenImmo_1_2_0.class);

    @Override
    public OpenImmoVersion getVersion() {
        return OpenImmoVersion.V1_2_0;
    }

    /**
     * Downgrade an OpenImmo document from version 1.2.0 to 1.1.
     *
     * @param doc OpenImmo document in version 1.2.0
     */
    @Override
    public void downgradeToPreviousVersion(OpenImmoDocument doc) {
        doc.setDocumentVersion(OpenImmoVersion.V1_1);

        if (doc instanceof OpenImmoTransferDocument) {
            try {
                this.downgradeUebertragungElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't downgrade <uebertragung> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeUserDefinedExtendElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove <user_defined_extend> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeAnbieterChildElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove unsupported children of <anbieter> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeBieterverfahrenElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove <bieterverfahren> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeBewertungElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove <bewertung> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeGeoChildElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove unsupported children of <geo> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeHeizkostenEnthaltenElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove <heizkosten_enthalten> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeAusstattungChildElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove unsupported children of <ausstattung> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.removeEnergiepassElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't remove <energiepass> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.downgradeMieteinnahmenElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't downgrade <mieteinnahmen_ist> and <mieteinnahmen_soll> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.downgradeBefeuerungElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't downgrade <befeuerung> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }

            try {
                this.downgradeHausElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't downgrade <haus> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }
        }
    }

    /**
     * Upgrade an OpenImmo document from version 1.1 to 1.2.0.
     *
     * @param doc OpenImmo document in version 1.1
     */
    @Override
    public void upgradeFromPreviousVersion(OpenImmoDocument doc) {
        doc.setDocumentVersion(OpenImmoVersion.V1_2_0);

        if (doc instanceof OpenImmoTransferDocument) {
            try {
                this.upgradeMieteinnahmenElements(doc.getDocument());
            } catch (Exception ex) {
                LOGGER.error("Can't upgrade <mieteinnahmen_ist> and <mieteinnahmen_soll> elements!");
                LOGGER.error("> " + ex.getLocalizedMessage(), ex);
            }
        }
    }

    /**
     * Downgrade <befeuerung> elements to OpenImmo 1.1.
     *

     * The attributes "FERN", "BLOCK", "WASSER-ELEKTRO" for <befeuerung>
     * elements are not available in version 1.1.
     *

     * Any occurences of these values are removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void downgradeBefeuerungElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:befeuerung[@FERN or @BLOCK or @WASSER-ELEKTRO]",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            node.removeAttribute("FERN");
            node.removeAttribute("BLOCK");
            node.removeAttribute("WASSER-ELEKTRO");
        }
    }

    /**
     * Downgrade <haus> elements to OpenImmo 1.1.
     *

     * The options "KRANKENHAUS", "PFLEGEHEIM", "SANATORIUM", "SENIORENHEIM",
     * "BETREUTES-WOHNEN" for the "haustyp" attribute of <haus>
     * elements are not available in version 1.1.
     *

     * Any occurence of these values is removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void downgradeHausElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:objektkategorie/io:objektart/io:haus[@haustyp]",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            String value = StringUtils.trimToNull(node.getAttribute("haustyp"));
            if ("KRANKENHAUS".equalsIgnoreCase(value))
                node.removeAttribute("haustyp");
            else if ("PFLEGEHEIM".equalsIgnoreCase(value))
                node.removeAttribute("haustyp");
            else if ("SANATORIUM".equalsIgnoreCase(value))
                node.removeAttribute("haustyp");
            else if ("SENIORENHEIM".equalsIgnoreCase(value))
                node.removeAttribute("haustyp");
            else if ("BETREUTES-WOHNEN".equalsIgnoreCase(value))
                node.removeAttribute("haustyp");
        }
    }

    /**
     * Downgrade <mieteinnahmen_ist>, <mieteinnahmen_soll> elements
     * to OpenImmo 1.1.
     *

     * The "periode" attribute of the <mieteinnahmen_ist> and
     * <mieteinnahmen_soll> elements is not available in version 1.1.
     *

     * Any occurences of these values is removed.
     *

     * The numeric value within the <mieteinnahmen_ist> and
     * <mieteinnahmen_soll> elements is converted according to the value of
     * the "periode" attribute.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void downgradeMieteinnahmenElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:preise/io:mieteinnahmen_ist[@periode] |" +
                        "/io:openimmo/io:anbieter/io:immobilie/io:preise/io:mieteinnahmen_soll[@periode]",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;

            String value = StringUtils.trimToNull(node.getTextContent());
            Double numericValue = null;
            try {
                numericValue = (value != null) ? DatatypeConverter.parseDouble(value) : null;
            } catch (Exception ex) {
                String tagName = node.getTagName();
                LOGGER.warn("Can't parse <" + tagName + ">" + value + "</" + tagName + "> as number!");
                LOGGER.warn("> " + ex.getLocalizedMessage(), ex);
            }

            if (numericValue != null && numericValue > 0) {
                String periode = StringUtils.trimToNull(node.getAttribute("periode"));
                if ("MONAT".equalsIgnoreCase(periode)) {
                    node.setTextContent(DatatypeConverter.printDouble(numericValue * 12));
                } else if ("WOCHE".equalsIgnoreCase(periode)) {
                    node.setTextContent(DatatypeConverter.printDouble(numericValue * 52));
                } else if ("TAG".equalsIgnoreCase(periode)) {
                    node.setTextContent(DatatypeConverter.printDouble(numericValue * 365));
                }
            }

            node.removeAttribute("periode");
        }
    }

    /**
     * Downgrade <uebertragung> elements to OpenImmo 1.1.
     *

     * The attributes "senderversion", "regi_id", "modus" for <uebertragung>
     * elements are not available in version 1.1.
     *

     * Any occurences of these values are removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void downgradeUebertragungElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:uebertragung[@senderversion or @regi_id or @modus]",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            node.removeAttribute("senderversion");
            node.removeAttribute("regi_id");
            node.removeAttribute("modus");
        }
    }

    /**
     * Remove unsupported children from all <anbieter> elements.
     *

     * OpenImmo 1.1 does not support the following children for
     * <anbieter> elements: <lizenzkennung>, <impressum_strukt>
     *

     * These elements are removed by this function.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeAnbieterChildElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:lizenzkennung | " +
                        "/io:openimmo/io:anbieter/io:impressum_strukt",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove unsupported children from all <ausstattung> elements.
     *

     * OpenImmo 1.1 does not support the following children for
     * <ausstattung> elements: <dvbt>, <breitband_zugang>,
     * <umts_empfang>, <abstellraum>, <fahrradraum>,
     * <rolladen>
     *

     * These elements are removed by this function.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeAusstattungChildElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:dvbt | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:breitband_zugang | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:umts_empfang | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:abstellraum | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:fahrradraum | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:ausstattung/io:rolladen",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove <bewertung> elements.
     *

     * OpenImmo 1.1 does not support <bewertung> elements.
     *

     * Any occurences of these elements are removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeBewertungElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:bewertung",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove <bieterverfahren> elements.
     *

     * OpenImmo 1.1 does not support <bieterverfahren> elements.
     *

     * Any occurences of these elements are removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeBieterverfahrenElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:bieterverfahren",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove <energiepass> elements.
     *

     * OpenImmo 1.1 does not support <energiepass> elements.
     *

     * Any occurences of these elements are removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeEnergiepassElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:zustand_angaben/io:energiepass",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove unsupported children from all <geo> elements.
     *

     * OpenImmo 1.1 does not support the following children for
     * <geo> elements: <anzahl_etagen>, <karten_makro>,
     * <karten_mikro>, <virtuelletour>, <luftbildern>
     *

     * These elements are removed by this function.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeGeoChildElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:geo/io:anzahl_etagen | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:geo/io:karten_makro | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:geo/io:karten_mikro | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:geo/io:virtuelletour | " +
                        "/io:openimmo/io:anbieter/io:immobilie/io:geo/io:luftbildern",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove <heizkosten_enthalten> elements.
     *

     * OpenImmo 1.1 does not support <heizkosten_enthalten> elements.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeHeizkostenEnthaltenElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:preise/io:heizkosten_enthalten",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Remove <user_defined_extend> elements.
     *

     * OpenImmo 1.1 does not support <user_defined_extend> elements .
     *

     * Any occurences of these elements are removed.
     *
     * @param doc OpenImmo document in version 1.2.0
     * @throws JaxenException if xpath evaluation failed
     */
    protected void removeUserDefinedExtendElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "//io:user_defined_extend", doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            Element parentNode = (Element) node.getParentNode();
            parentNode.removeChild(node);
        }
    }

    /**
     * Upgrade <mieteinnahmen_ist>, <mieteinnahmen_soll> elements
     * to OpenImmo 1.2.0.
     *

     * The "periode" attribute with the value "JAHR" is added to any
     * <mieteinnahmen_ist> and <mieteinnahmen_soll> elements.
     *
     * @param doc OpenImmo document in version 1.1
     * @throws JaxenException if xpath evaluation failed
     */
    protected void upgradeMieteinnahmenElements(Document doc) throws JaxenException {
        List nodes = XmlUtils.newXPath(
                "/io:openimmo/io:anbieter/io:immobilie/io:preise/io:mieteinnahmen_ist |" +
                        "/io:openimmo/io:anbieter/io:immobilie/io:preise/io:mieteinnahmen_soll",
                doc).selectNodes(doc);
        for (Object item : nodes) {
            Element node = (Element) item;
            node.setAttribute("periode", "JAHR");
        }
    }
}


package org.openestate.io.trovit.xml;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.jvnet.jaxb2_commons.lang.CopyStrategy2;
import org.jvnet.jaxb2_commons.lang.CopyTo2;
import org.jvnet.jaxb2_commons.lang.Equals2;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy2;
import org.jvnet.jaxb2_commons.lang.JAXBCopyStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString2;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy2;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;

/**
 *
Java class for anonymous complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *

 * <complexType>
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="ad" type="{}AdType" maxOccurs="unbounded" minOccurs="0"/>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 *

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "ad"
})
@XmlRootElement(name = "trovit")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
public class Trovit implements Serializable, Cloneable, CopyTo2, Equals2, ToString2
{

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    protected List<AdType> ad;

    /**
     * Gets the value of the ad property.
     *
     *

     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a set method for the ad property.
     *
     *

     * For example, to add a new item, do as follows:
     *

     *    getAd().add(newItem);
     *

     *
     *
     *

     * Objects of the following type(s) are allowed in the list
     * {@link AdType }
     *
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public List<AdType> getAd() {
        if (ad == null) {
            ad = new ArrayList<AdType>();
        }
        return this.ad;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public String toString() {
        final ToStringStrategy2 strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        {
            List<AdType> theAd;
            theAd = (((this.ad!= null)&&(!this.ad.isEmpty()))?this.getAd():null);
            strategy.appendField(locator, this, "ad", buffer, theAd, ((this.ad!= null)&&(!this.ad.isEmpty())));
        }
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public Object clone() {
        return copyTo(createNewInstance());
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(Object target) {
        final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
        return copyTo(null, target, strategy);
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(ObjectLocator locator, Object target, CopyStrategy2 strategy) {
        final Object draftCopy = ((target == null)?createNewInstance():target);
        if (draftCopy instanceof Trovit) {
            final Trovit copy = ((Trovit) draftCopy);
            {
                Boolean adShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, ((this.ad!= null)&&(!this.ad.isEmpty())));
                if (adShouldBeCopiedAndSet == Boolean.TRUE) {
                    List<AdType> sourceAd;
                    sourceAd = (((this.ad!= null)&&(!this.ad.isEmpty()))?this.getAd():null);
                    @SuppressWarnings("unchecked")
                    List<AdType> copyAd = ((List<AdType> ) strategy.copy(LocatorUtils.property(locator, "ad", sourceAd), sourceAd, ((this.ad!= null)&&(!this.ad.isEmpty()))));
                    copy.ad = null;
                    if (copyAd!= null) {
                        List<AdType> uniqueAdl = copy.getAd();
                        uniqueAdl.addAll(copyAd);
                    }
                } else {
                    if (adShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.ad = null;
                    }
                }
            }
        }
        return draftCopy;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public Object createNewInstance() {
        return new Trovit();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
        if ((object == null)||(this.getClass()!= object.getClass())) {
            return false;
        }
        if (this == object) {
            return true;
        }
        final Trovit that = ((Trovit) object);
        {
            List<AdType> lhsAd;
            lhsAd = (((this.ad!= null)&&(!this.ad.isEmpty()))?this.getAd():null);
            List<AdType> rhsAd;
            rhsAd = (((that.ad!= null)&&(!that.ad.isEmpty()))?that.getAd():null);
            if (!strategy.equals(LocatorUtils.property(thisLocator, "ad", lhsAd), LocatorUtils.property(thatLocator, "ad", rhsAd), lhsAd, rhsAd, ((this.ad!= null)&&(!this.ad.isEmpty())), ((that.ad!= null)&&(!that.ad.isEmpty())))) {
                return false;
            }
        }
        return true;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:55:25+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(Object object) {
        final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
        return equals(null, null, object, strategy);
    }

}


package org.openestate.io.openimmo.xml;

import java.io.Serializable;
import javax.annotation.Generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.jvnet.jaxb2_commons.lang.CopyStrategy2;
import org.jvnet.jaxb2_commons.lang.CopyTo2;
import org.jvnet.jaxb2_commons.lang.Equals2;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy2;
import org.jvnet.jaxb2_commons.lang.JAXBCopyStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString2;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy2;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;

/**
 * Java class for <gastgewerbe> element.
 *
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "gastgewerbe")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
public class Gastgewerbe implements Serializable, Cloneable, CopyTo2, Equals2, ToString2
{

    @XmlAttribute(name = "gastgew_typ")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    protected Gastgewerbe.GastgewTyp gastgewTyp;

    /**
     * Gets the value of the gastgewTyp property.
     *
     * @return
     *     possible object is
     *     {@link Gastgewerbe.GastgewTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public Gastgewerbe.GastgewTyp getGastgewTyp() {
        return gastgewTyp;
    }

    /**
     * Sets the value of the gastgewTyp property.
     *
     * @param value
     *     allowed object is
     *     {@link Gastgewerbe.GastgewTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public void setGastgewTyp(Gastgewerbe.GastgewTyp value) {
        this.gastgewTyp = value;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public String toString() {
        final ToStringStrategy2 strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        {
            Gastgewerbe.GastgewTyp theGastgewTyp;
            theGastgewTyp = this.getGastgewTyp();
            strategy.appendField(locator, this, "gastgewTyp", buffer, theGastgewTyp, (this.gastgewTyp!= null));
        }
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public Object clone() {
        return copyTo(createNewInstance());
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(Object target) {
        final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
        return copyTo(null, target, strategy);
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(ObjectLocator locator, Object target, CopyStrategy2 strategy) {
        final Object draftCopy = ((target == null)?createNewInstance():target);
        if (draftCopy instanceof Gastgewerbe) {
            final Gastgewerbe copy = ((Gastgewerbe) draftCopy);
            {
                Boolean gastgewTypShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.gastgewTyp!= null));
                if (gastgewTypShouldBeCopiedAndSet == Boolean.TRUE) {
                    Gastgewerbe.GastgewTyp sourceGastgewTyp;
                    sourceGastgewTyp = this.getGastgewTyp();
                    Gastgewerbe.GastgewTyp copyGastgewTyp = ((Gastgewerbe.GastgewTyp) strategy.copy(LocatorUtils.property(locator, "gastgewTyp", sourceGastgewTyp), sourceGastgewTyp, (this.gastgewTyp!= null)));
                    copy.setGastgewTyp(copyGastgewTyp);
                } else {
                    if (gastgewTypShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.gastgewTyp = null;
                    }
                }
            }
        }
        return draftCopy;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public Object createNewInstance() {
        return new Gastgewerbe();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
        if ((object == null)||(this.getClass()!= object.getClass())) {
            return false;
        }
        if (this == object) {
            return true;
        }
        final Gastgewerbe that = ((Gastgewerbe) object);
        {
            Gastgewerbe.GastgewTyp lhsGastgewTyp;
            lhsGastgewTyp = this.getGastgewTyp();
            Gastgewerbe.GastgewTyp rhsGastgewTyp;
            rhsGastgewTyp = that.getGastgewTyp();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "gastgewTyp", lhsGastgewTyp), LocatorUtils.property(thatLocator, "gastgewTyp", rhsGastgewTyp), lhsGastgewTyp, rhsGastgewTyp, (this.gastgewTyp!= null), (that.gastgewTyp!= null))) {
                return false;
            }
        }
        return true;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(Object object) {
        final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
        return equals(null, null, object, strategy);
    }

    /**
     *
     *                     Java enum for gastgew_typ attribute in <gastgewerbe> elements.
     *
     *
Java class for null.
     *
     *
The following schema fragment specifies the expected content contained within this class.
     *

     *

     * <simpleType>
     *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
     *     <enumeration value="GASTRONOMIE"/>
     *     <enumeration value="GASTRONOMIE_UND_WOHNUNG"/>
     *     <enumeration value="PENSIONEN"/>
     *     <enumeration value="HOTELS"/>
     *     <enumeration value="WEITERE_BEHERBERGUNGSBETRIEBE"/>
     *     <enumeration value="BAR"/>
     *     <enumeration value="CAFE"/>
     *     <enumeration value="DISCOTHEK"/>
     *     <enumeration value="RESTAURANT"/>
     *     <enumeration value="RAUCHERLOKAL"/>
     *     <enumeration value="EINRAUMLOKAL"/>
     *   </restriction>
     * </simpleType>
     *

     *
     */
    @XmlType(name = "")
    @XmlEnum
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:54:50+02:00", comments = "JAXB RI v2.2.11")
    public enum GastgewTyp {

        GASTRONOMIE,
        GASTRONOMIE_UND_WOHNUNG,
        PENSIONEN,
        HOTELS,
        WEITERE_BEHERBERGUNGSBETRIEBE,
        BAR,
        CAFE,
        DISCOTHEK,
        RESTAURANT,
        RAUCHERLOKAL,
        EINRAUMLOKAL;

        public String value() {
            return name();
        }

        public static Gastgewerbe.GastgewTyp fromValue(String v) {
            return valueOf(v);
        }

    }

}


package org.openestate.io.immoxml.xml;

import java.io.Serializable;
import javax.annotation.Generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlEnum;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import org.jvnet.jaxb2_commons.lang.CopyStrategy2;
import org.jvnet.jaxb2_commons.lang.CopyTo2;
import org.jvnet.jaxb2_commons.lang.Equals2;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy2;
import org.jvnet.jaxb2_commons.lang.JAXBCopyStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString2;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy2;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;

/**
 * Java class for <stp_sonstige> element.
 *
 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "")
@XmlRootElement(name = "stp_sonstige")
@Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
public class StpSonstige
    extends Stellplatz
    implements Serializable, Cloneable, CopyTo2, Equals2, ToString2
{

    @XmlAttribute(name = "platzart")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    protected StpSonstige.Platzart platzart;
    @XmlAttribute(name = "bemerkung")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    protected String bemerkung;

    /**
     * Gets the value of the platzart property.
     *
     * @return
     *     possible object is
     *     {@link StpSonstige.Platzart }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public StpSonstige.Platzart getPlatzart() {
        return platzart;
    }

    /**
     * Sets the value of the platzart property.
     *
     * @param value
     *     allowed object is
     *     {@link StpSonstige.Platzart }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public void setPlatzart(StpSonstige.Platzart value) {
        this.platzart = value;
    }

    /**
     * Gets the value of the bemerkung property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public String getBemerkung() {
        return bemerkung;
    }

    /**
     * Sets the value of the bemerkung property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public void setBemerkung(String value) {
        this.bemerkung = value;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public String toString() {
        final ToStringStrategy2 strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        super.appendFields(locator, buffer, strategy);
        {
            StpSonstige.Platzart thePlatzart;
            thePlatzart = this.getPlatzart();
            strategy.appendField(locator, this, "platzart", buffer, thePlatzart, (this.platzart!= null));
        }
        {
            String theBemerkung;
            theBemerkung = this.getBemerkung();
            strategy.appendField(locator, this, "bemerkung", buffer, theBemerkung, (this.bemerkung!= null));
        }
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public Object clone() {
        return copyTo(createNewInstance());
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(Object target) {
        final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
        return copyTo(null, target, strategy);
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(ObjectLocator locator, Object target, CopyStrategy2 strategy) {
        final Object draftCopy = ((target == null)?createNewInstance():target);
        super.copyTo(locator, draftCopy, strategy);
        if (draftCopy instanceof StpSonstige) {
            final StpSonstige copy = ((StpSonstige) draftCopy);
            {
                Boolean platzartShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.platzart!= null));
                if (platzartShouldBeCopiedAndSet == Boolean.TRUE) {
                    StpSonstige.Platzart sourcePlatzart;
                    sourcePlatzart = this.getPlatzart();
                    StpSonstige.Platzart copyPlatzart = ((StpSonstige.Platzart) strategy.copy(LocatorUtils.property(locator, "platzart", sourcePlatzart), sourcePlatzart, (this.platzart!= null)));
                    copy.setPlatzart(copyPlatzart);
                } else {
                    if (platzartShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.platzart = null;
                    }
                }
            }
            {
                Boolean bemerkungShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.bemerkung!= null));
                if (bemerkungShouldBeCopiedAndSet == Boolean.TRUE) {
                    String sourceBemerkung;
                    sourceBemerkung = this.getBemerkung();
                    String copyBemerkung = ((String) strategy.copy(LocatorUtils.property(locator, "bemerkung", sourceBemerkung), sourceBemerkung, (this.bemerkung!= null)));
                    copy.setBemerkung(copyBemerkung);
                } else {
                    if (bemerkungShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.bemerkung = null;
                    }
                }
            }
        }
        return draftCopy;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public Object createNewInstance() {
        return new StpSonstige();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
        if ((object == null)||(this.getClass()!= object.getClass())) {
            return false;
        }
        if (this == object) {
            return true;
        }
        if (!super.equals(thisLocator, thatLocator, object, strategy)) {
            return false;
        }
        final StpSonstige that = ((StpSonstige) object);
        {
            StpSonstige.Platzart lhsPlatzart;
            lhsPlatzart = this.getPlatzart();
            StpSonstige.Platzart rhsPlatzart;
            rhsPlatzart = that.getPlatzart();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "platzart", lhsPlatzart), LocatorUtils.property(thatLocator, "platzart", rhsPlatzart), lhsPlatzart, rhsPlatzart, (this.platzart!= null), (that.platzart!= null))) {
                return false;
            }
        }
        {
            String lhsBemerkung;
            lhsBemerkung = this.getBemerkung();
            String rhsBemerkung;
            rhsBemerkung = that.getBemerkung();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "bemerkung", lhsBemerkung), LocatorUtils.property(thatLocator, "bemerkung", rhsBemerkung), lhsBemerkung, rhsBemerkung, (this.bemerkung!= null), (that.bemerkung!= null))) {
                return false;
            }
        }
        return true;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(Object object) {
        final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
        return equals(null, null, object, strategy);
    }

    /**
     *
     *                     Java enum for platzart attribute in <stp_sonstige> elements.
     *
     *
Java class for null.
     *
     *
The following schema fragment specifies the expected content contained within this class.
     *

     *

     * <simpleType>
     *   <restriction base="{http://www.w3.org/2001/XMLSchema}string">
     *     <enumeration value="FREIPLATZ"/>
     *     <enumeration value="GARAGE"/>
     *     <enumeration value="TIEFGARAGE"/>
     *     <enumeration value="CARPORT"/>
     *     <enumeration value="DUPLEX"/>
     *     <enumeration value="PARKHAUS"/>
     *     <enumeration value="SONSTIGES"/>
     *   </restriction>
     * </simpleType>
     *

     *
     */
    @XmlType(name = "")
    @XmlEnum
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:50:55+02:00", comments = "JAXB RI v2.2.11")
    public enum Platzart {

        FREIPLATZ,
        GARAGE,
        TIEFGARAGE,
        CARPORT,
        DUPLEX,
        PARKHAUS,
        SONSTIGES;

        public String value() {
            return name();
        }

        public static StpSonstige.Platzart fromValue(String v) {
            return valueOf(v);
        }

    }

}


package org.openestate.io.is24_xml.xml;

import java.io.Serializable;
import java.math.BigDecimal;
import javax.annotation.Generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.jvnet.jaxb2_commons.lang.CopyStrategy2;
import org.jvnet.jaxb2_commons.lang.CopyTo2;
import org.jvnet.jaxb2_commons.lang.Equals2;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy2;
import org.jvnet.jaxb2_commons.lang.JAXBCopyStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString2;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy2;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;

/**
 *
Java class for BueroPraxisTyp complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *

 * <complexType name="BueroPraxisTyp">
 *   <complexContent>
 *     <extension base="{http://www.immobilienscout24.de/immobilientransfer}GewerbeImmoBaseTyp">
 *       <sequence>
 *         <element name="Vermarktung" type="{http://www.immobilienscout24.de/immobilientransfer}VermarktungGewerbeTyp"/>
 *       </sequence>
 *       <attribute name="Objektkategorie2" type="{http://www.immobilienscout24.de/immobilientransfer}BueroPraxisKategorienTyp" default="keineAngabe" />
 *       <attribute name="BueroPraxisFlaeche" use="required" type="{http://www.immobilienscout24.de/immobilientransfer}Zahl102Typ" />
 *       <attribute name="Bodenbelag" type="{http://www.immobilienscout24.de/immobilientransfer}BodenbelagTyp" default="keineAngabe" />
 *       <attribute name="DatenVerkabelung" type="{http://www.immobilienscout24.de/immobilientransfer}DatenVerkabelungsTyp" default="keineAngabe" />
 *       <attribute name="Klimaanlage" type="{http://www.immobilienscout24.de/immobilientransfer}JaNeinVereinbarungTyp" default="keineAngabe" />
 *       <attribute name="Kantine" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *       <attribute name="Denkmalschutzobjekt" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *       <attribute name="Keller" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *       <attribute name="Barrierefrei" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *       <attribute name="KuecheVorhanden" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *       <attribute name="Starkstrom" type="{http://www.w3.org/2001/XMLSchema}boolean" />
 *     </extension>
 *   </complexContent>
 * </complexType>
 *

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BueroPraxisTyp", propOrder = {
    "vermarktung"
})
@XmlSeeAlso({
    org.openestate.io.is24_xml.xml.BueroPraxis.Type.class
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
public class BueroPraxisTyp
    extends GewerbeImmoBaseTyp
    implements Serializable, Cloneable, CopyTo2, Equals2, ToString2
{

    @XmlElement(name = "Vermarktung", required = true)
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected VermarktungGewerbeTyp vermarktung;
    @XmlAttribute(name = "Objektkategorie2")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected BueroPraxisKategorienTyp objektkategorie2;
    @XmlAttribute(name = "BueroPraxisFlaeche", required = true)
    @XmlJavaTypeAdapter(Adapter34 .class)
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected BigDecimal bueroPraxisFlaeche;
    @XmlAttribute(name = "Bodenbelag")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected BodenbelagTyp bodenbelag;
    @XmlAttribute(name = "DatenVerkabelung")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected DatenVerkabelungsTyp datenVerkabelung;
    @XmlAttribute(name = "Klimaanlage")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected JaNeinVereinbarungTyp klimaanlage;
    @XmlAttribute(name = "Kantine")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected Boolean kantine;
    @XmlAttribute(name = "Denkmalschutzobjekt")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected Boolean denkmalschutzobjekt;
    @XmlAttribute(name = "Keller")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected Boolean keller;
    @XmlAttribute(name = "Barrierefrei")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected Boolean barrierefrei;
    @XmlAttribute(name = "KuecheVorhanden")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected Boolean kuecheVorhanden;
    @XmlAttribute(name = "Starkstrom")
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    protected Boolean starkstrom;

    /**
     * Gets the value of the vermarktung property.
     *
     * @return
     *     possible object is
     *     {@link VermarktungGewerbeTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public VermarktungGewerbeTyp getVermarktung() {
        return vermarktung;
    }

    /**
     * Sets the value of the vermarktung property.
     *
     * @param value
     *     allowed object is
     *     {@link VermarktungGewerbeTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setVermarktung(VermarktungGewerbeTyp value) {
        this.vermarktung = value;
    }

    /**
     * Gets the value of the objektkategorie2 property.
     *
     * @return
     *     possible object is
     *     {@link BueroPraxisKategorienTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public BueroPraxisKategorienTyp getObjektkategorie2() {
        if (objektkategorie2 == null) {
            return BueroPraxisKategorienTyp.KEINE_ANGABE;
        } else {
            return objektkategorie2;
        }
    }

    /**
     * Sets the value of the objektkategorie2 property.
     *
     * @param value
     *     allowed object is
     *     {@link BueroPraxisKategorienTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setObjektkategorie2(BueroPraxisKategorienTyp value) {
        this.objektkategorie2 = value;
    }

    /**
     * Gets the value of the bueroPraxisFlaeche property.
     *
     * @return
     *     possible object is
     *     {@link String }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public BigDecimal getBueroPraxisFlaeche() {
        return bueroPraxisFlaeche;
    }

    /**
     * Sets the value of the bueroPraxisFlaeche property.
     *
     * @param value
     *     allowed object is
     *     {@link String }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setBueroPraxisFlaeche(BigDecimal value) {
        this.bueroPraxisFlaeche = value;
    }

    /**
     * Gets the value of the bodenbelag property.
     *
     * @return
     *     possible object is
     *     {@link BodenbelagTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public BodenbelagTyp getBodenbelag() {
        if (bodenbelag == null) {
            return BodenbelagTyp.KEINE_ANGABE;
        } else {
            return bodenbelag;
        }
    }

    /**
     * Sets the value of the bodenbelag property.
     *
     * @param value
     *     allowed object is
     *     {@link BodenbelagTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setBodenbelag(BodenbelagTyp value) {
        this.bodenbelag = value;
    }

    /**
     * Gets the value of the datenVerkabelung property.
     *
     * @return
     *     possible object is
     *     {@link DatenVerkabelungsTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public DatenVerkabelungsTyp getDatenVerkabelung() {
        if (datenVerkabelung == null) {
            return DatenVerkabelungsTyp.KEINE_ANGABE;
        } else {
            return datenVerkabelung;
        }
    }

    /**
     * Sets the value of the datenVerkabelung property.
     *
     * @param value
     *     allowed object is
     *     {@link DatenVerkabelungsTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setDatenVerkabelung(DatenVerkabelungsTyp value) {
        this.datenVerkabelung = value;
    }

    /**
     * Gets the value of the klimaanlage property.
     *
     * @return
     *     possible object is
     *     {@link JaNeinVereinbarungTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public JaNeinVereinbarungTyp getKlimaanlage() {
        if (klimaanlage == null) {
            return JaNeinVereinbarungTyp.KEINE_ANGABE;
        } else {
            return klimaanlage;
        }
    }

    /**
     * Sets the value of the klimaanlage property.
     *
     * @param value
     *     allowed object is
     *     {@link JaNeinVereinbarungTyp }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setKlimaanlage(JaNeinVereinbarungTyp value) {
        this.klimaanlage = value;
    }

    /**
     * Gets the value of the kantine property.
     *
     * @return
     *     possible object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Boolean getKantine() {
        return kantine;
    }

    /**
     * Sets the value of the kantine property.
     *
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setKantine(Boolean value) {
        this.kantine = value;
    }

    /**
     * Gets the value of the denkmalschutzobjekt property.
     *
     * @return
     *     possible object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Boolean getDenkmalschutzobjekt() {
        return denkmalschutzobjekt;
    }

    /**
     * Sets the value of the denkmalschutzobjekt property.
     *
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setDenkmalschutzobjekt(Boolean value) {
        this.denkmalschutzobjekt = value;
    }

    /**
     * Gets the value of the keller property.
     *
     * @return
     *     possible object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Boolean getKeller() {
        return keller;
    }

    /**
     * Sets the value of the keller property.
     *
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setKeller(Boolean value) {
        this.keller = value;
    }

    /**
     * Gets the value of the barrierefrei property.
     *
     * @return
     *     possible object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Boolean getBarrierefrei() {
        return barrierefrei;
    }

    /**
     * Sets the value of the barrierefrei property.
     *
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setBarrierefrei(Boolean value) {
        this.barrierefrei = value;
    }

    /**
     * Gets the value of the kuecheVorhanden property.
     *
     * @return
     *     possible object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Boolean getKuecheVorhanden() {
        return kuecheVorhanden;
    }

    /**
     * Sets the value of the kuecheVorhanden property.
     *
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setKuecheVorhanden(Boolean value) {
        this.kuecheVorhanden = value;
    }

    /**
     * Gets the value of the starkstrom property.
     *
     * @return
     *     possible object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Boolean getStarkstrom() {
        return starkstrom;
    }

    /**
     * Sets the value of the starkstrom property.
     *
     * @param value
     *     allowed object is
     *     {@link Boolean }
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public void setStarkstrom(Boolean value) {
        this.starkstrom = value;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public String toString() {
        final ToStringStrategy2 strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        super.appendFields(locator, buffer, strategy);
        {
            VermarktungGewerbeTyp theVermarktung;
            theVermarktung = this.getVermarktung();
            strategy.appendField(locator, this, "vermarktung", buffer, theVermarktung, (this.vermarktung!= null));
        }
        {
            BueroPraxisKategorienTyp theObjektkategorie2;
            theObjektkategorie2 = this.getObjektkategorie2();
            strategy.appendField(locator, this, "objektkategorie2", buffer, theObjektkategorie2, (this.objektkategorie2 != null));
        }
        {
            BigDecimal theBueroPraxisFlaeche;
            theBueroPraxisFlaeche = this.getBueroPraxisFlaeche();
            strategy.appendField(locator, this, "bueroPraxisFlaeche", buffer, theBueroPraxisFlaeche, (this.bueroPraxisFlaeche!= null));
        }
        {
            BodenbelagTyp theBodenbelag;
            theBodenbelag = this.getBodenbelag();
            strategy.appendField(locator, this, "bodenbelag", buffer, theBodenbelag, (this.bodenbelag!= null));
        }
        {
            DatenVerkabelungsTyp theDatenVerkabelung;
            theDatenVerkabelung = this.getDatenVerkabelung();
            strategy.appendField(locator, this, "datenVerkabelung", buffer, theDatenVerkabelung, (this.datenVerkabelung!= null));
        }
        {
            JaNeinVereinbarungTyp theKlimaanlage;
            theKlimaanlage = this.getKlimaanlage();
            strategy.appendField(locator, this, "klimaanlage", buffer, theKlimaanlage, (this.klimaanlage!= null));
        }
        {
            Boolean theKantine;
            theKantine = this.getKantine();
            strategy.appendField(locator, this, "kantine", buffer, theKantine, (this.kantine!= null));
        }
        {
            Boolean theDenkmalschutzobjekt;
            theDenkmalschutzobjekt = this.getDenkmalschutzobjekt();
            strategy.appendField(locator, this, "denkmalschutzobjekt", buffer, theDenkmalschutzobjekt, (this.denkmalschutzobjekt!= null));
        }
        {
            Boolean theKeller;
            theKeller = this.getKeller();
            strategy.appendField(locator, this, "keller", buffer, theKeller, (this.keller!= null));
        }
        {
            Boolean theBarrierefrei;
            theBarrierefrei = this.getBarrierefrei();
            strategy.appendField(locator, this, "barrierefrei", buffer, theBarrierefrei, (this.barrierefrei!= null));
        }
        {
            Boolean theKuecheVorhanden;
            theKuecheVorhanden = this.getKuecheVorhanden();
            strategy.appendField(locator, this, "kuecheVorhanden", buffer, theKuecheVorhanden, (this.kuecheVorhanden!= null));
        }
        {
            Boolean theStarkstrom;
            theStarkstrom = this.getStarkstrom();
            strategy.appendField(locator, this, "starkstrom", buffer, theStarkstrom, (this.starkstrom!= null));
        }
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Object clone() {
        return copyTo(createNewInstance());
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(Object target) {
        final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
        return copyTo(null, target, strategy);
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(ObjectLocator locator, Object target, CopyStrategy2 strategy) {
        final Object draftCopy = ((target == null)?createNewInstance():target);
        super.copyTo(locator, draftCopy, strategy);
        if (draftCopy instanceof BueroPraxisTyp) {
            final BueroPraxisTyp copy = ((BueroPraxisTyp) draftCopy);
            {
                Boolean vermarktungShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.vermarktung!= null));
                if (vermarktungShouldBeCopiedAndSet == Boolean.TRUE) {
                    VermarktungGewerbeTyp sourceVermarktung;
                    sourceVermarktung = this.getVermarktung();
                    VermarktungGewerbeTyp copyVermarktung = ((VermarktungGewerbeTyp) strategy.copy(LocatorUtils.property(locator, "vermarktung", sourceVermarktung), sourceVermarktung, (this.vermarktung!= null)));
                    copy.setVermarktung(copyVermarktung);
                } else {
                    if (vermarktungShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.vermarktung = null;
                    }
                }
            }
            {
                Boolean objektkategorie2ShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.objektkategorie2 != null));
                if (objektkategorie2ShouldBeCopiedAndSet == Boolean.TRUE) {
                    BueroPraxisKategorienTyp sourceObjektkategorie2;
                    sourceObjektkategorie2 = this.getObjektkategorie2();
                    BueroPraxisKategorienTyp copyObjektkategorie2 = ((BueroPraxisKategorienTyp) strategy.copy(LocatorUtils.property(locator, "objektkategorie2", sourceObjektkategorie2), sourceObjektkategorie2, (this.objektkategorie2 != null)));
                    copy.setObjektkategorie2(copyObjektkategorie2);
                } else {
                    if (objektkategorie2ShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.objektkategorie2 = null;
                    }
                }
            }
            {
                Boolean bueroPraxisFlaecheShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.bueroPraxisFlaeche!= null));
                if (bueroPraxisFlaecheShouldBeCopiedAndSet == Boolean.TRUE) {
                    BigDecimal sourceBueroPraxisFlaeche;
                    sourceBueroPraxisFlaeche = this.getBueroPraxisFlaeche();
                    BigDecimal copyBueroPraxisFlaeche = ((BigDecimal) strategy.copy(LocatorUtils.property(locator, "bueroPraxisFlaeche", sourceBueroPraxisFlaeche), sourceBueroPraxisFlaeche, (this.bueroPraxisFlaeche!= null)));
                    copy.setBueroPraxisFlaeche(copyBueroPraxisFlaeche);
                } else {
                    if (bueroPraxisFlaecheShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.bueroPraxisFlaeche = null;
                    }
                }
            }
            {
                Boolean bodenbelagShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.bodenbelag!= null));
                if (bodenbelagShouldBeCopiedAndSet == Boolean.TRUE) {
                    BodenbelagTyp sourceBodenbelag;
                    sourceBodenbelag = this.getBodenbelag();
                    BodenbelagTyp copyBodenbelag = ((BodenbelagTyp) strategy.copy(LocatorUtils.property(locator, "bodenbelag", sourceBodenbelag), sourceBodenbelag, (this.bodenbelag!= null)));
                    copy.setBodenbelag(copyBodenbelag);
                } else {
                    if (bodenbelagShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.bodenbelag = null;
                    }
                }
            }
            {
                Boolean datenVerkabelungShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.datenVerkabelung!= null));
                if (datenVerkabelungShouldBeCopiedAndSet == Boolean.TRUE) {
                    DatenVerkabelungsTyp sourceDatenVerkabelung;
                    sourceDatenVerkabelung = this.getDatenVerkabelung();
                    DatenVerkabelungsTyp copyDatenVerkabelung = ((DatenVerkabelungsTyp) strategy.copy(LocatorUtils.property(locator, "datenVerkabelung", sourceDatenVerkabelung), sourceDatenVerkabelung, (this.datenVerkabelung!= null)));
                    copy.setDatenVerkabelung(copyDatenVerkabelung);
                } else {
                    if (datenVerkabelungShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.datenVerkabelung = null;
                    }
                }
            }
            {
                Boolean klimaanlageShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.klimaanlage!= null));
                if (klimaanlageShouldBeCopiedAndSet == Boolean.TRUE) {
                    JaNeinVereinbarungTyp sourceKlimaanlage;
                    sourceKlimaanlage = this.getKlimaanlage();
                    JaNeinVereinbarungTyp copyKlimaanlage = ((JaNeinVereinbarungTyp) strategy.copy(LocatorUtils.property(locator, "klimaanlage", sourceKlimaanlage), sourceKlimaanlage, (this.klimaanlage!= null)));
                    copy.setKlimaanlage(copyKlimaanlage);
                } else {
                    if (klimaanlageShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.klimaanlage = null;
                    }
                }
            }
            {
                Boolean kantineShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.kantine!= null));
                if (kantineShouldBeCopiedAndSet == Boolean.TRUE) {
                    Boolean sourceKantine;
                    sourceKantine = this.getKantine();
                    Boolean copyKantine = ((Boolean) strategy.copy(LocatorUtils.property(locator, "kantine", sourceKantine), sourceKantine, (this.kantine!= null)));
                    copy.setKantine(copyKantine);
                } else {
                    if (kantineShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.kantine = null;
                    }
                }
            }
            {
                Boolean denkmalschutzobjektShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.denkmalschutzobjekt!= null));
                if (denkmalschutzobjektShouldBeCopiedAndSet == Boolean.TRUE) {
                    Boolean sourceDenkmalschutzobjekt;
                    sourceDenkmalschutzobjekt = this.getDenkmalschutzobjekt();
                    Boolean copyDenkmalschutzobjekt = ((Boolean) strategy.copy(LocatorUtils.property(locator, "denkmalschutzobjekt", sourceDenkmalschutzobjekt), sourceDenkmalschutzobjekt, (this.denkmalschutzobjekt!= null)));
                    copy.setDenkmalschutzobjekt(copyDenkmalschutzobjekt);
                } else {
                    if (denkmalschutzobjektShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.denkmalschutzobjekt = null;
                    }
                }
            }
            {
                Boolean kellerShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.keller!= null));
                if (kellerShouldBeCopiedAndSet == Boolean.TRUE) {
                    Boolean sourceKeller;
                    sourceKeller = this.getKeller();
                    Boolean copyKeller = ((Boolean) strategy.copy(LocatorUtils.property(locator, "keller", sourceKeller), sourceKeller, (this.keller!= null)));
                    copy.setKeller(copyKeller);
                } else {
                    if (kellerShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.keller = null;
                    }
                }
            }
            {
                Boolean barrierefreiShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.barrierefrei!= null));
                if (barrierefreiShouldBeCopiedAndSet == Boolean.TRUE) {
                    Boolean sourceBarrierefrei;
                    sourceBarrierefrei = this.getBarrierefrei();
                    Boolean copyBarrierefrei = ((Boolean) strategy.copy(LocatorUtils.property(locator, "barrierefrei", sourceBarrierefrei), sourceBarrierefrei, (this.barrierefrei!= null)));
                    copy.setBarrierefrei(copyBarrierefrei);
                } else {
                    if (barrierefreiShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.barrierefrei = null;
                    }
                }
            }
            {
                Boolean kuecheVorhandenShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.kuecheVorhanden!= null));
                if (kuecheVorhandenShouldBeCopiedAndSet == Boolean.TRUE) {
                    Boolean sourceKuecheVorhanden;
                    sourceKuecheVorhanden = this.getKuecheVorhanden();
                    Boolean copyKuecheVorhanden = ((Boolean) strategy.copy(LocatorUtils.property(locator, "kuecheVorhanden", sourceKuecheVorhanden), sourceKuecheVorhanden, (this.kuecheVorhanden!= null)));
                    copy.setKuecheVorhanden(copyKuecheVorhanden);
                } else {
                    if (kuecheVorhandenShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.kuecheVorhanden = null;
                    }
                }
            }
            {
                Boolean starkstromShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.starkstrom!= null));
                if (starkstromShouldBeCopiedAndSet == Boolean.TRUE) {
                    Boolean sourceStarkstrom;
                    sourceStarkstrom = this.getStarkstrom();
                    Boolean copyStarkstrom = ((Boolean) strategy.copy(LocatorUtils.property(locator, "starkstrom", sourceStarkstrom), sourceStarkstrom, (this.starkstrom!= null)));
                    copy.setStarkstrom(copyStarkstrom);
                } else {
                    if (starkstromShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.starkstrom = null;
                    }
                }
            }
        }
        return draftCopy;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public Object createNewInstance() {
        return new BueroPraxisTyp();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
        if ((object == null)||(this.getClass()!= object.getClass())) {
            return false;
        }
        if (this == object) {
            return true;
        }
        if (!super.equals(thisLocator, thatLocator, object, strategy)) {
            return false;
        }
        final BueroPraxisTyp that = ((BueroPraxisTyp) object);
        {
            VermarktungGewerbeTyp lhsVermarktung;
            lhsVermarktung = this.getVermarktung();
            VermarktungGewerbeTyp rhsVermarktung;
            rhsVermarktung = that.getVermarktung();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "vermarktung", lhsVermarktung), LocatorUtils.property(thatLocator, "vermarktung", rhsVermarktung), lhsVermarktung, rhsVermarktung, (this.vermarktung!= null), (that.vermarktung!= null))) {
                return false;
            }
        }
        {
            BueroPraxisKategorienTyp lhsObjektkategorie2;
            lhsObjektkategorie2 = this.getObjektkategorie2();
            BueroPraxisKategorienTyp rhsObjektkategorie2;
            rhsObjektkategorie2 = that.getObjektkategorie2();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "objektkategorie2", lhsObjektkategorie2), LocatorUtils.property(thatLocator, "objektkategorie2", rhsObjektkategorie2), lhsObjektkategorie2, rhsObjektkategorie2, (this.objektkategorie2 != null), (that.objektkategorie2 != null))) {
                return false;
            }
        }
        {
            BigDecimal lhsBueroPraxisFlaeche;
            lhsBueroPraxisFlaeche = this.getBueroPraxisFlaeche();
            BigDecimal rhsBueroPraxisFlaeche;
            rhsBueroPraxisFlaeche = that.getBueroPraxisFlaeche();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "bueroPraxisFlaeche", lhsBueroPraxisFlaeche), LocatorUtils.property(thatLocator, "bueroPraxisFlaeche", rhsBueroPraxisFlaeche), lhsBueroPraxisFlaeche, rhsBueroPraxisFlaeche, (this.bueroPraxisFlaeche!= null), (that.bueroPraxisFlaeche!= null))) {
                return false;
            }
        }
        {
            BodenbelagTyp lhsBodenbelag;
            lhsBodenbelag = this.getBodenbelag();
            BodenbelagTyp rhsBodenbelag;
            rhsBodenbelag = that.getBodenbelag();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "bodenbelag", lhsBodenbelag), LocatorUtils.property(thatLocator, "bodenbelag", rhsBodenbelag), lhsBodenbelag, rhsBodenbelag, (this.bodenbelag!= null), (that.bodenbelag!= null))) {
                return false;
            }
        }
        {
            DatenVerkabelungsTyp lhsDatenVerkabelung;
            lhsDatenVerkabelung = this.getDatenVerkabelung();
            DatenVerkabelungsTyp rhsDatenVerkabelung;
            rhsDatenVerkabelung = that.getDatenVerkabelung();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "datenVerkabelung", lhsDatenVerkabelung), LocatorUtils.property(thatLocator, "datenVerkabelung", rhsDatenVerkabelung), lhsDatenVerkabelung, rhsDatenVerkabelung, (this.datenVerkabelung!= null), (that.datenVerkabelung!= null))) {
                return false;
            }
        }
        {
            JaNeinVereinbarungTyp lhsKlimaanlage;
            lhsKlimaanlage = this.getKlimaanlage();
            JaNeinVereinbarungTyp rhsKlimaanlage;
            rhsKlimaanlage = that.getKlimaanlage();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "klimaanlage", lhsKlimaanlage), LocatorUtils.property(thatLocator, "klimaanlage", rhsKlimaanlage), lhsKlimaanlage, rhsKlimaanlage, (this.klimaanlage!= null), (that.klimaanlage!= null))) {
                return false;
            }
        }
        {
            Boolean lhsKantine;
            lhsKantine = this.getKantine();
            Boolean rhsKantine;
            rhsKantine = that.getKantine();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "kantine", lhsKantine), LocatorUtils.property(thatLocator, "kantine", rhsKantine), lhsKantine, rhsKantine, (this.kantine!= null), (that.kantine!= null))) {
                return false;
            }
        }
        {
            Boolean lhsDenkmalschutzobjekt;
            lhsDenkmalschutzobjekt = this.getDenkmalschutzobjekt();
            Boolean rhsDenkmalschutzobjekt;
            rhsDenkmalschutzobjekt = that.getDenkmalschutzobjekt();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "denkmalschutzobjekt", lhsDenkmalschutzobjekt), LocatorUtils.property(thatLocator, "denkmalschutzobjekt", rhsDenkmalschutzobjekt), lhsDenkmalschutzobjekt, rhsDenkmalschutzobjekt, (this.denkmalschutzobjekt!= null), (that.denkmalschutzobjekt!= null))) {
                return false;
            }
        }
        {
            Boolean lhsKeller;
            lhsKeller = this.getKeller();
            Boolean rhsKeller;
            rhsKeller = that.getKeller();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "keller", lhsKeller), LocatorUtils.property(thatLocator, "keller", rhsKeller), lhsKeller, rhsKeller, (this.keller!= null), (that.keller!= null))) {
                return false;
            }
        }
        {
            Boolean lhsBarrierefrei;
            lhsBarrierefrei = this.getBarrierefrei();
            Boolean rhsBarrierefrei;
            rhsBarrierefrei = that.getBarrierefrei();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "barrierefrei", lhsBarrierefrei), LocatorUtils.property(thatLocator, "barrierefrei", rhsBarrierefrei), lhsBarrierefrei, rhsBarrierefrei, (this.barrierefrei!= null), (that.barrierefrei!= null))) {
                return false;
            }
        }
        {
            Boolean lhsKuecheVorhanden;
            lhsKuecheVorhanden = this.getKuecheVorhanden();
            Boolean rhsKuecheVorhanden;
            rhsKuecheVorhanden = that.getKuecheVorhanden();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "kuecheVorhanden", lhsKuecheVorhanden), LocatorUtils.property(thatLocator, "kuecheVorhanden", rhsKuecheVorhanden), lhsKuecheVorhanden, rhsKuecheVorhanden, (this.kuecheVorhanden!= null), (that.kuecheVorhanden!= null))) {
                return false;
            }
        }
        {
            Boolean lhsStarkstrom;
            lhsStarkstrom = this.getStarkstrom();
            Boolean rhsStarkstrom;
            rhsStarkstrom = that.getStarkstrom();
            if (!strategy.equals(LocatorUtils.property(thisLocator, "starkstrom", lhsStarkstrom), LocatorUtils.property(thatLocator, "starkstrom", rhsStarkstrom), lhsStarkstrom, rhsStarkstrom, (this.starkstrom!= null), (that.starkstrom!= null))) {
                return false;
            }
        }
        return true;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T02:52:47+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(Object object) {
        final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
        return equals(null, null, object, strategy);
    }

}


package org.openestate.io.kyero.xml;

import java.io.Serializable;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Generated;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlSchemaType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import org.jvnet.jaxb2_commons.lang.CopyStrategy2;
import org.jvnet.jaxb2_commons.lang.CopyTo2;
import org.jvnet.jaxb2_commons.lang.Equals2;
import org.jvnet.jaxb2_commons.lang.EqualsStrategy2;
import org.jvnet.jaxb2_commons.lang.JAXBCopyStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBEqualsStrategy;
import org.jvnet.jaxb2_commons.lang.JAXBToStringStrategy;
import org.jvnet.jaxb2_commons.lang.ToString2;
import org.jvnet.jaxb2_commons.lang.ToStringStrategy2;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;
import org.jvnet.jaxb2_commons.locator.util.LocatorUtils;

/**
 *
Java class for imagesType complex type.
 *
 *
The following schema fragment specifies the expected content contained within this class.
 *
 *

 * <complexType name="imagesType">
 *   <complexContent>
 *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *       <sequence>
 *         <element name="image" maxOccurs="50" minOccurs="0">
 *           <complexType>
 *             <complexContent>
 *               <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
 *                 <all>
 *                   <element name="url" type="{}imageUrlType" minOccurs="0"/>
 *                 </all>
 *                 <attribute name="id" use="required" type="{}imageAttributeType" />
 *               </restriction>
 *             </complexContent>
 *           </complexType>
 *         </element>
 *       </sequence>
 *     </restriction>
 *   </complexContent>
 * </complexType>
 *

 *
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "imagesType", propOrder = {
    "image"
})
@Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
public class ImagesType implements Serializable, Cloneable, CopyTo2, Equals2, ToString2
{

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    protected List<ImagesType.Image> image;

    /**
     * Gets the value of the image property.
     *
     *

     * This accessor method returns a reference to the live list,
     * not a snapshot. Therefore any modification you make to the
     * returned list will be present inside the JAXB object.
     * This is why there is not a set method for the image property.
     *
     *

     * For example, to add a new item, do as follows:
     *

     *    getImage().add(newItem);
     *

     *
     *
     *

     * Objects of the following type(s) are allowed in the list
     * {@link ImagesType.Image }
     *
     *
     */
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public List<ImagesType.Image> getImage() {
        if (image == null) {
            image = new ArrayList<ImagesType.Image>();
        }
        return this.image;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public String toString() {
        final ToStringStrategy2 strategy = JAXBToStringStrategy.INSTANCE;
        final StringBuilder buffer = new StringBuilder();
        append(null, buffer, strategy);
        return buffer.toString();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        strategy.appendStart(locator, this, buffer);
        appendFields(locator, buffer, strategy);
        strategy.appendEnd(locator, this, buffer);
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
        {
            List<ImagesType.Image> theImage;
            theImage = (((this.image!= null)&&(!this.image.isEmpty()))?this.getImage():null);
            strategy.appendField(locator, this, "image", buffer, theImage, ((this.image!= null)&&(!this.image.isEmpty())));
        }
        return buffer;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public Object clone() {
        return copyTo(createNewInstance());
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(Object target) {
        final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
        return copyTo(null, target, strategy);
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public Object copyTo(ObjectLocator locator, Object target, CopyStrategy2 strategy) {
        final Object draftCopy = ((target == null)?createNewInstance():target);
        if (draftCopy instanceof ImagesType) {
            final ImagesType copy = ((ImagesType) draftCopy);
            {
                Boolean imageShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, ((this.image!= null)&&(!this.image.isEmpty())));
                if (imageShouldBeCopiedAndSet == Boolean.TRUE) {
                    List<ImagesType.Image> sourceImage;
                    sourceImage = (((this.image!= null)&&(!this.image.isEmpty()))?this.getImage():null);
                    @SuppressWarnings("unchecked")
                    List<ImagesType.Image> copyImage = ((List<ImagesType.Image> ) strategy.copy(LocatorUtils.property(locator, "image", sourceImage), sourceImage, ((this.image!= null)&&(!this.image.isEmpty()))));
                    copy.image = null;
                    if (copyImage!= null) {
                        List<ImagesType.Image> uniqueImagel = copy.getImage();
                        uniqueImagel.addAll(copyImage);
                    }
                } else {
                    if (imageShouldBeCopiedAndSet == Boolean.FALSE) {
                        copy.image = null;
                    }
                }
            }
        }
        return draftCopy;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public Object createNewInstance() {
        return new ImagesType();
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
        if ((object == null)||(this.getClass()!= object.getClass())) {
            return false;
        }
        if (this == object) {
            return true;
        }
        final ImagesType that = ((ImagesType) object);
        {
            List<ImagesType.Image> lhsImage;
            lhsImage = (((this.image!= null)&&(!this.image.isEmpty()))?this.getImage():null);
            List<ImagesType.Image> rhsImage;
            rhsImage = (((that.image!= null)&&(!that.image.isEmpty()))?that.getImage():null);
            if (!strategy.equals(LocatorUtils.property(thisLocator, "image", lhsImage), LocatorUtils.property(thatLocator, "image", rhsImage), lhsImage, rhsImage, ((this.image!= null)&&(!this.image.isEmpty())), ((that.image!= null)&&(!that.image.isEmpty())))) {
                return false;
            }
        }
        return true;
    }

    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public boolean equals(Object object) {
        final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
        return equals(null, null, object, strategy);
    }

    /**
     *
Java class for anonymous complex type.
     *
     *
The following schema fragment specifies the expected content contained within this class.
     *
     *

     * <complexType>
     *   <complexContent>
     *     <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
     *       <all>
     *         <element name="url" type="{}imageUrlType" minOccurs="0"/>
     *       </all>
     *       <attribute name="id" use="required" type="{}imageAttributeType" />
     *     </restriction>
     *   </complexContent>
     * </complexType>
     *

     *
     *
     */
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(name = "", propOrder = {

    })
    @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
    public static class Image implements Serializable, Cloneable, CopyTo2, Equals2, ToString2
    {

        @XmlElement(type = String.class)
        @XmlJavaTypeAdapter(Adapter14 .class)
        @XmlSchemaType(name = "token")
        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        protected URI url;
        @XmlAttribute(name = "id", required = true)
        @XmlJavaTypeAdapter(Adapter15 .class)
        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        protected Integer id;

        /**
         * Gets the value of the url property.
         *
         * @return
         *     possible object is
         *     {@link String }
         *
         */
        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public URI getUrl() {
            return url;
        }

        /**
         * Sets the value of the url property.
         *
         * @param value
         *     allowed object is
         *     {@link String }
         *
         */
        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public void setUrl(URI value) {
            this.url = value;
        }

        /**
         * Gets the value of the id property.
         *
         * @return
         *     possible object is
         *     {@link String }
         *
         */
        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public Integer getId() {
            return id;
        }

        /**
         * Sets the value of the id property.
         *
         * @param value
         *     allowed object is
         *     {@link String }
         *
         */
        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public void setId(Integer value) {
            this.id = value;
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public String toString() {
            final ToStringStrategy2 strategy = JAXBToStringStrategy.INSTANCE;
            final StringBuilder buffer = new StringBuilder();
            append(null, buffer, strategy);
            return buffer.toString();
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public StringBuilder append(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
            strategy.appendStart(locator, this, buffer);
            appendFields(locator, buffer, strategy);
            strategy.appendEnd(locator, this, buffer);
            return buffer;
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public StringBuilder appendFields(ObjectLocator locator, StringBuilder buffer, ToStringStrategy2 strategy) {
            {
                URI theUrl;
                theUrl = this.getUrl();
                strategy.appendField(locator, this, "url", buffer, theUrl, (this.url!= null));
            }
            {
                Integer theId;
                theId = this.getId();
                strategy.appendField(locator, this, "id", buffer, theId, (this.id!= null));
            }
            return buffer;
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public Object clone() {
            return copyTo(createNewInstance());
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public Object copyTo(Object target) {
            final CopyStrategy2 strategy = JAXBCopyStrategy.INSTANCE;
            return copyTo(null, target, strategy);
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public Object copyTo(ObjectLocator locator, Object target, CopyStrategy2 strategy) {
            final Object draftCopy = ((target == null)?createNewInstance():target);
            if (draftCopy instanceof ImagesType.Image) {
                final ImagesType.Image copy = ((ImagesType.Image) draftCopy);
                {
                    Boolean urlShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.url!= null));
                    if (urlShouldBeCopiedAndSet == Boolean.TRUE) {
                        URI sourceUrl;
                        sourceUrl = this.getUrl();
                        URI copyUrl = ((URI) strategy.copy(LocatorUtils.property(locator, "url", sourceUrl), sourceUrl, (this.url!= null)));
                        copy.setUrl(copyUrl);
                    } else {
                        if (urlShouldBeCopiedAndSet == Boolean.FALSE) {
                            copy.url = null;
                        }
                    }
                }
                {
                    Boolean idShouldBeCopiedAndSet = strategy.shouldBeCopiedAndSet(locator, (this.id!= null));
                    if (idShouldBeCopiedAndSet == Boolean.TRUE) {
                        Integer sourceId;
                        sourceId = this.getId();
                        Integer copyId = ((Integer) strategy.copy(LocatorUtils.property(locator, "id", sourceId), sourceId, (this.id!= null)));
                        copy.setId(copyId);
                    } else {
                        if (idShouldBeCopiedAndSet == Boolean.FALSE) {
                            copy.id = null;
                        }
                    }
                }
            }
            return draftCopy;
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public Object createNewInstance() {
            return new ImagesType.Image();
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
            if ((object == null)||(this.getClass()!= object.getClass())) {
                return false;
            }
            if (this == object) {
                return true;
            }
            final ImagesType.Image that = ((ImagesType.Image) object);
            {
                URI lhsUrl;
                lhsUrl = this.getUrl();
                URI rhsUrl;
                rhsUrl = that.getUrl();
                if (!strategy.equals(LocatorUtils.property(thisLocator, "url", lhsUrl), LocatorUtils.property(thatLocator, "url", rhsUrl), lhsUrl, rhsUrl, (this.url!= null), (that.url!= null))) {
                    return false;
                }
            }
            {
                Integer lhsId;
                lhsId = this.getId();
                Integer rhsId;
                rhsId = that.getId();
                if (!strategy.equals(LocatorUtils.property(thisLocator, "id", lhsId), LocatorUtils.property(thatLocator, "id", rhsId), lhsId, rhsId, (this.id!= null), (that.id!= null))) {
                    return false;
                }
            }
            return true;
        }

        @Generated(value = "com.sun.tools.xjc.Driver", date = "2018-10-12T01:43:04+02:00", comments = "JAXB RI v2.2.11")
        public boolean equals(Object object) {
            final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
            return equals(null, null, object, strategy);
        }

    }

}