Skip to content

Commit

Permalink
investment: read the spreadsheet file directly
Browse files Browse the repository at this point in the history
  • Loading branch information
ge0ffrey committed Jun 27, 2015
1 parent 741792d commit 6a90e52
Show file tree
Hide file tree
Showing 8 changed files with 238 additions and 63 deletions.
9 changes: 0 additions & 9 deletions optaplanner-examples/data/investment/import/irrinki_1.csv

This file was deleted.

Binary file not shown.
Binary file not shown.
30 changes: 15 additions & 15 deletions optaplanner-examples/data/investment/unsolved/irrinki_1.xml
Expand Up @@ -133,63 +133,63 @@
</entry>
</correlationMillisMap>
</AssetClass>
<long>200</long>
<long>0</long>
</entry>
</correlationMillisMap>
</AssetClass>
<long>520</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="15"/>
<long>-20</long>
<long>0</long>
</entry>
</correlationMillisMap>
</AssetClass>
<long>870</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="13"/>
<long>620</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="15"/>
<long>-50</long>
<long>0</long>
</entry>
</correlationMillisMap>
</AssetClass>
<long>40</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="11"/>
<long>300</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="13"/>
<long>360</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="15"/>
<long>250</long>
<long>0</long>
</entry>
</correlationMillisMap>
</AssetClass>
<long>760</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="9"/>
<long>350</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="11"/>
<long>500</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="13"/>
<long>240</long>
<long>0</long>
</entry>
<entry>
<AssetClass reference="15"/>
<long>300</long>
<long>0</long>
</entry>
</correlationMillisMap>
</AssetClass>
Expand Down
4 changes: 4 additions & 0 deletions optaplanner-examples/pom.xml
Expand Up @@ -142,6 +142,10 @@
<groupId>org.jdom</groupId>
<artifactId>jdom</artifactId>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
</dependency>
</dependencies>

</project>
@@ -0,0 +1,160 @@
/*
* Copyright 2015 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.optaplanner.examples.common.persistence;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.optaplanner.core.api.domain.solution.Solution;

public abstract class AbstractXlsxSolutionImporter extends AbstractSolutionImporter {

private static final String DEFAULT_INPUT_FILE_SUFFIX = "xlsx";

protected AbstractXlsxSolutionImporter(SolutionDao solutionDao) {
super(solutionDao);
}

protected AbstractXlsxSolutionImporter(boolean withoutDao) {
super(withoutDao);
}

public String getInputFileSuffix() {
return DEFAULT_INPUT_FILE_SUFFIX;
}

public abstract XslxInputBuilder createXslxInputBuilder();

public Solution readSolution(File inputFile) {
Solution solution;
InputStream in = null;
try {
in = new FileInputStream(inputFile);
XSSFWorkbook workbook = new XSSFWorkbook(in);
XslxInputBuilder xlsxInputBuilder = createXslxInputBuilder();
xlsxInputBuilder.setInputFile(inputFile);
xlsxInputBuilder.setWorkbook(workbook);
try {
solution = xlsxInputBuilder.readSolution();
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Exception in inputFile (" + inputFile + ")", e);
} catch (IllegalStateException e) {
throw new IllegalStateException("Exception in inputFile (" + inputFile + ")", e);
}
} catch (IOException e) {
throw new IllegalArgumentException("Could not read the file (" + inputFile.getName() + ").", e);
} finally {
IOUtils.closeQuietly(in);
}
logger.info("Imported: {}", inputFile);
return solution;
}

public static abstract class XslxInputBuilder extends InputBuilder {

protected File inputFile;
protected XSSFWorkbook workbook;

public void setInputFile(File inputFile) {
this.inputFile = inputFile;
}

public void setWorkbook(XSSFWorkbook document) {
this.workbook = document;
}

public abstract Solution readSolution() throws IOException;

// ************************************************************************
// Helper methods
// ************************************************************************

public String getInputId() {
return FilenameUtils.getBaseName(inputFile.getPath());
}

protected XSSFSheet readSheet(int index, String name) {
XSSFSheet sheet = workbook.getSheetAt(index);
if (!sheet.getSheetName().equals(name)) {
throw new IllegalArgumentException("The sheet (" + sheet.getSheetName() + ") at index (" + index
+ ") is expected to have another name (" + name + ")");
}
return sheet;
}

protected void assertCellConstant(Cell cell, String constant) {
if (!constant.equals(cell.getStringCellValue())) {
throw new IllegalArgumentException("The cell (" + cell.getRow().getRowNum() + ","
+ cell.getColumnIndex() + ") with value (" + cell.getStringCellValue()
+ ") is expected to have the constant (" + constant + ")");
}
}

protected long readLongCell(Cell cell) {
double d = cell.getNumericCellValue();
long l = (long) d;
if (d - (double) l != 0.0) {
throw new IllegalArgumentException("The keyCell (" + cell.getRow().getRowNum() + ","
+ cell.getColumnIndex() + ") with value (" + d + ") is expected to be a long.");
}
return l;
}

protected double readDoubleCell(Cell cell) {
return cell.getNumericCellValue();
}

protected String readStringCell(Cell cell) {
return cell.getStringCellValue();
}

protected String readStringParameter(Row row, String key) {
Cell keyCell = row.getCell(0);
if (!key.equals(keyCell.getStringCellValue())) {
throw new IllegalArgumentException("The keyCell (" + keyCell.getRow().getRowNum() + ","
+ keyCell.getColumnIndex() + ") with value (" + keyCell.getStringCellValue()
+ ") is expected to have the key (" + key + ")");
}
Cell valueCell = row.getCell(1);
return valueCell.getStringCellValue();
}

protected double readDoubleParameter(Row row, String key) {
Cell keyCell = row.getCell(0);
if (!key.equals(keyCell.getStringCellValue())) {
throw new IllegalArgumentException("The keyCell (" + keyCell.getRow().getRowNum() + ","
+ keyCell.getColumnIndex() + ") with value (" + keyCell.getStringCellValue()
+ ") is expected to have the key (" + key + ")");
}
Cell valueCell = row.getCell(1);
return valueCell.getNumericCellValue();
}

}

}
Expand Up @@ -37,6 +37,10 @@ protected AbstractXmlSolutionImporter(SolutionDao solutionDao) {
super(solutionDao);
}

protected AbstractXmlSolutionImporter(boolean withoutDao) {
super(withoutDao);
}

public String getInputFileSuffix() {
return DEFAULT_INPUT_FILE_SUFFIX;
}
Expand All @@ -50,11 +54,11 @@ public Solution readSolution(File inputFile) {
in = new FileInputStream(inputFile);
SAXBuilder builder = new SAXBuilder(false);
Document document = builder.build(in);
XmlInputBuilder txtInputBuilder = createXmlInputBuilder();
txtInputBuilder.setInputFile(inputFile);
txtInputBuilder.setDocument(document);
XmlInputBuilder xmlInputBuilder = createXmlInputBuilder();
xmlInputBuilder.setInputFile(inputFile);
xmlInputBuilder.setDocument(document);
try {
solution = txtInputBuilder.readSolution();
solution = xmlInputBuilder.readSolution();
} catch (IllegalArgumentException e) {
throw new IllegalArgumentException("Exception in inputFile (" + inputFile + ")", e);
} catch (IllegalStateException e) {
Expand Down

0 comments on commit 6a90e52

Please sign in to comment.