com.motorola.studio.android.model.BuildingBlockModel.java Source code

Java tutorial

Introduction

Here is the source code for com.motorola.studio.android.model.BuildingBlockModel.java

Source

/*
 * Copyright (C) 2012 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.motorola.studio.android.model;

import java.security.InvalidParameterException;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.TreeSelection;

import com.motorola.studio.android.codeutils.CodeUtilsActivator;
import com.motorola.studio.android.common.IAndroidConstants;
import com.motorola.studio.android.common.exception.AndroidException;
import com.motorola.studio.android.common.log.StudioLogger;
import com.motorola.studio.android.common.utilities.AndroidUtils;
import com.motorola.studio.android.common.utilities.EclipseUtils;
import com.motorola.studio.android.model.java.JavaClass;

/**
 * Controller for Building Blocks.
 */
public abstract class BuildingBlockModel implements IWizardModel {
    private String name = "";

    private final Set<String> intentFilterPermissions = new HashSet<String>();

    /**
     * Constructor for Building class
     * @param superClass the Building block superclass
     */
    public BuildingBlockModel(String superClass) {
        if ((superClass == null) || (superClass.length() == 0)) {
            throw new InvalidParameterException();
        }
        this.superClass = superClass;
    }

    private String superClass;

    private IPackageFragmentRoot packageFragmentRoot;

    private IPackageFragment packageFragment;

