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

com.wuba.wsilk.producer.wrapper.WrapperSerializer Maven / Gradle / Ivy

package com.wuba.wsilk.producer.wrapper;

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

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

import com.wuba.wsilk.codegen.JavaWriter;
import com.wuba.wsilk.codegen.MethodMeta;
import com.wuba.wsilk.codegen.Modifier;
import com.wuba.wsilk.codegen.model.Parameter;
import com.wuba.wsilk.codegen.model.Type;
import com.wuba.wsilk.codegen.model.TypeExtends;
import com.wuba.wsilk.codegen.model.Types;
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;

/**
 * 
 * 组合模式
 * 
 * @author mindashuang
 */
@Support(value = Wrapper.class, order = 1, pkgInlcudeSuffix = false, override = true, suffix = "Wrapper")
public class WrapperSerializer extends AbstractSingleJavaSerializer {

	private final static String DELEGATE = "delegate";

	private final static String RESULT = "result";

	private final static Type RETURN_TYPE = new TypeExtends(Types.VOID);

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

	@Override
	public void createJavaHead(JavaWriter writer, SourceEntityMeta t) throws IOException {
		writer.beginClass(Modifier.Class.PUBLIC_ABSTRACT, t, getSuperClass(t), getSuperInterface(t));
	}

	@Override
	public void properties(JavaWriter writer, SourceEntityMeta t) throws IOException {
		// 创建一个属性
		writer.field(Modifier.Field.PRIVATE, t.getOriginal(), DELEGATE);
	}

	@Override
	public List superInterface(SourceEntityMeta t) throws IOException {
		List superType = super.superInterface(t);
		if (t.getOriginal().isInterface()) {
			superType.add(t.getOriginal());
		}
		return superType;
	}

	@Override
	public Type getSuperClass(SourceEntityMeta t) throws IOException {
		if (!t.getOriginal().isInterface()) {
			return t.getOriginal();
		}
		return null;
	}

	@Override
	public void constructors(JavaWriter writer, SourceEntityMeta t) throws IOException {
		writer.beginConstructor(new Parameter(DELEGATE, t.getOriginal()));
		writer.assign(DELEGATE);
		writer.end();
	}

	@Override
	public void methods(JavaWriter writer, SourceEntityMeta t) throws IOException {
		writer.beginMethod(t.getOriginal(), "getDelegate");
		writer.returns(DELEGATE);
		writer.end();

		// 获得装饰的最下层
		writer.beginMethod(t.getOriginal(), "getLastDelegate");
		writer.line(t.getOriginal().getSimpleName(), SPACE, RESULT, EQ, THIS, DOT, DELEGATE, SEMICOLON);
		writer.line("while (", RESULT, " instanceof ", t.getSimpleName(), ") {");
		writer.line(SPACE, RESULT, EQ, "((", t.getSimpleName(), ") ", RESULT, ").getDelegate();");
		writer.line("}");
		writer.returns(RESULT);
		writer.end();

		// 拆开装饰模式
		writer.beginMethod(Modifier.Field.PUBLIC_STATIC, t.getOriginal(), "unwrap",
				new Parameter(DELEGATE, t.getOriginal()));
		writer.line("if (", DELEGATE, " instanceof ", t.getSimpleName(), ") {");
		writer.line(SPACE, RETURN, "((", t.getSimpleName(), ") ", DELEGATE, ").getLastDelegate();");
		writer.line("}");
		writer.returns(DELEGATE);
		writer.end();

		// 添加
		Set methodMetas = t.getOriginal().getAllMethod();
		for (MethodMeta methodMeta : methodMetas) {
			writer.beginMethod(methodMeta.getReturnType(), methodMeta.getName(), methodMeta.getParameters());
			// 所有lead 需要执行相同的方法
			Type type = methodMeta.getReturnType();
			if (RETURN_TYPE.equals(type)) {
				writer.line(SPACE, DELEGATE, DOT, methodMeta.getName(), writer.packMethod(methodMeta.getParameters()),
						SEMICOLON);
			} else {
				writer.line(RETURN, SPACE, DELEGATE, DOT, methodMeta.getName(),
						writer.packMethod(methodMeta.getParameters()), SEMICOLON);
			}
			writer.end();
		}
	}

	@Override
	public void importPackage(JavaWriter writer, SourceEntityMeta em) throws IOException {
		writer.importClasses(em.getFullName());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy