Bug 873866

Summary: Enable API Diff Checkbuild between JON minor/micro versions
Product: [JBoss] JBoss Operations Network Reporter: Mike Foley <mfoley>
Component: Plugin ContainerAssignee: Lukas Krejci <lkrejci>
Status: CLOSED CURRENTRELEASE QA Contact: Mike Foley <mfoley>
Severity: urgent Docs Contact:
Priority: urgent    
Version: JON 3.1.1CC: jshaughn, lkrejci, loleary, spinder
Target Milestone: ER03   
Target Release: JON 3.2.0   
Hardware: Unspecified   
OS: Unspecified   
Whiteboard:
Fixed In Version: Doc Type: Bug Fix
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2014-01-02 20:43:15 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:
Bug Depends On: 803737    
Bug Blocks: 1012435    

Description Mike Foley 2012-11-06 20:58:41 UTC
Description of problem: API Diff Check by development 

See BZ 863063

perform the exact same tests, as BZ 863063

generate the API diff reports between JON 3.1.1 and JON 3.1.2.  
attach the reports to this BZ
review the diff reports with the team

Comment 1 Charles Crouch 2012-11-06 23:47:17 UTC
We need a jenkins job running these checks

Comment 2 Lukas Krejci 2012-11-13 10:36:11 UTC
Jenkins job comparing JON3.1.1 artifacts against release/jon3.1.x branch has been created - rhq-release-api-checks-against-latest-released

Comment 3 Mike Foley 2012-11-15 19:56:05 UTC
documenting the jenkins job is create and running.

http://jenkins.mw.lab.eng.bos.redhat.com/hudson/job/rhq-release-api-check-against-latest-released/

tests are currently failing.

please set to ON_QA again when the job is passing

Comment 10 Lukas Krejci 2013-09-13 15:11:05 UTC
We need to think about what we want from the API check job for the JON 3.2.0 release.

What's the API compatibility requirements for micro/minor/major releases?

micro=back-compat, only bugfixes
minor=back-compat + new features
major=incompatible changes + new features?

If that's the case, we can either declare this BZ a noop, because we should have the same rules in RHQ or we could be extra dutiful and manually check our intentional-changes-since-*.xml files for incompatible changes that slipped in by accident.

Comment 11 Larry O'Leary 2013-09-18 02:18:01 UTC
@Lukas, from a supportability perspective, the compatibility requirements you outline are correct:  

> What's the API compatibility requirements for micro/minor/major releases?
> 
> micro=back-compat, only bugfixes
> minor=back-compat + new features
> major=incompatible changes + new features?


The only note I will make is that even on major releases we should be backward compatible as much as possible but this would be the only place a breaking change could be inserted with the appropriate approval from the product team. Otherwise, any new functionality or breaking changes would have to be wrapped by product specific API definitions as appropriate. But, in general, the major release point is where such conversations can take place. Prior to that (micro or minor), any breaking change that requires a user to recompile their client application code or update their libraries or change command-line scripts is unacceptable. 

If we are already doing this upstream then perhaps this is a step in the right direction but we should still duplicate this task as part of the product build. Currently we share the same repository but there is always the chance that will change. If so, we must ensure that the API check performed for the product build can only be manipulated by the product release and build teams and that any changes there are considered very carefully prior to them being submitted.

I think the biggest issue we must deal with is that even after the API check jobs were put into place, we still seem to be picking up breaking changes in the public APIs (remote API, plug-in APIs, domain API, etc). 

The end goal should be that I can validate the 3.1.0, 3.1.1, and 3.1.2 build against the 3.2 GA build and get the same results.

Comment 13 Lukas Krejci 2013-09-30 15:10:36 UTC
Commits in master branch minimizing the API:

commit 9b38a7ecf4853047cfc3635bff6ec270954e3541
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 17:43:01 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    Commit 0ba8c5f (among other things) removed several public constants in
    MeasurementScheduleCriteria because they were improperly named and didn't
    do what they seemed to.
    
    Users might be using those constants even if they don't do what they're
    supposed to. The constants have therefore been re-introduced with a
    deprecation notice.

