net.rim.ejde.internal.model.BlackBerryPropertiesFactory.java Source code

Java tutorial

Introduction

Here is the source code for net.rim.ejde.internal.model.BlackBerryPropertiesFactory.java

Source

/*
* Copyright (c) 2010-2012 Research In Motion Limited. All rights reserved.
*
* This program and the accompanying materials are made available
* under the terms of the Eclipse Public License, Version 1.0,
* which accompanies this distribution and is available at
*
* http://www.eclipse.org/legal/epl-v10.html
*
*/
package net.rim.ejde.internal.model;

import java.io.File;
import java.util.Vector;

import net.rim.ejde.internal.core.IConstants;
import net.rim.ejde.internal.internalplugin.InternalFragmentReplaceable;
import net.rim.ejde.internal.model.BasicBlackBerryProperties.AlternateEntryPoint;
import net.rim.ejde.internal.model.BasicBlackBerryProperties.Icon;
import net.rim.ejde.internal.model.BasicBlackBerryProperties.PreprocessorTag;
import net.rim.ejde.internal.ui.editors.model.GeneralSection;
import net.rim.ejde.internal.util.PackageUtils;
import net.rim.ejde.internal.util.PackagingUtils;
import net.rim.ejde.internal.util.ProjectUtils;
import net.rim.ejde.internal.util.StatusFactory;
import net.rim.ide.Project;
import net.rim.ide.core.Util;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;

@InternalFragmentReplaceable
public class BlackBerryPropertiesFactory {

    private static final Logger _log = Logger.getLogger(BlackBerryPropertiesFactory.class);

    static public BlackBerryProperties createBlackBerryProperties() {
        return new BlackBerryProperties();
    }

    static public BlackBerryProperties createBlackBerryProperties(final AlternateEntryPoint entryPoint) {
        return new BlackBerryProperties(entryPoint);
    }

    static public BlackBerryProperties createBlackBerryProperties(final IJavaProject javaProject) {
        BlackBerryProperties properties = new BlackBerryProperties();
        initializeFromJavaProject(properties, javaProject);
        return properties;
    }

    static public BlackBerryProperties createBlackBerryProperties(final Project legacyProject,
            final IJavaProject javaProject) {
        BlackBerryProperties properties = new BlackBerryProperties();
        initializeFromLegacy(properties, legacyProject, javaProject);
        return properties;
    }

    /**
     * Initialize from a given java project.
     *
     * @param javaProj
     *            the java project
     */
    static private void initializeFromJavaProject(BlackBerryProperties properties, IJavaProject javaProj) {
        // Initialize the general section
        properties._general.setTitle(javaProj.getProject().getName());

        // Initialize the application section
        properties._application.setType(GeneralSection.projectTypeChoiceList[Project.LIBRARY]);

        // Initialize the packaging section
        properties.setValidOutputFileName(javaProj.getProject().getName());
    }

