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

com.wuba.wsilk.producer.composite.CompositeSerializer Maven / Gradle / Ivy

package com.wuba.wsilk.producer.composite;

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

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.util.ArrayList;
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.ClassType;
import com.wuba.wsilk.codegen.model.Parameter;
import com.wuba.wsilk.codegen.model.Type;
import com.wuba.wsilk.codegen.model.Types;
import com.wuba.wsilk.codegen.spec.MethodElement;
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;
import com.wuba.wsilk.core.tf.visitor.TypeVisitor;

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

	private final static String COMPOSITE = "composite";

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

	/**
	 * 继承原始类
	 */
	@Override
	public Type getSuperClass(SourceEntityMeta t) throws IOException {
		return t.getOriginal();
	}

	@Override
	public void properties(JavaWriter writer, SourceEntityMeta t) throws IOException {
		// 创建一个集合
		writer.field(Modifier.Field.PRIVATE_FINAL, new ClassType(List.class, t.getOriginal()), COMPOSITE,
				"new ArrayList<>()");
	}

	@Override
	public void methods(JavaWriter writer, SourceEntityMeta t) throws IOException {
		// 添加
		writer.beginMethod(MethodElement.builder(t, "add", new Parameter("t", t.getOriginal())));
		writer.line(THIS, DOT, COMPOSITE, DOT, "add(t);");
		writer.returns();
		writer.end();

		// 删除
		writer.beginMethod(MethodElement.builder(t, "remove", new Parameter("t", t.getOriginal())));
		writer.line(THIS, DOT, COMPOSITE, DOT, "remove(t);");
		writer.returns();
		writer.end();
		// 获得索引
		writer.beginMethod(MethodElement.builder(t.getOriginal(), "getChild", new Parameter("index", Types.INT)));
		writer.line("if(index>=" + COMPOSITE + ".size()){");
		writer.line(SPACE, RETURN, THIS, DOT, COMPOSITE, DOT, "get(index);");
		writer.line("}else{");
		writer.line(SPACE, RETURN, "null", SEMICOLON);
		writer.line("}");
		writer.end();

		Set methodMetas = t.getOriginal().getAllMethod();
		for (MethodMeta methodMeta : methodMetas) {
			writer.beginMethod(MethodElement.builder(methodMeta.getReturnType(), methodMeta.getName(), methodMeta.getParameters()));
			// 所有lead 需要执行相同的方法
			writer.line(COMPOSITE, DOT, "forEach((e) -> {");
			writer.line(SPACE, "e", DOT, methodMeta.getName(), writer.packMethod(methodMeta.getParameters()),
					SEMICOLON);
			writer.line("})", SEMICOLON);

			/** 不返回 */
			if (methodMeta.getReturnType() == TypeVisitor.VOID_TYPE) {
				writer.superInvoke(methodMeta.getName(), methodMeta.getParameters());
			} else {
				writer.superInvokeReturn(methodMeta.getName(), methodMeta.getParameters());
			}
			writer.end();
		}
	}

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

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy