/** * Copyright (c) 2004-2011 Wang Jinbao(Julian Wong), http://www.ralasafe.com * Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php */ package org.ralasafe.metadata.user; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.ralasafe.util.StringUtil; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; public class UserMetadataParser { private static final String TRUE = "true"; private static final String EMT_USER = "user"; private static final String EMT_TABLE = "table"; private static final String EMT_MULTIS = "multis"; private static final String EMT_SINGLES = "singles"; private static final String EMT_FIELD = "field"; private static final String ATTR_FIELD_JAVA_TYPE = "javaType"; private static final String ATTR_FIELD_SQL_TYPE = "sqlType"; private static final String ATTR_FIELD_COLUMN_NAME = "columnName"; private static final String ATTR_FIELD_NAME = "name"; private static final String ATTR_FIELD_DISPLAY_NAME = "displayName"; private static final String ATTR_FIELD_SHOW = "show"; private static final String ATTR_TABLE_MAX_OCC = "maxOcc"; private static final String ATTR_TABLE_MIN_OCC = "minOcc"; private static final String ATTR_TABLE_UNIQUE_FIELDS = "uniqueFields"; private static final String ATTR_TABLE_SQL_NAME = "sqlName"; private static final String ATTR_TABLE_NAME = ATTR_FIELD_NAME; private static final String ATTR_TABLE_DS = "ds"; public UserMetadata parse(String file) { DocumentBuilderFactory fcty = DocumentBuilderFactory.newInstance(); Document document = null; try { DocumentBuilder builder = fcty.newDocumentBuilder(); document = builder.parse(file); } catch (ParserConfigurationException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (SAXException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } Element rootEmt = document.getDocumentElement(); return parseUser(rootEmt); } public UserMetadata parse(InputStream in) { DocumentBuilderFactory fcty = DocumentBuilderFactory.newInstance(); Document document = null; try { DocumentBuilder builder = fcty.newDocumentBuilder(); document = builder.parse(in); } catch (ParserConfigurationException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (SAXException e) { e.printStackTrace(); throw new RuntimeException(e); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } Element rootEmt = document.getDocumentElement(); return parseUser(rootEmt); } private UserMetadata parseUser(Element rootEmt) { UserMetadata user = new UserMetadata(); // parse main table NodeList childNodes = rootEmt.getElementsByTagName(EMT_TABLE); Element tableEmt = (Element) childNodes.item(0); user.setMainTableMetadata(parseTable(tableEmt)); List userFieldsList=new LinkedList(); List userFieldDisplayNamesList=new LinkedList(); List showUserFieldsList=new LinkedList(); List showUserFieldDisplayNamesList=new LinkedList(); FieldMetadata[] fields = user.getMainTableMetadata().getFields(); for (int i = 0; i < fields.length; i++) { userFieldsList.add( fields[i].getName() ); userFieldDisplayNamesList.add( fields[i].getDisplayName() ); if (fields[i].isShow()) { showUserFieldsList.add( fields[i].getName() ); showUserFieldDisplayNamesList.add( fields[i].getDisplayName() ); } } String[] sa=new String[0]; user.setUserFields( (String[]) userFieldsList.toArray(sa) ); user.setUserFieldDisplayNames( (String[]) userFieldDisplayNamesList.toArray(sa) ); user.setShowUserFields( (String[]) showUserFieldsList.toArray(sa) ); user.setShowUserFieldDisplayNames( (String[]) showUserFieldDisplayNamesList.toArray(sa) ); // parse single value tables childNodes = rootEmt.getElementsByTagName(EMT_SINGLES); if (childNodes != null && childNodes.getLength() > 0) { Element singlesEmt = (Element) childNodes.item(0); NodeList tableEmts = singlesEmt.getElementsByTagName(EMT_TABLE); TableMetadata[] tables = new TableMetadata[tableEmts.getLength()]; for (int i = 0; i < tables.length; i++) { tables[i] = parseTable((Element) tableEmts.item(i)); } user.setSingleValueTableMetadatas(tables); } // parse multi value tables childNodes = rootEmt.getElementsByTagName(EMT_MULTIS); if (childNodes != null && childNodes.getLength() > 0) { Element multisEmt = (Element) childNodes.item(0); NodeList tableEmts = multisEmt.getElementsByTagName(EMT_TABLE); TableMetadata[] tables = new TableMetadata[tableEmts.getLength()]; for (int i = 0; i < tables.length; i++) { tables[i] = parseTable((Element) tableEmts.item(i)); } user.setMultiValueTableMetadatas(tables); } return user; } private TableMetadata parseTable(Element tableEmt) { TableMetadata table = new TableMetadata(); String dsName = tableEmt.getAttribute(ATTR_TABLE_DS); String name = tableEmt.getAttribute(ATTR_TABLE_NAME); String sqlName = tableEmt.getAttribute(ATTR_TABLE_SQL_NAME); String uniqueFieldsAttr = tableEmt .getAttribute(ATTR_TABLE_UNIQUE_FIELDS); String minOcc = tableEmt.getAttribute(ATTR_TABLE_MIN_OCC); String maxOcc = tableEmt.getAttribute(ATTR_TABLE_MAX_OCC); NodeList fields = tableEmt.getElementsByTagName(EMT_FIELD); table.setDatasourceName(dsName); table.setFields(parseFields(fields)); table.setMaxOcc(StringUtil.isEmpty(minOcc) ? 0 : Integer .parseInt(minOcc)); table.setMinOcc(StringUtil.isEmpty(maxOcc) ? 0 : Integer .parseInt(maxOcc)); table.setName(name); table.setSqlTableName(sqlName); FieldMetadata[] uniqueFields = null; if (uniqueFieldsAttr != null) { Map fieldMap = new HashMap(); FieldMetadata[] fields2 = table.getFields(); for (int i = 0; i < fields2.length; i++) { FieldMetadata field = fields2[i]; fieldMap.put(field.getName(), field); } String[] split = StringUtil.split(uniqueFieldsAttr, ","); uniqueFields = new FieldMetadata[split.length]; for (int i = 0; i < split.length; i++) { FieldMetadata field = (FieldMetadata) fieldMap.get(split[i]); uniqueFields[i] = field; } } table.setUniqueFields(uniqueFields); return table; } private FieldMetadata[] parseFields(NodeList fieldEmts) { int size = fieldEmts.getLength(); FieldMetadata[] fields = new FieldMetadata[size]; for (int i = 0; i < size; i++) { fields[i] = parseField((Element) fieldEmts.item(i)); } return fields; } private FieldMetadata parseField(Element fieldEmt) { String name = fieldEmt.getAttribute(ATTR_FIELD_NAME); String columnName = fieldEmt.getAttribute(ATTR_FIELD_COLUMN_NAME); String sqlType = fieldEmt.getAttribute(ATTR_FIELD_SQL_TYPE); String javaType = fieldEmt.getAttribute(ATTR_FIELD_JAVA_TYPE); String displayName = name; if (fieldEmt.hasAttribute(ATTR_FIELD_DISPLAY_NAME)) { displayName = fieldEmt.getAttribute(ATTR_FIELD_DISPLAY_NAME); } boolean show = false; if (fieldEmt.hasAttribute(ATTR_FIELD_SHOW) && fieldEmt.getAttribute(ATTR_FIELD_SHOW).equals(TRUE)) { show = true; } FieldMetadata field = new FieldMetadata(); field.setColumnName(columnName); field.setJavaType(javaType); field.setName(name); field.setSqlType(sqlType); field.setDisplayName(displayName); field.setShow(show); return field; } }