/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.edimap.editor; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.configuration.editors.xml.TagList; import org.jboss.tools.smooks.configuration.editors.xml.TagObject; import org.jboss.tools.smooks.edimap.models.EDIDataContainerModel; /** * @author Dart dpeng@redhat.com * */ public class EDIFileParser { public TagList parserEDIFile(String path, char segment, char field, char component, char subcomponent) throws InvocationTargetException, IOException { TagList tl = new TagList(); path = SmooksUIUtils.parseFilePath(path); if (!new File(path).exists()) return new TagList(); InputStream stream = new FileInputStream(path); InputStreamReader reader = new InputStreamReader(stream); BufferedReader br = new BufferedReader(reader); StringBuffer stringBuffer = new StringBuffer(); List<String> segmentList = new ArrayList<String>(); int readed = -1; while ((readed = br.read()) != -1) { if (readed != segment) { stringBuffer.append((char) readed); } else { segmentList.add(stringBuffer.toString()); stringBuffer = null; stringBuffer = new StringBuffer(); } } if (stringBuffer != null && stringBuffer.toString().length() > 0) { segmentList.add(stringBuffer.toString()); stringBuffer = null; } br.close(); reader.close(); stream.close(); List<String> names = new ArrayList<String>(); char[] separators = new char[] { field, component, subcomponent }; for (Iterator<?> iterator = segmentList.iterator(); iterator.hasNext();) { String string = (String) iterator.next(); String[] fields = string.split("\\" + new String(new char[] { field })); //$NON-NLS-1$ TagObject tag = null; if (fields.length != 0) { if (names.indexOf(fields[0]) == -1) { tag = new EDIDataContainerModel(); ((EDIDataContainerModel) tag).setMultipe(false); tag.setName(fields[0].trim()); names.add(tag.getName()); tl.addRootTag(tag); } else { List<TagObject> tagList = tl.getRootTagList(); for (Iterator<?> iterator2 = tagList.iterator(); iterator2.hasNext();) { TagObject tagObject = (TagObject) iterator2.next(); if (tagObject instanceof EDIDataContainerModel) { if (fields[0].equals(((EDIDataContainerModel) tagObject).getSegCode())) { ((EDIDataContainerModel) tagObject).setMultipe(true); break; } } } } } if (tag != null) { String ss = string.substring(fields[0].length(), string.length()); generateChildrenTag(tag, ss, separators, 0); } } return tl; } private String getSeparator(String s) { if (s.equals("*") || s.equals("+") || s.equals("^")) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ return "\\" + s; //$NON-NLS-1$ } return s; } private void generateChildrenTag(TagObject parent, String content, char[] separators, int currentSeparator) { char separator = separators[currentSeparator]; String sss = new String(new char[] { separator }); if (content.indexOf(sss) == -1) return; sss = getSeparator(sss); String[] contentArray = content.split(sss); if (contentArray == null || contentArray.length == 0) { return; } for (int i = 0; i < contentArray.length; i++) { String con = contentArray[i]; if (con == null || con.length() == 0) continue; TagObject child = new TagObject(); child.setName(con.trim()); parent.addChildTag(child); int newIndex = (currentSeparator + 1); if (newIndex <= (separators.length - 1)) { generateChildrenTag(child, con, separators, newIndex); } } } }