<?xml version="1.0" encoding="UTF-8"?>
<!--

    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you 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.

-->
<?xml-stylesheet type="text/xml" href="../../nbbuild/javadoctools/apichanges.xsl"?>
<!DOCTYPE apichanges PUBLIC "-//NetBeans//DTD API changes list 1.0//EN" "../../nbbuild/javadoctools/apichanges.dtd">

<!--

INFO FOR PEOPLE ADDING CHANGES:

Check the DTD (apichanges.dtd) for details on the syntax. You do not
need to regenerate the HTML, as this is part of Javadoc generation; just
change the XML. Rough syntax of a change (several parts optional):

<change>
    <api name="compiler"/>
    <summary>Some brief description here, can use <b>XHTML</b></summary>
    <version major="1" minor="99"/>
    <date day="13" month="6" year="2001"/>
    <author login="jrhacker"/>
    <compatibility addition="yes"/>
    <description>
        The main description of the change here.
        Again can use full <b>XHTML</b> as needed.
    </description>
    <class package="org.openide.compiler" name="DoWhatIWantCompiler"/>
    <issue number="14309"/>
</change>

Also permitted elements: <package>, <branch>. <version> is API spec
version, recommended for all new changes. <compatibility> should say
if things were added/modified/deprecated/etc. and give all information
related to upgrading old code. List affected top-level classes and
link to issue numbers if applicable. See the DTD for more details.

Changes need not be in any particular order, they are sorted in various
ways by the stylesheet anyway.

Dates are assumed to mean "on the trunk". If you *also* make the same
change on a stabilization branch, use the <branch> tag to indicate this
and explain why the change was made on a branch in the <description>.

Please only change this file on the trunk! Rather: you can change it
on branches if you want, but these changes will be ignored; only the
trunk version of this file is important.

Deprecations do not count as incompatible, assuming that code using the
deprecated calls continues to see their documented behavior. But do
specify deprecation="yes" in <compatibility>.

This file is not a replacement for Javadoc: it is intended to list changes,
not describe the complete current behavior, for which ordinary documentation
is the proper place.

-->

