From 6cb39adbef94f7172b5f368ea66df304ac845069 Mon Sep 17 00:00:00 2001 From: Ednilson Campos Date: Tue, 14 Nov 2017 15:19:27 -0200 Subject: [PATCH] =?UTF-8?q?Adicionando=20estrutura=20para=20agrupar=20list?= =?UTF-8?q?a=20de=20Record=20por=20name=20do=20Record.=20O=20objetivo=20da?= =?UTF-8?q?=20altera=C3=A7=C3=A3o=20=C3=A9=20facilitar=20a=20leitura=20de?= =?UTF-8?q?=20arquivos=20com=20o=20padr=C3=A3o=20da=20Cielo.=20Segue=20o?= =?UTF-8?q?=20link=20https://github.com/DeveloperCielo/EDI/blob/master/sou?= =?UTF-8?q?rce/extrato-edi.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jrimum/texgit/engine/RecordBuilder.java | 165 ++-- .../texgit/type/component/FixedField.java | 375 ++++---- .../texgit/type/component/FlatFile.java | 538 ++++++------ .../jrimum/texgit/type/component/Record.java | 808 +++++++++--------- 4 files changed, 945 insertions(+), 941 deletions(-) diff --git a/src/main/java/org/jrimum/texgit/engine/RecordBuilder.java b/src/main/java/org/jrimum/texgit/engine/RecordBuilder.java index 388591c..3602db0 100644 --- a/src/main/java/org/jrimum/texgit/engine/RecordBuilder.java +++ b/src/main/java/org/jrimum/texgit/engine/RecordBuilder.java @@ -41,97 +41,98 @@ import org.jrimum.texgit.type.component.FixedField; import org.jrimum.texgit.type.component.Record; - - /** * @author Gilmar P.S.L. * */ class RecordBuilder { - @SuppressWarnings("unchecked") - static Record build(MetaRecord metaRecord) { - - int strLength = getStringLength(metaRecord.getGroupOfFields().getFields()); - int fldSize = metaRecord.getGroupOfFields().getFields().size(); - - MetaOrderedField id = metaRecord.getGroupOfFields().getIdType(); - MetaOrderedField sequencialNumber = metaRecord.getGroupOfFields().getSequencialNumber(); - - if(isNotNull(id)){ - fldSize += 1; - strLength += id.getLength(); - } - - if(isNotNull(sequencialNumber)){ - fldSize += 1; - strLength += sequencialNumber.getLength(); - } - - Record record = new Record(strLength,fldSize); - - record.setName(metaRecord.getName()); - record.setDescription(metaRecord.getDescription()); - - /* + @SuppressWarnings("unchecked") + static Record build(MetaRecord metaRecord) { + + int strLength = getStringLength(metaRecord.getGroupOfFields().getFields()); + int fldSize = metaRecord.getGroupOfFields().getFields().size(); + + MetaOrderedField id = metaRecord.getGroupOfFields().getIdType(); + MetaOrderedField sequencialNumber = metaRecord.getGroupOfFields().getSequencialNumber(); + + if (isNotNull(id)) { + fldSize += 1; + strLength += id.getLength(); + } + + if (isNotNull(sequencialNumber)) { + fldSize += 1; + strLength += sequencialNumber.getLength(); + } + + Record record = new Record(strLength, fldSize); + + record.setName(metaRecord.getName()); + record.setDescription(metaRecord.getDescription()); + + /* * getPossition eh de 1 a X * e nao de 0 a X. - */ - if(isNotNull(id)){ - record.setIdType((FixedField) FixedFieldBuilder.build(id)); - record.set(id.getPosition()-1, record.getIdType()); - } - - if(isNotNull(sequencialNumber)){ - record.setSequencialNumber((FixedField) FixedFieldBuilder.build(sequencialNumber)); - record.set(sequencialNumber.getPosition()-1,record.getSequencialNumber()); - } - - List fields = metaRecord.getGroupOfFields().getFields(); - - /* + */ + if (isNotNull(id)) { + record.setIdType((FixedField) FixedFieldBuilder.build(id)); + record.set(id.getPosition() - 1, record.getIdType()); + } + + if (isNotNull(sequencialNumber)) { + record.setSequencialNumber((FixedField) FixedFieldBuilder.build(sequencialNumber)); + record.set(sequencialNumber.getPosition() - 1, record.getSequencialNumber()); + } + + List fields = metaRecord.getGroupOfFields().getFields(); + + /* * As somas sao para caso id ou sequencia jah * estejam na devida posicao. - */ - for(MetaField mField : fields){ - - if(isNull(record.get(fields.indexOf(mField)))) - record.set(fields.indexOf(mField), FixedFieldBuilder.build(mField)); - else - if(isNull(record.get(fields.indexOf(mField)+1))) - record.set(fields.indexOf(mField) + 1, FixedFieldBuilder.build(mField)); - else - record.set(fields.indexOf(mField) + 2, FixedFieldBuilder.build(mField)); - } - - // innerRecords - if (isNotNull(metaRecord.getGroupOfInnerRecords())){ - - record.setHeadOfGroup(true); - record.setDeclaredInnerRecords(new ArrayList(metaRecord.getGroupOfInnerRecords().getRecords().size())); - record.setRepitablesRecords(new HashSet()); - - List metaInnerRecords = metaRecord.getGroupOfInnerRecords().getRecords(); - - for(MetaRecord mRecord : metaInnerRecords){ - record.getDeclaredInnerRecords().add(mRecord.getName()); - if(mRecord.isRepeatable()) - record.getRepitablesRecords().add(mRecord.getName()); - } - - }else - record.setHeadOfGroup(false); - - return record; - } - - private static int getStringLength(List fields){ - int length = 0; - - for(MetaField mField : fields) - length += mField.getLength(); - - return length; - } + */ + for (MetaField mField : fields) { + + if (isNull(record.get(fields.indexOf(mField)))) { + record.set(fields.indexOf(mField), FixedFieldBuilder.build(mField)); + } else if (isNull(record.get(fields.indexOf(mField) + 1))) { + record.set(fields.indexOf(mField) + 1, FixedFieldBuilder.build(mField)); + } else { + record.set(fields.indexOf(mField) + 2, FixedFieldBuilder.build(mField)); + } + } + + // innerRecords + if (isNotNull(metaRecord.getGroupOfInnerRecords())) { + + record.setHeadOfGroup(true); + record.setDeclaredInnerRecords(new ArrayList(metaRecord.getGroupOfInnerRecords().getRecords().size())); + record.setRepitablesRecords(new HashSet()); + + List metaInnerRecords = metaRecord.getGroupOfInnerRecords().getRecords(); + + for (MetaRecord mRecord : metaInnerRecords) { + record.getDeclaredInnerRecords().add(mRecord.getName()); + if (mRecord.isRepeatable()) { + record.getRepitablesRecords().add(mRecord.getName()); + } + } + + } else { + record.setHeadOfGroup(false); + } + + return record; + } + + private static int getStringLength(List fields) { + int length = 0; + + for (MetaField mField : fields) { + length += mField.getLength(); + } + + return length; + } } diff --git a/src/main/java/org/jrimum/texgit/type/component/FixedField.java b/src/main/java/org/jrimum/texgit/type/component/FixedField.java index 9adcd7f..2c8c3f7 100644 --- a/src/main/java/org/jrimum/texgit/type/component/FixedField.java +++ b/src/main/java/org/jrimum/texgit/type/component/FixedField.java @@ -37,197 +37,200 @@ import org.jrimum.texgit.type.Filler; import org.jrimum.utilix.Objects; - /** * @author Gilmar P.S.L. * * @param */ @SuppressWarnings("serial") -public class FixedField extends Field implements org.jrimum.texgit.type.FixedField{ - - /** - *