    /**
     * Initialize from a given legacy project.
     *
     * @param properties
     *
     * @param project
     *            the project
     * @param javaProj
     *            the java proj
     */
    static private void initializeFromLegacy(BlackBerryProperties properties, final Project project,
            final IJavaProject javaProj) {
        // Initialize the general section
        properties._general.setTitle(project.getTitle());
        properties._general.setVersion(project.getVersion());
        properties._general.setDescription(project.getDescription());
        properties._general.setVendor(project.getVendor());

        // Initialize the application section
        properties._application.setHomeScreenPosition(project.getRibbonPosition());
        properties._application.setIsAutostartup(project.getRunOnStartup());
        properties._application.setIsSystemModule(project.getSystemModule());
        switch (project.getType()) {
        case Project.MIDLET: {
            properties._application.setMainArgs(IConstants.EMPTY_STRING);
            properties._application.setMainMIDletName(project.getMidletClass());
            break;
        }
        case Project.CLDC_APPLICATION: {
            properties._application.setMainArgs(project.getMidletClass());
            properties._application.setMainMIDletName(IConstants.EMPTY_STRING);
            break;
        }
        case Project.LIBRARY: {
            properties._application.setIsSystemModule(Boolean.TRUE);
            // No break falling through to default case
        }
        default: {
            properties._application.setMainArgs(IConstants.EMPTY_STRING);
            properties._application.setMainMIDletName(IConstants.EMPTY_STRING);
        }
        }
        properties._application
                .setStartupTier(Math.max(project.getStartupTier(), ProjectUtils.getStartupTiers()[0]));
        properties._application.setType(GeneralSection.projectTypeChoiceList[project.getType()]);

        // Initialize the resources section
        properties._resources.setHasTitleResource(project.isTitleResourceBundleActive());
        properties._resources.setTitleResourceBundleName(project.getTitleResourceBundleName());
        properties._resources.setTitleResourceBundleKey(project.getTitleResourceTitleKey());
        properties._resources.setTitleResourceBundleClassName(project.getTitleResourceBundleClassName());
        final IProject iProject = javaProj.getProject();
        final String resourceBundlePath = project.getTitleResourceBundlePath();
        if (!StringUtils.isBlank(resourceBundlePath)) {
            final String resourceBundleFilePath = Util.makeAbsolute(resourceBundlePath, project.getFile());
            properties._resources.setTitleResourceBundleRelativePath(
                    getTargetRelFilePath(new File(resourceBundleFilePath), project, JavaCore.create(iProject)));
        } else {
            properties._resources.setTitleResourceBundleRelativePath(IConstants.EMPTY_STRING);
        }
        properties._resources.setDescriptionId(project.getTitleResourceDescriptionKey());
        properties._resources.setIconFiles(getIcons(project, iProject));
        // Initialize the keyword section
        // TODO we use the KeywordResourceBundleKey to store ID for now, later on when we implemented the UI part, we need to
        // change
        properties.getKeywordResources().setKeywordResourceBundleKey(project.getKeywordResourceBundleId());
        properties.getKeywordResources()
                .setKeywordResourceBundleClassName(project.getKeywordResourceBundleClassName());
        // Initialize the compiler section
        properties._compile.setAliasList(project.getAlias());
        properties._compile.setCompressResources(project.getWorkspace().getResourcesCompressed());
        properties._compile.setConvertImages(!project.getIsNoConvertPng());
        properties._compile.setCreateWarningForNoExportedRoutine(!project.getIsNoMainWarn());
        properties._compile.setOutputCompilerMessages(project.getIsNoWarn());
        final Vector<String> defines = project.getDefines();
        properties._compile.setPreprocessorDefines(
                PreprocessorTag.create(defines.toArray(new String[defines.size()]), PreprocessorTag.PJ_SCOPE));

        // Initialize the packaging section
        final Vector<File> alxFileVector = project.getAlxImports();
        final String[] alxFiles = new String[alxFileVector.size()];
        for (int i = 0; i < alxFileVector.size(); i++) {
            final File alxFile = alxFileVector.get(i);
            alxFiles[i] = alxFile.getPath();
        }
        properties._packaging.setAlxFiles(alxFiles);
        properties._packaging.setCleanStep(project.getCleanBuild());
        properties.setValidOutputFileName(project.getOutputFileName());
        properties._packaging.setPostBuildStep(project.getPostBuild());
        properties._packaging.setPreBuildStep(project.getPreBuild());
        properties._packaging.setGenerateALXFile(PackagingUtils.getDefaultGenerateAlxFile());

        // Initialize alternate entry points
        final int AEPNumber = project.getNumEntries();
        properties._alternateEntryPoints = new AlternateEntryPoint[AEPNumber];
        for (int i = 0; i < AEPNumber; i++) {
            final Project entry = project.getEntry(i);
            try {
                properties._alternateEntryPoints[i] = createAlternateEntryPoint(entry, iProject);
            } catch (final CoreException e) {
                _log.error(e.getMessage(), e);
            }
        }

        // Initialize hidden properties
        properties._hiddenProperties.setClassProtection(project.getClassProtection());
        properties._hiddenProperties.setPackageProtection(project.getPackageProtection());
    }

