/* * Copyright 2016 Red Hat, Inc. and/or its affiliates. * * 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.scrabble.persistence; import java.io.IOException; import java.math.BigInteger; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.List; import java.util.Locale; import org.optaplanner.examples.common.persistence.AbstractTxtSolutionImporter; import org.optaplanner.examples.scrabble.domain.ScrabbleCell; import org.optaplanner.examples.scrabble.domain.ScrabbleSolution; import org.optaplanner.examples.scrabble.domain.ScrabbleWordAssignment; public class ScrabbleImporter extends AbstractTxtSolutionImporter<ScrabbleSolution> { public static void main(String[] args) { ScrabbleImporter importer = new ScrabbleImporter(); importer.convert("jbossProjects.txt", "jbossProjects.xml"); } public ScrabbleImporter() { super(new ScrabbleDao()); } public ScrabbleImporter(boolean withoutDao) { super(withoutDao); } @Override public TxtInputBuilder<ScrabbleSolution> createTxtInputBuilder() { return new ScrabbleInputBuilder(); } public static class ScrabbleInputBuilder extends TxtInputBuilder<ScrabbleSolution> { private ScrabbleSolution solution; private Locale locale; @Override public ScrabbleSolution readSolution() throws IOException { solution = new ScrabbleSolution(); solution.setId(0L); locale = Locale.forLanguageTag(readStringValue("locale:")); readCellList(); readWordList(); BigInteger possibleSolutionSize = BigInteger.valueOf(solution.getCellList().size()).pow( solution.getWordList().size()); logger.info("ScrabbleSolution {} has {} words and {} cells with a search space of {}.", getInputId(), solution.getWordList().size(), solution.getCellList().size(), getFlooredPossibleSolutionSize(possibleSolutionSize)); return solution; } private void readCellList() throws IOException { int gridWidth = readIntegerValue("gridWidth:"); solution.setGridWidth(gridWidth); int gridHeight = readIntegerValue("gridHeight:"); solution.setGridHeight(gridHeight); List<ScrabbleCell> cellList = new ArrayList<>(gridWidth * gridHeight); for (int x = 0; x < gridWidth; x++) { for (int y = 0; y < gridHeight; y++) { ScrabbleCell cell = new ScrabbleCell(); cell.setId((long) (y * gridWidth + x)); cell.setX(x); cell.setY(y); cell.setWordSet(new LinkedHashSet<>()); cell.setCharacterCountMap(new LinkedHashMap<>()); cellList.add(cell); } } solution.setCellList(cellList); } private void readWordList() throws IOException { readConstantLine("# Words"); List<ScrabbleWordAssignment> wordList = new ArrayList<>(); String line = bufferedReader.readLine(); long wordId = 0L; while (line != null) { String word = line.trim(); if (!word.isEmpty()) { ScrabbleWordAssignment wordAssignment = new ScrabbleWordAssignment(); wordAssignment.setId(wordId); wordId++; wordAssignment.setSolution(solution); // Add spaces to enforce an empty cell before and after each word wordAssignment.setWord(" " + word.toUpperCase(locale) + " "); wordList.add(wordAssignment); } line = bufferedReader.readLine(); } solution.setWordList(wordList); } } }