import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.eclipse.persistence.internal.oxm.schema.model.SimpleType;
import org.eclipse.persistence.sdo.SDOHelper;
import org.eclipse.persistence.sdo.SDOType;
import org.eclipse.persistence.sdo.helper.SDOHelperContext;
import commonj.sdo.DataObject;
import commonj.sdo.Property;
import commonj.sdo.Type;
import commonj.sdo.helper.HelperContext;
public class test {
public static void main(String[] args) throws FileNotFoundException, MalformedURLException {
// File file = new File("Y:/workspace/EclipseLinkTest/xsd/allinone/CDAall.xsd");
File file = new File("Y:/workspace/EclipseLinkTest/xsd/all/CDA.xsd");
FileInputStream fileInputStream = new FileInputStream(file);
List<SDOType> ls = SDOHelperContext.getHelperContext().getXSDHelper().define(fileInputStream, file.toURL().toString());
System.out.println("***************************************************");
for(SDOType type:ls){
System.out.println(genSampleXml(SDOHelperContext.getHelperContext(),type));
}
System.out.println(ls.size());
// SDOHelper.GETS
}
public static String genSampleXml(HelperContext scope, Type type) {
return genSampleXml(scope, type, null);
}
public static final String RootType = "DocumentRoot"; //$NON-NLS-1$
/**
* 递归设置DataObject
*
* @param parent
* @param scope
* @param pro
*/
private static void createDo4Type(DataObject parent, HelperContext scope, Property pro, Map<Property, Integer> times) {
Type type = pro.getType();
boolean isMany = pro.isMany();
if (type.isDataType()) {
Object obj = getSimpleType(type);
if (obj != null) {
if (isMany) {
List list = new ArrayList();
list.add(obj);
parent.set(pro, list);
} else {
parent.set(pro, obj);
}
}
return;
}
if (!type.isAbstract()) {
DataObject dataobj = scope.getDataFactory().create(type);
List list = type.getProperties();
for (Object obj : list) {
Property property = (Property) obj;
Integer time = times.get(property);
if (time == null || time < 4) {
if (time == null)
time = 0;
time++;
times.put(property, time);
createDo4Type(dataobj, scope, property, times);
}
}
if (pro.isMany()) {
List proList = new ArrayList();
proList.add(dataobj);
parent.setList(pro, proList);
} else {
parent.set(pro, dataobj);
}
}
}
public static String getDefaultElementName(Type type) {
String name = ((SDOType) type).getXmlDescriptor().getDefaultRootElement();
if (name == null || name.trim().equals("")) {
name = type.getName();
}
return name;
}
public static String genSampleXml(HelperContext scope, Type type, String elementName) {
if (type.isDataType()) {
return getSimpleType(type).toString();
}
if (RootType.equals(type.getName())) {
return null;
}
try {
if (!type.isAbstract()) {
DataObject gp = scope.getDataFactory().create(type);
for (Object obj : type.getProperties()) {
Property p = (Property) obj;
Map<Property, Integer> map = new HashMap<Property, Integer>();
map.put(p, 1);
createDo4Type(gp, scope, p, map);
}
if (elementName == null || elementName.equals("")) {
elementName = getDefaultElementName(gp.getType());
}
String xml = scope.getXMLHelper().save(gp, gp.getType().getURI(), elementName);
return xml;
} else {
return "Type is Abstract";
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static Map<QName, Object> dataType = new HashMap<QName, Object>();
static {
dataType.put(new QName("commonj.sdo", "Boolean"), true);
dataType.put(new QName("commonj.sdo", "Byte"), (byte) 1);
dataType.put(new QName("commonj.sdo", "Bytes"), "bytes".getBytes());
dataType.put(new QName("commonj.sdo", "Character"), 'C');
dataType.put(new QName("commonj.sdo", "Date"), new Date());
dataType.put(new QName("commonj.sdo", "DateTime"), "2009-07-10T10:10:10");
dataType.put(new QName("commonj.sdo", "Day"), "---10");
dataType.put(new QName("commonj.sdo", "Decimal"), new BigDecimal(123));
dataType.put(new QName("commonj.sdo", "Duration"), "P1998Y");
dataType.put(new QName("commonj.sdo", "Double"), 123.123);
dataType.put(new QName("commonj.sdo", "Float"), 12.12F);
dataType.put(new QName("commonj.sdo", "Int"), 12);
dataType.put(new QName("commonj.sdo", "Integer"), new BigInteger("123456789"));
dataType.put(new QName("commonj.sdo", "Long"), 123456);
dataType.put(new QName("commonj.sdo", "MonthDay"), "--10-10");
dataType.put(new QName("commonj.sdo", "Month"), "--10");
dataType.put(new QName("commonj.sdo", "Short"), (short) 1);
dataType.put(new QName("commonj.sdo", "String"), "String");
dataType.put(new QName("commonj.sdo", "Strings"), "any characters seprated by whitespace");
dataType.put(new QName("commonj.sdo", "Time"), "10:10:10");
dataType.put(new QName("commonj.sdo", "Year"), "-1994");
dataType.put(new QName("commonj.sdo", "YearMonth"), "-1994-10");
dataType.put(new QName("commonj.sdo", "YearMonthDay"), "-1994-10-10");
dataType.put(new QName("commonj.sdo", "URI"), "uri");
}
private static Object getSimpleType(Type type) {
Object obj = dataType.get(new QName(type.getURI(), type.getName()));
if (obj == null) {
List<Type> superTypes = type.getBaseTypes();
for (Type superType : superTypes) {
obj = dataType.get(new QName(superType.getURI(), superType.getName()));
if (obj != null) {
if (type instanceof SDOType) {
if (((SDOType) type).isXsdList()) {
ArrayList ls = new ArrayList();
ls.add(obj);
return ls;
}
}
return obj;
} else {
if (!superType.getBaseTypes().isEmpty()) {
obj = getSimpleType(superType);
if (obj != null) {
if (type instanceof SDOType) {
if (((SDOType) type).isXsdList()) {
ArrayList ls = new ArrayList();
ls.add(obj);
return ls;
}
}
return obj;
}
}
}
}
}
return obj;
}
// 722行,增加该代码可以进行部分规避,但还是不能确定basetype的原因
// XXX for list union等类型,缺少内容类型的设置,导致无法展示出来。这里进行补充处理。不确定是否正确
// if (currentType.getBaseTypes().size() == 0) {
// if (simpleType.getUnion() != null && simpleType.getUnion().getSimpleTypes().size() > 0) {
// SimpleType mySimpleType = (SimpleType) simpleType.getUnion().getSimpleTypes().get(0);
// String baseType = mySimpleType.getRestriction().getBaseType();
// baseTypeQName = this.getQNameForString(defaultNamespace, baseType);
// SDOType baseSDOType = getTypeForXSDQName(baseTypeQName);
// currentType.addBaseType(baseSDOType);
// currentType.setInstanceClass(baseSDOType.getInstanceClass());
// }
// }
//
// if (currentType.getBaseTypes().size() == 0) {
// if (simpleType.getUnion() != null && simpleType.getUnion().getMemberTypes().size() > 0) {
// String baseType = (String) simpleType.getUnion().getMemberTypes().get(0);
// baseTypeQName = this.getQNameForString(defaultNamespace, baseType);
// SDOType baseSDOType = getTypeForXSDQName(baseTypeQName);
// currentType.addBaseType(baseSDOType);
//
// currentType.setInstanceClass(baseSDOType.getInstanceClass());
// }
// }
//
// if (currentType.getBaseTypes().size() == 0) {
// if(simpleType.getList()!=null&&simpleType.getList().getItemType()!=null&&!"".equals(simpleType.getList().getItemType())){
// String baseType = simpleType.getList().getItemType();
// baseTypeQName = this.getQNameForString(defaultNamespace, baseType);
// SDOType baseSDOType = getTypeForXSDQName(baseTypeQName);
// currentType.addBaseType(baseSDOType);
//
// currentType.setInstanceClass(baseSDOType.getInstanceClass());
// }
// }
//
// if (currentType.getBaseTypes().size() == 0) {
// System.out.println("存在basetype为空的");
// }
}