private static void loadTables() {
		
		if (tables != null) return ;
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		try {
			DocumentBuilder builder = dbf.newDocumentBuilder();
			Document doc = builder.parse(new File(MetaData.class.getResource(MODEL_FILE).getFile()));
			Element elm = doc.getDocumentElement();
			NodeList nl = elm.getElementsByTagName(N_TABLE);
			tables = new HashMap<String,  List<ColumnType>>();
			rowkeys = new HashMap<String, String>();
			for (int i=0; i<nl.getLength(); i++) {
				List<ColumnType> columns = new ArrayList<ColumnType>();
				
				Element columnMeta = (Element)nl.item(i);
				String key = columnMeta.getAttribute(A_TABLENAME_T);
				String rowKeyType = columnMeta.getAttribute(A_ROWKEY);
				
				rowkeys.put(key, rowKeyType);
				//get its sub element: column
				NodeList nl2 = columnMeta.getElementsByTagName(N_COLUMN);
				for (int j=0; j<nl2.getLength(); j++) {
					Element col = (Element)nl2.item(j);
					ColumnType meta = new ColumnType();
					String name=col.getAttribute("name").trim(),
							type=col.getAttribute("type").trim().toLowerCase().replaceAll("\\s", ""),
							familyName=col.getAttribute("familyName").trim();
					if (isEmpty(name) || isEmpty(familyName)) {
						//invalid configuration, ignore this row
						Logger.getLogger(MetaData.class).warn("either column name " +
								"or family name is not specified!");
						continue;
					}
					meta.setColName(name);
					meta.setType(type);
					meta.setFamilyName(familyName);
					columns.add(meta);
				}
				if (columns.size() > 0) {
					tables.put(key, columns);
				}
			}
		} catch (ParserConfigurationException e) {
			Logger.getLogger(MetaData.class).error("ParserConfigurationException", e);
		} catch (SAXException e) {
			Logger.getLogger(MetaData.class).error("SAXException", e);
		} catch (IOException e) {
			Logger.getLogger(MetaData.class).error("IOException", e);
		}
	}