Have a look at the following link...
http://www.ibm.com/developerworks/library/x-quick/index.html
But this converts from DTD -> QJML -> Java.
I have eliminiated the need for creating DTD.
You can create QJML directly from java Bean class if you have.
Just provide the java class and it will generate 90% code for QJML.
You can use it with minor tweeking...
private static String getQJML(Class c) throws ClassNotFoundException
{
suffix = c.getSimpleName().substring(c.getSimpleName().length()-2);
System.out.println(suffix);
String tagName = getTagName(c);
StringBuilder output=new StringBuilder("");
output.append("<!-- ********************************************************************************** -->");
output.append("\n\t<bean tag=\"" + tagName + "\">");
if(!containsArrayOrDate(c))
output.append("\n\t\t<targetClass>" + c.getName() + "</targetClass>");
else
output.append("\n\t\t<targetClass>" + "wrappers.ui.vo." + c.getSimpleName() + "</targetClass>");
output.append("\n\t\t<elements>");
output.append("\n\t\t\t<selection optional=\"True\" repeating=\"True\">");
Field fields[]= c.getDeclaredFields();
for(Field f: fields)
{
if(f.getName().charAt(0)>='A' && f.getName().charAt(0)<='Z')
{
if(!Modifier.toString(f.getModifiers()).contains("final"))
{
System.out.println("Class property " + f.getName() + " starts with upper case.");
System.out.println("Cannot proceed");
return "";
}
else
{
continue;
}
}
// if property type does not ends with a VO
if(!f.getType().getName().endsWith(suffix))
{
// Means it is not a custom object (like AssetVO)
// <item coin="asset.id">
output.append("\n\t\t\t\t<item coin=\"" + tagName + "." + f.getName() + "\">");
}
else
{
// it ends in a VO e.g. AssetRangeVO
// tag should be <item coin="assetRange">
output.append("\n\t\t\t\t<item coin=\"" + getTagName(f.getType())+ "\">");
}
if(f.getType().isArray())
{
//<property kind="list" name="wrapperSchedule"/>
output.append("\n\t\t\t\t\t<property kind=\"list\" name=\"wrapper" + firstCaps(f.getName()) + "\"/>");
}
else if(f.getType().equals(java.util.Date.class))
{
// <property name="wrapperDate"/>
output.append("\n\t\t\t\t\t<property name=\"wrapper" + firstCaps(f.getName()) + "\"/>");
}
else if(f.getType().equals(java.util.List.class))
{
String fldType = f.getGenericType().toString();
String typeOfList = fldType.substring("java.util.List<".length(), fldType.length()-1);
if(typeOfList.endsWith(suffix))
{
// It is a list of custom objects
// For example, lets say if it is List<GoalVO>, then it should be defined as follows.
// <property kind="list" name="goal"/>
output.append("\n\t\t\t\t\t<property kind=\"list\" name=\"" + getTagName(Class.forName(typeOfList)) + "\"/>");
}
else
{
//<property kind="list" name="propValues"/>
output.append("\n\t\t\t\t\t<property kind=\"list\" name=\"" + f.getName() + "\"/>");
}
}
else
{
//<property name="propertName"/>
output.append("\n\t\t\t\t\t<property name=\"" + f.getName() + "\"/>");
}
output.append("\n\t\t\t\t</item>");
}
output.append("\n\t\t\t</selection>");
output.append("\n\t\t</elements>");
output.append("\n\t</bean>");
for(Field fd: fields)
{
if(Modifier.toString(fd.getModifiers()).contains("final"))
{
// if the field is final, it
// cannot be set via XML.
continue;
}
// No need to generate if property Name ends in VO because the tag should be already defined.
// Most likely it will be a VO object
if(fd.getType().getName().endsWith(suffix))
continue;
if(fd.getType().equals(java.util.List.class))
{
// if it is a list of custom objects
String fldType = fd.getGenericType().toString();
String typeOfList = fldType.substring("java.util.List<".length(), fldType.length()-1);
if(typeOfList.endsWith(suffix))
{
// It is a list of custom objects
// so no need to definie its <text tag
continue;
}
}
if(fd.getType().isArray() && fd.getType().getComponentType().getClass().getName().endsWith(suffix))
{
// it is an array and each element is a custom object
continue;
}
output.append("\n\t<text label=\"" + tagName + "." + fd.getName() + "\" tag=\"" + fd.getName()+"\"" );
// Specify type based on the type of field.
if(fd.getType().equals(int.class) || fd.getType().equals(Integer.class) ||
(fd.getType().isArray() && fd.getType().getComponentType().equals(int.class)))
{
output.append(" type=\"int\"/>");
continue;
}
if(fd.getType().equals(boolean.class) || fd.getType().equals(Boolean.class))
{
output.append(" type=\"boolean\"/>");
continue;
}
if(fd.getType().equals(double.class)||fd.getType().equals(Double.class) ||
(fd.getType().isArray() && fd.getType().getComponentType().equals(double.class)))
{
output.append(" type=\"double\"/>");
continue;
}
if(fd.getType().equals(long.class)||fd.getType().equals(Long.class)||
(fd.getType().isArray() && fd.getType().getComponentType().equals(long.class)))
{
output.append(" type=\"long\"/>");
continue;
}
if(fd.getType().equals(java.util.List.class))
{
output.append(" type=\"Needs to be filled\"/>");
continue;
}
output.append("/>");
}
return output.toString();
}
No comments:
Post a Comment