package org.reunionemu.jcommon; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.Iterator; import java.util.List; import java.util.Vector; import org.slf4j.LoggerFactory; /** * @author Aidamina * @license http://reunion.googlecode.com/svn/trunk/license.txt */ public class Parser implements Iterable<ParsedItem> { private List<ParsedItem> itemList = new Vector<ParsedItem>(); private String source; public Parser() { super(); } public String getSource() { return source; } public void setSource(String source) { this.source = source; } public void addMember(ParsedItem item) { itemList.add(item); } public boolean checkItems(String[] itemNames) { for (String itemName : itemNames) { if (getItem(itemName) == null) { return false; } } return true; } public void clear() { Iterator<ParsedItem> iter = getItemListIterator(); while (iter.hasNext()) { ParsedItem item = iter.next(); item.clear(); } itemList.clear(); } public String dump() { String dumpString = new String(""); Iterator<ParsedItem> itemIter = getItemListIterator(); while (itemIter.hasNext()) { ParsedItem parsedItem = itemIter.next(); dumpString += "\n[" + parsedItem.getName() + "]\n"; Iterator<ParsedItemMember> memberIter = parsedItem .getMemberListIterator(); while (memberIter.hasNext()) { ParsedItemMember parsedItemMember = memberIter.next(); dumpString += parsedItemMember.getName() + " = " + parsedItemMember.getValue() + "\n"; } } return dumpString; } public ParsedItem find(String membername, String membervalue) { Iterator<ParsedItem> itemIter = getItemListIterator(); while (itemIter.hasNext()) { ParsedItem parsedItem = itemIter.next(); ParsedItemMember member = parsedItem.getMember(membername); if (member == null) { continue; } if (member.getValue().toLowerCase() .equals(membervalue.toLowerCase())) { return parsedItem; } } return null; } public ParsedItem getItem(String name) { Iterator<ParsedItem> itemIter = getItemListIterator(); while (itemIter.hasNext()) { ParsedItem parsedItem = itemIter.next(); if (parsedItem.getName().toLowerCase().equals(name.toLowerCase())) { return parsedItem; } } return null; } public ParsedItem getItemById(int id) { return find("id", String.valueOf(id)); } public Iterator<ParsedItem> getItemListIterator() { return itemList.iterator(); } public int getItemListSize() { return itemList.size(); } public void Parse(InputStream inputStream){ try { ParsedItem parsedItem = null; BufferedReader input = new BufferedReader(new InputStreamReader(inputStream)); String line = null; int linenr = 0; while ((line = input.readLine()) != null) { linenr++; line = line.trim(); if (line.startsWith("#") || line.length() == 0) { continue; } line = line.split("#")[0]; line = line.trim(); String[] object = line.split("="); if (object.length == 1) { String hobject = object[0]; if (hobject.startsWith("[") && hobject.endsWith("]")) { String hobjectname = hobject.substring(1, hobject.length() - 1); hobjectname = hobjectname.trim(); if (getItem(hobjectname) != null) { LoggerFactory.getLogger(Parser.class).info(parseError(linenr, "Object with name \"" + hobjectname + "\" already exits", line)); continue; } parsedItem = new ParsedItem(hobjectname); addMember(parsedItem); } } if (line.contains("=")) { if (parsedItem == null) { LoggerFactory.getLogger(Parser.class).info(parseError(linenr, "Member needs an object", line)); continue; } String name = object[0].trim(); String value = object.length==2 ? object[1].trim() : null; ParsedItemMember parsedItemMember = new ParsedItemMember( name, value); parsedItem.addMember(parsedItemMember); } if (object.length < 1 || object.length > 2) { LoggerFactory.getLogger(Parser.class).info(parseError(linenr, "Invalid member syntax", line)); continue; } } input.close(); } catch (Exception e) { LoggerFactory.getLogger(this.getClass()).warn("Exception",e); } } public void Parse(String filename) throws IOException { setSource(filename); File file = new File(filename); if (!file.exists()) { LoggerFactory.getLogger(Parser.class).info("Parsing error: '" + file.getAbsolutePath() + "' does not exist"); throw new FileNotFoundException(file.getAbsolutePath()); } Parse(new FileInputStream(file)); } private String parseError(int linenr, String errorMessage, String line) { String parseErrorMessage = new String(); parseErrorMessage = "Parsing error line " + linenr + " in " + getSource() + " (" + errorMessage + "): \"" + line + "\""; return parseErrorMessage; } @Override public Iterator<ParsedItem> iterator() { return getItemListIterator(); } }