summaryrefslogtreecommitdiff
path: root/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ContentProviderClass.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ContentProviderClass.java')
-rw-r--r--src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ContentProviderClass.java433
1 files changed, 433 insertions, 0 deletions
diff --git a/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ContentProviderClass.java b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ContentProviderClass.java
new file mode 100644
index 0000000..2a81305
--- /dev/null
+++ b/src/plugins/android.codeutils/src/com/motorola/studio/android/model/java/ContentProviderClass.java
@@ -0,0 +1,433 @@
+/*
+ * 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.core.runtime.Assert;
+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.BodyDeclaration;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.FieldDeclaration;
+import org.eclipse.jdt.core.dom.ImportDeclaration;
+import org.eclipse.jdt.core.dom.MethodDeclaration;
+import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
+import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.dom.PrimitiveType;
+import org.eclipse.jdt.core.dom.StringLiteral;
+import org.eclipse.jdt.core.dom.Type;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
+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 Content Provider building block class
+ */
+public class ContentProviderClass extends JavaClass
+{
+ private static final String CP_SUPERCLASS = "android.content.ContentProvider";
+
+ private static final String[] URI_CLASS = getFQNAsArray("android.net.Uri");
+
+ private static final String[] CONTENTVALUES_CLASS =
+ getFQNAsArray("android.content.ContentValues");
+
+ private static final String[] CURSOR_CLASS = getFQNAsArray("android.database.Cursor");
+
+ private static final String DELETE_METHOD_NAME = "delete";
+
+ private static final String GETTYPE_METHOD_NAME = "getType";
+
+ private static final String INSERT_METHOD_NAME = "insert";
+
+ private static final String ONCREATE_METHOD_NAME = "onCreate";
+
+ private static final String QUERY_METHOD_NAME = "query";
+
+ private static final String UPDATE_METHOD_NAME = "update";
+
+ private static final String CONTENT_SCHEME = "content://";
+
+ private static final String CONTENT_URI_NAME = "CONTENT_URI";
+
+ private ASTRewrite rewrite;
+
+ private String authority;
+
+ /**
+ * Default constructor
+ *
+ * @param className The simple class name
+ * @param packageName The full-qualified class package name
+ */
+ public ContentProviderClass(String className, String packageName, String authority)
+ {
+ super(className, packageName, CP_SUPERCLASS);
+
+ Assert.isNotNull(authority);
+ this.authority = authority;
+
+ addBasicCPInfo();
+ }
+
+ /**
+ * Adds basic information to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addBasicCPInfo()
+ {
+ ImportDeclaration importDecl;
+
+ // Adds import for Uri
+ importDecl = ast.newImportDeclaration();
+ importDecl.setName(ast.newName(URI_CLASS));
+ compUnit.imports().add(importDecl);
+
+ // Adds import for ContentValues
+ importDecl = ast.newImportDeclaration();
+ importDecl.setName(ast.newName(CONTENTVALUES_CLASS));
+ compUnit.imports().add(importDecl);
+
+ // Adds import for Cursor
+ importDecl = ast.newImportDeclaration();
+ importDecl.setName(ast.newName(CURSOR_CLASS));
+ compUnit.imports().add(importDecl);
+
+ // Adds the authorities constants
+ addAuthority();
+
+ // Adds the delete method
+ addDeleteMethod();
+
+ // Adds the getType method
+ addGetTypeMethod();
+
+ // Adds the insert method
+ addInsertMethod();
+
+ // Adds the onCreate method
+ addOnCreateMethod();
+
+ // Adds the query method
+ addQueryMethod();
+
+ // Adds the update method
+ addUpdateMethod();
+
+ // Adds JavaDoc to elements
+ addComment(classDecl, CodeUtilsNLS.MODEL_ContentProviderClass_ContentProviderDescription);
+ }
+
+ /**
+ * Adds the default content provider Uri
+ */
+ @SuppressWarnings("unchecked")
+ private void addAuthority()
+ {
+ final String URI_PARSE_METHOD = "parse";
+
+ String contentUriValue = CONTENT_SCHEME + authority;
+ StringLiteral stringLiteral = ast.newStringLiteral();
+ stringLiteral.setLiteralValue(contentUriValue);
+
+ Name uri = ast.newSimpleName(getName(URI_CLASS));
+
+ MethodInvocation parse = ast.newMethodInvocation();
+ parse.setExpression(uri);
+ parse.setName(ast.newSimpleName(URI_PARSE_METHOD));
+ parse.arguments().add(stringLiteral);
+
+ VariableDeclarationFragment contentUri = ast.newVariableDeclarationFragment();
+
+ contentUri.setName(ast.newSimpleName(CONTENT_URI_NAME));
+ contentUri.setInitializer(parse);
+
+ FieldDeclaration fieldDeclaration = ast.newFieldDeclaration(contentUri);
+ fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.STATIC_KEYWORD));
+ fieldDeclaration.modifiers().add(ast.newModifier(ModifierKeyword.FINAL_KEYWORD));
+ fieldDeclaration.setType(uriType());
+
+ classDecl.bodyDeclarations().add(fieldDeclaration);
+
+ addComment(fieldDeclaration, CodeUtilsNLS.MODEL_ContentProviderClass_ContentUriDescription);
+ }
+
+ /**
+ * Adds the delete method to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addDeleteMethod()
+ {
+ final String SELECTION_PARAM = "selection";
+ final String SELECTION_ARGS_PARAM = "selectionArgs";
+
+ MethodDeclaration method = ast.newMethodDeclaration();
+ method.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ method.setReturnType2(ast.newPrimitiveType(PrimitiveType.INT));
+ method.setName(ast.newSimpleName(DELETE_METHOD_NAME));
+ addMethodParameter(method, getName(URI_CLASS).toLowerCase(), uriType());
+ addMethodParameter(method, SELECTION_PARAM, stringType());
+ addMethodParameter(method, SELECTION_ARGS_PARAM, stringArrayType());
+ addEmptyBlock(method);
+ classDecl.bodyDeclarations().add(method);
+
+ addComment(method, CodeUtilsNLS.MODEL_ContentProviderClass_DeleteMethodDescription);
+ addMethodReference(method, CP_SUPERCLASS, DELETE_METHOD_NAME, new Type[]
+ {
+ uriType(), stringType(), stringArrayType()
+ });
+ }
+
+ /**
+ * Adds the getType method to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addGetTypeMethod()
+ {
+ MethodDeclaration method = ast.newMethodDeclaration();
+ method.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ method.setReturnType2(stringType());
+ method.setName(ast.newSimpleName(GETTYPE_METHOD_NAME));
+ addMethodParameter(method, getName(URI_CLASS).toLowerCase(), uriType());
+
+ addEmptyBlock(method);
+ classDecl.bodyDeclarations().add(method);
+
+ addComment(method, CodeUtilsNLS.MODEL_ContentProviderClass_GetTypeMethodDescription);
+ addMethodReference(method, CP_SUPERCLASS, GETTYPE_METHOD_NAME, new Type[]
+ {
+ uriType()
+ });
+ }
+
+ /**
+ * Adds the insert method to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addInsertMethod()
+ {
+ final String VALUES_PARAM = "values";
+
+ MethodDeclaration method = ast.newMethodDeclaration();
+ method.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ method.setReturnType2(uriType());
+ method.setName(ast.newSimpleName(INSERT_METHOD_NAME));
+ addMethodParameter(method, getName(URI_CLASS).toLowerCase(), uriType());
+ addMethodParameter(method, VALUES_PARAM, contentValuesType());
+ addEmptyBlock(method);
+ classDecl.bodyDeclarations().add(method);
+
+ addComment(method, CodeUtilsNLS.MODEL_ContentProviderClass_InsertMethodDescription);
+ addMethodReference(method, CP_SUPERCLASS, INSERT_METHOD_NAME, new Type[]
+ {
+ uriType(), contentValuesType()
+ });
+ }
+
+ /**
+ * Adds the onCreate method to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addOnCreateMethod()
+ {
+ MethodDeclaration method = ast.newMethodDeclaration();
+ method.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ method.setReturnType2(ast.newPrimitiveType(PrimitiveType.BOOLEAN));
+ method.setName(ast.newSimpleName(ONCREATE_METHOD_NAME));
+ addEmptyBlock(method);
+ classDecl.bodyDeclarations().add(method);
+
+ addComment(method, CodeUtilsNLS.MODEL_ContentProviderClass_OnCreateMethodDescription);
+ addMethodReference(method, CP_SUPERCLASS, ONCREATE_METHOD_NAME, null);
+ }
+
+ /**
+ * Adds the query method to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addQueryMethod()
+ {
+ final String PROJECTION_PARAM = "projection";
+ final String SELECTION_PARAM = "selection";
+ final String SELECTION_ARGS_PARAM = "selectionArgs";
+ final String SORT_ORDER_PARAM = "sortOrder";
+
+ MethodDeclaration method = ast.newMethodDeclaration();
+ method.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ method.setReturnType2(cursorType());
+ method.setName(ast.newSimpleName(QUERY_METHOD_NAME));
+ addMethodParameter(method, getName(URI_CLASS).toLowerCase(), uriType());
+ addMethodParameter(method, PROJECTION_PARAM, stringArrayType());
+ addMethodParameter(method, SELECTION_PARAM, stringType());
+ addMethodParameter(method, SELECTION_ARGS_PARAM, stringArrayType());
+ addMethodParameter(method, SORT_ORDER_PARAM, stringType());
+
+ addEmptyBlock(method);
+ classDecl.bodyDeclarations().add(method);
+
+ addComment(method, CodeUtilsNLS.MODEL_ContentProviderClass_QueryMethodDescription);
+ addMethodReference(method, CP_SUPERCLASS, QUERY_METHOD_NAME, new Type[]
+ {
+ uriType(), stringArrayType(), stringType(), stringArrayType(), stringType()
+ });
+ }
+
+ /**
+ * Adds the update method to the content provider class
+ */
+ @SuppressWarnings("unchecked")
+ private void addUpdateMethod()
+ {
+ final String VALUES_PARAM = "values";
+ final String SELECTION_PARAM = "selection";
+ final String SELECTION_ARGS_PARAM = "selectionArgs";
+
+ MethodDeclaration method = ast.newMethodDeclaration();
+ method.modifiers().add(ast.newModifier(ModifierKeyword.PUBLIC_KEYWORD));
+ method.setReturnType2(ast.newPrimitiveType(PrimitiveType.INT));
+ method.setName(ast.newSimpleName(UPDATE_METHOD_NAME));
+ addMethodParameter(method, getName(URI_CLASS).toLowerCase(), uriType());
+ addMethodParameter(method, VALUES_PARAM, contentValuesType());
+ addMethodParameter(method, SELECTION_PARAM, stringType());
+ addMethodParameter(method, SELECTION_ARGS_PARAM, stringArrayType());
+
+ addEmptyBlock(method);
+ classDecl.bodyDeclarations().add(method);
+
+ addComment(method, CodeUtilsNLS.MODEL_ContentProviderClass_UpdateMethodDescription);
+ addMethodReference(method, CP_SUPERCLASS, UPDATE_METHOD_NAME, new Type[]
+ {
+ uriType(), contentValuesType(), stringType(), stringArrayType()
+ });
+ }
+
+ /* (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 cpClass = (TypeDeclaration) compUnit.types().get(0);
+ MethodDeclaration method;
+ Block block;
+
+ // Adds the Override annotation and ToDo comment to all abstract methods
+ for (int i = 0; i < cpClass.bodyDeclarations().size(); i++)
+ {
+ BodyDeclaration bodyDecl = (BodyDeclaration) cpClass.bodyDeclarations().get(i);
+
+ if (bodyDecl instanceof MethodDeclaration)
+ {
+ method = (MethodDeclaration) bodyDecl;
+
+ // 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).insertFirst(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(ContentProviderClass.class, errMsg, e);
+ throw new AndroidException(errMsg);
+ }
+ catch (MalformedTreeException e)
+ {
+ String errMsg =
+ NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
+
+ StudioLogger.error(ContentProviderClass.class, errMsg, e);
+ throw new AndroidException(errMsg);
+ }
+ catch (BadLocationException e)
+ {
+ String errMsg =
+ NLS.bind(CodeUtilsNLS.EXC_JavaClass_ErrorApplyingCommentsToCode, className);
+
+ StudioLogger.error(ContentProviderClass.class, errMsg, e);
+ throw new AndroidException(errMsg);
+ }
+ }
+
+ /**
+ * Returns a new Uri type
+ *
+ * @return a new Uri type
+ */
+ private Type uriType()
+ {
+ return ast.newSimpleType(ast.newSimpleName(getName(URI_CLASS)));
+ }
+
+ /**
+ * Returns a new ContentValues type
+ *
+ * @return a new ContentValues type
+ */
+ private Type contentValuesType()
+ {
+ return ast.newSimpleType(ast.newSimpleName(getName(CONTENTVALUES_CLASS)));
+ }
+
+ /**
+ * Returns a new Cursor type
+ *
+ * @return a new Cursor type
+ */
+ private Type cursorType()
+ {
+ return ast.newSimpleType(ast.newSimpleName(getName(CURSOR_CLASS)));
+ }
+
+}