package org.rr.jeborker.metadata;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import org.rr.commons.log.LoggerFactory;
import org.rr.commons.utils.DateConversionUtils;
import org.rr.commons.utils.StringUtil;
import org.rr.mobi4java.EXTHRecord;
import org.rr.mobi4java.EXTHRecord.RECORD_TYPE;
import org.rr.mobi4java.exth.BinaryRecordDelegate;
import org.rr.mobi4java.exth.DateRecordDelegate;
import org.rr.mobi4java.exth.RecordDelegate;
import org.rr.mobi4java.exth.StringRecordDelegate;
import static org.rr.commons.utils.StringUtil.UTF_8;;
class MobiMetadataProperty extends MetadataProperty {
private RecordDelegate exthRecord;
private String encoding;
MobiMetadataProperty(RecordDelegate record, String name, String encoding) {
super(name, record);
this.exthRecord = record;
}
MobiMetadataProperty(EXTHRecord record, String name, String encoding) {
super(name, record);
}
@Override
public List<Object> getValues() {
return Collections.<Object>singletonList(getValue());
}
private Object getValue() {
if(exthRecord instanceof DateRecordDelegate) {
try {
return ((DateRecordDelegate) exthRecord).getAsDate();
} catch (ParseException e) {
LoggerFactory.getLogger(this).log(Level.WARNING, e.getMessage());
return ((DateRecordDelegate) exthRecord).getAsString(UTF_8);
}
} else if(exthRecord instanceof BinaryRecordDelegate) {
return ((BinaryRecordDelegate) exthRecord).getAsString();
}
return new String(exthRecord.getRecord().getData());
}
public Class<?> getPropertyClass() {
if(exthRecord instanceof DateRecordDelegate) {
return Date.class;
}
return getValue().getClass();
}
@Override
public boolean isVisible() {
return super.isVisible() && !(exthRecord instanceof BinaryRecordDelegate);
}
/**
* Creates a new {@link MobiMetadataProperty} instance with the data of this {@link MobiMetadataProperty}.
*/
@Override
public MetadataProperty clone() {
MobiMetadataProperty newMetadataProperty = new MobiMetadataProperty(exthRecord, getName(), encoding);
newMetadataProperty.hints = this.hints;
newMetadataProperty.values = new ArrayList<>(this.values);
return newMetadataProperty;
}
public String getOriginCodeName() {
return StringUtil.toString(exthRecord.getRecord().getRecordType().getType());
}
public EXTHRecord getExthRecord() {
return exthRecord.getRecord();
}
public void setValue(final Object value, final int idx) {
if(exthRecord instanceof DateRecordDelegate) {
Date d = (value instanceof Date) ? (Date) value : DateConversionUtils.toDate(StringUtil.toString(value));
((DateRecordDelegate)exthRecord).setDateData(d);
} else if(exthRecord instanceof StringRecordDelegate) {
try {
((StringRecordDelegate)exthRecord).setStringData(StringUtil.toString(value), encoding);
} catch (UnsupportedEncodingException e) {
LoggerFactory.getLogger().log(Level.SEVERE, "Failed to set value " + StringUtil.toString(value), e);
}
} else {
exthRecord.getRecord().setData(StringUtil.toString(value).getBytes());
}
}
public void setValues(final List<Object> newValues) {
setValue(newValues.get(0), 0);
}
@Override
public boolean isSingle() {
if(exthRecord.getRecord().getRecordType() == RECORD_TYPE.AUTHOR) {
return false;
} else if(exthRecord.getRecord().getRecordType() == RECORD_TYPE.SUBJECT) {
return false;
}
return super.isSingle();
}
}