commit 8de9364b5f83e26bdda3eb16543c0ba13768393d
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 16:20:45 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    Commit 26959a31d8c37bcb86dc6a845b5707a277bff3cb made the constructor of
    the DatabaseQueryUtility private, which it should be, and removed an
    unused class.
    
    While the chances of anyone either instantiating the utility class or using
    the absolutely useless DatabaseQueryUtility.StatementParameter are very
    slim, we need to keep API back-compat.
    
    The public constructor and the class have been reintroduced with
    a deprecation notice.

commit f78beeb0deff4fc4801f2236881e45d659bd578f
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 15:06:43 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    The fix for bug 840512 changed the way we handle the value of an obfuscated
    property, which rendered the obfuscate() method unused. It has been removed
    which unfortunately is an API breaking change due to its protected
    visibility.
    
    While the chances of anyone using that method are miniscule we cannot break
    the API. The method was re-introduced but made a NOOP so that it doesn't
    break the obfuscation. The deprecation notice on the method suggests to
    stop using it.

commit aeae80458d5175f2e5c3cc164943c561da2cc0f3
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 15:02:58 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    The fix for bug 1000006 declared the constructor of
    o.r.c.d.configuration.ConfigurationUtility private. It previously had the
    default pulic constructor and hence this was a API breaking change.
    
    While the utility class should have had the private constructor in first
    place, we cannot break the API, so the public constructor has been
    re-introduced with a deprecation notice.

commit 53f3329850efcb7fd0e18fca2964c8c4dbb6a3b1
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 14:46:57 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    Commit 85f75e0 removed 2 enum fields from the server details, because they
    are no longer used due to our move from DB to Cassandra for metric storage.
    
    Nevertheless the clients might be using those fields to get back that
    information. To retain the backwards compatibility, we need to keep those
    enum fields, making the server details work without recompilation.
    The server details will no longer contain any information for the for those
    fields. The fact that some information might be missing is part of the
    contract of the ServerDetails class though, so the users should be able to
    handle that situation.

commit be6f70ce0ae66b544965636f503bbe6e4732958b
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 14:40:42 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    Commit a4b78eb6e1adeffaa519115a9ef07b3f00025168 fixed the handling of the
    server status, but changed the signature of
    o.r.c.d.cloud.Server#clearStatus() method in an incompatible way. Adding
    the old method back with a deprecation notice.
    
    The chances of anyone using this method are miniscule but we need to retain
    back-compat.

commit 9a5a5a7a1b9153968474a459f097e73d5421e038
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 27 14:37:22 2013 +0200

    [BZ 873866] - Minimizing API changes between JON 3.1.2.GA and JON 3.2.0.GA.
    
    Bug 888927 changed the signature of the
    AlertConditionAvailabilityCategoryComposite class to add a missing
    parameter.
    
    While the chances of anyone using this method miniscule, we need to retain
    the back-compat. Therefore I added the wrong constructor back with
    a deprecation notice.

commit 92aaf569774b9328812f447cc940719287540883
Author: Lukas Krejci <lkrejci>
Date:   Mon Sep 23 15:37:06 2013 +0200

    Adding intentional api changes for the new methods ported over from RHQ 4.4.0.

commit 2a152b1f670099c7f3341abe8ca35bac11ff29bd
Author: Lukas Krejci <lkrejci>
Date:   Fri Sep 20 21:09:02 2013 +0200

    (Almost) regain back-compat with RHQ 4.4.0 in script bindings.

commit 3885d705e8b31485fae92e8df5ae2209a4c6a5d0
Author: Jirka Kremser <jkremser>
Date:   Mon Sep 30 16:55:49 2013 +0200

    api checks: reverting a change that broke JON 3.2 backward compatibility

commit 1b567f2f9eb2e81f86dbedf60cf85b42283aea05
Author: Jirka Kremser <jkremser>
Date:   Thu Sep 26 22:36:43 2013 +0200

    api checks: Adding back the org.rhq.enterprise.server.measurement.MeasurementAggregate see the commit c2a609f48 for more details.

