<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 Changes</title>
<style>
td { font-family: arial, helvetica, geneva; font-size: 9pt; vertical-align: top; }
td.code { font-family: "Courier New", Courier, mono; font-size: 7.75pt}
</style>
</head>

<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 Changes</FONT></FONT></B><BR>
			<FONT SIZE=1><FONT FACE="Arial, Helvetica, sans-serif"><FONT COLOR="#8080ff">Information on Server Tools API Changes</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">M1 Changes</font></b></td>
  </tr></tbody>
</table>

Here are the Server Tools API changes that went into M1.

<p/>

<table border=1 cellspacing="0">
<tr>
  <th>Change</th>
  <th>Reason</th>
  <th>Old Code</th>
  <th>New Code</th>
</tr>
<tr>
  <td>Package renames:<br/>
  com.ibm.wtp.server.core -> org.eclipse.wst.server.core<br/>
  com.ibm.wtp.server.ui -> org.eclipse.wst.server.ui<br/>
  com.ibm.wtp.server.util -> org.eclipse.wst.server.util<br/>
  com.ibm.wtp.server.java.core -> org.eclipse.jst.server.core<br/>
  com.ibm.wtp.server.java.ui -> org.eclipse.jst.server.ui<br/>
  com.ibm.wtp.server.tomcat.core -> org.eclipse.jst.server.tomcat.core<br/>
  com.ibm.wtp.server.tomcat.ui -> org.eclipse.jst.server.tomcat.ui<br/>
  com.ibm.wtp.monitor.core -> org.eclipse.wst.monitor.core<br/>
  com.ibm.wtp.monitor.ui -> org.eclipse.wst.monitor.ui<br/>
  com.ibm.wtp.webbrowser -> org.eclipse.wst.webbrowser</td>
  <td>Renaming for open source</td>
  <td></td>
  <td></td>
</tr>
<tr>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
</tr>
</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">M2 Changes</font></b></td>
  </tr></tbody>
</table>

Here are the Server Tools API changes that went into M2.

<p/>

<table border=1 cellspacing="0">
<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 class="code">List list = ServerCore.getRuntimeTypes();</td>
  <td class="code">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 class="code">ServerCore.getResourceManager().getServers();</td>
  <td class="code">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 class="code"></td>
  <td class="code"></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 class="code">import org.eclipse.wst.server.code.model.IModule;</td>
  <td class="code">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 class="code">ServerCore.getResourceManager().addServerResourceListener(myListener);</td>
  <td class="code">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 class="code"></td>
  <td class="code"></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 class="code"></td>
  <td class="code"></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 class="code">ITomcatRuntime tr = (ITomcatRuntime) runtime.getDelegate();</td>
  <td class="code">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 class="code"></td>
  <td class="code"></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 class="code"></td>
  <td class="code"></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 class="code"></td>
  <td class="code">see Tomcat implementation</td>
</tr>
<tr>
  <td>Various minor cleanup - methods renamed, parameters changed, etc.</td>
  <td>Cleanup and future maintenance.</td>
  <td class="code"></td>
  <td class="code"></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 class="code"></td>
  <td class="code"></td>
</tr>
<tr>
  <td>getServerType(String id) -> findServerType(String id)</td>
  <td>Lookup methods on ServerCore and ServerUtil renamed to be more accurate to what
      they do.</td>
  <td class="code">IServerType st = getServerType("com.x")</td>
  <td class="code">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 class="code"></td>
  <td class="code"></td>
</tr>
<tr>
  <td>Publishing changes - several interfaces and the org.eclipse.wst.server.core.resource
      package removed</td>
  <td>The old publishing mechanism did not allow flexibility in publishing options (e.g.
      ANT, Eclipse team support, or some other mechanism) and used an outdated publishing
      manager framework.</td>
  <td class="code"></td>
  <td class="code">ServerDelegate.publishStart(); // Called to tell the server that publishing is starting.
      Can be used to connect to a remote server, etc.<br/>
      ServerDelegate.publishStart(); // Called once to allow the server to publish any "global"
      resources or a server config<br/>
      ServerDelegate.publishStart(); // Called for each module to give the server a chance
      to publish using any method it wants<br/>
      ServerDelegate.publishFinish(); // Called to disconnect from the server or cleanup</td>
</tr>
<tr>
  <td>IMonitorableServer merged with IServer</td>
  <td>No need for additional interface</td>
  <td class="code">IServerDelegate delegate = server.getDelegate()<br/>
      if (delegate instanceof IMonitorableServer) {<br/>
         IMonitorableServer ms = (IMonitorableServer) delegate;<br/>
         List ports = ms.getServerPorts();<br/>
      }</td>
  <td class="code">IServerPort[] ports = server.getServerPorts();</td>
