/*
* JEF - Copyright 2009-2010 Jiyi (mr.jiyi@gmail.com)
*
* 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 com.github.geequery.codegen.ast;
import java.io.BufferedWriter;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.lang.reflect.Modifier;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import jef.codegen.support.NotModified;
import jef.codegen.support.OverWrittenMode;
import jef.common.log.LogUtil;
import jef.tools.ArrayUtils;
import jef.tools.IOUtils;
import jef.tools.StringUtils;
import jef.tools.reflect.BeanUtils;
import org.apache.commons.lang.ObjectUtils;
import org.apache.commons.lang.builder.HashCodeBuilder;
import com.github.geequery.codegen.ast.IClass.GenericClass;
import com.github.geequery.codegen.ast.IClass.RealClass;
import com.github.geequery.codegen.support.ParseMode;
import com.github.geequery.codegen.util.GenUtil;
/**
* 用于生成和解析Java代码的辅助类
*
* @author Administrator
*
*/
public class JavaUnit extends DefaultJavaElement{
private static final String COMMA = ";";
private boolean isInterface = false;
private int modifiers = Modifier.PUBLIC;
private String packageName;
private String unitName;
private Map<String,String> imports = new LinkedHashMap<String,String>();
private Map<String,String> importsStatic = new LinkedHashMap<String,String>();
private JavaElement rawLinesBeforeTypeDef;
private List<JavaElement> rawBlocks = new ArrayList<JavaElement>();
private Map<String, JavaElement> fields = new LinkedHashMap<String, JavaElement>();
private Map<String, JavaElement> methods = new LinkedHashMap<String, JavaElement>(10, 0.8f, false);
private String extendsClass;
private String[] implementsInterface;
private String[] typeParameters;
boolean addNotModifiedTag = true;
boolean protectMode = false;// 当为protected模式时,新增的方法和字段不能覆盖已有的方法或字段
boolean trimUnderlineInMethod=true;//方法开头如果有下划线,那么要删除掉
boolean trimUnderlineInField=false;//字段名开头如果有下划线,那么要删除掉
public boolean isTrimUnderlineInMethod() {
return trimUnderlineInMethod;
}
/**
* 在类中创建Equals方法
* @param idfields 要用于鉴别的fields
* @param overwirte 是否类中已有的方法
* @param doSuperMethod 是否沿用父类的判断逻辑
* @return
*/
public boolean createEqualsMethod(List<JavaField> idfields,boolean overwirte,String doSuperMethod){
JavaMethod equals = new JavaMethod("equals");
equals.setReturnType(boolean.class);
equals.addparam(IClassUtil.getIClass(Object.class), "rhs0", Modifier.FINAL);
if(methods.containsKey(equals.getKey())){//方法已经存在
if(!overwirte){
return false;
}
}
equals.addContent("if (rhs0 == null)return false;");
String simpleName=getSimpleName();
equals.addContent(simpleName+" rhs=("+simpleName+")rhs0;");
//开始添加方法字段
for (int i = 0; i < idfields.size(); i++) {
JavaField field = idfields.get(i);
String name = field.getName();
if (Modifier.isAbstract(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
continue;
}
equals.addContent("if(!ObjectUtils.equals(" + name + ", rhs." + name + ")) return false;");
}
if(StringUtils.isEmpty(doSuperMethod)){
equals.addContent("return true;");
}else{
equals.addContent("return super."+doSuperMethod+"(rhs);");
}
addMethod(equals);
addImport(ObjectUtils.class);
return true;
}
/**
* 在类中创建Equals方法
* @param idfields 要用于鉴别的fields
* @param overwirte 是否类中已有的方法
* @param doSuperMethod 是否沿用父类的判断逻辑
* @return
*/
public boolean createHashCodeMethod(List<JavaField> idfields,boolean overwirte,String doSuperMethod){
JavaMethod hashCode = new JavaMethod("hashCode");
hashCode.setCheckReturn(false);
hashCode.setReturnType(int.class);
if(methods.containsKey(hashCode.getKey())){//方法已经存在
if(!overwirte){
return false;
}
}
hashCode.addContent("return new HashCodeBuilder()");
//开始添加方法字段
for (int i = 0; i < idfields.size(); i++) {
JavaField field = idfields.get(i);
String name = field.getName();
if (Modifier.isAbstract(field.getModifiers()) || Modifier.isStatic(field.getModifiers())) {
continue;
}
hashCode.addContent(".append("+name+")");
}
if(StringUtils.isNotEmpty(doSuperMethod)){
hashCode.addContent(".append(super."+doSuperMethod+"())");
}
hashCode.addContent(".toHashCode();");
addMethod(hashCode);
addImport(HashCodeBuilder.class);
return true;
}
/**
* 重新排序Field
* @param names
*/
public void reorderFields(List<String> names){
Map<String, JavaElement> result = new LinkedHashMap<String, JavaElement>();
for(String s:names){
JavaElement element=this.fields.remove(s);
if(element==null)continue;
result.put(s, element); //将顺序里指定的fields重新添加到新的map中。
}
result.putAll(fields);
this.fields=result;
}
/**
* 当为true时,如果field的第一个字符是下划线,生成的getter和setter会截去这个下划线。
* 默认为true
* @param trimUnderlineInMethod
*/
public void setTrimUnderlineInMethod(boolean trimUnderlineInMethod) {
this.trimUnderlineInMethod = trimUnderlineInMethod;
}
public boolean isTrimUnderlineInField() {
return trimUnderlineInField;
}
/**
* 当为true时,如果field的第一个字符是下划线,field名称会截去这个下划线。
* 默认为true
* @param trimUnderlineInMethod
*/
public void setTrimUnderlineInField(boolean trimUnderlineInField) {
this.trimUnderlineInField = trimUnderlineInField;
}
public JavaElement getRawLinesBeforeTypeDef() {
return rawLinesBeforeTypeDef;
}
public void setRawLinesBeforeTypeDef(JavaElement rawLinesBeforeTypeDef) {
this.rawLinesBeforeTypeDef = rawLinesBeforeTypeDef;
}
public List<JavaElement> getRawBlocks() {
return rawBlocks;
}
public void setRawBlocks(List<JavaElement> rawBlocks) {
this.rawBlocks = rawBlocks;
}
public boolean isInterface() {
return isInterface;
}
public String[] getTypeParameters() {
return typeParameters;
}
public void setTypeParameters(String[] typeParameters) {
this.typeParameters = typeParameters;
}
public void addTypeParameter(String typeParameter) {
this.typeParameters = ArrayUtils.addElement(typeParameters, typeParameter);
}
public JavaElement getField(String name) {
return fields.get(name);
}
public JavaField getFieldAsJavaField(String name) {
JavaElement element= fields.get(name);
if(element==null)return null;
if(element instanceof JavaField){
return (JavaField)element;
}
return null;
}
/**
* 根据字段名获得一个方法
*
* @param name
* @param typeArgs
* @return
*/
public JavaElement getMethod(String name, String... typeArgs) {
IClass[] inputArgs = new IClass[typeArgs.length];
for (int i = 0; i < typeArgs.length; i++) {
inputArgs[i] = IClassUtil.getIClass(typeArgs[i]);
}
String key = JavaMethod.toMethodKey(name, inputArgs);
return methods.get(key);
}
/**
* 根据名称和类型获得一个方法
*
* @param name
* @param typeArgs
* @return
*/
public JavaElement getMethod(String name, Class<?>... typeArgs) {
IClass[] inputArgs = new IClass[typeArgs.length];
for (int i = 0; i < typeArgs.length; i++) {
inputArgs[i] = new RealClass(typeArgs[i]);
}
String key = JavaMethod.toMethodKey(name, inputArgs);
return methods.get(key);
}
public JavaConstructor getOrCreateConstructor(String... typeArgs){
IClass[] inputArgs = new IClass[typeArgs.length];
for (int i = 0; i < typeArgs.length; i++) {
inputArgs[i] = IClassUtil.getIClass(typeArgs[i]);
}
String key = JavaConstructor.toConstratorKey(Arrays.asList(inputArgs));
JavaConstructor result=(JavaConstructor)methods.get(key);
if(result==null){
result=new JavaConstructor();
for(int i=0;i<typeArgs.length;i++){
result.addparam(typeArgs[i], "arg"+i);
}
addMethod(result.getKey(),result);
}
return result;
}
public JavaConstructor getConstructor(Class<?>... typeArgs){
IClass[] inputArgs = new IClass[typeArgs.length];
for (int i = 0; i < typeArgs.length; i++) {
inputArgs[i] = new RealClass(typeArgs[i]);
}
String key = JavaConstructor.toConstratorKey(Arrays.asList(inputArgs));
return (JavaConstructor)methods.get(key);
}
public JavaConstructor getConstructor(String... typeArgs){
IClass[] inputArgs = new IClass[typeArgs.length];
for (int i = 0; i < typeArgs.length; i++) {
inputArgs[i] = IClassUtil.getIClass(typeArgs[i]);
}
String key = JavaConstructor.toConstratorKey(Arrays.asList(inputArgs));
return (JavaConstructor)methods.get(key);
}
public void setInterface(boolean isInterface) {
this.isInterface = isInterface;
}
public JavaUnit(String fullName) {
this.packageName = StringUtils.substringBeforeLast(fullName, ".");
this.unitName = StringUtils.substringAfterLast(fullName, ".");
}
public JavaUnit(String packageName, String unitName) {
this.packageName = packageName;
this.unitName = unitName;
}
public boolean isAbstract() {
return Modifier.isAbstract(modifiers);
}
public void setAbstract(boolean isAbstract) {
if (isAbstract != isAbstract()) {
this.modifiers ^= Modifier.ABSTRACT;
}
}
public boolean addImportStatic(String importClass) {
String simpleName=StringUtils.substringAfterLastIfExist(importClass, ".");
if (!importsStatic.containsKey(simpleName)) {
importsStatic.put(simpleName, importClass);
return true;
}else{
String old=importsStatic.get(simpleName);
return StringUtils.equals(importClass, old);
}
}
/**
* 添加Import项
*
* @param importClass
*/
public boolean addImport(String importClass) {
if(StringUtils.isBlank(importClass)){
this.imports.put(StringUtils.randomString(), importClass);//添加一个空行
return true;
}else if(importClass.endsWith(".*")){
if (!imports.containsValue(importClass)) {
imports.put(StringUtils.randomString(),importClass);
}
return true;
}else{
String simpleName=StringUtils.substringAfterLastIfExist(importClass, ".");
if (!imports.containsKey(simpleName)) {
imports.put(simpleName,importClass);
return true;
}else{
String old=imports.get(simpleName);
return StringUtils.equals(importClass, old);
}
}
}
public void addImport(IClass clz) {
if(clz instanceof GenericClass){
addImport(((GenericClass) clz).getRawClass());
for(IClass param: ((GenericClass) clz).getParamTypes()){
addImport(param);
}
}else{
if(clz.getName().indexOf('.')>-1){
addImport(clz.getName());
}
}
}
public void addImport(Class<?> importClass) {
IClass clz = new RealClass(importClass);
addImport(clz.getName());
}
/**
* 添加Field
*
* @param modifier
* @param type
* @param field
*/
public JavaField addField(int modifier, Class<?> type, String name, String... annotation) {
JavaField field = new JavaField(type, name);
field.setModifiers(modifier);
field.addAnnotation(annotation);
return addField(field);
}
public JavaField addField(int modifier, String type, String name, String... annotation) {
JavaField field = new JavaField(type, name);
field.setModifiers(modifier);
field.addAnnotation(annotation);
return addField(field);
}
/**
* 如果能够成功添加,返回field
* @param field
* @return
*/
public JavaField addField(JavaField field) {
if(this.trimUnderlineInField && field.getName().charAt(0)=='_'){
field.setName(field.getName().substring(1));
}
return (JavaField)addField(field.getName(), field);
}
/**
* 如果能够成功添加,则返回field
* @param fieldName
* @param element
* @return
*/
public JavaElement addField(String fieldName, JavaElement element) {
if (element == null)
return null;
if (fields.containsKey(fieldName)) {
if (this.protectMode)
return null;
else {
System.err.println("Exist field was overwritten:" + fieldName);
}
}
this.fields.put(fieldName, element);
return element;
}
public void addSetter(String fieldName){
JavaField field=this.getFieldAsJavaField(fieldName);
if (field==null)
throw new IllegalArgumentException("field not exit while generate getter:"+fieldName);
String methodName="set"+StringUtils.capitalize(fieldName);
JavaMethod method=new JavaMethod(methodName);
method.setModifier(Modifier.PUBLIC);
method.addparam(field.getType().getSimpleName(), "arg");
method.addContent("this."+field.getName()+"=arg;");
this.addMethod(method);
}
public void addGetter(String fieldName){
JavaField field=this.getFieldAsJavaField(fieldName);
if (field==null)
throw new IllegalArgumentException("field not exit while generate getter:"+fieldName);
String methodName="get"+StringUtils.capitalize(fieldName);
JavaMethod method=new JavaMethod(methodName);
method.setModifier(Modifier.PUBLIC);
method.setReturnType(field.getType());
method.addContent("return this."+fieldName+";");
this.addMethod(method);
}
/**
* 根据field名称得到Method
* 只返回JavaMethod,如果该方法内容为javaElement,则返回null
* @param fieldname
* @return
*/
public JavaMethod getGetter(String fieldname){
JavaElement field=this.getField(fieldname);
if(!(field instanceof JavaField)){
return null;
}
JavaField f=(JavaField)field;
String name=f.getName();
if(trimUnderlineInMethod && name.charAt(0)=='_'){
name=name.substring(1);
}
boolean isBoolean = f.getType().getSimpleName().equalsIgnoreCase("boolean") && !name.startsWith("is");
String getName=(isBoolean ? "is" : "get") + StringUtils.capitalize(name);
JavaElement method=this.methods.get(JavaMethod.toMethodKey(getName));
if(method==null && isBoolean)method=this.methods.get(JavaMethod.toMethodKey("get"+StringUtils.capitalize(name)));
if(method instanceof JavaMethod){
return (JavaMethod)method;
}
return null;
}
/**
* 根据field名称得到Method
* 只返回JavaMethod,如果该方法内容为javaElement,则返回null
* @param fieldname
* @return
*/
public JavaMethod getSetter(String fieldname){
JavaElement field=getField(fieldname);
if(!(field instanceof JavaField)){
return null;
}
JavaField f=(JavaField)field;
String name=f.getName();
if(trimUnderlineInMethod && name.charAt(0)=='_'){
name=name.substring(1);
}
String setName="set" + StringUtils.capitalize(name);
JavaElement method=this.methods.get(JavaMethod.toMethodKey(setName, f.getType()));
if(method instanceof JavaMethod){
return (JavaMethod)method;
}
return null;
}
public JavaField addFieldWithGetterAndSetter(JavaField field) {
JavaField result=addField(field);
if(result==null)return null;
String name=field.getName();
if(trimUnderlineInMethod && name.charAt(0)=='_'){
name=name.substring(1);
}
JavaMethod setMethod = new JavaMethod("set" +BeanUtils.capitalizeFieldName(name));
setMethod.setModifier(Modifier.PUBLIC);
setMethod.addparam(field.getType(), "obj", 0);
setMethod.addContent("this." +field.getName() + " = obj;");
addMethod(setMethod);
boolean isBoolean = field.getType().getSimpleName().equalsIgnoreCase("boolean") && !name.startsWith("is");
JavaMethod getMethod = new JavaMethod((isBoolean ? "is" : "get") + BeanUtils.capitalizeFieldName(name));
getMethod.setModifier(Modifier.PUBLIC);
getMethod.setReturnType(field.getType());
getMethod.addContent("return " + field.getName() + ";");
addMethod(getMethod);
return result;
}
public JavaField addFieldWithGetterAndSetter(int modifier, String javaType, String name, String... annotation) {
JavaField field = new JavaField(javaType, name);
field.addAnnotation(annotation);
field.setModifiers(modifier);
return addFieldWithGetterAndSetter(field);
}
public void addFieldWithGetterAndSetter(int modifier, Class<?> javaType, String name, String... annotation) {
JavaField field = new JavaField(javaType, name);
field.addAnnotation(annotation);
field.setModifiers(modifier);
addFieldWithGetterAndSetter(field);
}
private String checkAddImport(String raw) {
String name;
String[] generaicType = new String[0];
if (raw.indexOf("<") > -1) {
name = StringUtils.substringBefore(raw, "<");
generaicType = StringUtils.split(StringUtils.substringBetween(raw, "<", ">"), ",");
} else {
name = raw;
}
if(doCheckUnit(name)){
name=StringUtils.substringAfterLastIfExist(name, ".");
}
for (int i=0;i<generaicType.length;i++) {
generaicType[i]=checkAddImport(generaicType[i]);
}
if(generaicType.length==0){
return name;
}else{
StringBuilder sb=new StringBuilder(name);
sb.append('<').append(generaicType[0]);
for(int i=1;i<generaicType.length;i++){
sb.append(',');
sb.append(generaicType[i]);
}
sb.append('>');
return sb.toString();
}
}
private boolean doCheckUnit(String name) {
if (name.indexOf(".") < 0)
return true;
String pkg = StringUtils.substringBeforeLast(name, ".");
if (!name.startsWith("java.lang.") && !this.packageName.equals(pkg)) {
if (!imports.containsValue(name) && !imports.containsValue(toPackageImport(name))) {
return addImport(name);
}
}
return true;
}
private String toPackageImport(String name) {
if (name.indexOf('.') == -1)
return null;
String pkg = StringUtils.substringBeforeLast(name, ".");
return pkg.concat(".*");
}
/**
* 添加一个Java方法
* @param method
*/
public void addMethod(JavaMethod method) {
if (method.isAbstract())
this.setAbstract(true);
addMethod(method.getKey(), method);
}
/**
* 添加一个Java方法
* @param keyword 关键字,由方法名和参数名构成
* @param method
*/
public void addMethod(String keyword, JavaElement method) {
if (method == null)
return;
if (methods.containsKey(keyword)) {
if (this.protectMode) {
return;
} else {
System.err.println("Exist method was overwritten:" + keyword);
}
}
methods.put(keyword, method);
}
public String getJavaClassName(IClass cls) {
if (cls instanceof GenericClass) {
String pType = getJavaClassName(((GenericClass) cls).getRawClass());
List<String> paramTypes = new ArrayList<String>();
for (IClass clz : ((GenericClass) cls).getParamTypes()) {
paramTypes.add(getJavaClassName(clz));
}
if (paramTypes.isEmpty())
return pType;
return pType + "<" + StringUtils.join(paramTypes, ",") + ">";
} else if (cls.isArray()) {
return getJavaClassName(cls.getComponentType()) + "[]";
} else {
return getJavaClassName(cls.getName());
}
}
// 检查给定的类名是否已经导入,如果已经导入则直接用简称
public String getJavaClassName(String raw) {
String name;
String[] generaicType = new String[0];
if (raw.indexOf("<") > -1) {
name = StringUtils.substringBefore(raw, "<");
generaicType = StringUtils.split(StringUtils.substringBetween(raw, "<", ">"), ",");
} else {
name = raw;
}
name = toJavaClassName(name);
for (int i = 0; i < generaicType.length; i++) {
generaicType[i] = toJavaClassName(generaicType[i]);
}
if (generaicType.length == 0)
return name;
return name + "<" + StringUtils.join(generaicType, ',') + ">";
}
// 处理类型名,不支持泛型
private String toJavaClassName(String name) {
if (name.indexOf('.') < 0)
return name;
return checkAddImport(name);
}
static void appendModifier(StringBuilder sb, int modifier,boolean isInterface) {
if (java.lang.reflect.Modifier.isPrivate(modifier)) {
sb.append("private ");
}
if (java.lang.reflect.Modifier.isProtected(modifier)) {
sb.append("protected ");
}
if (java.lang.reflect.Modifier.isPublic(modifier)) {
sb.append("public ");
}
if (java.lang.reflect.Modifier.isFinal(modifier)) {
sb.append("final ");
}
if (!isInterface && java.lang.reflect.Modifier.isAbstract(modifier)) {
sb.append("abstract ");
}
if (java.lang.reflect.Modifier.isNative(modifier)) {
sb.append("native ");
}
if (java.lang.reflect.Modifier.isStatic(modifier)) {
sb.append("static ");
}
if (java.lang.reflect.Modifier.isSynchronized(modifier)) {
sb.append("synchronized ");
}
if (java.lang.reflect.Modifier.isTransient(modifier)) {
sb.append("transient ");
}
if (java.lang.reflect.Modifier.isVolatile(modifier)) {
sb.append("volatile ");
}
}
public void writeTo(BufferedWriter bw) throws IOException {
prepareImports();
if (StringUtils.isNotEmpty(packageName)) {
bw.write("package ");
bw.write(packageName);
bw.write(COMMA);
bw.newLine();
bw.newLine();
}
if (addNotModifiedTag) {
this.addImport(NotModified.class);
}
for (String cls : this.imports.values()) {
if(StringUtils.isNotBlank(cls)){
bw.write("import ");
bw.write(cls);
bw.write(COMMA);
}
bw.newLine();
}
if (!this.importsStatic.isEmpty()) {
for (String cls : this.importsStatic.values()) {
bw.write("import static ");
bw.write(cls);
bw.write(COMMA);
bw.newLine();
}
bw.newLine();
}
if(rawLinesBeforeTypeDef!=null){
bw.write(rawLinesBeforeTypeDef.toCode(this));
}
if (comments != null && comments.size() > 0) {
bw.write("/**\r\n");
for (String s : comments) {
bw.write(" * ");
bw.write(s);
bw.newLine();
}
bw.write(" */\r\n");
}
if (addNotModifiedTag) {
bw.write("@NotModified\r\n");
}
if (annotation != null) {
for (String s : annotation) {
bw.write(s);
bw.write("\r\n");
}
}
if (this.isInterface) {
bw.write("public interface " + this.unitName);
} else {
StringBuilder sb=new StringBuilder(64);
appendModifier(sb, this.modifiers,false);
sb.append("class " + this.unitName);
bw.write(sb.toString());
}
if (typeParameters != null && typeParameters.length > 0) {
bw.write("<");
for (int n = 0; n < typeParameters.length; n++) {
if (n > 0)
bw.write(',');
bw.write(typeParameters[n]);
}
bw.write(">");
}
if (this.extendsClass != null) {
bw.write(" extends ");
bw.write(this.getJavaClassName(extendsClass));
}
if (this.implementsInterface != null && implementsInterface.length > 0) {
for (int i = 0; i < implementsInterface.length; i++) {
implementsInterface[i] = this.getJavaClassName(implementsInterface[i]);
}
bw.write(" implements ");
bw.write(StringUtils.join(implementsInterface, ","));
}
bw.write("{");
bw.newLine();
bw.newLine();
// 写入Fields
if (fields.size() > 0) {
for (JavaElement str : fields.values()) {
if((str instanceof JavaField)&&((JavaField) str).isStatic()){
String code = str.toCode(this);
bw.write("\t");
bw.write(code);
}
}
bw.newLine();
for (JavaElement str : fields.values()) {
if((str instanceof JavaField)&&((JavaField) str).isStatic()){
}else{
String code = str.toCode(this);
bw.write("\t");
bw.write(code);
bw.newLine();
}
}
}
// 写入方法
if (!methods.isEmpty()) {
for (JavaElement method : methods.values()) {
bw.write("\t");
bw.write(method.toCode(this));
bw.newLine();
}
}
if(!content.isEmpty()){
bw.newLine();
// 写入正文
for (String str : content) {
// bw.write("\t");
bw.write(str);
bw.newLine();
}
}
if(rawBlocks!=null){
bw.newLine();
for(JavaElement block:rawBlocks){
bw.write(block.toCode(this));
bw.newLine();
}
}
bw.write("}");
bw.flush();
}
public String toString(){
StringWriter sw=new StringWriter();
BufferedWriter bw=new BufferedWriter(sw);
try {
this.writeTo(bw);
} catch (IOException e) {
LogUtil.exception(e);
}
return sw.toString();
}
//计算导入
private void prepareImports() {
calcImpInterfaces();
if (methods != null) {
for (JavaElement me : methods.values()) {
me.buildImport(this);
}
}
if (fields != null) {
for (JavaElement me : fields.values()) {
me.buildImport(this);
}
}
if(rawBlocks!=null){
for (JavaElement me : rawBlocks) {
me.buildImport(this);
}
}
}
private void calcImpInterfaces() {
if (implementsInterface == null || implementsInterface.length == 0)
return;
String[] realImport = new String[implementsInterface.length];
for (int i = 0; i < implementsInterface.length; i++) {
realImport[i] = getJavaClassName(implementsInterface[i]);
}
implementsInterface = realImport;
}
public String getPackageName() {
return packageName;
}
public void setPackageName(String packageName) {
this.packageName = packageName;
}
public String getUnitName() {
return unitName;
}
public void setUnitName(String unitName) {
this.unitName = unitName;
}
public String getFilePath() {
return packageName.replace('.', '/') + "/" + unitName + ".java";
}
public String getSimpleName() {
return unitName;
}
public String getClassName() {
return packageName + "." + unitName;
}
public void setExtends(Class<?> cls) {
if(cls.isInterface()){
throw new IllegalArgumentException("the class "+ cls.getName()+" is a interface");
}
this.extendsClass = getJavaClassName(cls.getName());
}
public void setExtends(String name) {
this.extendsClass = getJavaClassName(name);
}
public String getExtends() {
return this.extendsClass;
}
public void setImplementsInterface(String... implementsInterface) {
this.implementsInterface = implementsInterface;
}
public String[] getImplementsInterface(){
return this.implementsInterface;
}
public void addImplementsInterface(String i) {
if (this.implementsInterface == null) {
this.implementsInterface = new String[] { i };
} else {
this.implementsInterface = (String[]) ArrayUtils.add(implementsInterface, i);
}
}
public void addImplementsInterface(Class<?> s) {
if(!s.isInterface()){
throw new IllegalArgumentException("class "+ s.getName()+" is not a interface.");
}
if (implementsInterface == null) {
implementsInterface = new String[] { s.getName() };
} else {
implementsInterface = (String[]) ArrayUtils.add(implementsInterface, s.getName());
}
}
/**
* 另存為文件
*
* @param javaFile
* @param charset
* @return
* @throws IOException
*/
public File saveAs(File javaFile, String charset) throws IOException {
BufferedWriter bw = IOUtils.getWriter(javaFile, charset, false);
writeTo(bw);
bw.flush();
bw.close();
return javaFile;
}
/**
* 目标文件在指定的源文件夹中存在?
* @param srcFolder
* @return
*/
public boolean isFileExistInSourceFolder(File srcFolder){
File javaFile = new File(srcFolder.getAbsolutePath(),getFilePath());
return javaFile.exists();
}
/**
* 保存到指定的SourceFolder
* @param srcFolder
* @return
* @throws IOException
*/
public File saveToSrcFolder(File srcFolder, String charset, OverWrittenMode mode) throws IOException {
File javaFile = new File(srcFolder.getAbsolutePath(),getFilePath());
if (javaFile.exists()) {
if (mode == OverWrittenMode.NO)
return null;
if (mode == OverWrittenMode.AUTO) {
if (!protectMode && GenUtil.isModified(javaFile)) {
// 非保护模式下,文件已经修改过,不能覆盖
return null;
}
}
}
BufferedWriter bw = IOUtils.getWriter(javaFile, charset == null ? Charset.defaultCharset().name() : charset, false);
writeTo(bw);
bw.flush();
bw.close();
return javaFile;
}
public File asSourceFile() {
File f = new File(StringUtils.randomString());
if (!f.exists())
f.mkdirs();
try {
return saveToSrcFolder(f, "null", OverWrittenMode.AUTO);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public File asSourceFileInFolder(File folder) {
try {
return this.saveToSrcFolder(folder, null, OverWrittenMode.AUTO);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public int getModifiers() {
return modifiers;
}
public void setModifiers(int modifiers) {
this.modifiers = modifiers;
}
public boolean asTempFile() {
return true;
}
/**
* 从指定的位置读入
*
* @param srcFolder
* @return 如果文件没有读入成功返回null
*/
public static JavaUnit loadFromSrcFolder(File srcFolder, String className, String charset, ParseMode mode) {
File javaFile = new File(srcFolder.getAbsolutePath() + "/" + className.replace('.', '/') + ".java");
if (!javaFile.exists()) {
return null;
}
return load(javaFile, charset, mode);
}
public static JavaUnit load(File file,String charset,ParseMode mode){
if(mode==ParseMode.JAVACC){
JavaUnit java=new JapaParser().parse(file, charset);
java.protectMode=true;
return java;
}else if(mode==ParseMode.KEEP_COMMENT){
JavaUnit java=new JefParser().parse(file,charset);
java.protectMode=true;
return java;
}else{
throw new RuntimeException();
}
}
public String[] getFieldNames() {
Set<String> set = fields.keySet();
return set.toArray(new String[set.size()]);
}
public JavaElement[] getMethods() {
return methods.values().toArray(new JavaElement[methods.size()]);
}
public boolean isAddNotModifiedTag() {
return addNotModifiedTag;
}
public void setAddNotModifiedTag(boolean addNotModifiedTag) {
this.addNotModifiedTag = addNotModifiedTag;
}
public void addRawBlock(JavaElement element) {
if(this.rawBlocks==null)rawBlocks=new ArrayList<JavaElement>();
rawBlocks.add(element);
}
}