/**Copyright 2010 Research Studios Austria Forschungsgesellschaft mBH * * This file is part of easyrec. * * easyrec is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * easyrec is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with easyrec. If not, see <http://www.gnu.org/licenses/>. */ package org.easyrec.utils.io.autoimport; import org.apache.commons.logging.Log; import org.easyrec.utils.io.tabular.output.impl.CSVOutput; /** * This class provides methods to parse header data from a .CSV file. * <p/> * <p><b>Company: </b> * SAT, Research Studios Austria</p> * <p/> * <p><b>Copyright: </b> * (c) 2007</p> * <p/> * <p><b>last modified:</b><br/> * $Author: pmarschik $<br/> * $Date: 2011-02-11 11:04:49 +0100 (Fr, 11 Feb 2011) $<br/> * $Revision: 17656 $</p> * * @author Roman Cerny */ public class AutoImportUtils { /////////////////////////////////////////////////////////////////////////// // constants public static final String CSV_SEPARATOR = Character.toString(CSVOutput.SEP_COMMA); public static final char CSV_DEF_SEPARATOR = CSVOutput.DEF_SEPARATOR; public static final char CSV_SEP_COMMENT_BEGIN = CSVOutput.SEP_COMMENT_BEGIN; public static final char CSV_COMMENT_CHAR = CSVOutput.COMMENT_CHAR; public static final String CSV_TYPE = "type"; public static final String CSV_COMMAND = "command"; public static final String CSV_DELIMITER = ":"; public static final String COMMAND_INSERT = "insert"; public static final String COMMAND_REMOVE = "remove"; public static final String VALID_TYPE; public static final String VALID_TYPE_EXAMPLE; public static final String VALID_COMMAND; static { StringBuilder buf = new StringBuilder(); buf.append(CSV_COMMENT_CHAR); buf.append(" "); buf.append(CSV_TYPE); buf.append(CSV_DELIMITER); buf.append(" <TYPE_OF_FILE>"); VALID_TYPE = buf.toString(); buf.delete(buf.length() - 15, buf.length()); buf.append(" itemassoc"); VALID_TYPE_EXAMPLE = buf.toString(); buf = new StringBuilder(); buf.append(CSV_COMMENT_CHAR); buf.append(" "); buf.append(CSV_COMMAND); buf.append(CSV_DELIMITER); buf.append(" "); buf.append(COMMAND_INSERT); buf.append("' or '"); buf.append(CSV_COMMENT_CHAR); buf.append(" "); buf.append(CSV_COMMAND); buf.append(CSV_DELIMITER); buf.append(" "); buf.append(COMMAND_REMOVE); VALID_COMMAND = buf.toString(); } // ///////////////////////////////////////////////////////////////////////// // public methods public static String retrieveTypeFromLine(String line) { // syntax: '# type: <TYPE_OF_FILE>' StringBuilder errorMsgBuffer = new StringBuilder("this line doesn't contain a valid type, line must be: '"); errorMsgBuffer.append(VALID_TYPE); errorMsgBuffer.append("', but was: '"); errorMsgBuffer.append(line); errorMsgBuffer.append("'"); String errorMsg = errorMsgBuffer.toString(); // check '#' line = line.trim(); String csvComment = Character.toString(CSV_COMMENT_CHAR); if (!line.startsWith(csvComment)) { throw new IllegalArgumentException(errorMsg); } line = line.substring(line.indexOf(csvComment) + csvComment.length()); // check 'type' line = line.trim(); if (!line.startsWith(CSV_TYPE)) { throw new IllegalArgumentException(errorMsg); } line = line.substring(line.indexOf(CSV_TYPE) + CSV_TYPE.length()); // check ':' line = line.trim(); if (!line.startsWith(CSV_DELIMITER)) { throw new IllegalArgumentException(errorMsg); } line = line.substring(line.indexOf(CSV_DELIMITER) + CSV_DELIMITER.length()); // retrieve type of file, for e.g. 'itemassoc' or 'action' return line.trim(); } public static String retrieveCommandFromLine(String line) { // syntax: '# command: insert/remove' String csvComment = Character.toString(CSV_COMMENT_CHAR); StringBuilder errorMsgBuffer = new StringBuilder("this line doesn't contain a valid command, line must be: '"); errorMsgBuffer.append(VALID_COMMAND); errorMsgBuffer.append("', but was: '"); errorMsgBuffer.append(line); errorMsgBuffer.append("'"); String errorMsg = errorMsgBuffer.toString(); // check '#' line = line.trim(); if (!line.startsWith(csvComment)) { throw new IllegalArgumentException(errorMsg); } line = line.substring(line.indexOf(csvComment) + csvComment.length()); // check 'command' line = line.trim(); if (!line.startsWith(CSV_COMMAND)) { throw new IllegalArgumentException(errorMsg); } line = line.substring(line.indexOf(CSV_COMMAND) + CSV_COMMAND.length()); // check ':' line = line.trim(); if (!line.startsWith(CSV_DELIMITER)) { throw new IllegalArgumentException(errorMsg); } line = line.substring(line.indexOf(CSV_DELIMITER) + CSV_DELIMITER.length()); // check command 'insert' or 'delete' line = line.trim(); if (line.startsWith(COMMAND_INSERT)) { return COMMAND_INSERT; } if (line.startsWith(COMMAND_REMOVE)) { return COMMAND_REMOVE; } throw new IllegalArgumentException(errorMsg); } public static String getDefaultFromHeaderPart(String headerPart) { // no header value found if (headerPart == null || "".equals(headerPart)) { return null; } int indexFrom = headerPart.indexOf(CSV_DEF_SEPARATOR); // no separator char '=' found if (indexFrom == -1) { return null; } int indexTo = headerPart.indexOf(CSV_SEP_COMMENT_BEGIN); if (indexTo != -1) { return headerPart.substring(indexFrom + 1, indexTo); } else { return headerPart.substring(indexFrom + 1); } } public static void logSkippedLine(Log logger, int lineCounter, String line, String message) { if (logger.isInfoEnabled()) { StringBuilder s = new StringBuilder("skipped data line["); s.append(lineCounter); s.append("] '"); s.append(line); s.append("', "); s.append(message); logger.info(s.toString()); } } }