blob: fd7a5eda42e407125fb72cb100165ecb0dd1452f [file] [log] [blame]
/*
* 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.java;
import org.eclipse.jdt.core.dom.AST;
import org.eclipse.jdt.core.dom.ASTNode;
import org.eclipse.jdt.core.dom.ASTParser;
import org.eclipse.jdt.core.dom.Block;
import org.eclipse.jdt.core.dom.CompilationUnit;
import org.eclipse.jdt.core.dom.ImportDeclaration;
import org.eclipse.jdt.core.dom.MethodDeclaration;
import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
import org.eclipse.jdt.core.dom.PrimitiveType;
import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
import org.eclipse.jdt.core.dom.SuperMethodInvocation;
import org.eclipse.jdt.core.dom.Type;
import org.eclipse.jdt.core.dom.TypeDeclaration;
import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.osgi.util.NLS;
import org.eclipse.text.edits.MalformedTreeException;
import org.eclipse.text.edits.TextEdit;
import com.motorola.studio.android.codeutils.i18n.CodeUtilsNLS;
import com.motorola.studio.android.common.exception.AndroidException;
import com.motorola.studio.android.common.log.StudioLogger;
/**
* Class used to create an Android Activity building block class
*/
public class ActivityClass extends JavaClass
{
public static final String ACTIVITY_SUPERCLASS = "android.app.Activity";
private static final String[] BUNDLE_CLASS = getFQNAsArray("android.os.Bundle");
protected static final String ONCREATE_METHOD_NAME = "onCreate";
protected static final String ONSTART_METHOD_NAME = "onStart";
private ASTRewrite rewrite = null;
/**
* The constructor
*
* @param className The simple class name
* @param packageName The full-qualified class package name
* @param addOnStart If true, adds the OnStart method to the activity class
*/
public ActivityClass(String className, String packageName, boolean addOnStart)
{
super(className, packageName, ACTIVITY_SUPERCLASS);
addBasicActivityInfo();
if (addOnStart)
{
addOnStartMethod();
}
}
/**
* Adds basic information to the activity class
*/
private void addBasicActivityInfo()
{
addOnCreateMethod();
// Adds JavaDoc to elements
addComment(classDecl, CodeUtilsNLS.MODEL_ActivityClass_ActivityDescription);
}
/**
* Adds the onCreate method to the activity class
*/
@SuppressWarnings("unchecked")
private void addOnCreateMethod()
{
// Adds import for Bundle
ImportDeclaration intentImport = ast.newImportDeclaration();
intentImport.setName(ast.newName(BUNDLE_CLASS));
compUnit.imports().add(intentImport);
MethodDeclaration onCreateMethod = ast.newMethodDeclaration();
onCreateMethod.modifiers().add(ast.newModifier(ModifierKeyword.PROTECTED_KEYWORD));
onCreateMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onCreateMethod.setName(ast.newSimpleName(ONCREATE_METHOD_NAME));
addMethodParameter(onCreateMethod, "savedInstanceState",
ast.newSimpleType(ast.newSimpleName(getName(BUNDLE_CLASS))));
addEmptyBlock(onCreateMethod);
addSuperInvocation(onCreateMethod);
classDecl.bodyDeclarations().add(onCreateMethod);
// Adds JavaDoc to the method
addComment(onCreateMethod, CodeUtilsNLS.MODEL_ActivityClass_OnCreateMethodDescription);
addMethodReference(onCreateMethod, ACTIVITY_SUPERCLASS, ONCREATE_METHOD_NAME, new Type[]
{
ast.newSimpleType(ast.newSimpleName(getName(BUNDLE_CLASS)))
});
}
/**
* Adds the onStart method to the activity class
*/
@SuppressWarnings("unchecked")
private void addOnStartMethod()
{
MethodDeclaration onStartMethod = ast.newMethodDeclaration();
onStartMethod.modifiers().add(ast.newModifier(ModifierKeyword.PROTECTED_KEYWORD));
onStartMethod.setReturnType2(ast.newPrimitiveType(PrimitiveType.VOID));
onStartMethod.setName(ast.newSimpleName(ONSTART_METHOD_NAME));
addEmptyBlock(onStartMethod);
addSuperInvocation(onStartMethod);
classDecl.bodyDeclarations().add(onStartMethod);
// Adds JavaDoc to the method
addComment(onStartMethod, CodeUtilsNLS.MODEL_ActivityClass_OnStartMethodDescription);
addMethodReference(onStartMethod, ACTIVITY_SUPERCLASS, ONSTART_METHOD_NAME, null);
}
/**
* Adds a "super.method(arguments...)" statement inside the given method body
*
* @param method The method declaration
*/
@SuppressWarnings("unchecked")
private void addSuperInvocation(MethodDeclaration method)
{
SuperMethodInvocation superInv = ast.newSuperMethodInvocation();
superInv.setName(ast.newSimpleName(method.getName().toString()));
for (Object param : method.parameters())
{
if (param instanceof SingleVariableDeclaration)
{
SingleVariableDeclaration vd = (SingleVariableDeclaration) param;
String varName = vd.getName().toString();
superInv.arguments().add(ast.newSimpleName(varName));
}
}
method.getBody().statements().add(ast.newExpressionStatement(superInv));
}
/* (non-Javadoc)
* @see com.motorola.studio.android.model.java.JavaClass#addComments()
*/
@Override
protected void addComments() throws AndroidException
{
ASTNode todoComment;
ASTParser parser = ASTParser.newParser(AST.JLS3);
parser.setSource(document.get().toCharArray());
compUnit = (CompilationUnit) parser.createAST(null);
ast = compUnit.getAST();
rewrite = ASTRewrite.create(ast);
todoComment =
rewrite.createStringPlaceholder(CodeUtilsNLS.MODEL_Common_ToDoPutYourCodeHere,
ASTNode.EMPTY_STATEMENT);
TypeDeclaration activityClass = (TypeDeclaration) compUnit.types().get(0);
MethodDeclaration method;
Block block;
// Adds the Override annotation and ToDo comment to all overridden methods
for (int i = 0; i < activityClass.bodyDeclarations().size(); i++)
{
method = (MethodDeclaration) activityClass.bodyDeclarations().get(i);
// Adds the Override annotation
rewrite.getListRewrite(method, method.getModifiersProperty()).insertFirst(
OVERRIDE_ANNOTATION, null);
// Adds the ToDo comment
block = method.getBody();
rewrite.getListRewrite(block, Block.STATEMENTS_PROPERTY).insertLast(todoComment, null);
}
try
{
// Writes the modifications
TextEdit modifications = rewrite.rewriteAST(document, null);
modifications.apply(document);
}
catch (IllegalArgumentException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
StudioLogger.error(ActivityClass.class, errMsg, e);
throw new AndroidException(errMsg);
}
catch (MalformedTreeException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
StudioLogger.error(ActivityClass.class, errMsg, e);
throw new AndroidException(errMsg);
}
catch (BadLocationException e)
{
String errMsg =
NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
StudioLogger.error(ActivityClass.class, errMsg, e);
throw new AndroidException(errMsg);
}
}
}