- * Tamanho de especificação e parâmetro da string de leitura ou escrita do campo. - *

- */ - private Integer length; - - /** - *

- * Preenchedor do valor utilizado na hora da escrita. - *

- */ - private Filler filler; - - - /** - *

- * Tamanho da string de escrita do campo. - *

- */ - private Integer instantLength; - - /** - *

- * Ao ultrapassar o tamanho, define se pode truncar ou se dispara uma exceção. - *

- */ - private boolean truncate; - - - /** - * - */ - public FixedField() { - super(); - } - - public FixedField(G value, Integer length) { - super(value); - setFixedLength(length); - } - - public FixedField(G value, Integer length, Filler filler) { - super(value); - setFixedLength(length); - setFiller(filler); - } - - public FixedField(G value, Integer length, Format formatter) { - super(value,formatter); - setFixedLength(length); - } - - public FixedField(G value, Integer length, Format formatter, Filler filler) { - super(value,formatter); - setFixedLength(length); - setFiller(filler); - } - - public FixedField(String name, G value, Integer length) { - super(name,value); - setFixedLength(length); - } - - public FixedField(String name, G value, Integer length, Filler filler) { - super(name,value); - setFixedLength(length); - setFiller(filler); - } - - public FixedField(String name, G value, Integer length, Format formatter) { - super(name,value,formatter); - setFixedLength(length); - } - - public FixedField(String name, G value, Integer length, Format formatter, Filler filler) { - super(name,value,formatter); - setFixedLength(length); - setFiller(filler); - } - - @Override - public FixedField clone() throws CloneNotSupportedException { - - return (FixedField) super.clone(); - } - - /** - * @see org.jrimum.texgit.type.component.Field#read(java.lang.String) - */ - @Override - public void read(String str) { - - Objects.checkNotNull(str, "String inválida [null]!"); - - if (str.length() == getFixedLength()) { - super.read(str); - } else - throw new IllegalArgumentException(format("Tamanho da string [%s] diferente do especificado [%s]! %s",str.length(),getFixedLength(),toString())); - } - - /** - * @see org.jrimum.texgit.type.component.Field#write() - */ - @Override - public String write() { - - String str = fill(super.write()); - - instantLength = str.length(); - - if (isTruncate() && instantLength > getFixedLength()) { - str = str.substring(0, getFixedLength()); - instantLength = getFixedLength(); - } - - isFixedAsDefined(); - - return str; - } - - private String fill(String str) { - - if(isNotNull(filler)) - str = filler.fill(str, length); - - return str; - } - - public boolean isFixedAsDefined() throws IllegalStateException { - - if(instantLength.equals(getFixedLength())) - return true; - else - throw new IllegalStateException(format("Tamanho da string [%s] diferente do especificado [%s]! %s",instantLength,getFixedLength(),toString())); - } - - public Integer getFixedLength() { - - return this.length; - } - - public void setFixedLength(Integer length) { - - if (isNotNull(length) && length.intValue() > 0) - this.length = length; - else - throw new IllegalArgumentException(format("Comprimento inválido [%s]!",length)); - - } - - public Filler getFiller() { - return filler; - } - - public void setFiller(Filler filler) { - - if(isNotNull(filler)) - this.filler = filler; - else - throw new IllegalArgumentException(format("Preenchedor inválido [%s]!",filler)); - } - - public boolean isTruncate() { - return this.truncate; - } - - public void setTruncate(boolean truncate) { - this.truncate = truncate; - } - - - @Override - public String toString() { - - return format( - "%s FixedField [length=%s, instantLength=%s, filler=%s, truncate=%s]", - super.toString() - , Objects.whenNull(this.length, EMPTY) - , Objects.whenNull(this.instantLength, EMPTY) - , Objects.whenNull(this.filler, EMPTY) - , Objects.whenNull(this.truncate, EMPTY)); - } +public class FixedField extends Field implements org.jrimum.texgit.type.FixedField { + + /** + *

+ * Tamanho de especificação e parâmetro da string de leitura ou escrita do + * campo. + *

+ */ + private Integer length; + + /** + *

+ * Preenchedor do valor utilizado na hora da escrita. + *

+ */ + private Filler filler; + + /** + *

+ * Tamanho da string de escrita do campo. + *

+ */ + private Integer instantLength; + + /** + *

+ * Ao ultrapassar o tamanho, define se pode truncar ou se dispara uma + * exceção. + *

+ */ + private boolean truncate; + + /** + * + */ + public FixedField() { + super(); + } + + public FixedField(G value, Integer length) { + super(value); + setFixedLength(length); + } + + public FixedField(G value, Integer length, Filler filler) { + super(value); + setFixedLength(length); + setFiller(filler); + } + + public FixedField(G value, Integer length, Format formatter) { + super(value, formatter); + setFixedLength(length); + } + + public FixedField(G value, Integer length, Format formatter, Filler filler) { + super(value, formatter); + setFixedLength(length); + setFiller(filler); + } + + public FixedField(String name, G value, Integer length) { + super(name, value); + setFixedLength(length); + } + + public FixedField(String name, G value, Integer length, Filler filler) { + super(name, value); + setFixedLength(length); + setFiller(filler); + } + + public FixedField(String name, G value, Integer length, Format formatter) { + super(name, value, formatter); + setFixedLength(length); + } + + public FixedField(String name, G value, Integer length, Format formatter, Filler filler) { + super(name, value, formatter); + setFixedLength(length); + setFiller(filler); + } + + @Override + public FixedField clone() throws CloneNotSupportedException { + + return (FixedField) super.clone(); + } + + /** + * @see org.jrimum.texgit.type.component.Field#read(java.lang.String) + */ + @Override + public void read(String str) { + + Objects.checkNotNull(str, "String inválida [null]!"); + + if (str.length() == getFixedLength()) { + super.read(str); + } else { + throw new IllegalArgumentException(format("Tamanho da string [%s] diferente do especificado [%s]! %s", str.length(), getFixedLength(), toString())); + } + } + + /** + * @see org.jrimum.texgit.type.component.Field#write() + */ + @Override + public String write() { + + String str = fill(super.write()); + + instantLength = str.length(); + + if (isTruncate() && instantLength > getFixedLength()) { + str = str.substring(0, getFixedLength()); + instantLength = getFixedLength(); + } + + isFixedAsDefined(); + + return str; + } + + private String fill(String str) { + + if (isNotNull(filler)) { + str = filler.fill(str, length); + } + + return str; + } + + public boolean isFixedAsDefined() throws IllegalStateException { + + if (instantLength.equals(getFixedLength())) { + return true; + } else { + throw new IllegalStateException(format("Tamanho da string [%s] diferente do especificado [%s]! %s", instantLength, getFixedLength(), toString())); + } + } + + public Integer getFixedLength() { + + return this.length; + } + + public void setFixedLength(Integer length) { + + if (isNotNull(length) && length.intValue() > 0) { + this.length = length; + } else { + throw new IllegalArgumentException(format("Comprimento inválido [%s]!", length)); + } + + } + + public Filler getFiller() { + return filler; + } + + public void setFiller(Filler filler) { + + if (isNotNull(filler)) { + this.filler = filler; + } else { + throw new IllegalArgumentException(format("Preenchedor inválido [%s]!", filler)); + } + } + + public boolean isTruncate() { + return this.truncate; + } + + public void setTruncate(boolean truncate) { + this.truncate = truncate; + } + + @Override + public String toString() { + + return format( + "%s FixedField [length=%s, instantLength=%s, filler=%s, truncate=%s]", + super.toString(), + Objects.whenNull(this.length, EMPTY), + Objects.whenNull(this.instantLength, EMPTY), + Objects.whenNull(this.filler, EMPTY), + Objects.whenNull(this.truncate, EMPTY)); + } } diff --git a/src/main/java/org/jrimum/texgit/type/component/FlatFile.java b/src/main/java/org/jrimum/texgit/type/component/FlatFile.java index 0a858f2..82af8c8 100644 --- a/src/main/java/org/jrimum/texgit/type/component/FlatFile.java +++ b/src/main/java/org/jrimum/texgit/type/component/FlatFile.java @@ -32,290 +32,278 @@ import static org.apache.commons.lang.StringUtils.EMPTY; import static org.apache.commons.lang.StringUtils.isNotBlank; import static org.jrimum.utilix.Objects.isNotNull; -import static org.jrimum.utilix.Objects.isNull; import java.util.ArrayList; import java.util.Collection; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; - /** * @author Gilmar P.S.L. * */ @SuppressWarnings("serial") -public class FlatFile implements org.jrimum.texgit.FlatFile{ - - private List records; - - private Set repitablesRecords; - - private List recordsOrder; - - private RecordFactory recordFactory; - - public FlatFile(RecordFactory iFac4Rec) { - - this.recordFactory = iFac4Rec; - this.records = new ArrayList(); - } - - public Record getRecord(String idName){ - - Record record = null; - - if (isNotBlank(idName)) { - if (!isRepitable(idName)){ - if (!records.isEmpty()) { - for (Record rec : records) { - if (idName.equals(rec.getName())) - record = rec; - } - } - } - } - - return record; - } - - public boolean isRepitable(String idName){ - - return (isNotNull(repitablesRecords) && !repitablesRecords.isEmpty() && repitablesRecords.contains(idName)); - } - - public org.jrimum.texgit.Record createRecord(String idName){ - - return recordFactory.create(idName); - } - - public void addRecord(Record record){ - - if(isNotNull(record)) - if(isMyRecord(record.getName())) - records.add(record); - else - throw new IllegalArgumentException("Record fora de scopo!"); - } - - public boolean isMyRecord(String idName){ - boolean is = false; - - if (isNotBlank(idName)) { - if(!recordsOrder.isEmpty()) - if(recordsOrder.contains(idName)) - is = true; - } - return is; - } - - public void read(List str) { - - if(isNotNull(str)){ - if(!str.isEmpty()){ - - String line = null; - int lineIndex = 0; - - FixedField typeRecord = null; - Record record = null; - - for(String id : recordsOrder){ - - record = recordFactory.create(id); - - try{ - - if(isRepitable(id)){ - - boolean read = true; - - while(read){ - - if(isNull(record)) - record = recordFactory.create(id); - - if(lineIndex < str.size()) - line = str.get(lineIndex); - - typeRecord = record.readID(line); - - read = record.getIdType().getValue().equals(typeRecord.getValue()) && (lineIndex < str.size()); - - if(read){ - - record.read(line); - lineIndex++; - addRecord(record); - - if(record.isHeadOfGroup()){ - lineIndex = record.readInnerRecords(str,lineIndex,recordFactory); - } - - record = null; - } - } - - }else{ - if((lineIndex < str.size())){ - - line = str.get(lineIndex); - typeRecord = record.readID(line); - - if(record.getIdType().getValue().equals(typeRecord.getValue())){ - - record.read(line); - lineIndex++; - addRecord(record); - - if(record.isHeadOfGroup()){ - lineIndex = record.readInnerRecords(str,lineIndex,recordFactory); - } - - record = null; - } - } - } - - } catch (Exception e) { - - throw new IllegalStateException(format( - "Erro ao tentar ler o registro \"%s\".", record.getName()), e); - } - } - } - } - } - - public List write() { - - return write(EMPTY); - } - - public List write(String lineEnding) { - - ArrayList out = new ArrayList(records.size()); - - for(String id : recordsOrder){ - - if(isRepitable(id)){ - - Record rec = null; - - for(org.jrimum.texgit.Record record : getRecords(id)){ - - rec = Record.class.cast(record); - - try{ - - out.add(rec.write()+lineEnding); - - } catch (Exception e) { - - throw new IllegalStateException(format( - "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); - } - - if(rec.isHeadOfGroup() && rec.hasInnerRecords()){ - out.addAll(rec.writeInnerRecords(lineEnding)); - } - } - - }else{ - - Record rec = getRecord(id); - - try{ - - out.add(rec.write()+lineEnding); - - } catch (Exception e) { - - throw new IllegalStateException(format( - "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); - } - - if(rec.isHeadOfGroup() && rec.hasInnerRecords()){ - out.addAll(rec.writeInnerRecords(lineEnding)); - } - } - } - - return out; - } - - public org.jrimum.texgit.FlatFile addRecord(org.jrimum.texgit.Record record) { - - if(isNotNull(record)){ - Record rec = Record.class.cast(record); - addRecord(rec); - } - - return this; - } - - public Collection getRecords(String idName) { - - List secRecords = new ArrayList(); - - if (isNotBlank(idName)) { - if (isRepitable(idName)) { - if (!records.isEmpty()) { - for (Record rec : records) { - if (idName.equals(rec.getName())) - secRecords.add(rec); - } - } - } - } - - return secRecords; - } - - public org.jrimum.texgit.FlatFile addAllRecords(Collection records) { - // TODO IMPLEMENTAR - throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - public org.jrimum.texgit.FlatFile addRecords(String idName, Collection records) { - // TODO IMPLEMENTAR - throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - public Collection getAllRecords() { - // TODO IMPLEMENTAR - throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - public org.jrimum.texgit.Record removeRecord(String idName) { - // TODO IMPLEMENTAR - throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - public org.jrimum.texgit.FlatFile setAllRecords(Collection records) { - // TODO IMPLEMENTAR - throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - public org.jrimum.texgit.FlatFile setRecords(String idName, Collection records) { - // TODO IMPLEMENTAR - throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); - } - - public Set getRepitablesRecords() { - return repitablesRecords; - } - - public void setRepitablesRecords(Set repitablesRecords) { - this.repitablesRecords = repitablesRecords; - } - - public List getRecordsOrder() { - return recordsOrder; - } - - public void setRecordsOrder(List recordsOrder) { - this.recordsOrder = recordsOrder; - } - +public class FlatFile implements org.jrimum.texgit.FlatFile { + + private Map> mapRecords; + + private Set repitablesRecords; + + private List recordsOrder; + + private RecordFactory recordFactory; + + public FlatFile(RecordFactory iFac4Rec) { + + this.recordFactory = iFac4Rec; + this.mapRecords = new HashMap>(); + } + + public Record getRecord(String idName) { + + Record record = null; + + if (isNotBlank(idName)) { + if (!isRepitable(idName)) { + if (!getRecords().isEmpty()) { + for (Record rec : getRecords()) { + if (idName.equals(rec.getName())) { + record = rec; + } + } + } + } + } + + return record; + } + + public boolean isRepitable(String idName) { + + return (isNotNull(repitablesRecords) && !repitablesRecords.isEmpty() && repitablesRecords.contains(idName)); + } + + public org.jrimum.texgit.Record createRecord(String idName) { + + return recordFactory.create(idName); + } + + public void addRecord(Record record) { + + if (isNotNull(record)) { + if (isMyRecord(record.getName())) { + if (mapRecords.containsKey(record.getName())) { + mapRecords.get(record.getName()).add(record); + } else { + List lista = new ArrayList(); + lista.add(record); + mapRecords.put(record.getName(), lista); + } + } else { + throw new IllegalArgumentException("Record fora de scopo!"); + } + } + } + + public boolean isMyRecord(String idName) { + boolean is = false; + + if (isNotBlank(idName)) { + if (!recordsOrder.isEmpty()) { + if (recordsOrder.contains(idName)) { + is = true; + } + } + } + return is; + } + + public void read(List str) { + if (isNotNull(str)) { + if (!str.isEmpty()) { + Map map = new HashMap(); + + for (String id : recordsOrder) { + Record record = recordFactory.create(id); + String idTypeValue = record.getIdType().getValue(); + map.put(idTypeValue, record); + } + + for (int lineIndex = 0; lineIndex < str.size(); lineIndex++) { + String id = null; + try { + String line = str.get(lineIndex); + + for (Map.Entry entry : map.entrySet()) { + String keyIdTypeValue = entry.getKey(); + Record record = entry.getValue(); + + record.readID(line); + + String idTypeValue = record.getIdType().getValue(); + + if (keyIdTypeValue.equals(idTypeValue)) { + id = record.getName(); + break; + } + } + + Record record = recordFactory.create(id); + record.read(line); + addRecord(record); + + if (record.isHeadOfGroup()) { + lineIndex = record.readInnerRecords(str, lineIndex, recordFactory); + } + } catch (Exception e) { + throw new IllegalStateException(format("Erro ao tentar ler o registro \"%s\".", id), e); + } + } + } + } + } + + public List write() { + + return write(EMPTY); + } + + public List write(String lineEnding) { + + ArrayList out = new ArrayList(getRecords().size()); + + for (String id : recordsOrder) { + + if (isRepitable(id)) { + + Record rec = null; + + for (org.jrimum.texgit.Record record : getRecords(id)) { + + rec = Record.class.cast(record); + + try { + + out.add(rec.write() + lineEnding); + + } catch (Exception e) { + + throw new IllegalStateException(format( + "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); + } + + if (rec.isHeadOfGroup() && rec.hasInnerRecords()) { + out.addAll(rec.writeInnerRecords(lineEnding)); + } + } + + } else { + + Record rec = getRecord(id); + + try { + + out.add(rec.write() + lineEnding); + + } catch (Exception e) { + + throw new IllegalStateException(format( + "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); + } + + if (rec.isHeadOfGroup() && rec.hasInnerRecords()) { + out.addAll(rec.writeInnerRecords(lineEnding)); + } + } + } + + return out; + } + + public org.jrimum.texgit.FlatFile addRecord(org.jrimum.texgit.Record record) { + + if (isNotNull(record)) { + Record rec = Record.class.cast(record); + addRecord(rec); + } + + return this; + } + + public List getRecords() { + List records = new ArrayList(); + for (Map.Entry> entry : mapRecords.entrySet()) { + records.addAll(entry.getValue()); + } + return records; + } + + public Collection getRecords(String idName) { + + List secRecords = new ArrayList(); + + if (isNotBlank(idName)) { + if (isRepitable(idName)) { + if (!getRecords().isEmpty()) { + List records = mapRecords.get(idName); + if (records != null) { + for (Record record : records) { + secRecords.add(record); + } + } + } + } + } + + return secRecords; + } + + public org.jrimum.texgit.FlatFile addAllRecords(Collection records) { + // TODO IMPLEMENTAR + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + public org.jrimum.texgit.FlatFile addRecords(String idName, Collection records) { + // TODO IMPLEMENTAR + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + public Collection getAllRecords() { + // TODO IMPLEMENTAR + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + public org.jrimum.texgit.Record removeRecord(String idName) { + // TODO IMPLEMENTAR + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + public org.jrimum.texgit.FlatFile setAllRecords(Collection records) { + // TODO IMPLEMENTAR + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + public org.jrimum.texgit.FlatFile setRecords(String idName, Collection records) { + // TODO IMPLEMENTAR + throw new UnsupportedOperationException("AINDA NÃO IMPLEMENTADO!"); + } + + public Set getRepitablesRecords() { + return repitablesRecords; + } + + public void setRepitablesRecords(Set repitablesRecords) { + this.repitablesRecords = repitablesRecords; + } + + public List getRecordsOrder() { + return recordsOrder; + } + + public void setRecordsOrder(List recordsOrder) { + this.recordsOrder = recordsOrder; + } + } diff --git a/src/main/java/org/jrimum/texgit/type/component/Record.java b/src/main/java/org/jrimum/texgit/type/component/Record.java index 39de234..75c6562 100644 --- a/src/main/java/org/jrimum/texgit/type/component/Record.java +++ b/src/main/java/org/jrimum/texgit/type/component/Record.java @@ -41,406 +41,418 @@ import org.jrimum.texgit.type.Field; import org.jrimum.utilix.Objects; - - /** * @author Gilmar P.S.L. * */ @SuppressWarnings("serial") -public class Record extends BlockOfFields implements org.jrimum.texgit.Record{ - - private String name; - - private String description; - - private FixedField idType; - - private FixedField sequencialNumber; - - private boolean headOfGroup; - - private List innerRecords; - - private Set repitablesRecords; - - private List declaredInnerRecords; - - public Record() { - super(); - } - - /** - * @param length - * @param size - */ - public Record(Integer length, Integer size) { - super(length, size); - } - - @Override - public Record clone() throws CloneNotSupportedException { - //TODO Outros atributos - return (Record) super.clone(); - } - - @SuppressWarnings("null") - public FixedField readID(String lineRecord) { - - FixedField ffID = null; - - try { - - ffID = getIdType().clone(); - ffID.setName(""); - - } catch (CloneNotSupportedException e) { - - throw new UnsupportedOperationException(format("Quebra de contrato [%s] não suporta clonagem!",Objects.whenNull(ffID, "FixedField", ffID.getClass())), e); - } - - getIdType().read(lineRecord.substring(getIdPosition(), getIdPosition() + getIdType().getFixedLength())); - - return ffID; - } - - public org.jrimum.texgit.type.FixedField getField(String fieldName) { - - org.jrimum.texgit.type.FixedField field = null; - - if (isNotBlank(fieldName)) - if (!getFields().isEmpty()) - for (FixedField ff : this.getFields()) - if (ff.getName().equals(fieldName)) { - field = ff; - break; - } - - return field; - } - - public boolean isMyField(String idName){ - boolean is = false; - - if (isNotBlank(idName)) { - if(!getFields().isEmpty()) - for(org.jrimum.texgit.type.Field f : getFields()) - if(idName.equals(f.getName())){ - is = true; - break; - } - } - return is; - } - - private int getIdPosition(){ - int pos = 0; - - for(FixedField ff : this.getFields()) - if(!ff.getName().equals(idType.getName())) - pos += ff.getFixedLength(); - else - break; - - return pos; - } - - public int readInnerRecords(List lines, int lineIndex, RecordFactory iFactory) { - - return readInnerRecords(this,lines,lineIndex,iFactory); - } - - private int readInnerRecords(Record record, List lines, int lineIndex, RecordFactory iFactory) { - - if(isNotNull(record)){ - - if(isNotNull(record.getDeclaredInnerRecords()) && !record.getDeclaredInnerRecords().isEmpty()){ - - boolean read = true; - String line = null; - - FixedField typeRecord = null; - Record innerRec = null; - - for(String id : record.getDeclaredInnerRecords()){ - - innerRec = iFactory.create(id); - - try{ - - if(isRepitable(id)){ - - while(read){ - - if(isNull(innerRec)) - innerRec = iFactory.create(id); - - if(lineIndex < lines.size()) - line = lines.get(lineIndex); - - typeRecord = innerRec.readID(line); - - read = innerRec.getIdType().getValue().equals(typeRecord.getValue()) && (lineIndex < lines.size()); - - if(read){ - - innerRec.read(line); - lineIndex++; - record.addInnerRecord(innerRec); - - if(innerRec.isHeadOfGroup()) - innerRec.readInnerRecords(lines,lineIndex,iFactory); - - innerRec = null; - } - } - - }else{ - if((lineIndex < lines.size())){ - - line = lines.get(lineIndex); - typeRecord = innerRec.readID(line); - - if(innerRec.getIdType().getValue().equals(typeRecord.getValue())){ - - innerRec.read(line); - lineIndex++; - record.addInnerRecord(innerRec); - - if(innerRec.isHeadOfGroup()) - innerRec.readInnerRecords(lines,lineIndex,iFactory); - - innerRec = null; - } - } - } - - } catch (Exception e) { - - throw new IllegalStateException(format( - "Erro ao tentar ler o registro \"%s\".", - innerRec.getName()), e); - } - } - } - } - - return lineIndex; - } - - public List writeInnerRecords(){ - - return writeInnerRecords(this,EMPTY); - } - - public List writeInnerRecords(String lineEnding){ - - return writeInnerRecords(this,lineEnding); - } - - private List writeInnerRecords(Record record, String lineEnding){ - - ArrayList out = new ArrayList(record.getInnerRecords().size()); - - for(String id : getDeclaredInnerRecords()){//ordem - - if(isRepitable(id)){ - - for(Record rec : getRecords(id)){ - - try{ - - out.add(rec.write()+lineEnding); - - } catch (Exception e) { - - throw new IllegalStateException(format( - "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); - } - - if(rec.isHeadOfGroup()) - out.addAll(rec.writeInnerRecords()); - } - - }else{ - - Record rec = getRecord(id); - - try{ - - out.add(rec.write()+lineEnding); - - } catch (Exception e) { - - throw new IllegalStateException(format( - "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); - } - - if(rec.isHeadOfGroup()) - out.addAll(rec.writeInnerRecords()); - } - } - - return out; - } - - public Record getRecord(String idName){ - - Record record = null; - - if (isNotBlank(idName)) { - if (!isRepitable(idName)){ - if (!getInnerRecords().isEmpty()) { - for (org.jrimum.texgit.Record iRec : getInnerRecords()) { - Record rec = (Record) iRec; - if (idName.equals(rec.getName())) - record = rec; - } - } - } - } - - return record; - } - - public List getRecords(String idName) { - - List secRecords = new ArrayList(); - - if (isNotBlank(idName)) { - if (isRepitable(idName)) { - if (!getInnerRecords().isEmpty()) { - for (org.jrimum.texgit.Record iRec : getInnerRecords()) { - Record rec = (Record) iRec; - if (idName.equals(rec.getName())) - secRecords.add(rec); - } - } - } - } - - return secRecords; - } - - public boolean isRepitable(String idName){ - - return (isNotNull(repitablesRecords) && !repitablesRecords.isEmpty() && repitablesRecords.contains(idName)); - } - - public boolean isMyRecord(String idName){ - boolean is = false; - - if (isNotBlank(idName)) { - if(!getDeclaredInnerRecords().isEmpty()) - if(getDeclaredInnerRecords().contains(idName)) - is = true; - } - return is; - } - - public org.jrimum.texgit.Record addInnerRecord(org.jrimum.texgit.Record record) { - - if(isNotNull(record)){ - if(isNull(this.innerRecords)) - this.innerRecords = new ArrayList(); - - if(isMyRecord(Record.class.cast(record).getName())) - this.innerRecords.add(record); - else - throw new IllegalArgumentException("Record fora de scopo!"); - - } - - return this; - } - - public List getInnerRecords() { - - return this.innerRecords; - } - - @SuppressWarnings("unchecked") - public G getValue(String fieldName) { - - G value = null; - - org.jrimum.texgit.type.Field f = getField(fieldName); - - if(isNotNull(f)) - value = (G) f.getValue(); - - return value; - } - - @SuppressWarnings("unchecked") - public org.jrimum.texgit.Record setValue(String fieldName, G value) { - - org.jrimum.texgit.type.Field f = (Field) getField(fieldName); - - if(isNotNull(f)) - f.setValue(value); - - return this; - } - - public boolean hasInnerRecords(){ - return getInnerRecords() != null && !getInnerRecords().isEmpty(); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - public FixedField getIdType() { - return idType; - } - - public void setIdType(FixedField idType) { - this.idType = idType; - } - - public FixedField getSequencialNumber() { - return sequencialNumber; - } - - public void setSequencialNumber(FixedField sequencialNumber) { - this.sequencialNumber = sequencialNumber; - } - - public boolean isHeadOfGroup() { - return headOfGroup; - } - - public void setHeadOfGroup(boolean headOfGroup) { - this.headOfGroup = headOfGroup; - } - - public List getDeclaredInnerRecords() { - return declaredInnerRecords; - } - - public void setDeclaredInnerRecords(List declaredInnerRecords) { - this.declaredInnerRecords = declaredInnerRecords; - } - - public Set getRepitablesRecords() { - return repitablesRecords; - } - - public void setRepitablesRecords(Set repitablesRecords) { - this.repitablesRecords = repitablesRecords; - } - -} \ No newline at end of file +public class Record extends BlockOfFields implements org.jrimum.texgit.Record { + + private String name; + + private String description; + + private FixedField idType; + + private FixedField sequencialNumber; + + private boolean headOfGroup; + + private List innerRecords; + + private Set repitablesRecords; + + private List declaredInnerRecords; + + public Record() { + super(); + } + + /** + * @param length + * @param size + */ + public Record(Integer length, Integer size) { + super(length, size); + } + + @Override + public Record clone() throws CloneNotSupportedException { + //TODO Outros atributos + return (Record) super.clone(); + } + + @SuppressWarnings("null") + public FixedField readID(String lineRecord) { + FixedField ffID = null; + try { + ffID = getIdType().clone(); + ffID.setName(""); + getIdType().read(lineRecord.substring(getIdPosition(), getIdPosition() + getIdType().getFixedLength())); + return ffID; + } catch (CloneNotSupportedException e) { + throw new UnsupportedOperationException(format("Quebra de contrato [%s] não suporta clonagem!", Objects.whenNull(ffID, "FixedField", ffID.getClass())), e); + } + } + + public org.jrimum.texgit.type.FixedField getField(String fieldName) { + + org.jrimum.texgit.type.FixedField field = null; + + if (isNotBlank(fieldName)) { + if (!getFields().isEmpty()) { + for (FixedField ff : this.getFields()) { + if (ff.getName().equals(fieldName)) { + field = ff; + break; + } + } + } + } + + return field; + } + + public boolean isMyField(String idName) { + boolean is = false; + + if (isNotBlank(idName)) { + if (!getFields().isEmpty()) { + for (org.jrimum.texgit.type.Field f : getFields()) { + if (idName.equals(f.getName())) { + is = true; + break; + } + } + } + } + return is; + } + + private int getIdPosition() { + int pos = 0; + + for (FixedField ff : this.getFields()) { + if (!ff.getName().equals(idType.getName())) { + pos += ff.getFixedLength(); + } else { + break; + } + } + + return pos; + } + + public int readInnerRecords(List lines, int lineIndex, RecordFactory iFactory) { + + return readInnerRecords(this, lines, lineIndex, iFactory); + } + + private int readInnerRecords(Record record, List lines, int lineIndex, RecordFactory iFactory) { + + if (isNotNull(record)) { + + if (isNotNull(record.getDeclaredInnerRecords()) && !record.getDeclaredInnerRecords().isEmpty()) { + + boolean read = true; + String line = null; + + FixedField typeRecord = null; + Record innerRec = null; + + for (String id : record.getDeclaredInnerRecords()) { + + innerRec = iFactory.create(id); + + try { + + if (isRepitable(id)) { + + while (read) { + + if (isNull(innerRec)) { + innerRec = iFactory.create(id); + } + + if (lineIndex < lines.size()) { + line = lines.get(lineIndex); + } + + typeRecord = innerRec.readID(line); + + read = innerRec.getIdType().getValue().equals(typeRecord.getValue()) && (lineIndex < lines.size()); + + if (read) { + + innerRec.read(line); + lineIndex++; + record.addInnerRecord(innerRec); + + if (innerRec.isHeadOfGroup()) { + innerRec.readInnerRecords(lines, lineIndex, iFactory); + } + + innerRec = null; + } + } + + } else { + if ((lineIndex < lines.size())) { + + line = lines.get(lineIndex); + typeRecord = innerRec.readID(line); + + if (innerRec.getIdType().getValue().equals(typeRecord.getValue())) { + + innerRec.read(line); + lineIndex++; + record.addInnerRecord(innerRec); + + if (innerRec.isHeadOfGroup()) { + innerRec.readInnerRecords(lines, lineIndex, iFactory); + } + + innerRec = null; + } + } + } + + } catch (Exception e) { + + throw new IllegalStateException(format( + "Erro ao tentar ler o registro \"%s\".", + innerRec.getName()), e); + } + } + } + } + + return lineIndex; + } + + public List writeInnerRecords() { + + return writeInnerRecords(this, EMPTY); + } + + public List writeInnerRecords(String lineEnding) { + + return writeInnerRecords(this, lineEnding); + } + + private List writeInnerRecords(Record record, String lineEnding) { + + ArrayList out = new ArrayList(record.getInnerRecords().size()); + + for (String id : getDeclaredInnerRecords()) {//ordem + + if (isRepitable(id)) { + + for (Record rec : getRecords(id)) { + + try { + + out.add(rec.write() + lineEnding); + + } catch (Exception e) { + + throw new IllegalStateException(format( + "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); + } + + if (rec.isHeadOfGroup()) { + out.addAll(rec.writeInnerRecords()); + } + } + + } else { + + Record rec = getRecord(id); + + try { + + out.add(rec.write() + lineEnding); + + } catch (Exception e) { + + throw new IllegalStateException(format( + "Erro ao tentar escrever o registro \"%s\".", rec.getName()), e); + } + + if (rec.isHeadOfGroup()) { + out.addAll(rec.writeInnerRecords()); + } + } + } + + return out; + } + + public Record getRecord(String idName) { + + Record record = null; + + if (isNotBlank(idName)) { + if (!isRepitable(idName)) { + if (!getInnerRecords().isEmpty()) { + for (org.jrimum.texgit.Record iRec : getInnerRecords()) { + Record rec = (Record) iRec; + if (idName.equals(rec.getName())) { + record = rec; + } + } + } + } + } + + return record; + } + + public List getRecords(String idName) { + + List secRecords = new ArrayList(); + + if (isNotBlank(idName)) { + if (isRepitable(idName)) { + if (!getInnerRecords().isEmpty()) { + for (org.jrimum.texgit.Record iRec : getInnerRecords()) { + Record rec = (Record) iRec; + if (idName.equals(rec.getName())) { + secRecords.add(rec); + } + } + } + } + } + + return secRecords; + } + + public boolean isRepitable(String idName) { + + return (isNotNull(repitablesRecords) && !repitablesRecords.isEmpty() && repitablesRecords.contains(idName)); + } + + public boolean isMyRecord(String idName) { + boolean is = false; + + if (isNotBlank(idName)) { + if (!getDeclaredInnerRecords().isEmpty()) { + if (getDeclaredInnerRecords().contains(idName)) { + is = true; + } + } + } + return is; + } + + public org.jrimum.texgit.Record addInnerRecord(org.jrimum.texgit.Record record) { + + if (isNotNull(record)) { + if (isNull(this.innerRecords)) { + this.innerRecords = new ArrayList(); + } + + if (isMyRecord(Record.class.cast(record).getName())) { + this.innerRecords.add(record); + } else { + throw new IllegalArgumentException("Record fora de scopo!"); + } + + } + + return this; + } + + public List getInnerRecords() { + + return this.innerRecords; + } + + @SuppressWarnings("unchecked") + public G getValue(String fieldName) { + + G value = null; + + org.jrimum.texgit.type.Field f = getField(fieldName); + + if (isNotNull(f)) { + value = (G) f.getValue(); + } + + return value; + } + + @SuppressWarnings("unchecked") + public org.jrimum.texgit.Record setValue(String fieldName, G value) { + + org.jrimum.texgit.type.Field f = (Field) getField(fieldName); + + if (isNotNull(f)) { + f.setValue(value); + } + + return this; + } + + public boolean hasInnerRecords() { + return getInnerRecords() != null && !getInnerRecords().isEmpty(); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public FixedField getIdType() { + return idType; + } + + public void setIdType(FixedField idType) { + this.idType = idType; + } + + public FixedField getSequencialNumber() { + return sequencialNumber; + } + + public void setSequencialNumber(FixedField sequencialNumber) { + this.sequencialNumber = sequencialNumber; + } + + public boolean isHeadOfGroup() { + return headOfGroup; + } + + public void setHeadOfGroup(boolean headOfGroup) { + this.headOfGroup = headOfGroup; + } + + public List getDeclaredInnerRecords() { + return declaredInnerRecords; + } + + public void setDeclaredInnerRecords(List declaredInnerRecords) { + this.declaredInnerRecords = declaredInnerRecords; + } + + public Set getRepitablesRecords() { + return repitablesRecords; + } + + public void setRepitablesRecords(Set repitablesRecords) { + this.repitablesRecords = repitablesRecords; + } + +}