/*
* Hibernate Search, full-text search for your domain model
*
* License: GNU Lesser General Public License (LGPL), version 2.1 or later
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
*/
package org.hibernate.search.bridge.builtin.time.impl;
import java.time.Duration;
import java.time.Period;
import java.util.Locale;
import org.hibernate.search.bridge.TwoWayStringBridge;
import org.hibernate.search.bridge.spi.IgnoreAnalyzerBridge;
import org.hibernate.search.util.logging.impl.Log;
import org.hibernate.search.util.logging.impl.LoggerFactory;
/**
* Converts a {@link Period} to a {@link String} concatenating year, months and days.
* <p>
* The sign is always present for the year and the string is padded with 0 to allow field sorting.
*
* @author Davide D'Alto
*/
public class PeriodBridge implements TwoWayStringBridge, IgnoreAnalyzerBridge {
private static final Log log = LoggerFactory.make();
private static final int PADDING = 11;
private static final String FORMAT = "%+0" + PADDING + "d%+0" + PADDING + "d%+0" + PADDING + "d";
public static final PeriodBridge INSTANCE = new PeriodBridge();
private PeriodBridge() {
}
@Override
public String objectToString(Object object) {
if ( object == null ) {
return null;
}
Period period = (Period) object;
int years = period.getYears();
int months = period.getMonths();
int days = period.getDays();
return String.format( Locale.ROOT, FORMAT, years, months, days );
}
@Override
public Object stringToObject(String stringValue) {
if ( stringValue == null ) {
return null;
}
try {
int years = Integer.parseInt( stringValue.substring( 0, PADDING ) );
int months = Integer.parseInt( stringValue.substring( PADDING, 2 * PADDING ) );
int days = Integer.parseInt( stringValue.substring( 2 * PADDING ) );
return Period.of( years, months, days );
}
catch (NumberFormatException e) {
throw log.parseException( stringValue, Duration.class, e );
}
}
}