/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.planner.examples.common.persistence; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.drools.planner.core.solution.Solution; /** * @author Geoffrey De Smet */ public abstract class AbstractTxtSolutionImporter extends AbstractSolutionImporter { private static final String DEFAULT_INPUT_FILE_SUFFIX = ".txt"; protected AbstractTxtSolutionImporter(SolutionDao solutionDao) { super(solutionDao); } protected String getInputFileSuffix() { return DEFAULT_INPUT_FILE_SUFFIX; } public abstract TxtInputBuilder createTxtInputBuilder(); public Solution readSolution(File inputFile) { BufferedReader bufferedReader = null; try { bufferedReader = new BufferedReader(new FileReader(inputFile)); TxtInputBuilder txtInputBuilder = createTxtInputBuilder(); txtInputBuilder.setBufferedReader(bufferedReader); return txtInputBuilder.readSolution(); } catch (IOException e) { throw new IllegalArgumentException("Could not read the file (" + inputFile.getName() + ").", e); } finally { IOUtils.closeQuietly(bufferedReader); } } public abstract class TxtInputBuilder { protected BufferedReader bufferedReader; public void setBufferedReader(BufferedReader bufferedReader) { this.bufferedReader = bufferedReader; } public abstract Solution readSolution() throws IOException; // ************************************************************************ // Helper methods // ************************************************************************ public void readEmptyLine() throws IOException { readConstantLine(""); } public void readConstantLine(String constantValue) throws IOException { String line = bufferedReader.readLine(); String value = line.trim(); if (!value.equals(constantValue)) { throw new IllegalArgumentException("Read line (" + line + ") is expected to be a constant value (" + constantValue + ")."); } } public int readIntegerValue() throws IOException { return readIntegerValue(""); } public int readIntegerValue(String prefix) throws IOException { return readIntegerValue(prefix, ""); } public int readIntegerValue(String prefix, String suffix) throws IOException { String line = bufferedReader.readLine(); String value = line.trim(); if (!value.startsWith(prefix)) { throw new IllegalArgumentException("Read line (" + line + ") is expected to start with prefix (" + prefix + ")."); } value = value.substring(prefix.length()); if (!value.endsWith(suffix)) { throw new IllegalArgumentException("Read line (" + line + ") is expected to end with suffix (" + suffix + ")."); } value = value.substring(0, value.length() - suffix.length()); value = value.trim(); try { return Integer.parseInt(value); } catch (NumberFormatException e) { throw new IllegalArgumentException("Read line (" + line + ") is expected to contain an integer value (" + value + ").", e); } } } }