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); } } }