/* * Copyright 2013 cruxframework.org. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package org.cruxframework.crux.core.rebind.bean; import org.cruxframework.crux.core.client.bean.BeanContentValidator; import org.cruxframework.crux.core.client.utils.StringUtils; import org.cruxframework.crux.core.rebind.AbstractInterfaceWrapperProxyCreator; import org.cruxframework.crux.core.rebind.CruxGeneratorException; import org.cruxframework.crux.core.rebind.context.RebindContext; import org.cruxframework.crux.core.utils.JClassUtils; import org.cruxframework.crux.core.utils.JClassUtils.PropertyInfo; import com.google.gwt.core.ext.typeinfo.JClassType; import com.google.gwt.core.ext.typeinfo.JPrimitiveType; /** * @author Thiago da Rosa de Bustamante * */ public class BeanContentValidatorProxyCreator extends AbstractInterfaceWrapperProxyCreator { private JClassType aType; /** * * @param logger * @param context * @param baseIntf */ public BeanContentValidatorProxyCreator(RebindContext context, JClassType baseIntf) { super(context, baseIntf, true); JClassType beanComparatorType = context.getGeneratorContext().getTypeOracle().findType(BeanContentValidator.class.getCanonicalName()); JClassType[] parameterTypes = JClassUtils.getActualParameterTypes(baseIntf, beanComparatorType); aType = parameterTypes[0]; if (JClassUtils.isSimpleType(aType)) { throw new CruxGeneratorException("Can not create a BeanContentValidator for simple types."); } } @Override protected void generateProxyMethods(SourcePrinter srcWriter) throws CruxGeneratorException { srcWriter.println("public boolean isEmpty("+aType.getParameterizedQualifiedSourceName()+" a){"); generateValidateBeanCode(srcWriter, "a", aType, true); srcWriter.println("return true;"); srcWriter.println("}"); srcWriter.println("public boolean isFilled("+aType.getParameterizedQualifiedSourceName()+" a){"); generateValidateBeanCode(srcWriter, "a", aType, false); srcWriter.println("return true;"); srcWriter.println("}"); } protected void generateValidateBeanCode(SourcePrinter srcWriter, String objVariable, JClassType type, boolean empty) { if (type != null) { PropertyInfo[] propertiesInfo = JClassUtils.extractBeanPropertiesInfo(type); if (propertiesInfo != null && propertiesInfo.length > 0) { for (PropertyInfo propertyInfo : propertiesInfo) { if (JClassUtils.isSimpleType(propertyInfo.getType())) { JPrimitiveType primitiveType = propertyInfo.getType().isPrimitive(); if (propertyInfo.getType().getQualifiedSourceName().equals(String.class.getCanonicalName())) { srcWriter.println("if ("+(empty?"!":"")+"StringUtils.isEmpty("+objVariable+"."+propertyInfo.getReadMethod().getName()+"())){"); srcWriter.println("return false;"); srcWriter.println("}"); } else if (primitiveType == null) { srcWriter.println("if ("+objVariable+"."+propertyInfo.getReadMethod().getName()+"() "+(empty?"!=":"==")+" null){"); srcWriter.println("return false;"); srcWriter.println("}"); } } else { srcWriter.println("if ("+objVariable+"."+propertyInfo.getReadMethod().getName()+"() != null){"); generateValidateBeanCode(srcWriter, objVariable+"."+propertyInfo.getReadMethod().getName()+"()", propertyInfo.getType().isClassOrInterface(), empty); srcWriter.println("}"); if (!empty) { srcWriter.println("else {"); srcWriter.println("return false;"); srcWriter.println("}"); } } } } } } @Override protected String[] getImports() { return new String[]{ aType.getParameterizedQualifiedSourceName(), StringUtils.class.getCanonicalName() }; } }