<html>

<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<link rel="stylesheet" href="http://www.eclipse.org/default_style.css" type="text/css">
<title>Server Tools API Branch</title>
</head>

<body>

<body alink="#ff0000" bgcolor="#ffffff" link="#0000ee" text="#000000" vlink="#551a8b">

<table border="0" cellpadding="2" cellspacing="5" width="100%">
  <tbody><tr>
 		<TD WIDTH=60%>
			<P ALIGN=LEFT><B><FONT SIZE=6><FONT FACE="Verdana, Arial, Helvetica, sans-serif">Server Tools API Branch</FONT></FONT></B><BR>
			<FONT SIZE=1><FONT FACE="Arial, Helvetica, sans-serif"><FONT COLOR="#8080ff">Information on the Server Tools API Branch</FONT></FONT></FONT>
			</P>
		</TD>
    <td rowspan="2" width="19%"><img src="http://www.eclipse.org/images/Idea.jpg" border="0" height="86" width="120"></td>
  </tr>
</tbody></table>

<table border="0" cellpadding="2" cellspacing="5" width="100%">
  <tbody><tr> 
    <td colspan="2" align="left" bgcolor="#0080c0" valign="top"><b><font color="#ffffff" face="Arial,Helvetica">Changes</font></b></td>
  </tr></tbody>
</table>

This document contains information on the Server Tools API changes that have gone
into the Server Tools API Branch for M2.

<p/>

<table border=1>
<tr>
  <th>Change</th>
  <th>Reason</th>
  <th>Old Code</th>
  <th>New Code</th>
</tr>
<tr>
  <td>All java.util.Lists returned from methods have been changed to arrays of the corresponding
      content type.</td>
  <td>Stronger typed return values are safer, and returning a copy of the list (instead of the list
      itself) blocks against clients modifying internal data structures.</td>
  <td>List list = ServerCore.getRuntimeTypes();</td>
  <td>IRuntimeType[] rt = ServerCore.getRuntimeTypes();</td>
</tr>
<tr>
  <td>IResourceManager has been removed. Most of it's methods have been moved to the ServerCore
      class, with the remaining ones in ServerUtil.</td>
  <td>There was no client benefit of the resource manager, and it was misnamed.</td>
  <td>ServerCore.getResourceManager().getServers();</td>
  <td>ServerCore.getServers();</td>
</tr>
<tr>
  <td>All extension point interfaces have been changed to abstract classes, and the "I" removed
    from the name.</td>
  <td>Allows for future support and maintenance without breaking existing interfaces.</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>Several interfaces were moved from the .core.model package to .core.</td>
  <td>The .core.model package was meant for SPIs, not API. All API classes & interfaces will
      be moved or remain in .core so that API users do not need to use the .core.model package.</td>
  <td>import org.eclipse.wst.server.code.model.IModule;</td>
  <td>import org.eclipse.wst.server.code.IModule;</td>
</tr>
<tr>
  <td>IServerResourceListener renamed to IServerLifecycleListener. Several methods moved out to
      new IRuntimeListener and IServerConfigurationListener interfaces.</td>
  <td>"Resource" had to be removed from the name, and the interface contained methods for
      runtimes and server configurations as well. They are split up so that API users do not
      need to listen for all types of changes from a single interface.</td>
  <td>ServerCore.getResourceManager().addServerResourceListener(myListener);</td>
  <td>ServerCore.addRuntimeLifecycleListener(myListener);</td>
</tr>
<tr>
  <td>Publishing interfaces completely rewritten & .core.resources package removed.</td>
  <td>The publishing interface was outdated and written before the Eclipse team support,
      ANT, or other recent publishing methods had been developed. The new API allows for
      better support and for each server type to use it's own publishing mechanism.</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>IRuntimeDelegate and IRuntimeWorkingCopyDelegate merged into a single RuntimeDelegate.
      IServerDelegate and IServerWorkingCopyDelegate reworked into 
      ServerDelegate and ServerBehaviourDelegate.</td>
  <td>Making clients provide two separate classes for the delegates was excessive,
      unnecessary, and ended up with too many SPI classes. Only a single delegate class is
      now required for these extension points.</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>IRuntime.getDelegate(), IRuntime.getWorkingCopyDelegate() changed into IRuntime extending
      IAdaptable. Similar for IServer and other delegates</td>
  <td>IAdaptable is a common Eclipse mechanism, and allows for other extension as well. Clients
      should still remember that calling this method may involve plugin loading, so it should
      not be used in popup menus, etc.</td>
  <td>ITomcatRuntime tr = (ITomcatRuntime) runtime.getDelegate();</td>
  <td>ITomcatRuntime tr = (ITomcatRuntime) runtime.getAdapter(ITomcatRuntime.class);</td>
</tr>
<tr>
  <td>IModuleType and IModuleKind interfaces merged.</td>
  <td>IModuleKind was created late in the previous release cycle and couldn't be merged at the
      time it was created.</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>IServerTask changed and IModuleTask removed.</td>
  <td>The existing interfaces had an ITask directly returned as a delegate, and only allowed a
      single task per extension point. The new IServerTask allows the delegate to return multiple
      tasks from a single extension point, and it is not itself a task.</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>IServerConfiguration, IServerConfiguration, etc. removed</td>
  <td>The server config was a relic and did not need to be a first class resource. ServerDelegates
      are now directly responsible for maintaining the configuration.</td>
  <td></td>
  <td>see Tomcat implementation</td>
</tr>
<tr>
  <td>Various minor cleanup - methods renamed, parameters changed, etc.</td>
  <td>Cleanup and future maintenance.</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>IModuleObjectAdapter -> IModuleArtifactAdapter, IModuleObject -> IModuleArtifact</td>
  <td>Object was too generic and didn't have any real meaning. Artifact represents what the
      IModuleObject really represents - resources within a module</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td>getServerType(String id) -> findServerType(String id)</td>
  <td>Lookup methods on ServerCore and ServerUtil renamed to be more accurate.</td>
  <td>IServerType st = getServerType("com.x")</td>
  <td>IServerType st = findServerType("com.x")</td>
</tr>
<tr>
  <td>Lots of methods & interfaces moved to internal packages</td>
  <td>Need to trim down the exposed API to only what is required for ongoing maintenance. If
      there is anything in an internal package that you were previously using, or plan to use
      in the future, please contact me and we'll work out an API solution</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
</table>

</body>
</html>