/*! * 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) 2002-2013 Pentaho Corporation.. All rights reserved. */ package org.pentaho.platform.dataaccess.datasource.wizard.models; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.pentaho.metadata.model.concept.types.DataType; import org.pentaho.ui.xul.XulEventSourceAdapter; import org.pentaho.ui.xul.stereotype.Bindable; public class ColumnInfo extends XulEventSourceAdapter implements Serializable { public static final List<String> DATE_FORMATS = Arrays.asList( "MM-dd-yyyy", "dd/MM/yyyy", "MM-dd-yy", "dd/MM/yy", "yyyyMMdd", "dd-MM-yy", "dd-MM-yyyy", "MM/dd/yy", "MM/dd/yyyy", "yyyy-MM-dd", "yyyy/MM/dd", "dd MMM yyyy", "dd MMMM yyyy", "yyyyMMddHHmm", "yyyyMMdd HHmm", "dd-MM-yy HH:mm", "dd-MM-yyyy HH:mm", "MM/dd/yy HH:mm", "MM/dd/yyyy HH:mm", "yyyy-MM-dd HH:mm", "yyyy/MM/dd HH:mm", "dd MMM yyyy HH:mm", "dd MMMM yyyy HH:mm", "yyyyMMddHHmmss", "yyyyMMdd HHmmss", "dd-MM-yy HH:mm:ss", "dd-MM-yyyy HH:mm:ss", "MM/dd/yy HH:mm:ss", "MM/dd/yyyy HH:mm:ss", "yyyy-MM-dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss", "dd MMM yyyy HH:mm:ss", "dd MMMM yyyy HH:mm:ss" ); private static final long serialVersionUID = 2498345633158485182L; public static final String FIELD_TYPE_BOTH = "both"; //$NON-NLS-1$ public static final String FIELD_TYPE_MEASURE = "measure"; //$NON-NLS-1$ public static final String FIELD_TYPE_ATTRIBUTE = "attribute"; //$NON-NLS-1$ public static final String FIELD_TYPE_DIMENSION = "dimension"; //$NON-NLS-1$ public static final int DATE_LEVEL_YEAR = 0x01; public static final int DATE_LEVEL_MONTH = 0x02; public static final int DATE_LEVEL_QUARTER = 0x04; public static final int DATE_LEVEL_WEEK = 0x08; public static final int DATE_LEVEL_DAY = 0x10; public static final int DATE_LEVEL_DAYOFWEEK = 0x20; private String id; private String title; private DataType dataType; private static List<DataType> availableDataTypes; private String aggregateType; private String[] samples; private boolean index; private boolean ignore; private String fieldType; private String format; private int length; private int precision; private int dateFieldBreakout = DATE_LEVEL_YEAR | DATE_LEVEL_MONTH | DATE_LEVEL_QUARTER | DATE_LEVEL_WEEK | DATE_LEVEL_DAY | DATE_LEVEL_DAYOFWEEK; @Bindable public int getLength() { return length; } @Bindable public void setLength( int length ) { this.length = length; } @Bindable public int getPrecision() { return precision; } @Bindable public void setPrecision( int precision ) { this.precision = precision; } @Bindable public String getFormat() { return format; } @Bindable public void setFormat( String format ) { this.format = format; } @Bindable public boolean isIndex() { return index; } @Bindable public void setIndex( boolean index ) { this.index = index; } @Bindable public boolean isIgnore() { return ignore; } @Bindable public void setIgnore( boolean ignore ) { this.ignore = ignore; } @Bindable public boolean isInclude() { return !ignore; } @Bindable public void setInclude( boolean include ) { ignore = !include; firePropertyChange( "include", null, include ); } @Bindable public String getFieldType() { return fieldType; } @Bindable public void setFieldType( String fieldType ) { this.fieldType = fieldType; } @Bindable public String getId() { return id; } @Bindable public void setId( String id ) { this.id = id; } @Bindable public String getTitle() { return title; } @Bindable public void setTitle( String title ) { this.title = title.trim(); } @Bindable public DataType getDataType() { return dataType; } @Bindable public void setDataType( DataType dataType ) { List<String> prev = getFormatStrings(); boolean prevDisabled = getFormatStringsDisabled(); this.dataType = dataType; // trigger a change to format string, and format disabled binding this.firePropertyChange( "formatStrings", prev, getFormatStrings() ); this.firePropertyChange( "formatStringsDisabled", prevDisabled, getFormatStringsDisabled() ); } @Bindable public String getAggregateType() { return aggregateType; } @Bindable public void setAggregateType( String aggregateType ) { this.aggregateType = aggregateType; } @Bindable public String[] getSamples() { return samples; } @Bindable public void setSamples( String[] samples ) { this.samples = samples; } @Bindable public static List<DataType> getAvailableDataTypes() { if ( availableDataTypes == null || availableDataTypes.size() == 0 ) { ArrayList<DataType> types = new ArrayList<DataType>(); DataType[] dt = DataType.values(); for ( DataType dataType : dt ) { // don't support url, binary, unknown, or image in csv switch ( dataType ) { case URL: case BINARY: case IMAGE: case UNKNOWN: break; default: // types.add(dataType.getDescription()); types.add( dataType ); break; } } availableDataTypes = types; } return availableDataTypes; } @Bindable public boolean getFormatStringsDisabled() { return ( dataType != DataType.NUMERIC && dataType != DataType.DATE ); } @Bindable public List<String> getFormatStrings() { ArrayList<String> formatStrings = new ArrayList<String>(); if ( dataType == DataType.NUMERIC ) { formatStrings.add( "0.00" ); formatStrings.add( "#.#" ); formatStrings.add( "#" ); formatStrings.add( "#,##0.###" ); formatStrings.add( "###,###,###.#" ); formatStrings.add( "$#,###" ); formatStrings.add( "$#,###.00;($#,###.00)" ); } else if ( dataType == DataType.DATE ) { formatStrings.addAll( DATE_FORMATS ); } return formatStrings; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ( ( aggregateType == null ) ? 0 : aggregateType.hashCode() ); result = prime * result + ( ( dataType == null ) ? 0 : dataType.hashCode() ); result = prime * result + ( ( fieldType == null ) ? 0 : fieldType.hashCode() ); result = prime * result + ( ( format == null ) ? 0 : format.hashCode() ); result = prime * result + ( ( id == null ) ? 0 : id.hashCode() ); result = prime * result + ( ignore ? 1231 : 1237 ); result = prime * result + ( index ? 1231 : 1237 ); result = prime * result + length; result = prime * result + precision; result = prime * result + Arrays.hashCode( samples ); result = prime * result + ( ( title == null ) ? 0 : title.hashCode() ); return result; } @Override public boolean equals( Object obj ) { if ( this == obj ) { return true; } if ( obj == null ) { return false; } if ( getClass() != obj.getClass() ) { return false; } ColumnInfo other = (ColumnInfo) obj; if ( aggregateType == null ) { if ( other.aggregateType != null ) { return false; } } else if ( !aggregateType.equals( other.aggregateType ) ) { return false; } if ( dataType == null ) { if ( other.dataType != null ) { return false; } } else if ( !dataType.equals( other.dataType ) ) { return false; } if ( fieldType == null ) { if ( other.fieldType != null ) { return false; } } else if ( !fieldType.equals( other.fieldType ) ) { return false; } if ( format == null ) { if ( other.format != null ) { return false; } } else if ( !format.equals( other.format ) ) { return false; } if ( id == null ) { if ( other.id != null ) { return false; } } else if ( !id.equals( other.id ) ) { return false; } if ( ignore != other.ignore ) { return false; } if ( index != other.index ) { return false; } if ( length != other.length ) { return false; } if ( precision != other.precision ) { return false; } if ( !Arrays.equals( samples, other.samples ) ) { return false; } if ( title == null ) { if ( other.title != null ) { return false; } } else if ( !title.equals( other.title ) ) { return false; } return true; } public int getDateFieldBreakout() { return dateFieldBreakout; } public void setDateFieldBreakout( int dateFieldBreakout ) { this.dateFieldBreakout = dateFieldBreakout; } }