/**
* 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.
*
* Copyright 2012-2016 the original author or authors.
*/
package org.assertj.db.output.impl;
import org.assertj.core.api.WritableAssertionInfo;
import org.assertj.db.type.*;
import java.sql.Date;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
/**
* Enumeration of the different types of output.
*
* @author RĂ©gis Pouiller
* @since 1.1.0
*/
public enum OutputType implements Output {
/**
* Plain output.
* @see PlainOutput
*/
PLAIN(PlainOutput.INSTANCE),
/**
* Html output.
* @see HtmlOutput
*/
HTML(HtmlOutput.INSTANCE);
/**
* Returns the data name of the change.
* @param change The change.
* @return The data name.
*/
static String getDataName(Change change) {
DataType dataType = change.getDataType();
String dataName = change.getDataName();
if (dataType == DataType.REQUEST && dataName.length() > 30) {
dataName = dataName.substring(0, 30) + "...";
}
return dataName;
}
/**
* Returns a text representing the type of values.
*
* @param values The values.
* @return The text.
*/
static String getType(Value... values) {
for (Value value : values) {
if (value.getValue() != null) {
return "(" + value.getValueTypeRepresentation() + ")";
}
}
return "(" + ValueType.NOT_IDENTIFIED + ")";
}
/**
* Returns the text representing a value.
*
* @param value The value
* @return The text.
*/
static String getText(Value value) {
Object object = value.getValue();
ValueType type = value.getValueType();
if (type == ValueType.BYTES) {
return "...";
}
if (type == ValueType.DATE_TIME) {
return "" + DateTimeValue.from((Timestamp) object);
}
if (type == ValueType.DATE) {
return "" + DateValue.from((Date) object);
}
if (type == ValueType.TIME) {
return "" + TimeValue.from((Time) object);
} else {
return "" + object;
}
}
/**
* Returns the labels for the columns corresponding to the type of the values of the column.
*
* @param rows The rows.
* @return The labels.
*/
static List<String> getTypesList(Row... rows) {
List<String> typesList = new ArrayList<>();
Row row0 = null;
for (Row row : rows) {
if (row != null) {
row0 = row;
break;
}
}
if (row0 != null) {
int index = 0;
for (; index < row0.getColumnsNameList().size(); index++) {
List<Object> valuesList = new ArrayList<>();
for (Row row : rows) {
if (row != null) {
Object value = row.getValuesList().get(index);
valuesList.add(value);
}
}
String type = OutputType.getType(valuesList.toArray(new Value[valuesList.size()]));
typesList.add(type);
}
}
return typesList;
}
/**
* Returns a {@code StringBuilder} representing the values of the primary key.
*
* @param rows The rows
* @return The output.
*/
static StringBuilder[] getPksValueStringBuilder(Row... rows) {
List<StringBuilder> stringBuildersList = new ArrayList<>();
for (Row row : rows) {
List<Value> pksValueList = row.getPksValueList();
StringBuilder pksValueStringBuilder = new StringBuilder();
for (Value pkValue : pksValueList) {
if (pksValueStringBuilder.length() > 0) {
pksValueStringBuilder.append(", ");
}
pksValueStringBuilder.append(getText(pkValue));
}
stringBuildersList.add(pksValueStringBuilder);
}
return stringBuildersList.toArray(new StringBuilder[stringBuildersList.size()]);
}
/**
* Returns a {@code StringBuilder} representing the values of the primary key.
*
* @param changes The changes
* @return The output.
*/
static StringBuilder[] getPksValueStringBuilder(Change... changes) {
List<StringBuilder> stringBuildersList = new ArrayList<>();
for (Change change : changes) {
List<Value> pksValueList = change.getPksValueList();
StringBuilder pksValueStringBuilder = new StringBuilder();
for (Value pkValue : pksValueList) {
if (pksValueStringBuilder.length() > 0) {
pksValueStringBuilder.append(", ");
}
pksValueStringBuilder.append(getText(pkValue));
}
stringBuildersList.add(pksValueStringBuilder);
}
return stringBuildersList.toArray(new StringBuilder[stringBuildersList.size()]);
}
/**
* The implementation of the output.
*/
private final Output displayer;
/**
* Constructor.
* @param displayer The implementation of the output.
*/
OutputType(Output displayer) {
this.displayer = displayer;
}
/** {@inheritDoc} */
@Override
public String getTableOutput(WritableAssertionInfo info, Table table) {
return displayer.getTableOutput(info, table);
}
/** {@inheritDoc} */
@Override
public String getRequestOutput(WritableAssertionInfo info, Request request) {
return displayer.getRequestOutput(info, request);
}
/** {@inheritDoc} */
@Override
public String getChangesOutput(WritableAssertionInfo info, Changes changes) {
return displayer.getChangesOutput(info, changes);
}
/** {@inheritDoc} */
@Override
public String getChangeOutput(WritableAssertionInfo info, Change change) {
return displayer.getChangeOutput(info, change);
}
/** {@inheritDoc} */
@Override
public String getRowOutput(WritableAssertionInfo info, Row row) {
return displayer.getRowOutput(info, row);
}
/** {@inheritDoc} */
@Override
public String getColumnOutput(WritableAssertionInfo info, Column column) {
return displayer.getColumnOutput(info, column);
}
/**
* {@inheritDoc}
*/
@Override
public String getChangeColumnOutput(WritableAssertionInfo info, String columnName,
Value valueAtStartPoint, Value valueAtEndPoint) {
return displayer.getChangeColumnOutput(info, columnName, valueAtStartPoint, valueAtEndPoint);
}
/** {@inheritDoc} */
@Override
public String getValueOutput(WritableAssertionInfo info, Value value) {
return displayer.getValueOutput(info, value);
}
}