/* * Copyright 2015 MovingBlocks * * 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.terasology.persistence.typeHandling.mathTypes; import org.terasology.math.IntegerRange; import org.terasology.persistence.typeHandling.StringRepresentationTypeHandler; public class IntegerRangeHandler extends StringRepresentationTypeHandler<IntegerRange> { @Override public String getAsString(IntegerRange item) { if (item == null) { return ""; } StringBuilder sb = new StringBuilder(); Integer currentRangeStart = null; Integer currentRangeEnd = null; for (int nextNumber : item) { if (currentRangeStart != null && currentRangeEnd != null && nextNumber > currentRangeEnd + 1) { appendRange(sb, currentRangeStart, currentRangeEnd); currentRangeStart = nextNumber; } else if (currentRangeStart == null) { currentRangeStart = nextNumber; } currentRangeEnd = nextNumber; } if (currentRangeStart != null && currentRangeEnd != null) { appendRange(sb, currentRangeStart, currentRangeEnd); } return sb.toString(); } private void appendRange(StringBuilder sb, int rangeStart, int rangeEnd) { if (sb.length() > 0) { sb.append(','); } if (rangeStart != rangeEnd) { sb.append(rangeStart).append("..").append(rangeEnd); } else { sb.append(rangeStart); } } @Override public IntegerRange getFromString(String representation) { String[] rangeParts = representation.split(","); IntegerRange range = new IntegerRange(); for (String rangePart : rangeParts) { if (!rangePart.isEmpty()) { String[] parts = rangePart.split("\\.\\."); if (parts.length == 2) { range.addNumbers(Integer.parseInt(parts[0]), Integer.parseInt(parts[1])); } else if (parts.length == 1) { int number = Integer.parseInt(parts[0]); range.addNumbers(number, number); } else { throw new IllegalArgumentException("Unable to parse the range correctly: " + representation); } } } return range; } }