All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.droitateddb.builder.provider.ContentProviderBuilder Maven / Gradle / Ivy

Go to download

droitatedDB is a lightweight framework, which frees you from the burden of dealing with Androids SQLite database directly if you don't want to and let's you access it directly if you have to.

The newest version!
/*
 * Copyright (C) 2014 The droitated DB Authors
 *
 * 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 org.droitateddb.builder.provider;

import org.droitateddb.entity.Entity;

import javax.annotation.processing.Messager;
import javax.lang.model.element.Element;
import javax.lang.model.element.VariableElement;
import javax.tools.Diagnostic.Kind;
import java.util.Locale;

import static org.droitateddb.builder.Constants.GENERATED_COMMENT;
import static org.droitateddb.builder.Constants.TAB;
import static org.droitateddb.schema.SchemaConstants.*;

/**
 * Generates Java source file content a ContentProvider depending on a {@link Entity} annotated class.
 *
 * @author Alexander Frank
 * @author Falk Appel
 */
public class ContentProviderBuilder {

    private final Element entityElement;
    private final Entity entity;
    private final String packageName;
    private final String entityName;
    private final VariableElement primaryKey;
    private final Messager messager;

    public static final String CONTENT_PROVIDER_SUFFIX = "ContentProvider";

    public ContentProviderBuilder(final String packageName, final Element entityElement, final Messager messager) {
        this.packageName = packageName;
        this.entityElement = entityElement;
        this.messager = messager;
        entityName = entityElement.getSimpleName().toString();
        entity = entityElement.getAnnotation(Entity.class);
        primaryKey = getPrimaryKey();
    }

    private VariableElement getPrimaryKey() {
        for (Element element : entityElement.getEnclosedElements()) {
            VariableElement variableElement = element.accept(new PrimaryKeyVisitor(), null);
            if (variableElement != null) {
                return variableElement;
            }
        }
        String error = "The @Entity " + entityName + " has no @PrimaryKey. @PrimaryKey is required";
        messager.printMessage(Kind.ERROR, error, entityElement);
        throw new IllegalStateException(error);
    }

    public SourceContentProviderData build() {

        String providerName = entityName + CONTENT_PROVIDER_SUFFIX;
        String authority = getAuthority();

        StringBuilder builder = new StringBuilder();
        addSignature(builder, providerName);
        overrideEntityUriPart(builder);
        overrideGetAuthority(builder, authority);
        overrideGetEntityInfo(builder);
        overrideGetIdAttribute(builder);
        addEnd(builder);
        String source = builder.toString();
        return new SourceContentProviderData(packageName, providerName, source, authority, entity.exported());
    }

    private void addSignature(final StringBuilder builder, final String providerName) {
        builder.append(GENERATED_COMMENT);
        builder.append("package ").append(packageName).append(";\n\n") //
                .append("import ").append("org.droitateddb.schema.*;\n") //
                .append("import ").append("org.droitateddb.*;\n") //
                .append("public class ").append(providerName).append(" extends BaseContentProvider {\n\n");
    }

    private void overrideEntityUriPart(final StringBuilder builder) {
        builder.append(TAB).append("@Override\n") //
                .append(TAB).append("protected String getEntityURIPart() {\n") //
                .append(TAB).append(TAB).append("return \"").append(entityName.toLowerCase(Locale.getDefault())).append("\";\n") //
                .append(TAB).append("}\n\n");
    }

    private void overrideGetAuthority(final StringBuilder builder, final String authority) {
        builder.append(TAB).append("@Override\n") //
                .append(TAB).append("protected String getAuthority() {\n") //
                .append(TAB).append("return \"").append(authority).append("\";\n") //
                .append(TAB).append("}\n\n");
    }

    private void overrideGetEntityInfo(final StringBuilder builder) {
        builder.append(TAB).append("@Override\n");
        builder.append(TAB).append("protected EntityInfo getEntityInfo() {\n");
        builder.append(TAB).append(TAB).append("return ").append(DB).append(".").append(entityName).append(INFO_SUFFIX).append(";\n");
        builder.append(TAB).append("}\n\n");
    }

    private void overrideGetIdAttribute(final StringBuilder builder) {
        builder.append(TAB).append("@Override\n");
        builder.append(TAB).append("protected AbstractAttribute getIdAttribute() {\n");
        builder.append(TAB).append(TAB).append("return ").append(DB).append(".").append(entityName).append(TABLE).append(".")
                .append(primaryKey.getSimpleName().toString().toUpperCase(Locale.getDefault())).append(";\n");
        builder.append(TAB).append("}\n");

    }

    private void addEnd(final StringBuilder builder) {
        builder.append("}");
    }

    private String getAuthority() {
        String authority = entity.authority();
        if (authority == null || authority.equals("")) {
            return packageName + ".provider." + entityName.toLowerCase(Locale.getDefault());
        }
        return authority;
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy