In this section, you will be learning how to extend MTJ build process in order do add SDK specific actions into it.
Attaching a build hook is very simple, extend the org.eclipse.mtj.core.mtjbuildhook extension point in your plug-in project:
Implement your instance of the org.eclipse.mtj.core.build.IMTJBuildHook interface. The interface has as single callback for every state transition of the build process:
/**
* This method is called upon state transitions within the MTJ build
* process. This method implementation must be lightweight
* in order to avoid introducing overhead to the build process. In case the
* hook has nothing to do on the new state it must return
* as soon as possible.
*
* The project instance passed during the invocation of this method provides
* everything a build hook might require, including access to all resources
* available.
*
*
* A progress monitor is provided to report in the user interface the
* current statuses inside the hook.
* Note: Progress messages should be "user readable" to be
* displayed in the User Interface.
*
*
* In case an error has occurred, clients implementing this interface must
* throw a {@link CoreException} that will be treated by MTJ and correctly
* displayed.
*
* Note: Exception messages should be "user readable" to be
* displayed in the User Interface.
*
* @param project the IMTJProject being built.
* @param state new build state. For more info on available build states see
* MTJBuildState.
* @param monitor a progress monitor.
* @throws CoreException any error occurred.
* @see org.eclipse.mtj.core.build.MTJBuildState
*/
public void buildStateChanged(IMTJProject project, MTJBuildState state,
IProgressMonitor monitor) throws CoreException;
Follows an example of a hook that adds a license file (EPLV1.0.txt) from the project root into the binary folder in order to be packaged along with the other sources. It also adds a property to the JAD file.
public class LicenseBuildHook implements IMTJBuildHook {
public void buildStateChanged(IMTJProject project, MTJBuildState state, IProgressMonitor monitor) throws CoreException {
switch (state) {
case PRE_COMPILATION:
writeLicense(project, monitor);
break;
case PRE_PREVERIFICATION:
writeJadAttribute(project, monitor);
break;
}
}
private void writeJadAttribute(IMTJProject mtjProject, IProgressMonitor monitor) {
if (!(mtjProject instanceof IMidletSuiteProject)) {
return;
}
IMidletSuiteProject midletSuiteProject = (IMidletSuiteProject) mtjProject;
IApplicationDescriptor descriptor = midletSuiteProject.getApplicationDescriptor();
descriptor.getManifestProperties().put("License", "EPLv1.0");
try {
descriptor.store();
} catch (IOException e) {
e.printStackTrace();
}
}
private void writeLicense(IMTJProject mtjProject, IProgressMonitor monitor) throws CoreException {
IProject project = mtjProject.getProject();
IFile file = project.getFile("EPLV1.0.txt");
if (file.exists()) {
IPath path = mtjProject.getJavaProject()
.getOutputLocation().removeFirstSegments(1);
IFolder folder = project.getFolder(path);
File target = folder.getLocation().append(file.getName()).toFile();
if (target.exists()) {
try {
file.setContents(new FileInputStream(target), false, false , monitor);
} catch (FileNotFoundException e) {
return;
}
} else {
file.copy(folder.getProjectRelativePath().append(file.getName()), true, monitor);
}
file.refreshLocal(IResource.DEPTH_ZERO, monitor);
}
}
}