    private IStatus nameStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);

    private IStatus packageStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);

    private IStatus packageFragmentRootStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);

    private String label;

    private IStatus labelStatus = new Status(IStatus.OK, CodeUtilsActivator.PLUGIN_ID, null);

    private int apiVersion;

    /**
     * Return building block name
     * @return
     */
    public String getName() {
        return name;
    }

    /**
     * Return superclass
     * @return
     */
    public String getSuperClass() {
        return superClass;
    }

    /**
     * Set building block name
     * @param typeName
     */
    public void setName(String typeName) {
        this.name = typeName;
    }

    /**
     * Set superclass 
     * @param superClass
     */
    public void setSuperClass(String superClass) {
        this.superClass = superClass;
    }

    /**
     * Change source folder
     * @return
     */
    public IPackageFragmentRoot getPackageFragmentRoot() {
        return packageFragmentRoot;
    }

    /**
     * Check if using extended Class
     * @return
     */
    public boolean useExtendedClass() {
        return false;
    }

    /**
     * Change source folder
     * @param pack
     */
    public void setPackageFragmentRoot(IPackageFragmentRoot pack) {
        this.packageFragmentRoot = pack;
    }

    /**
     * Change package
     * @param packageFragment
     */
    public void setPackageFragment(IPackageFragment packageFragment) {
        if ((packageFragmentRoot != null) && (packageFragment != null)
                && !packageFragmentRoot.getJavaProject().equals(packageFragment.getJavaProject())) {
            throw new InvalidParameterException();
        } else {
            this.packageFragment = packageFragment;
        }
    }

    /**
     * Return package
     * @return
     */
    public IPackageFragment getPackageFragment() {
        return packageFragment;
    }

    /**
     * Configure source folder and package from workbench selection
     * @param selection
     */
    public void configure(IStructuredSelection selection) {
        try {
            IPackageFragmentRoot srcFolder = extractPackageFragmentRoot(selection);
            setPackageFragmentRoot(srcFolder);
            IJavaProject javaProject = srcFolder == null ? null : srcFolder.getJavaProject();
            setPackageFragment(extractPackageFragment(selection, javaProject));
            if (javaProject != null) {
                apiVersion = AndroidUtils.getApiVersionNumberForProject(javaProject.getProject());
            }

        } catch (Exception e) {
            StudioLogger.error(BuildingBlockModel.class, "Error configuring building block from selection.", e);
        }
    }

    /**
     * Extract Package from selection
     * @param selection
     * @param javaProject
     * @return
     * @throws CoreException
     */
    private IPackageFragment extractPackageFragment(IStructuredSelection selection, IJavaProject javaProject)
            throws CoreException {
        IPackageFragment pack = null;
        Object object = selection.getFirstElement();
        if ((object instanceof IPackageFragment)
                && ((IPackageFragment) object).getJavaProject().equals(javaProject)) {
            pack = (IPackageFragment) object;
        } else if ((object instanceof IJavaElement)
                && ((IJavaElement) object).getJavaProject().equals(javaProject)) {
            pack = (IPackageFragment) ((IJavaElement) object).getAncestor(IJavaElement.PACKAGE_FRAGMENT);
            if (pack == null) {
                pack = EclipseUtils.getDefaultPackageFragment(((IJavaElement) object).getJavaProject());
            }
        } else if (object instanceof IResource) {
            pack = EclipseUtils.getDefaultPackageFragment(
                    javaProject == null ? JavaCore.create(((IResource) object).getProject()) : javaProject);
        } else {
            if (javaProject != null) {
                pack = EclipseUtils.getDefaultPackageFragment(javaProject);
            } else {
                IJavaProject[] prjs = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot()).getJavaProjects();
                if (prjs.length > 0) {
                    pack = EclipseUtils.getDefaultPackageFragment(prjs[0]);
                }
            }

        }

        if (pack != null) {
            if (!pack.getJavaProject().getProject().hasNature(IAndroidConstants.ANDROID_NATURE)) {
                pack = extractPackageFragment(new TreeSelection(), javaProject);
            }
        }
        return pack;
    }

    /**
     * Extract source folder from selection.
     * @param selection
     * @return
     * @throws CoreException
     */
    private static IPackageFragmentRoot extractPackageFragmentRoot(IStructuredSelection selection)
            throws CoreException {
        IPackageFragmentRoot pack = null;
        Object selectionElement = selection.getFirstElement();

        if (selectionElement instanceof IPackageFragmentRoot) {
            pack = (IPackageFragmentRoot) selectionElement;
        } else if (selectionElement instanceof IJavaElement) {
            pack = (IPackageFragmentRoot) ((IJavaElement) selectionElement)
                    .getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
            if (pack == null) {
                IJavaProject element = ((IJavaElement) selectionElement).getJavaProject();

                for (IPackageFragmentRoot root : element.getPackageFragmentRoots()) {
                    if (root.getResource() != null) {
                        boolean isSrc = (root.getElementType()
                                & IPackageFragmentRoot.K_SOURCE) == IPackageFragmentRoot.K_SOURCE;
                        boolean isGen = root.getElementName().equals(IAndroidConstants.GEN_SRC_FOLDER)
                                && (root.getParent() instanceof IJavaProject);
                        if (isSrc && !isGen) {
                            pack = root;
                            break;
                        }
                    }
                }
            }
        } else if (selectionElement instanceof IResource) {
            IJavaProject element = JavaCore.create(((IResource) selectionElement).getProject());

            if (element.isOpen()) {
                for (IPackageFragmentRoot root : element.getPackageFragmentRoots()) {
                    if (root.getResource() != null) {
                        boolean isSrc = (root.getElementType()
                                & IPackageFragmentRoot.K_SOURCE) == IPackageFragmentRoot.K_SOURCE;
                        boolean isGen = root.getElementName().equals(IAndroidConstants.GEN_SRC_FOLDER)
                                && (root.getParent() instanceof IJavaProject);
                        if (isSrc && !isGen) {
                            pack = root;
                            break;
                        }
                    }
                }
            }
        } else {
            IJavaProject[] allProjects = JavaCore.create(ResourcesPlugin.getWorkspace().getRoot())
                    .getJavaProjects();
            if ((allProjects != null) && (allProjects.length > 0)) {
                for (IJavaProject project : allProjects) {
                    if (project.getResource().getProject().hasNature(IAndroidConstants.ANDROID_NATURE)) {
                        IPackageFragmentRoot[] roots = project.getPackageFragmentRoots();

                        if ((roots != null) && (roots.length > 0)) {
                            boolean found = false;

                            for (IPackageFragmentRoot root : roots) {
                                boolean isSrc = (root.getElementType()
                                        & IPackageFragmentRoot.K_SOURCE) == IPackageFragmentRoot.K_SOURCE;
                                boolean isGen = root.getElementName().equals(IAndroidConstants.GEN_SRC_FOLDER)
                                        && (root.getParent() instanceof IJavaProject);
                                if (isSrc && !isGen) {
                                    found = true;
                                    pack = root;
                                    break;
                                }
                            }

                            if (found) {
                                break;
                            }
                        }
                    }
                }
            }
        }

        if (pack != null) {
            if (!pack.getJavaProject().getProject().hasNature(IAndroidConstants.ANDROID_NATURE)) {
                pack = extractPackageFragmentRoot(new TreeSelection());
            }
        }
        return pack;
    }

    /** 
     * Return selected project.
     * @return
     */
    public IProject getProject() {
        IProject project = null;
        if (packageFragmentRoot != null) {
            project = packageFragmentRoot.getJavaProject().getProject();
        } else if (packageFragment != null) {
            project = packageFragment.getJavaProject().getProject();
        }
        return project;
    }

    /**
     * Change status from name. Use JDT validation.
     * @param nameStatus
     */
    public void setNameStatus(IStatus nameStatus) {
        this.nameStatus = nameStatus;
    }

    /*
     * (non-Javadoc)
     * @see com.motorola.studio.android.model.IWizardModel#getStatus()
     */
    public IStatus getStatus() {
        return getMostSevere(new IStatus[] { packageFragmentRootStatus, nameStatus, packageStatus, labelStatus });
    }

    /**
     * Find most severe status.
     * @param status
     * @return
     */
    protected static IStatus getMostSevere(IStatus[] status) {
        IStatus max = null;
        for (int i = 0; i < status.length; i++) {
            IStatus curr = status[i];
            if (curr.matches(IStatus.ERROR)) {
                return curr;
            }
            if ((max == null) || (curr.getSeverity() > max.getSeverity())) {
                max = curr;
            }
        }

        return max;
    }

    /**
     * Change package status. Use JDT Validation
     * @param packageStatus
     */
    public void setPackageStatus(IStatus packageStatus) {
        this.packageStatus = packageStatus;
    }

    /**
     * Change source folder status. Use JDT Validation
     * @param packageFragmentRootStatus
     */
    public void setPackageFragmentRootStatus(IStatus packageFragmentRootStatus) {
        this.packageFragmentRootStatus = packageFragmentRootStatus;
    }

    /**
     * Change label.
     * @param label
     */
    public void setLabel(String label) {
        this.label = label;
    }

    /**
     * Return Label.
     * @return
     */
    public String getLabel() {
        return label;
    }

    /**
     * Change Label Status. Don't uses JDT validation.
     * @param labelStatus
     */
    public void setLabelStatus(IStatus labelStatus) {
        this.labelStatus = labelStatus;
    }

    /**
     * Creates the Java Class file
     * 
     * @param javaClass The Java Class model
     * @param monitor The progress monitor
     * @throws JavaModelException
     * @throws AndroidException
     */
    protected void createJavaClassFile(JavaClass javaClass, IProgressMonitor monitor)
            throws JavaModelException, AndroidException {
        final String JAVA_EXTENSION = ".java";

        IPackageFragment targetPackage = getPackageFragmentRoot()
                .getPackageFragment(getPackageFragment().getElementName());

        if (!targetPackage.exists()) {
            getPackageFragmentRoot().createPackageFragment(targetPackage.getElementName(), true, monitor);
        }

        targetPackage.createCompilationUnit(getName() + JAVA_EXTENSION, //$NON-NLS-1$
                javaClass.getClassContent().get(), true, monitor);
    }

    /**
     * Return all Filter Permissions as an Array.
     * @return
     */
    public String[] getIntentFilterPermissionsAsArray() {
        return intentFilterPermissions.toArray(new String[intentFilterPermissions.size()]);
    }

    /**
     * Returns all intent filter permissions.
     * @return
     */
    public Set<String> getIntentFilterPermissions() {
        return intentFilterPermissions;
    }

    /**
     * Adds an intent filter permission to this launcher.
     * @param category
     */
    public void addIntentFilterPermissions(String permission) {
        intentFilterPermissions.add(permission);
    }

    /**
     * Remove intent filter permission.
     * @param category
     */
    public void removeIntentFilterPermissions(String permission) {
        intentFilterPermissions.remove(permission);
    }

    /**
     * @return the apiVersion
     */
    public int getApiVersion() {
        return apiVersion;
    }
}