    public static AlternateEntryPoint createAlternateEntryPoint(final Project project, final IProject iProject)
            throws CoreException {
        AlternateEntryPoint aep = new AlternateEntryPoint();
        if (project.getEntryFor() == null) {
            throw new CoreException(StatusFactory.createErrorStatus("Project is not an alternate entry project."));
        }
        if (StringUtils.isBlank(project.getTitle())) {
            aep.setTitle(project.getDisplayName());
        } else {
            aep.setTitle(project.getTitle());
        }
        switch (project.getType()) {
        case Project.MIDLET_ENTRY: {
            aep.setArgsPassedToMain(IConstants.EMPTY_STRING);
            aep.setMainMIDletName(project.getMidletClass());
            break;
        }
        case Project.CLDC_APPLICATION_ENTRY: {
            aep.setArgsPassedToMain(project.getMidletClass());
            aep.setMainMIDletName(IConstants.EMPTY_STRING);
            break;
        }
        default: {
            aep.setArgsPassedToMain(IConstants.EMPTY_STRING);
            aep.setMainMIDletName(IConstants.EMPTY_STRING);
        }
        }
        aep.setHomeScreenPosition(project.getRibbonPosition());
        aep.setTitleResourceBundleName(project.getTitleResourceBundleName());
        aep.setTitleResourceBundleKey(project.getTitleResourceTitleKey());
        aep.setTitleResourceBundleClassName(project.getTitleResourceBundleClassName());
        final String resourceBundlePath = project.getTitleResourceBundlePath();
        if (!StringUtils.isBlank(resourceBundlePath)) {
            final String resourceBundleFilePath = Util.makeAbsolute(resourceBundlePath, project.getFile());
            aep.setTitleResourceBundleRelativePath(
                    getTargetRelFilePath(new File(resourceBundleFilePath), project, JavaCore.create(iProject)));
        } else {
            aep.setTitleResourceBundleRelativePath(IConstants.EMPTY_STRING);
        }
        // TODO we use the KeywordResourceBundleKey to store ID for now, later on when we implemented the UI part, we need to
        // change
        aep._keywordResources.setKeywordResourceBundleClassName(project.getKeywordResourceBundleClassName());
        aep._keywordResources.setKeywordResourceBundleKey(project.getKeywordResourceBundleId());
        aep.setStartupTier(Math.max(project.getStartupTier(), ProjectUtils.getStartupTiers()[0]));
        aep.setIconFiles(getIcons(project, iProject));
        aep.setIsAutostartup(project.getRunOnStartup());
        aep.setIsSystemModule(project.getSystemModule());
        if (!StringUtils.isBlank(aep.getTitleResourceBundleKey())) {
            aep.setHasTitleResource(true);
        }

        return aep;
    }

    /**
     * Gets the relative path of the <code>file</code>.
     * <p>
     * <b> This method does not calculate path for the given files as the import module does. This method only search the file in
     * the project and return the relative path if found. </b>
     *
     * @param file
     *            the file
     * @param legacyProject
     *            the legacy project
     * @param javaProject
     *            the java project
     *
     * @return the target rel file path
     */
    protected static String getTargetRelFilePath(final File file, final Project legacyProject,
            final IJavaProject javaProject) {
        IPath path = null;
        try {
            path = new Path(PackageUtils.getFilePackageString(file, legacyProject));
        } catch (CoreException e) {
            return IConstants.EMPTY_STRING;
        }
        path = path.append(file.getName());
        path = PackageUtils.getProjectRelativePath(javaProject, path);
        if (path == null) {
            return IConstants.EMPTY_STRING;
        }
        return path.toOSString();
    }

    /**
     * Gets the icons.
     *
     * @param project
     *            the project
     * @param iProject
     *            the i project
     *
     * @return the icons
     */
    protected static Icon[] getIcons(final Project project, final IProject iProject) {
        IJavaProject javaProject = JavaCore.create(iProject);
        final Vector<Icon> newIcons = new Vector<Icon>();
        Icon icon = null, rooloverIcon;

        Vector<File> iconFiles = project.getIcons();
        // we only get the first icon
        if ((iconFiles != null) && (iconFiles.size() > 0)) {
            final File iconFile = iconFiles.get(0);
            if (iconFile.exists()) {
                icon = new Icon(getTargetRelFilePath(iconFile, project, javaProject));
                newIcons.add(icon);
            }
        }

        iconFiles = project.getRolloverIcons();
        // we only get the first rollover icon
        if ((iconFiles != null) && (iconFiles.size() > 0)) {
            final File iconFile = iconFiles.get(0);
            if (iconFile.exists()) {
                // If there is only 1 icon it cannot be a focus icon, so set focus status based on existence of first icon
                rooloverIcon = new Icon(getTargetRelFilePath(iconFile, project, javaProject),
                        Boolean.valueOf(icon != null));
                newIcons.add(rooloverIcon);
            }
        }

        return newIcons.toArray(new Icon[newIcons.size()]);
    }
}