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

net.sf.qualitycheck.immutableobject.generator.SourceCodeReader Maven / Gradle / Ivy

package net.sf.qualitycheck.immutableobject.generator;

import japa.parser.JavaParser;
import japa.parser.ParseException;
import japa.parser.ast.CompilationUnit;
import japa.parser.ast.ImportDeclaration;
import japa.parser.ast.body.BodyDeclaration;
import japa.parser.ast.body.ClassOrInterfaceDeclaration;
import japa.parser.ast.body.MethodDeclaration;
import japa.parser.ast.body.Parameter;
import japa.parser.ast.body.VariableDeclaratorId;
import japa.parser.ast.expr.AnnotationExpr;
import japa.parser.ast.type.ClassOrInterfaceType;

import java.io.ByteArrayInputStream;
import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import javax.annotation.concurrent.ThreadSafe;

import net.sf.qualitycheck.Check;
import net.sf.qualitycheck.immutableobject.domain.Annotation;
import net.sf.qualitycheck.immutableobject.domain.Attribute;
import net.sf.qualitycheck.immutableobject.domain.Final;
import net.sf.qualitycheck.immutableobject.domain.Import;
import net.sf.qualitycheck.immutableobject.domain.Imports;
import net.sf.qualitycheck.immutableobject.domain.Interface;
import net.sf.qualitycheck.immutableobject.domain.Method;
import net.sf.qualitycheck.immutableobject.domain.Primitive;
import net.sf.qualitycheck.immutableobject.domain.ReturnType;
import net.sf.qualitycheck.immutableobject.domain.Static;
import net.sf.qualitycheck.immutableobject.domain.Type;
import net.sf.qualitycheck.immutableobject.domain.Visibility;

import com.google.common.base.Charsets;
import com.google.common.collect.Lists;

@ThreadSafe
final class SourceCodeReader {

	@Nonnull
	public static Method createMethod(@Nonnull final MethodDeclaration methodDeclaration, @Nonnull final Imports imports) {
		Check.notNull(methodDeclaration, "methodDeclaration");
		Check.notNull(imports, "imports");
		final List annotations = findAnnotations(methodDeclaration.getAnnotations(), imports);
		final List attributes = findAttributes(methodDeclaration.getParameters(), imports);
		final ReturnType returnType = ReturnType.of(findType(methodDeclaration.getType(), imports));
		return new Method(methodDeclaration.getName(), returnType, Method.NOT_IMPLEMENTED, attributes, Visibility.PUBLIC, Final.UNDEFINED,
				Static.UNDEFINED, annotations);
	}

	@Nonnull
	public static List findAnnotations(@Nullable final List annotationExprs, @Nonnull final Imports imports) {
		Check.notNull(imports, "imports");
		final List annotations = Lists.newArrayList();
		if (annotationExprs != null) {
			for (final AnnotationExpr annotation : annotationExprs) {
				final String name = annotation.getName().toString();
				if (!name.isEmpty()) {
					final Import imp = imports.find(name);
					if (imp != null) {
						annotations.add(new Annotation(imp.getType()));
					}
				}
			}
		}
		return annotations;
	}

	@Nonnull
	public static List findAttributes(@Nullable final List parameters, @Nonnull final Imports imports) {
		Check.notNull(imports, "imports");
		final List attributes = Lists.newArrayList();
		if (parameters != null) {
			for (final Parameter parameter : parameters) {
				final VariableDeclaratorId var = parameter.getId();
				final Type type = findType(parameter.getType(), imports);
				final List annotations = findAnnotations(parameter.getAnnotations(), imports);
				attributes.add(new Attribute(var.getName(), type, Final.UNDEFINED, annotations));
			}
		}
		return attributes;
	}

	public static List findExtends(@Nonnull final ClassOrInterfaceDeclaration type) {
		final List ret = Lists.newArrayList();
		if (type.getExtends() != null) {
			for (final ClassOrInterfaceType extend : type.getExtends()) {
				ret.add(Interface.of(extend.getName()));
			}
		}
		return ret;
	}

	@Nonnull
	public static Imports findImports(@Nullable final List importDeclarations) {
		final List imports = Lists.newArrayList();
		if (importDeclarations != null) {
			for (final ImportDeclaration importDeclaration : importDeclarations) {
				imports.add(Import.of(importDeclaration.getName().toString()));
			}
		}
		return Imports.copyOf(imports);
	}

	@Nonnull
	public static List findMethods(@Nonnull final List members, @Nonnull final Imports imports) {
		Check.notNull(members, "members");
		Check.notNull(imports, "imports");
		final List methods = Lists.newArrayList();
		for (final BodyDeclaration member : members) {
			if (member instanceof MethodDeclaration) {
				methods.add(createMethod((MethodDeclaration) member, imports));
			}
		}
		return methods;
	}

	@Nonnull
	public static Type findType(@Nonnull final japa.parser.ast.type.Type type, @Nonnull final Imports imports) {
		Check.notNull(type, "type");
		Check.notNull(imports, "imports");
		final Type ret;
		if (Primitive.isPrimitive(type.toString())) {
			ret = new Type(type.toString());
		} else {
			final Type t = new Type(type.toString());
			final Import imp = imports.find(t.getName());
			ret = imp != null ? new Type(imp.getType().getPackage(), imp.getType().getName(), t.getGenericDeclaration()) : t;
		}
		return ret;
	}

	@Nullable
	static CompilationUnit parse(@Nonnull final String code) {
		Check.notNull(code, "code");
		CompilationUnit unit = null;
		try {
			unit = JavaParser.parse(new ByteArrayInputStream(code.getBytes(Charsets.UTF_8.displayName())));
		} catch (final UnsupportedEncodingException e) {
			throw new RuntimeException("Character encoding is not supported: switch to UTF-8");
		} catch (final ParseException e) {
			throw new RuntimeException("Failed to parse interface: " + e.getLocalizedMessage(), e);
		}
		return unit;
	}

	/**
	 * Attention: This class is not intended to create objects from it.
	 */
	private SourceCodeReader() {
		// This class is not intended to create objects from it.
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy