// annotate with @Override
clone.annotate(Override.class);
// clone._throws(CloneNotSupportedException.class);
final JVar copy = clone.body().decl(implClass, "copy");
if (extends1.fullName().equals("java.lang.Object")) {
final JTryBlock ctry = clone.body()._try();
ctry.body().assign(copy, JExpr.cast(implClass, JExpr._super().invoke("clone")));
ctry._catch(cloneNotSupportedException.boxify()).body()._throw(JExpr._new(internalError.boxify()).arg(JExpr.direct("_x.toString()")));
} else {
clone.body().assign(copy, JExpr.cast(implClass, JExpr._super().invoke("clone")));
}
for (final JFieldVar jFieldVar : fields) {
if (jFieldVar.type().fullName().equals("java.lang.String")) {
continue;
} else if (enums.contains(jFieldVar.type().fullName())) {
LOG.info("SKIP ENUM: " + jFieldVar.type().fullName());
continue;
} else if (jFieldVar.name().equals("altitudeMode")) {
LOG.info("SKIP AltitudeModeEnum: " + jFieldVar.type().fullName());
continue;
} else if (jFieldVar.type().fullName().equals("java.lang.Boolean")) {
continue;
} else if (jFieldVar.type().fullName().equals("int")) {
continue;
} else if (jFieldVar.type().fullName().equals("float")) {
continue;
} else if (jFieldVar.type().fullName().equals("double")) {
continue;
} else if (jFieldVar.type().fullName().equals("char")) {
continue;
} else if (jFieldVar.type().fullName().equals("byte")) {
continue;
} else if (jFieldVar.type().fullName().equals("boolean")) {
continue;
} else if (jFieldVar.type().fullName().startsWith("java.util.List")) {
// LOG.info(">>>>>>>>"+jFieldVar.type().boxify().name());
final List<JClass> type = jFieldVar.type().boxify().getTypeParameters();
JClass clazz = type.get(0);
if (clazz.fullName().startsWith("javax.xml.bind.JAXBElement<")) {
LOG.info("111>>>>>>>>" + clazz.fullName());
if (clazz.fullName().startsWith("javax.xml.bind.JAXBElement<")) {
final List<JClass> typeParameters = clazz.getTypeParameters();
final JClass clazz2 = typeParameters.get(0);
LOG.info("222>>>>>>>>" + clazz2.fullName());
if (clazz2.fullName().startsWith("? extends")) {
clazz = clazz2._extends();
// if (clazz2._extends().fullName().equals("java.lang.Object")) {
LOG.info("333a>>>>>>>" + clazz.fullName());
} else {
clazz = clazz2;
LOG.info("333b>>>>>>>" + clazz.fullName());
}
}
}
clone.body().assign(copy.ref(jFieldVar),
JExpr._new(arrayList.narrow(clazz)).arg(JExpr.direct("get" + Util.upperFirst(jFieldVar.name()) + "().size()")));
final JForEach forEach = clone.body().forEach(clazz, "iter", jFieldVar);
if (forEach.var().type().fullName().equals("java.lang.Object") || enums.contains(forEach.var().type().fullName()) || forEach.var().type().fullName().equals("java.lang.String") ){
forEach.body().add(copy.ref(jFieldVar).invoke("add").arg(forEach.var()));
LOG.info("444a>>>>>>>" + forEach.var().type().fullName());
} else {
forEach.body().add(copy.ref(jFieldVar).invoke("add").arg(forEach.var().invoke("clone")));
LOG.info("444b>>>>>>>" + forEach.var().type().fullName()+".clone()");
}
} else {
final JExpression cond = JOp.cond(jFieldVar.eq(JExpr._null()), JExpr._null(), JExpr.cast(jFieldVar.type(), jFieldVar.invoke("clone")));
clone.body().assign(copy.ref(jFieldVar), cond);
LOG.info(jFieldVar.type().fullName());
}
}
clone.body()._return(copy);
}