/* * Copyright (c) 2019-2020. Developed by Hedgecode. * * 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.hedgecode.chess.scanner.json.format; import java.util.HashMap; import java.util.Map; import org.hedgecode.chess.scanner.ChessHogScannerConstants; import org.hedgecode.chess.scanner.entity.PGNEntity; import org.hedgecode.chess.scanner.entity.PGNTag; /** * AbstractPGNFormat * * @author Dmitry Samoshin aka gotty */ public abstract class AbstractPGNFormat extends AbstractBaseFormat implements PGNEntity { private static final String EMPTY = ""; private static final String MOVES_FORMAT = "%s %s"; private final Map pgnTags = new HashMap<>(); private String pgnMoves; protected abstract void assignPGN(); protected void addTag(PGNTag tag, String value) { pgnTags.put(tag, value); } protected void addMoves(String moves) { pgnMoves = moves; } private String moves() { return pgnMoves != null ? pgnMoves : EMPTY; } private String result() { String result = pgnTags.get(PGNTag.RESULT); return result != null ? result : PGNTag.RESULT.defaultValue(); } @Override public String pgn() { assignPGN(); StringBuilder sb = new StringBuilder(); for (PGNTag tag : PGNTag.values()) { String tagValue = pgnTags.get(tag); if (tag.isRequired() || tagValue != null) { sb.append( String.format( PGNTag.TAG_FORMAT, tag.getName(), tagValue != null ? tagValue : tag.defaultValue() ) ).append( ChessHogScannerConstants.CRLF ); } } sb.append( ChessHogScannerConstants.CRLF ).append( String.format(MOVES_FORMAT, moves(), result()) ).append( ChessHogScannerConstants.CRLF ); return sb.toString(); } }