<apichanges>

    <!-- First, a list of API names you may use: -->
    <apidefs>
        <apidef name="general">Java Platform API</apidef>
        <!-- etc. -->
    </apidefs>

    <!-- ACTUAL CHANGES BEGIN HERE: -->

    <changes>
        <change id="java-platform-valid">
            <api name="general"/>
            <summary>Added a <code>isValid</code> method into <code>JavaPlatform</code></summary>
            <version major="1" minor="43"/>
            <date day="3" month="4" year="2017"/>
            <author login="tzezula"/>
            <compatibility addition="yes"/>
            <description>
                <p>
                    Added a <code>isValid</code> method into <code>JavaPlatform</code>
                    to check platform validity. The platform is non valid when it's deleted
                    or an platform tool (java, javac) is missing or bootstrap libraries are missing.
                </p>
            </description>
            <class package="org.netbeans.api.java.platform" name="JavaPlatform"/>
        </change>
        <change id="java-platform-factory">
            <api name="general"/>
            <summary>Added a SPI to create new JavaPlatform </summary>
            <version major="1" minor="41"/>
            <date day="17" month="8" year="2016"/>
            <author login="tzezula"/>
            <compatibility addition="yes"/>                
            <description>
                <p>
                    Added a SPI allowing <code>JavaPlatform</code> implementors
                    to export ability to create a new <code>JavaPlatform</code>.
                </p>
            </description>
            <class package="org.netbeans.spi.java.platform" name="JavaPlatformFactory"/>
            <class package="org.netbeans.spi.java.platform.support" name="ForwardingJavaPlatform"/>
        </change>
        <change id="server.is.free">
            <api name="general"/>
            <summary>Desktop dependent java platform UI extracted</summary>
            <version major="1" minor="37"/>
            <date day="14" month="5" year="2014"/>
            <author login="tstupka"/>
            <compatibility modification="yes" addition="yes">
                <p>
                    Runtime compatibility remains, compile time compatibility is
                    mostly preserved too. It is however recommended to upgrade
                    dependencies of client modules. Try running
                    <code>ant fix-dependencies</code> in your Ant module.
                </p>
            </compatibility>
            <description>
                <p>
                    The following classes were moved into the
                    <a href="@org-netbeans-modules-java-platform-ui@/overview-summary.html">org.netbeans.java.platform.ui</a> module:
                </p>
                <ul>
                    <li><a href="@org-netbeans-modules-java-platform-ui@/org/netbeans/api/java/platform/PlatformsCustomizer.html">PlatformCustomizer</a></li>
                    <li><a href="@org-netbeans-modules-java-platform-ui@/org/netbeans/spi/java/platform/CustomPlatformInstall.html">CustomPlatformInstall</a></li>
                    <li><a href="@org-netbeans-modules-java-platform-ui@/org/netbeans/spi/java/platform/GeneralPlatformInstall.html">GeneralPlatformInstall</a></li>
                    <li><a href="@org-netbeans-modules-java-platform-ui@/org/netbeans/spi/java/platform/PlatformInstall.html">PlatformInstall</a></li>
                </ul>
            </description>
        </change>

        <change id="Specification.displayName">
            <api name="general"/>
            <summary>Added <code>Specification.getDisplayName</code> returning
            the user friendly name of the platform specification.</summary>
            <version major="1" minor="26"/>
            <date day="13" month="6" year="2012"/>
            <author login="tzezula"/>
            <compatibility addition="yes"/>                
            <description>
                Added <code>Specification.getDisplayName</code> returning
            the user friendly name of the platform specification.
            </description>
            <class package="org.netbeans.api.java.platform" name="Specification"/>
            <issue number="198834"/>
        </change>

        <change id="JavaPlatformManager.defaultPlatform">
            <api name="general"/>
            <summary></summary>
            <version major="1" minor="9"/>
            <date day="12" month="4" year="2006"/>
            <author login="jglick"/>
            <compatibility modification="yes">
                <p>
                    Code which previously handled null return values
                    but expected any returned platform instance to
                    meet certain criteria, such as having JDK tool bindings,
                    may be broken.
                </p>
            </compatibility>
            <description>
                <p>
                    <code>JavaPlatformManager.getDefaultPlatform</code>
                    could formerly return null, in case no installed
                    providers returned an instance; typically this
                    would be due to some storage problem. In the
                    interests of robustness, it will now as a fallback
                    return a simple platform instance corresponding
                    the JRE hosting the NetBeans code. Optional
                    capabilities may be missing so avoid relying on
                    this fallback platform implementation.
                </p>
            </description>
        </change>

        <change id="CustomPlatformInstall">
            <api name="general"/>
            <summary>Added new CustomPlatformInstall implemented by the platform installers which does not use the file chooser to select new platform</summary>
            <version major="1" minor="5"/>
            <date day="27" month="7" year="2005"/>
            <author login="tzezula"/>
            <compatibility addition="yes"/>
            <description>
                <p>
                There are some platform installers which does not use the local disk as source of the java platform,
                for example they download the java platform from the web. Such installers cannot use the current
                PlatformInstall which is file oriented. The CustomPlatformInstall allows to platform install
                provider to implement its own way of installing the new platform. The PlatformInstall is still supported.
                If the module provides the PlatformInstall in the global lookup, the java platform module does the
                java platform chooser for it, the behavior is not changed. If the module provides the CustomPlatformInstall
                in the global lookup, it has to do the platform selection by itself.
                </p>
                <p>
                The relevant code was moved off to <code>java.platform.ui</code> module. Please
                see it's <a href="@org-netbeans-modules-java-platform-ui@/apichanges.html">
                API change document</a>.
                </p>
            </description>
            <class package="org.netbeans.spi.java.platform" name="CustomPlatformInstall" link="no"/>
            <class package="org.netbeans.spi.java.platform" name="GeneralPlatformInstall" link="no"/>
            <issue number="61475"/>
        </change>
        <change id="rel-vers-1">
            <api name="general"/>
            <summary>Switched to major release version 1</summary>
            <version major="1" minor="3"/>
            <date day="22" month="12" year="2004"/>
            <author login="jglick"/>
            <compatibility>
                <p>
                    Clients should begin requesting the new version to avoid a warning at startup.
                </p>
            </compatibility>
            <description>
                <p>
                    To indicate that this is now considered a stable API, the major release version was
                    incremented to 1 from 0.
                </p>
            </description>
            <issue number="51468"/>
        </change>

    </changes>

    <!-- Now the surrounding HTML text and document structure: -->

    <htmlcontents>
<!--

                            NO NO NO NO NO!

         ==============>    DO NOT EDIT ME!  <==============

          AUTOMATICALLY GENERATED FROM APICHANGES.XML, DO NOT EDIT

                SEE java/platform/apichanges.xml

-->
    <head>
      <title>Change History for the Java Platform API</title>
      <link rel="stylesheet" href="prose.css" type="text/css"/>
    </head>
    <body>

<p class="overviewlink"><a href="overview-summary.html">Overview</a></p>

<h1>Introduction</h1>

<p>This document lists changes made to the <a href="@TOP@">Java Platform API</a>.</p>

<!-- The actual lists of changes, as summaries and details: -->
      <hr/>
      <standard-changelists module-code-name="org.netbeans.modules.java.platform/1"/>

      <hr/><p>@FOOTER@</p>

    </body>
  </htmlcontents>

</apichanges>