</tr>
<tr>
  <td>Working copy changes</td>
  <td>Previously, references were kept to every working copy, and clients had to save() or
      release() them in finally blocks or else the reference would be dangling (and possibly
      blocking other changes) forever. This code was unsafe and caused problems if a client
      tried to use a working copy after it had been saved or released.
      Now, clients can create a working copy at any time, and references are not kept. On
      save, a client can specify whether the working copy changes should be forced, or not
      (in which case the save will fail if someone else has made changes to the object in
      the meantime). If the changes do not need to be saved, clients can just drop the
      reference to the working copy at any time. As before, working copies should not be
      used for long periods of time since it increases the chances that another client has
      made changes</td>
  <td class="code">IServerWorkingCopy wc = IServer.getWorkingCopy();<br/>
      // do something with wc<br/>
      wc.save(); or wc.release();</td>
  <td class="code">IServerWorkingCopy wc = IServer.createWorkingCopy();<br/>
      // do something with wc<br/>
      wc.save(); or lose reference</td>
</tr>
<tr>
  <td>Change IServer.isRestartNeeded() to match other methods</td>
  <td></td>
  <td class="code">IServer.isRestartNeeded();</td>
  <td class="code">IServer.getServerRestartState();</td>
</tr>
<tr>
  <td></td>
  <td></td>
  <td class="code"></td>
  <td class="code"></td>
</tr>
</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">M3 Changes</font></b></td>
  </tr></tbody>
</table>

Here are the Server Tools API changes that went into M3.

<p/>

<table border=1 cellspacing="0">
<tr>
  <th>Change</th>
  <th>Reason</th>
  <th>Old Code</th>
  <th>New Code</th>
</tr>
<tr>
  <td>Remove serverAction extension point</td>
  <td>Duplicate function exists in Eclipse v3.0</td>
  <td class="code">&lt;extension point="org.eclipse.wst.server.ui.serverActions"&gt;<br/>
  &lt;serverAction id="org.eclipse.wst.server.ui.projects"<br/>
    typeIds="org.eclipse.jst.*"<br/>
    label="%actionModifyModules"<br/>
    category="control"<br/>
    icon="icons/ctool16/wiz_modify_modules.gif"<br/>
    order="50"<br/>
    class="org.eclipse.wst.server.ui.internal.actions.AddRemoveModulesAction"/&gt;<br/>
&lt;/extension&gt;</td>
  <td class="code">&lt;extension point="org.eclipse.ui.popupMenus"&gt;<br/>
  &lt;objectContribution<br/>
    id="org.eclipse.wst.server.ui.popupMenu"<br/>
    objectClass="org.eclipse.wst.server.core.IServer"<br/>
    adaptable="true"&gt;<br/>
    &lt;filter name="typeIds" value="org.eclipse.jst.*"/&gt;<br/>
    &lt;action<br/>
      id="org.eclipse.wst.server.ui.action.modifyModules"<br/>
      label="%actionModifyModules"<br/>
      icon="icons/ctool16/wiz_modify_modules.gif"<br/>
      class="org.eclipse.wst.server.ui.internal.actions.ModifyModulesAction"&gt;<br/>
    &lt;/action&gt;<br/>
  &lt;/objectContribution&gt;<br/>
&lt;/extension&gt;</td>
</tr>
<tr>
  <td>Remove objectClass attribute from moduleArtifactAdapter extension point and switch to expressions</td>
  <td>Removal of IModuleArtifactAdapter class</td>
  <td class="code"></td>
  <td class="code"></td>
</tr>
<tr>
  <td>IElement and IElementWorkingCopy removed</td>
  <td>There was no point having common code between IRuntime and IServer, since they didn't really have
      any common structure. Existing methods moved to correct location in IRuntime, IServer, and their working copies.</td>
  <td class="code"></td>
  <td class="code"></td>
</tr>
<tr>
  <td>IModuleEvent and IModuleFactoryEvent changed to ModuleEvent and ModuleFactoryEvent</td>
  <td>Event classes are not typically interfaces, and there was no reason to abstract these two classes.</td>
  <td class="code">IModuleEvent<br/>IModuleFactoryEvent</td>
  <td class="code">ModuleEvent<br/>ModuleFactoryEvent</td>
</tr>
<tr>
  <td>IServerPreferences removed</td>
  <td>IServerPreferences was not required as API and was not being used by external plugins. To clean up API,
      it is being removed from the first API version.</td>
  <td class="code"></td>
  <td class="code"></td>
</tr>
<tr>
  <td>ServerBehaviourDelegate.setLaunchDefaults() renamed</td>
  <td>ServerBehaviourDelegate.setLaunchDefaults() was renamed to ServerBehaviourDelegate.setupLaunchConfiguration().
      It is now called on every launch instead of just the first time. This allows servers to update the launch
      configuration before it is executed.</td>
  <td class="code"></td>
  <td class="code"></td>
</tr>
<tr>
  <td></td>
  <td></td>
  <td class="code"></td>
  <td class="code"></td>
</tr>
</table>

</body>
</html>