commit c2a609f48d5f364310060d031069495679b69c6f
Author: Jirka Kremser <jkremser>
Date:   Thu Sep 26 22:32:46 2013 +0200

    Adding back the org.rhq.enterprise.server.measurement.MeasurementAggregate because of the JON 3.2 backward compatibility breakage (for EJB remote clients). This contains also adding a new method, deprecating the old method and the added class so that it can be removed in the next major release.

Comment 14 Lukas Krejci 2013-10-02 12:46:53 UTC
This is a complete set of differences between JON 3.1.2.GA and JON 3.2.0 as of 2013-10-01. This comes from doing:

cat `find $JON_REPO_CHECKOUT/jon/approved-api-changes -name '*.xml'`


<?xml version="1.0"?>
<differences>

  <!-- since 4.4.0 -->
  <difference>
      <className>org/rhq/core/pluginapi/inventory/ResourceContext</className>
      <differenceType>7004</differenceType><!-- number of args changed -->
      <method>ResourceContext(*)</method>
      <justification>Instances of this class are provided by the API, it is not supposed to be instantiated by users.</justification>
  </difference>
  <difference>
      <className>org/rhq/core/pluginapi/upgrade/ResourceUpgradeContext</className>
      <differenceType>7004</differenceType><!-- number of args changed -->
      <method>ResourceUpgradeContext(*)</method>
      <justification>Instances of this class are provided by the API, it is not supposed to be instantiated by users.</justification>
  </difference>

  <!-- since 4.6.0 -->
  <difference>
      <className>org/rhq/core/pluginapi/inventory/DisabledResourceDiscoveryComponent</className>
      <differenceType>8001</differenceType><!-- Class Removed -->
      <justification>This class was used as a hot fix (13cb988bb4835289393c8e3f736918651d6e2bae) to some a issue on Jan 25 2013. Now it is not used anymore, because the resource type ignoring solves the issue.</justification>
  </difference>

  <difference>
      <className>org/rhq/core/pluginapi/inventory/DisabledResourceComponent</className>
      <differenceType>8001</differenceType><!-- Class Removed -->
      <justification>This class was used as a hot fix (13cb988bb4835289393c8e3f736918651d6e2bae) to some a issue on Jan 25 2013. Now it is not used anymore, because the resource type ignoring solves the issue.</justification>
  </difference>

    <!-- since 4.6.0 -->
    <difference>
        <className>org/rhq/core/domain/criteria/BaseCriteria</className>
        <differenceType>7012</differenceType><!-- method added -->
        <method>void addSortId(org.rhq.core.domain.util.PageOrdering)</method>
        <justification>
            We are adding a default addSortId operation to all criteria to support paging through
            large result sets. This interface is not supposed to be implemented by the users.
        </justification>
    </difference>
    <difference>
        <className>org/rhq/core/domain/criteria/BaseCriteria</className>
        <differenceType>7012</differenceType><!-- method added -->
        <method>java.util.List getOrderingFieldNames()</method>
        <justification>
            We are adding an operation to return FieldOrdering to support paging through
            large result sets. This interface is not supposed to be implemented by the users.
        </justification>
    </difference>
    <difference>
        <className>org/rhq/core/domain/criteria/SavedSearchCriteria</className>
        <differenceType>6003</differenceType> <!-- Value of compile-time constant has changed -->
        <field>serialVersionUID</field>
        <justification>
            The serialization format of this class has changed.
        </justification>
    </difference>
    <difference>
        <className>org/rhq/core/domain/criteria/SavedSearchCriteria</className>
        <differenceType>6010</differenceType> <!-- Field Less Accessible -->
        <field>serialVersionUID</field>
        <justification>
            The serialVersionUID should be private. This fields is meant to be used by JVM not
            by users.
        </justification>
    </difference>

    <!-- since 4.7.0 -->
    <difference>
        <className>org/rhq/core/domain/measurement/MeasurementBaseline</className>
        <differenceType>6001</differenceType><!-- removed field -->
        <field>NATIVE_QUERY_CALC_FIRST_AUTOBASELINE_ORACLE</field>
        <justification>
            Removing MeasurementBaseline.NATIVE_QUERY_CALC_FIRST_AUTOBASELINE_ORACLE. The constants for native queries shouldn't be exposed at all.
        </justification>
    </difference>
    <difference>
        <className>org/rhq/core/domain/measurement/MeasurementBaseline</className>
        <differenceType>6001</differenceType><!-- removed field -->
        <field>NATIVE_QUERY_CALC_FIRST_AUTOBASELINE_POSTGRES</field>
        <justification>
            Removing MeasurementBaseline.NATIVE_QUERY_CALC_FIRST_AUTOBASELINE_POSTGRES. The constants for native queries shouldn't be exposed at all.        
        </justification>
    </difference>
    <difference>
        <className>org/rhq/core/domain/measurement/MeasurementBaseline</className>
        <differenceType>6001</differenceType><!-- removed field -->
        <field>NATIVE_QUERY_CALC_FIRST_AUTOBASELINE_SQLSERVER</field>
        <justification>
            Removing MeasurementBaseline.NATIVE_QUERY_CALC_FIRST_AUTOBASELINE_SQLSERVER. The constants for native queries shouldn't be exposed at all.
        </justification>
    </difference>

    
    
    
    <!-- since 4.4.0 -->
   <difference>
      <className>org/rhq/enterprise/server/content/RepoManagerRemote</className>
      <differenceType>7012</differenceType><!-- method added to an interface -->
      <method>byte[] getPackageVersionBytes(org.rhq.core.domain.auth.Subject, int, int)</method>
      <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
   </difference>
   <difference>
      <className>org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote</className>
      <differenceType>7012</differenceType><!-- method added to an interface -->
      <method>java.util.Set findLiveDataForGroup(org.rhq.core.domain.auth.Subject, int, int[], int[])</method>
      <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
   </difference>   

   <!-- since 4.5.1 -->
   <difference>
    <className>**/WebservicesRemote</className>
    <differenceType>8001</differenceType> <!-- class removed -->
    <justification>Removed already deprecated web services in this release</justification>
  </difference>
  <difference>
    <className>**/WebServiceTestRemote</className>
    <differenceType>8001</differenceType> <!-- class removed -->
    <justification>Removed already deprecated web services in this release</justification>
  </difference>
  <difference>
    <className>**/RemoteWsInvocationHandler</className>
    <differenceType>8001</differenceType> <!-- class removed -->
    <justification>Removed already deprecated web services in this release</justification>
  </difference>
  <difference>
    <className>**/ServerVersion</className>
    <differenceType>8001</differenceType> <!-- class removed -->
    <justification>Removed already deprecated web services in this release, this file was used for WS client-server
      compatibility</justification>
  </difference>
  <difference>
    <className>org/rhq/enterprise/server/operation/OperationManagerRemote</className>
    <differenceType>7012</differenceType> <!-- method added to an interface -->
    <method>org.rhq.core.domain.operation.bean.ResourceOperationSchedule scheduleResourceOperationUsingCron(org.rhq.core.domain.auth.Subject, int, java.lang.String, java.lang.String, int, org.rhq.core.domain.configuration.Configuration, java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>
  <difference>
    <className>org/rhq/enterprise/server/operation/OperationManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
     <method>org.rhq.core.domain.operation.bean.GroupOperationSchedule scheduleGroupOperationUsingCron(org.rhq.core.domain.auth.Subject, int, int[], boolean, java.lang.String, org.rhq.core.domain.configuration.Configuration, java.lang.String, int, java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>

  <!-- since 4.6.0 -->
  <difference>
    <className>org/rhq/enterprise/server/resource/ResourceManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
     <method>void uninventoryAllResourcesByAgent(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.resource.Agent)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/resource/ResourceManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
     <method>void uninventoryResourcesOfResourceType(org.rhq.core.domain.auth.Subject, int)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/discovery/DiscoveryBossRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
     <method>void unignoreAndImportResources(org.rhq.core.domain.auth.Subject, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>
  
  <difference>
    <className>org/rhq/enterprise/server/resource/ResourceTypeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
     <method>void setResourceTypeIgnoreFlagAndUninventoryResources(org.rhq.core.domain.auth.Subject, int, boolean)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>

  <!-- since 4.7.0 -->
  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleFile addBundleFileViaURL(org.rhq.core.domain.auth.Subject, int, java.lang.String, java.lang.String, org.rhq.core.domain.content.Architecture, java.lang.String, java.lang.String, java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleVersion createBundleVersionViaURL(org.rhq.core.domain.auth.Subject, java.lang.String, java.lang.String, java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This class is never to be implemented by users.</justification>
  </difference>

  <!-- since 4.8.0 -->
  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findNotAcknowledgedStorageNodeAlerts(org.rhq.core.domain.auth.Subject)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findNotAcknowledgedStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findAllStorageNodeAlerts(org.rhq.core.domain.auth.Subject)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findAllStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.cloud.StorageNodeConfigurationComposite retrieveConfiguration(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>boolean updateConfiguration(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNodeConfigurationComposite)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findNotAcknowledgedStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findAllStorageNodeAlerts(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void deployStorageNode(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void deployStorageNode(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void undeployStorageNode(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.cloud.StorageNode)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/cloud/StorageNodeManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void runClusterMaintenance(org.rhq.core.domain.auth.Subject)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void assignBundlesToBundleGroups(org.rhq.core.domain.auth.Subject, int[], int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleGroup createBundleGroup(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.bundle.BundleGroup)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>
  
  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleVersion createInitialBundleVersionViaByteArray(org.rhq.core.domain.auth.Subject, int[], byte[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleVersion createInitialBundleVersionViaFile(org.rhq.core.domain.auth.Subject, int[], java.io.File)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleVersion createInitialBundleVersionViaRecipe(org.rhq.core.domain.auth.Subject, int[], java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleVersion createInitialBundleVersionViaURL(org.rhq.core.domain.auth.Subject, int[], java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleVersion createInitialBundleVersionViaURL(org.rhq.core.domain.auth.Subject, int[], java.lang.String, java.lang.String, java.lang.String)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void deleteBundleGroups(org.rhq.core.domain.auth.Subject, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.util.PageList findBundleGroupsByCriteria(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.criteria.BundleGroupCriteria)</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void unassignBundlesFromBundleGroups(org.rhq.core.domain.auth.Subject, int[], int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/bundle/BundleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>org.rhq.core.domain.bundle.BundleGroup updateBundleGroup(org.rhq.core.domain.auth.Subject, org.rhq.core.domain.bundle.BundleGroup)</method>    
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/authz/RoleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void addBundleGroupsToRole(org.rhq.core.domain.auth.Subject, int, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/authz/RoleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void addRolesToBundleGroup(org.rhq.core.domain.auth.Subject, int, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/authz/RoleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void removeBundleGroupsFromRole(org.rhq.core.domain.auth.Subject, int, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/authz/RoleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void removeRolesFromBundleGroup(org.rhq.core.domain.auth.Subject, int, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
    <className>org/rhq/enterprise/server/authz/RoleManagerRemote</className>
    <differenceType>7012</differenceType>  <!-- method added to an interface -->
    <method>void setAssignedBundleGroups(org.rhq.core.domain.auth.Subject, int, int[])</method>
    <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <!-- Cherry-picks since 4.9.0 -->
  <difference>
     <className>org/rhq/enterprise/server/content/ContentManagerRemote</className>
     <differenceType>7012</differenceType>
     <method>org.rhq.core.domain.content.PackageVersion createPackageVersionWithDisplayVersion(org.rhq.core.domain.auth.Subject, java.lang.String, int, java.lang.String, java.lang.String, java.lang.Integer, java.lang.String)</method>
     <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
     <className>org/rhq/enterprise/server/content/ContentManagerRemote</className>
     <differenceType>7012</differenceType>
     <method>java.lang.String createTemporaryContentHandle()</method>
     <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
     <className>org/rhq/enterprise/server/content/ContentManagerRemote</className>
     <differenceType>7012</differenceType>
     <method>void uploadContentFragment(java.lang.String, byte[], int, int)</method>
     <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  <difference>
     <className>org/rhq/enterprise/server/measurement/MeasurementDataManagerRemote</className>
     <differenceType>7012</differenceType><!-- method added to iface -->
     <method>org.rhq.core.domain.measurement.MeasurementAggregate getMeasurementAggregate(org.rhq.core.domain.auth.Subject, int, long, long)</method>
     <justification>Adding a method to a remote API interface is safe. This is newly implemented functionality.</justification>
  </difference>

  
  
  
   <difference>
       <className>org/rhq/bindings/client/AbstractRhqFacadeProxy</className>
       <differenceType>7005</differenceType> <!-- arg type changed -->
       <method>AbstractRhqFacadeProxy(org.rhq.bindings.client.RhqFacade, org.rhq.bindings.client.RhqManagers)</method>
       <to>AbstractRhqFacadeProxy(org.rhq.bindings.client.RhqFacade, org.rhq.bindings.client.RhqManager)</to>
       <justification>
           This is an infrastructural class for support of scripted environments. It is not meant to be used by 3rd parties.
       </justification>
   </difference>

   <difference>
       <className>org/rhq/bindings/client/AbstractRhqFacadeProxy</className>
       <differenceType>7004</differenceType> <!-- arg number changed -->
       <method>java.lang.Object doInvoke(java.lang.Object, java.lang.reflect.Method, java.lang.Class[], java.lang.Object[])</method>
       <justification>
           This is an infrastructural class for support of scripted environments. It is not meant to be used by 3rd parties.
       </justification>
   </difference>

   <difference>
       <className>org/rhq/bindings/client/AbstractRhqFacadeProxy</className>
       <differenceType>7006</differenceType> <!-- return type changed -->
       <method>org.rhq.bindings.client.RhqManagers getManager()</method>
       <to>org.rhq.bindings.client.RhqManager</to>
       <justification>
           This is an infrastructural class for support of scripted environments. It is not meant to be used by 3rd parties.
       </justification>
   </difference>

   <difference>
       <className>org/rhq/bindings/client/RhqFacade</className>
       <differenceType>7012</differenceType><!-- method added to iface -->
       <method>java.lang.Object getProxy(java.lang.Class)</method>
       <justification>
          This interface is not meant to be implemented by 3rd parties. This is therefore a safe change.
       </justification>
   </difference>

   <difference>
       <className>org/rhq/bindings/client/RhqFacade</className>
       <differenceType>7012</differenceType><!-- method added to iface -->
       <method>java.util.Map getScriptingAPI()</method>
       <justification>
          This interface is not meant to be implemented by 3rd parties. This is therefore a safe change.
       </justification>
   </difference>

   <difference>
      <className>org/rhq/bindings/util/ScriptAssert</className>
      <differenceType>7002</differenceType><!-- method removed -->
      <method>void assertEquals(java.lang.Object[], java.lang.Object[], java.lang.String)</method>
      <justification>
          This is an infrastructural class for support of scripted environments. The removal of this method
          does not affect the list of methods available in the scripts. On contrary, removing this 
          override improves the method resolution in the script engines.   
      </justification>
   </difference>

   <difference>
      <className>org/rhq/bindings/util/ScriptAssert</className>
      <differenceType>7002</differenceType><!-- method removed -->
      <method>void assertEquals(java.lang.Object[], java.lang.Object[])</method>
      <justification>
          This is an infrastructural class for support of scripted environments. The removal of this method
          does not affect the list of methods available in the scripts. On contrary, removing this 
          override improves the method resolution in the script engines.   
      </justification>
   </difference>
</differences>

Comment 15 Simeon Pinder 2013-10-08 07:41:37 UTC
Moving to ON_QA for testing.