public Object copyTo(ObjectLocator locator, Object target, CopyStrategy strategy) {
   if (null == target) {
     throw new IllegalArgumentException(
         "Target argument must not be null for abstract copyable classes.");
   }
   super.copyTo(locator, target, strategy);
   if (target instanceof AbstractCoordinateOperationType) {
     final AbstractCoordinateOperationType copy = ((AbstractCoordinateOperationType) target);
     if (this.isSetDomainOfValidity()) {
       DomainOfValidityElement sourceDomainOfValidity;
       sourceDomainOfValidity = this.getDomainOfValidity();
       DomainOfValidityElement copyDomainOfValidity =
           ((DomainOfValidityElement)
               strategy.copy(
                   LocatorUtils.property(locator, "domainOfValidity", sourceDomainOfValidity),
                   sourceDomainOfValidity));
       copy.setDomainOfValidity(copyDomainOfValidity);
     } else {
       copy.domainOfValidity = null;
     }
     if (this.isSetScope()) {
       List<String> sourceScope;
       sourceScope = this.getScope();
       @SuppressWarnings("unchecked")
       List<String> copyScope =
           ((List<String>)
               strategy.copy(LocatorUtils.property(locator, "scope", sourceScope), sourceScope));
       copy.unsetScope();
       List<String> uniqueScopel = copy.getScope();
       uniqueScopel.addAll(copyScope);
     } else {
       copy.unsetScope();
     }
     if (this.isSetOperationVersion()) {
       String sourceOperationVersion;
       sourceOperationVersion = this.getOperationVersion();
       String copyOperationVersion =
           ((String)
               strategy.copy(
                   LocatorUtils.property(locator, "operationVersion", sourceOperationVersion),
                   sourceOperationVersion));
       copy.setOperationVersion(copyOperationVersion);
     } else {
       copy.operationVersion = null;
     }
     if (this.isSetCoordinateOperationAccuracy()) {
       List<CoordinateOperationAccuracyElement> sourceCoordinateOperationAccuracy;
       sourceCoordinateOperationAccuracy = this.getCoordinateOperationAccuracy();
       @SuppressWarnings("unchecked")
       List<CoordinateOperationAccuracyElement> copyCoordinateOperationAccuracy =
           ((List<CoordinateOperationAccuracyElement>)
               strategy.copy(
                   LocatorUtils.property(
                       locator, "coordinateOperationAccuracy", sourceCoordinateOperationAccuracy),
                   sourceCoordinateOperationAccuracy));
       copy.unsetCoordinateOperationAccuracy();
       List<CoordinateOperationAccuracyElement> uniqueCoordinateOperationAccuracyl =
           copy.getCoordinateOperationAccuracy();
       uniqueCoordinateOperationAccuracyl.addAll(copyCoordinateOperationAccuracy);
     } else {
       copy.unsetCoordinateOperationAccuracy();
     }
     if (this.isSetSourceCRS()) {
       CRSPropertyType sourceSourceCRS;
       sourceSourceCRS = this.getSourceCRS();
       CRSPropertyType copySourceCRS =
           ((CRSPropertyType)
               strategy.copy(
                   LocatorUtils.property(locator, "sourceCRS", sourceSourceCRS), sourceSourceCRS));
       copy.setSourceCRS(copySourceCRS);
     } else {
       copy.sourceCRS = null;
     }
     if (this.isSetTargetCRS()) {
       CRSPropertyType sourceTargetCRS;
       sourceTargetCRS = this.getTargetCRS();
       CRSPropertyType copyTargetCRS =
           ((CRSPropertyType)
               strategy.copy(
                   LocatorUtils.property(locator, "targetCRS", sourceTargetCRS), sourceTargetCRS));
       copy.setTargetCRS(copyTargetCRS);
     } else {
       copy.targetCRS = null;
     }
   }
   return target;
 }
 public void mergeFrom(
     ObjectLocator leftLocator,
     ObjectLocator rightLocator,
     Object left,
     Object right,
     MergeStrategy strategy) {
   super.mergeFrom(leftLocator, rightLocator, left, right, strategy);
   if (right instanceof AbstractCoordinateOperationType) {
     final AbstractCoordinateOperationType target = this;
     final AbstractCoordinateOperationType leftObject = ((AbstractCoordinateOperationType) left);
     final AbstractCoordinateOperationType rightObject = ((AbstractCoordinateOperationType) right);
     {
       DomainOfValidityElement lhsDomainOfValidity;
       lhsDomainOfValidity = leftObject.getDomainOfValidity();
       DomainOfValidityElement rhsDomainOfValidity;
       rhsDomainOfValidity = rightObject.getDomainOfValidity();
       target.setDomainOfValidity(
           ((DomainOfValidityElement)
               strategy.merge(
                   LocatorUtils.property(leftLocator, "domainOfValidity", lhsDomainOfValidity),
                   LocatorUtils.property(rightLocator, "domainOfValidity", rhsDomainOfValidity),
                   lhsDomainOfValidity,
                   rhsDomainOfValidity)));
     }
     {
       List<String> lhsScope;
       lhsScope = leftObject.getScope();
       List<String> rhsScope;
       rhsScope = rightObject.getScope();
       target.unsetScope();
       List<String> uniqueScopel = target.getScope();
       uniqueScopel.addAll(
           ((List<String>)
               strategy.merge(
                   LocatorUtils.property(leftLocator, "scope", lhsScope),
                   LocatorUtils.property(rightLocator, "scope", rhsScope),
                   lhsScope,
                   rhsScope)));
     }
     {
       String lhsOperationVersion;
       lhsOperationVersion = leftObject.getOperationVersion();
       String rhsOperationVersion;
       rhsOperationVersion = rightObject.getOperationVersion();
       target.setOperationVersion(
           ((String)
               strategy.merge(
                   LocatorUtils.property(leftLocator, "operationVersion", lhsOperationVersion),
                   LocatorUtils.property(rightLocator, "operationVersion", rhsOperationVersion),
                   lhsOperationVersion,
                   rhsOperationVersion)));
     }
     {
       List<CoordinateOperationAccuracyElement> lhsCoordinateOperationAccuracy;
       lhsCoordinateOperationAccuracy = leftObject.getCoordinateOperationAccuracy();
       List<CoordinateOperationAccuracyElement> rhsCoordinateOperationAccuracy;
       rhsCoordinateOperationAccuracy = rightObject.getCoordinateOperationAccuracy();
       target.unsetCoordinateOperationAccuracy();
       List<CoordinateOperationAccuracyElement> uniqueCoordinateOperationAccuracyl =
           target.getCoordinateOperationAccuracy();
       uniqueCoordinateOperationAccuracyl.addAll(
           ((List<CoordinateOperationAccuracyElement>)
               strategy.merge(
                   LocatorUtils.property(
                       leftLocator, "coordinateOperationAccuracy", lhsCoordinateOperationAccuracy),
                   LocatorUtils.property(
                       rightLocator,
                       "coordinateOperationAccuracy",
                       rhsCoordinateOperationAccuracy),
                   lhsCoordinateOperationAccuracy,
                   rhsCoordinateOperationAccuracy)));
     }
     {
       CRSPropertyType lhsSourceCRS;
       lhsSourceCRS = leftObject.getSourceCRS();
       CRSPropertyType rhsSourceCRS;
       rhsSourceCRS = rightObject.getSourceCRS();
       target.setSourceCRS(
           ((CRSPropertyType)
               strategy.merge(
                   LocatorUtils.property(leftLocator, "sourceCRS", lhsSourceCRS),
                   LocatorUtils.property(rightLocator, "sourceCRS", rhsSourceCRS),
                   lhsSourceCRS,
                   rhsSourceCRS)));
     }
     {
       CRSPropertyType lhsTargetCRS;
       lhsTargetCRS = leftObject.getTargetCRS();
       CRSPropertyType rhsTargetCRS;
       rhsTargetCRS = rightObject.getTargetCRS();
       target.setTargetCRS(
           ((CRSPropertyType)
               strategy.merge(
                   LocatorUtils.property(leftLocator, "targetCRS", lhsTargetCRS),
                   LocatorUtils.property(rightLocator, "targetCRS", rhsTargetCRS),
                   lhsTargetCRS,
                   rhsTargetCRS)));
     }
   }
 }
 public boolean equals(
     ObjectLocator thisLocator,
     ObjectLocator thatLocator,
     Object object,
     EqualsStrategy strategy) {
   if (!(object instanceof AbstractCoordinateOperationType)) {
     return false;
   }
   if (this == object) {
     return true;
   }
   if (!super.equals(thisLocator, thatLocator, object, strategy)) {
     return false;
   }
   final AbstractCoordinateOperationType that = ((AbstractCoordinateOperationType) object);
   {
     DomainOfValidityElement lhsDomainOfValidity;
     lhsDomainOfValidity = this.getDomainOfValidity();
     DomainOfValidityElement rhsDomainOfValidity;
     rhsDomainOfValidity = that.getDomainOfValidity();
     if (!strategy.equals(
         LocatorUtils.property(thisLocator, "domainOfValidity", lhsDomainOfValidity),
         LocatorUtils.property(thatLocator, "domainOfValidity", rhsDomainOfValidity),
         lhsDomainOfValidity,
         rhsDomainOfValidity)) {
       return false;
     }
   }
   {
     List<String> lhsScope;
     lhsScope = this.getScope();
     List<String> rhsScope;
     rhsScope = that.getScope();
     if (!strategy.equals(
         LocatorUtils.property(thisLocator, "scope", lhsScope),
         LocatorUtils.property(thatLocator, "scope", rhsScope),
         lhsScope,
         rhsScope)) {
       return false;
     }
   }
   {
     String lhsOperationVersion;
     lhsOperationVersion = this.getOperationVersion();
     String rhsOperationVersion;
     rhsOperationVersion = that.getOperationVersion();
     if (!strategy.equals(
         LocatorUtils.property(thisLocator, "operationVersion", lhsOperationVersion),
         LocatorUtils.property(thatLocator, "operationVersion", rhsOperationVersion),
         lhsOperationVersion,
         rhsOperationVersion)) {
       return false;
     }
   }
   {
     List<CoordinateOperationAccuracyElement> lhsCoordinateOperationAccuracy;
     lhsCoordinateOperationAccuracy = this.getCoordinateOperationAccuracy();
     List<CoordinateOperationAccuracyElement> rhsCoordinateOperationAccuracy;
     rhsCoordinateOperationAccuracy = that.getCoordinateOperationAccuracy();
     if (!strategy.equals(
         LocatorUtils.property(
             thisLocator, "coordinateOperationAccuracy", lhsCoordinateOperationAccuracy),
         LocatorUtils.property(
             thatLocator, "coordinateOperationAccuracy", rhsCoordinateOperationAccuracy),
         lhsCoordinateOperationAccuracy,
         rhsCoordinateOperationAccuracy)) {
       return false;
     }
   }
   {
     CRSPropertyType lhsSourceCRS;
     lhsSourceCRS = this.getSourceCRS();
     CRSPropertyType rhsSourceCRS;
     rhsSourceCRS = that.getSourceCRS();
     if (!strategy.equals(
         LocatorUtils.property(thisLocator, "sourceCRS", lhsSourceCRS),
         LocatorUtils.property(thatLocator, "sourceCRS", rhsSourceCRS),
         lhsSourceCRS,
         rhsSourceCRS)) {
       return false;
     }
   }
   {
     CRSPropertyType lhsTargetCRS;
     lhsTargetCRS = this.getTargetCRS();
     CRSPropertyType rhsTargetCRS;
     rhsTargetCRS = that.getTargetCRS();
     if (!strategy.equals(
         LocatorUtils.property(thisLocator, "targetCRS", lhsTargetCRS),
         LocatorUtils.property(thatLocator, "targetCRS", rhsTargetCRS),
         lhsTargetCRS,
         rhsTargetCRS)) {
       return false;
     }
   }
   return true;
 }