/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.extensions.modules.sbarcodes;
import net.sourceforge.barbecue.Barcode;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.krysalis.barcode4j.BarcodeGenerator;
import org.pentaho.reporting.engine.classic.core.function.AbstractExpression;
/**
* This single expression handling all types of barcode can be used in Simple XML report definition using a
* drawable-field element.<br/>
* The barcode type can be: 3of9, 3of9ext, code39, code39ext, usd3, usd3ext, usd-3, usd-3ext, codabar, code27, usd4,
* 2of7, monarch, nw7, usd-4, nw-7, ean13, ean-13, upca, upc-a, isbn, bookland, code128, code128a, code128b, code128c,
* uccean128, 2of5, std2of5, int2of5, postnet or pdf417.
* <p/>
* The data as well as type can be retrieved from the datasource fields using <code>rawDataField</code> and
* <code>rawTypeField</code>. The static type supersedes the type retrieved from the datasource field.
*
* @author Cedric Pronzato
*/
public class SimpleBarcodesExpression extends AbstractExpression {
private static final Log logger = LogFactory.getLog( SimpleBarcodesExpression.class );
private String type;
private int barHeight;
private int barWidth;
private boolean checksum;
private boolean showText;
private String rawDataField;
private String rawTypeField;
public SimpleBarcodesExpression() {
showText = true;
checksum = false;
barWidth = 1;
barHeight = 10;
}
/**
* Return the current expression value.
* <p/>
* The value depends (obviously) on the expression implementation.
*
* @return the value of the function.
*/
public Object getValue() {
final String data = getData();
if ( data == null ) {
logger.info( "No data supplied to barcode element." );
return null;
}
String ltype;
if ( type == null ) {
// if no static type, retrieve it from the type field
ltype = computeRawType();
} else {
ltype = type;
}
if ( ltype == null ) {
logger.info( "No type supplied to barcode element." );
return null;
}
try {
final BarcodeGenerator generator =
SimpleBarcodesUtility.createBarcode4J( type, showText, checksum, Integer.valueOf( barHeight ) );
if ( generator != null ) {
return new BarcodeDrawable( generator, data );
}
} catch ( Exception e ) {
if ( logger.isInfoEnabled() ) {
logger.info( "Error creating barcode, falling back to null value", e );
}
return null;
}
final Barcode barcode = SimpleBarcodesUtility.createBarcode( data, ltype, checksum );
if ( barcode == null ) {
return null;
}
barcode.setDrawingText( showText );
barcode.setBarWidth( barWidth );
barcode.setBarHeight( barHeight );
return new BarcodeWrapper( barcode );
}
private String getData() {
if ( rawDataField == null ) {
return null;
}
final Object o = getDataRow().get( rawDataField );
if ( o == null ) {
return null;
}
if ( o instanceof String ) {
return (String) o;
} else {
logger.info( "Barcode input is not a String? Using toString() method." );
return o.toString();
}
}
private String computeRawType() {
if ( rawTypeField == null ) {
return null;
}
final Object o = getDataRow().get( rawTypeField );
if ( o instanceof String ) {
return (String) o;
} else {
return null;
}
}
public String getType() {
return type;
}
public void setType( final String type ) {
this.type = type;
}
public int getBarHeight() {
return barHeight;
}
public void setBarHeight( final int barHeight ) {
this.barHeight = barHeight;
}
public int getBarWidth() {
return barWidth;
}
public void setBarWidth( final int barWidth ) {
this.barWidth = barWidth;
}
public boolean isChecksum() {
return checksum;
}
public void setChecksum( final boolean checksum ) {
this.checksum = checksum;
}
public boolean isShowText() {
return showText;
}
public void setShowText( final boolean showText ) {
this.showText = showText;
}
public String getRawDataField() {
return rawDataField;
}
public void setRawDataField( final String rawDataField ) {
this.rawDataField = rawDataField;
}
public String getRawTypeField() {
return rawTypeField;
}
public void setRawTypeField( String rawTypeField ) {
this.rawTypeField = rawTypeField;
}
}