URICellConverterFactory.java
- package com.gh.mygreen.xlsmapper.cellconverter.impl;
- import java.net.URI;
- import java.net.URISyntaxException;
- import java.util.Optional;
- import org.apache.poi.common.usermodel.HyperlinkType;
- import org.apache.poi.ss.usermodel.Cell;
- import org.apache.poi.ss.usermodel.CreationHelper;
- import org.apache.poi.ss.usermodel.Hyperlink;
- import com.gh.mygreen.xlsmapper.Configuration;
- import com.gh.mygreen.xlsmapper.annotation.XlsTrim;
- import com.gh.mygreen.xlsmapper.cellconverter.BaseCellConverter;
- import com.gh.mygreen.xlsmapper.cellconverter.CellConverter;
- import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactory;
- import com.gh.mygreen.xlsmapper.cellconverter.CellConverterFactorySupport;
- import com.gh.mygreen.xlsmapper.cellconverter.TypeBindException;
- import com.gh.mygreen.xlsmapper.fieldaccessor.FieldAccessor;
- import com.gh.mygreen.xlsmapper.textformatter.TextFormatter;
- import com.gh.mygreen.xlsmapper.textformatter.TextParseException;
- import com.gh.mygreen.xlsmapper.util.POIUtils;
- import com.gh.mygreen.xlsmapper.util.Utils;
- /**
- * {@link URI}型を処理する{@link CellConverter}を作成するためのファクトリクラス。
- *
- * @since 2.0
- * @author T.TSUCHIE
- *
- */
- public class URICellConverterFactory extends CellConverterFactorySupport<URI>
- implements CellConverterFactory<URI>{
-
- @Override
- public URICellConverter create(final FieldAccessor field, final Configuration config) {
-
- final URICellConverter cellConverter = new URICellConverter(field, config);
- setupCellConverter(cellConverter, field, config);
-
- return cellConverter;
- }
-
- @Override
- protected void setupCustom(final BaseCellConverter<URI> cellConverter, final FieldAccessor field,
- Configuration config) {
- // 何もしない
- }
-
- @Override
- protected TextFormatter<URI> createTextFormatter(final FieldAccessor field, final Configuration config) {
- return new TextFormatter<URI>() {
- @Override
- public URI parse(String text) throws TextParseException {
- try {
- return new URI(text);
- } catch (URISyntaxException e) {
- throw new TextParseException(text, URI.class);
- }
- }
-
- @Override
- public String format(final URI value) {
- return value.toString();
- }
- };
- }
-
- public class URICellConverter extends BaseCellConverter<URI> {
-
- private URICellConverter(final FieldAccessor field, final Configuration config) {
- super(field, config);
- }
-
- @Override
- protected URI parseCell(final Cell evaluatedCell, final String formattedValue) throws TypeBindException {
-
- final Hyperlink hyperlink = POIUtils.getHyperlink(evaluatedCell);
- if(hyperlink != null) {
- // リンクが設定されているセルは、リンクの内容を値とする
- Optional<XlsTrim> trimAnno = getField().getAnnotation(XlsTrim.class);
- final String address = Utils.trim(hyperlink.getAddress(), trimAnno);
-
- try {
- return new URI(address);
- } catch (URISyntaxException e) {
- throw newTypeBindExceptionOnParse(e, evaluatedCell, address);
- }
-
- } else if(!formattedValue.isEmpty()) {
- // リンクがないセルは、セルの文字列を値とする
- try {
- return this.textFormatter.parse(formattedValue);
-
- } catch(TextParseException e) {
- throw newTypeBindExceptionOnParse(e, evaluatedCell, formattedValue);
- }
- }
-
- return null;
-
- }
-
- @Override
- protected boolean isEmptyCell(final String formattedValue, final Cell cell) {
- if(POIUtils.getHyperlink(cell) != null) {
- return false;
- }
-
- return super.isEmptyCell(formattedValue, cell);
- }
-
- @Override
- protected void setupCell(final Cell cell, final Optional<URI> cellValue) throws TypeBindException {
-
- // 既存のハイパーリンクを削除
- // 削除しないと、Excelの見た目上はリンクは変わっているが、データ上は2重にリンクが設定されている。
- cell.removeHyperlink();
-
- if(cellValue.isPresent()) {
- final CreationHelper helper = cell.getSheet().getWorkbook().getCreationHelper();
- final Hyperlink link = helper.createHyperlink(HyperlinkType.URL);
- link.setAddress(cellValue.get().toString());
- cell.setHyperlink(link);
-
- cell.setCellValue(cellValue.get().toString());
-
- } else {
- cell.setBlank();
- }
-
- }
-
- }
-
- }