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

com.zvoykish.restdl.generator.java.JavaRestdlGeneratorProvider Maven / Gradle / Ivy

package com.zvoykish.restdl.generator.java;

import com.zvoykish.restdl.generator.ContentGenerator;
import com.zvoykish.restdl.generator.HttpClientFactoryInterface;
import com.zvoykish.restdl.generator.HttpClientFactoryInterfaceImpl;
import com.zvoykish.restdl.generator.RestdlGeneratorProvider;
import com.zvoykish.restdl.generator.java.impl.ClassContentGenerator;
import com.zvoykish.restdl.generator.java.impl.EnumObjectContentGenerator;
import com.zvoykish.restdl.generator.java.impl.PrimitiveObjectContentGenerator;
import com.zvoykish.restdl.objects.EndpointInfo;
import com.zvoykish.restdl.objects.TypedObject;
import com.zvoykish.restdl.objects.TypedObjectType;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

import java.io.File;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Created with IntelliJ IDEA.
 * User: Zvoykish
 * Date: 1/12/14
 * Time: 22:50
 */
public class JavaRestdlGeneratorProvider implements RestdlGeneratorProvider {
    public static final String CLASS_NAME_REST_TEMPLATE_FACTORY = "RestdlRestTemplateFactory";
    private final JavaWriter writer;
    private final Map contentGeneratorMap;

    public JavaRestdlGeneratorProvider() {
        writer = new JavaWriter();
        contentGeneratorMap = new HashMap<>();
        contentGeneratorMap.put(TypedObjectType.Primitive, new PrimitiveObjectContentGenerator());
        contentGeneratorMap.put(TypedObjectType.Enum, new EnumObjectContentGenerator());
        contentGeneratorMap.put(TypedObjectType.Other, new ClassContentGenerator(writer));

        java.util.Properties p = new java.util.Properties();
        p.setProperty("resource.loader", "class");
        p.setProperty("class.resource.loader.class",
                "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
        Velocity.init(p);
    }

    @Override
    public boolean isIgnoredType(String objectTypeClass) {
        return objectTypeClass == null || objectTypeClass.indexOf('.') == -1 ||
                objectTypeClass.indexOf('<') > -1 || objectTypeClass.indexOf('[') > -1;
    }

    @Override
    public String generateTypeContents(TypedObject type, String className, Map typeMap) {
        String objectTypeClass = type.getClassName();
        if (objectTypeClass == null || objectTypeClass.indexOf('.') == -1 ||
                objectTypeClass.indexOf('<') > -1 || objectTypeClass.indexOf('[') > -1)
        {
            System.out.println("Unhandled class: " + type);
            return null;
        }

        String targetPackage = getPackage(objectTypeClass);
        String contents = generateClassContents(type, targetPackage, className, typeMap);
        return contents;
    }

    @Override
    public String generateApiInterface(List endpoints, String className, String packageName,
                                       Map typeMap)
    {
        Template template = Velocity.getTemplate("templates/interface.vm");
        StringWriter stringWriter = new StringWriter();
        VelocityContext context = new VelocityContext();
        context.put("packageName", packageName);
        context.put("interfaceName", className);
        context.put("endpoints", endpoints);
        context.put("writer", writer);
        context.put("types", typeMap);
        template.merge(context, stringWriter);
        return stringWriter.toString();
    }

    @Override
    public String generateApiImplementation(List endpoints, String className, String packageName,
                                            Map typeMap)
    {
        // TODO 1: Void return types (and delete/put requests that do not return any value)
        // TODO 2: Generic request types
        // TODO 3: Path params (need to accept them as method parameters and replace the params in the URL string)
        Template template = Velocity.getTemplate("templates/class.vm");
        StringWriter stringWriter = new StringWriter();
        VelocityContext context = new VelocityContext();
        context.put("packageName", packageName);
        context.put("clientFactoryClassName", CLASS_NAME_REST_TEMPLATE_FACTORY);
        context.put("superInterfaces", new String[]{className.substring(0, className.length() - 4)});
        context.put("className", className);
        context.put("endpoints", endpoints);
        context.put("writer", writer);
        context.put("types", typeMap);
        template.merge(context, stringWriter);
        return stringWriter.toString();
    }

    @Override
    public HttpClientFactoryInterface generateHttpClientFactory(String packageName) {
        Template template = Velocity.getTemplate("templates/resttemplate_factory.vm");
        StringWriter stringWriter = new StringWriter();
        VelocityContext context = new VelocityContext();
        context.put("packageName", packageName);
        context.put("factoryInterfaceName", CLASS_NAME_REST_TEMPLATE_FACTORY);
        template.merge(context, stringWriter);
        return new HttpClientFactoryInterfaceImpl(CLASS_NAME_REST_TEMPLATE_FACTORY, stringWriter.toString());
    }

    @Override
    public String getClassFileExtension() {
        return "java";
    }

    public String classNameToPath(String targetPackage) {
        return targetPackage.replace('.', File.separatorChar).replace('$', '_');
    }

    private String getPackage(String objectTypeClass) {
        return objectTypeClass.substring(0, objectTypeClass.lastIndexOf('.'));
    }

    private String generateClassContents(TypedObject typedObject, String targetPackage, String className,
                                         Map typeMap)
    {
        TypedObjectType typedObjectType = TypedObjectType.fromString(typedObject.getType());
        ContentGenerator contentGenerator = contentGeneratorMap.get(typedObjectType);
        if (contentGenerator != null) {
            String content = contentGenerator.generateContent(typedObject, className, typeMap);
            if (content == null) {
                return null;
            }

            Template template = Velocity.getTemplate("templates/package_with_contents.vm");
            StringWriter stringWriter = new StringWriter();
            VelocityContext context = new VelocityContext();
            context.put("packageName", targetPackage);
            context.put("contents", content);
            template.merge(context, stringWriter);
            return stringWriter.toString();
        }
        else {
            return null;
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy