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

com.wuba.wsilk.producer.builder.BuilderSerializer Maven / Gradle / Ivy

package com.wuba.wsilk.producer.builder;

import static com.wuba.wsilk.codegen.Constants.*;

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.Set;

import org.apache.commons.lang3.StringUtils;

import com.wuba.wsilk.codegen.JavaWriter;
import com.wuba.wsilk.codegen.Modifier;
import com.wuba.wsilk.codegen.PropertyMeta;
import com.wuba.wsilk.codegen.model.ClassType;
import com.wuba.wsilk.codegen.model.Parameter;
import com.wuba.wsilk.core.NoGenericException;
import com.wuba.wsilk.core.SourceEntityMeta;
import com.wuba.wsilk.core.Support;
import com.wuba.wsilk.core.WsilkConfiguration;
import com.wuba.wsilk.core.serializer.java.AbstractSingleJavaSerializer;

/**
 * 
 * Builder 的生成器
 * 
 * @author mindashuang
 */
@Support(value = Builder.class, suffix = "Builder", override = false)
public class BuilderSerializer extends AbstractSingleJavaSerializer {

	/** 拿到原始类的类型 */
	private ClassType bean;

	private String name;

	public BuilderSerializer(WsilkConfiguration configuration, Class annClass) {
		super(configuration, annClass);
	}

	@Override
	public SourceEntityMeta init(SourceEntityMeta em) throws NoGenericException {
		// 拿到原始类的类型
		bean = new ClassType(em.getJavaClass());
		// 拿到原始类的名字
		name = StringUtils.uncapitalize(bean.getSimpleName());
		return super.init(em);
	}

	@Override
	public void constructors(JavaWriter writer, SourceEntityMeta em) throws IOException {
		// 创建一个私有构造器
		writer.beginConstructor(Modifier.Field.PRIVATE);
		writer.line(THIS, DOT, name, EQ, NEW, em.getOriginal().getSimpleName(), BRAKETS, SEMICOLON);
		writer.end();
	}

	@Override
	public void methods(JavaWriter writer, SourceEntityMeta em) throws IOException {// 重写所有方法
		// 写一个静态create的方法
		writer.beginMethod(Modifier.Field.PUBLIC_STATIC, em, "create");
		String javaName = em.getSimpleName();
		String proxName = StringUtils.uncapitalize(javaName);
		writer.line(javaName, SPACE, proxName, EQ, NEW, javaName, BRAKETS, SEMICOLON);
		writer.line(RETURN, proxName, SEMICOLON);
		writer.end();

		// 遍历元素数据的所有属性,生成对应的方法
		Set propertyMetas = em.getOriginal().getAllProperties();
		if (propertyMetas != null) {
			for (PropertyMeta propertyMeta : propertyMetas) {
				writer.beginMethod(em, propertyMeta.getName(),
						new Parameter(propertyMeta.getName(), propertyMeta.getType()));
				writer.line(THIS, DOT, name, DOT, SET, StringUtils.capitalize(propertyMeta.getName()), "(",
						propertyMeta.getName(), ");");
				writer.line(RETURN, THIS, SEMICOLON);
				writer.end();
			}
		}
	}

	@Override
	public void properties(JavaWriter writer, SourceEntityMeta em) throws IOException {
		// 生成一个私有遍历
		writer.field(Modifier.Field.PRIVATE, bean, name);
	}

	@Override
	public void importPackage(JavaWriter writer, SourceEntityMeta em) throws IOException {
		// 导入原始数据的对象全名 getOriginal() 是获得注解上的原数据对象
		writer.importClasses(em.getOriginal().getFullName());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy