Commit 33e1ab0b authored by Erika Segatto's avatar Erika Segatto

Inclui geração de classe hibernate JPA

parent 90c8807f
......@@ -75,6 +75,7 @@ type
fMetaModelPersistenceMap: acMetaModelPersistenceMapSQL;
function FindLostClasses(out poLostClasses: TStringList): integer;
procedure PutMessage(piMessage: string; piElement: IElement; piMessageType: integer = 0);
function ObterTipoAtributoJava(piTipoCurio: string): string;
public
constructor Create;
destructor Destroy; override;
......@@ -5075,39 +5076,95 @@ end;
function TUtil.GerarClassPreview_JavaHibernate(piClass: IUMLClass): string;
function ObterTipoAtributo(piTipoCurio: string): string;
begin
if piTipoCurio = 'acString' then Result := 'String'
else if piTipoCurio = 'acText' then Result := 'String'
else if piTipoCurio = 'acBlob' then Result := 'bynary[]'
else if piTipoCurio = 'acGraphic' then Result := 'bynary[]'
else if piTipoCurio = 'acDateTime' then Result := 'OffsetDateTime'
else if piTipoCurio = 'acInt' then Result := 'Integer'
else if piTipoCurio = 'acCurrency' then Result := 'BigDecimal'
else if piTipoCurio = 'acDouble' then Result := 'BigDecimal'
else if piTipoCurio = 'acBoolean' then Result := 'boolean'
else Result := piTipoCurio;
end;
procedure EscreveGetterSetterClasse(const piCodigoClasse: PStringWriter; piNomeAtributo, piTipoAtributo: String; piApenasGetter: Boolean = False);
procedure EscreveGetterSetterClasse(const piCodigoClasse: PStringWriter; piNomeAtributo, piTipoAtributo: String; piApenasGetter: Boolean = False; piLista: Boolean = False);
begin
//Escreve getter and setter
if not piLista then
begin
piCodigoClasse.WriteLine('public ' + piTipoAtributo+' get'+piNomeAtributo+'() { return '+piNomeAtributo+'; }');
if not piApenasGetter then
piCodigoClasse.WriteLine('public void set'+piNomeAtributo+'('+piTipoAtributo+' pi'+piNomeAtributo+') { '+piNomeAtributo+' = pi'+piNomeAtributo+'; }');
end
else
begin
piCodigoClasse.WriteLine('public List<' + piTipoAtributo+'> get'+piNomeAtributo+'() { return '+piNomeAtributo+'; }');
//piCodigoClasse.WriteLine('public void add'+piNomeAtributo+'('+piTipoAtributo+' piObject) { '+piNomeAtributo+'.add(piObject); }');
//piCodigoClasse.WriteLine('public void remove'+piNomeAtributo+'('+piTipoAtributo+' piObject) { '+piNomeAtributo+'.remove(piObject); }');
end;
piCodigoClasse.WriteLine('');
end;
procedure EscreverInicializacaoAtributo(const piCodigoClasse: PStringWriter; piNomeAtributo: String; const piMultiplicity: Integer);
begin
if (piNomeAtributo <> '') then
begin
if piMultiplicity = 1 then
piCodigoClasse.WriteLine(piNomeAtributo + ' = pi' + piNomeAtributo + ';')
else
begin
piCodigoClasse.WriteLine(piNomeAtributo + ' = new ArrayList<>();');
piCodigoClasse.WriteLine('if (pi'+piNomeAtributo+' != null) { '+piNomeAtributo + '.addAll(pi'+piNomeAtributo+'); }');
end;
end;
end;
procedure IncluirImports(const piCodigoClasse: PStringWriter; piClassTicket: acClassTicket; const piTipoId: string);
var
lAttributeTicket: acAttributeTicket;
lHasImport: array[0..3] of Boolean;
index: integer;
lsTipoAttribute: string;
begin
piCodigoClasse.WriteLine('import javax.persistence.*;');
piCodigoClasse.WriteLine('import java.util.List;');
piCodigoClasse.WriteLine('import java.util.ArrayList;');
for index := 0 to 3 do
lHasImport[index] := False;
if piTipoId = 'Long' then
begin
piCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end;
for index := 0 to piClassTicket.Attributes.Count - 1 do
begin
lAttributeTicket := piClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
if (lsTipoAttribute = 'BigDecimal') and (not lHasImport[0]) then
begin
piCodigoClasse.WriteLine('import java.math.BigDecimal;');
lHasImport[0] := True;
end
else if (lsTipoAttribute = 'Long') and (not lHasImport[1]) then
begin
piCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end
else if (lsTipoAttribute = 'OffsetDateTime') and (not lHasImport[2]) then
begin
piCodigoClasse.WriteLine('import java.time.OffsetDateTime;');
lHasImport[2] := True;
end
else if (lsTipoAttribute = 'Boolean') and (not lHasImport[3]) then
begin
piCodigoClasse.WriteLine('import java.lang.Boolean;');
lHasImport[2] := True;
end;
end;
end;
const
_NomeId = 'Id';
_DBTipoId = 'Long';
var
lsNomeClasse,
lsNomeClasseDominio,
lsNomeClasseDB,
lsNomeTabela,
lsNomeGeneratorId,
lsAtributo,
lsTipoAttribute: string;
index: integer;
lClassTicket: acClassTicket;
lClassTicket,
lClassTicketPai: acClassTicket;
lAttributeTicket: acAttributeTicket;
lMetaModelPersistenceMapSQL: acMetaModelPersistenceMapSQL;
lClassToDBMapTicket: acClassToDBMapTicket;
......@@ -5117,58 +5174,30 @@ var
lRelation: acRelationTicket;
lRelationPersistenceMapTicket: acRelationSQLPersistenceMapTicket;
lColumnTicket: acDBColumnMapTicket;
lHasImport: array[0..2] of Boolean;
lEhClasseHerdada: Boolean;
lListaChamadaSuper: TStringList;
begin
Result := '';
lParamsConstrutor := '';
lsNomeClasse := piClass.Name;
lClassTicket := MetaModel.GetClassTicketByName(lsNomeClasse);
lsNomeClasseDominio := piClass.Name;
lClassTicket := MetaModel.GetClassTicketByName(lsNomeClasseDominio);
lEhClasseHerdada := Assigned(lClassTicket.ParentClassTicket);
for index := 0 to 2 do
lHasImport[index] := False;
lsNomeClasseDB := lsNomeClasseDominio + 'Entity';
// Obter ticket do banco
lMetaModelPersistenceMapSQL := fMetaModelPersistenceMap as acMetaModelPersistenceMapSQL;
lClassToDBMapTicket := lMetaModelPersistenceMapSQL.GetClassToDBMapTicket(lClassTicket);
lListaChamadaSuper := TStringList.Create;
lCodigoClasse := PStringWriter.Create;
try
lCodigoClasse.WriteLine('package adapters.persistence.entities;');
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('import javax.persistence.*;');
lCodigoClasse.WriteLine('import java.util.List;');
//lCodigoClasse.WriteLine('package adapters.persistence.entities;');
//lCodigoClasse.WriteLine('');
// Imports de tipos
if _DBTipoId = 'Long' then
begin
lCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end;
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
if (lsTipoAttribute = 'BigDecimal') and (not lHasImport[0]) then
begin
lCodigoClasse.WriteLine('import java.math.BigDecimal;');
lHasImport[0] := True;
end
else if (lsTipoAttribute = 'Long') and (not lHasImport[1]) then
begin
lCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end
else if (lsTipoAttribute = 'OffsetDateTime') and (not lHasImport[2]) then
begin
lCodigoClasse.WriteLine('import java.time.OffsetDateTime;');
lHasImport[2] := True;
end;
end;
IncluirImports(lCodigoClasse, lClassTicket, _DBTipoId);
lCodigoClasse.WriteLine('');
// Obter ticket do banco
lsNomeTabela := Uppercase(Copy(lsNomeClasse, 0, 2)) + 'U' + Copy(lsNomeClasse, 3, Length(lsNomeClasse)-2);
lMetaModelPersistenceMapSQL := fMetaModelPersistenceMap as acMetaModelPersistenceMapSQL;
lClassToDBMapTicket := lMetaModelPersistenceMapSQL.GetClassToDBMapTicket(lClassTicket);
// Incio da classe
lsNomeGeneratorId := 'gen' + RightStr(lsNomeClasse, Length(lsNomeClasse)-2);
lsNomeGeneratorId := 'gen' + RightStr(lsNomeClasseDominio, Length(lsNomeClasseDominio)-2);
lsNomeTabela := lClassToDBMapTicket.TableName;
lsNomeClasse := lsNomeClasse + 'Entity';
lCodigoClasse.WriteLine('@Entity');
lCodigoClasse.WriteLine('@TableGenerator(name = "'+lsNomeGeneratorId+'", table = "SISBTNUMER", valueColumnName = "SISBNONUME",');
lCodigoClasse.WriteLine(' pkColumnName = "SISBDSNUME", pkColumnValue = "'+lsNomeTabela+'", allocationSize = 1)');
......@@ -5184,9 +5213,13 @@ begin
lCodigoClasse.WriteLine('@PrimaryKeyJoinColumn(name = "'+lClassToDBMapTicket.IdoDBMapTicket.GetIDOColumns+'")');
end;
lCodigoClasse.WriteLine('@Table(name = "'+lsNomeTabela+'")');
if lClassTicket.HasDescendants
then lCodigoClasse.Write('public abstract ')
else lCodigoClasse.Write('public final ');
lCodigoClasse.Write('class ' + lsNomeClasseDB);
if lEhClasseHerdada
then lCodigoClasse.WriteLine('public abstract class ' + lsNomeClasse + ' extends '+ lClassTicket.ParentClassTicket.DisplayName+'Entity {')
else lCodigoClasse.WriteLine('public abstract class ' + lsNomeClasse + ' {');
then lCodigoClasse.WriteLine(' extends '+ lClassTicket.ParentClassTicket.DisplayName+'Entity {')
else lCodigoClasse.WriteLine(' {');
lCodigoClasse.WriteLine('');
lCodigoClasse.Indent();
......@@ -5196,31 +5229,7 @@ begin
lCodigoClasse.WriteLine('@Id');
lCodigoClasse.WriteLine('@Column(name = "'+lClassToDBMapTicket.IdoDBMapTicket.GetIDOColumns+'")');
lCodigoClasse.WriteLine('@GeneratedValue(generator = "'+lsNomeGeneratorId+'")');
lCodigoClasse.WriteLine('private '+_DBTipoId+' id;');
end;
// Obtem parametros da classe pai
if lEhClasseHerdada then
begin
for index := 0 to lClassTicket.ParentClassTicket.Attributes.Count - 1 do
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsAtributo := lClassTicket.Attributes.Strings[index];
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
end;
for index := 0 to lClassTicket.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsIn.Objects[index] as acRelationTicket);
if (lRelation.DestinationPropertyName <> '') then
begin
lsAtributo := lRelation.DestinationPropertyName;
if lRelation.DestinationMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+ lRelation.OriginClassTicket.DisplayName +'Entity>'
else lsTipoAttribute := lRelation.OriginClassTicket.DisplayName + 'Entity';
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
end;
end;
lCodigoClasse.WriteLine('private '+_DBTipoId+' '+_NomeId+';');
end;
// DECLARAO ATRIBUTOS: Percorre atributos da classe
......@@ -5228,8 +5237,7 @@ begin
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsAtributo := lClassTicket.Attributes.Strings[index];
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
lColumnTicket := acDBColumnMapTicket(lClassToDBMapTicket.Columns.ValueOf(UpCase(lsAtributo)));
if lAttributeTicket.DBType = 'VARCHAR'
......@@ -5245,24 +5253,26 @@ begin
if (lRelation.DestinationPropertyName <> '') then
begin
lsAtributo := lRelation.DestinationPropertyName;
if lRelation.DestinationMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+ lRelation.OriginClassTicket.DisplayName +'Entity>'
else lsTipoAttribute := lRelation.OriginClassTicket.DisplayName + 'Entity';
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
lsTipoAttribute := lRelation.OriginClassTicket.DisplayName + 'Entity';
if lRelation.DestinationMaxMultiplicity = 1 then
begin
if lRelation.OriginMaxMultiplicity = 1
then lCodigoClasse.WriteLine('@OneToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)')
else lCodigoClasse.WriteLine('@OneToMany(cascade = CascadeType.ALL)');
else lCodigoClasse.WriteLine('@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)');
end
else
begin
lsTipoAttribute := 'final List<'+ lsTipoAttribute +'>';
if lRelation.OriginMaxMultiplicity = 1
then lCodigoClasse.WriteLine('@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)')
then lCodigoClasse.WriteLine('@OneToMany(cascade = CascadeType.ALL)')
else lCodigoClasse.WriteLine('@ManyToMany(cascade = CascadeType.ALL)');
end;
if lRelationPersistenceMapTicket is acDirectDBRelationMapTicket
then lCodigoClasse.WriteLine('@JoinColumn(name = "'+acDirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKColumnName+'")');
then lCodigoClasse.WriteLine('@JoinColumn(name = "'+acDirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKColumnName+'")')
else lCodigoClasse.WriteLine('@JoinTable(name = "'+ acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).TableName + '"'+
', joinColumns = { @JoinColumn(name = "'+acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKOrigemName+'") }'+
', inverseJoinColumns = { @JoinColumn(name = "'+acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKDestinoName+'")'+
'} )');
lCodigoClasse.WriteLine('private '+lsTipoAttribute+' '+lsAtributo + ';');
end;
end;
......@@ -5273,95 +5283,184 @@ begin
if (lRelation.OriginPropertyName <> '') then
begin
lsAtributo := lRelation.OriginPropertyName;
if lRelation.OriginMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+ lRelation.DestinationClassTicket.DisplayName +'Entity>'
else lsTipoAttribute := lRelation.DestinationClassTicket.DisplayName + 'Entity';
lsTipoAttribute := lRelation.DestinationClassTicket.DisplayName + 'Entity';
if lRelation.OriginMaxMultiplicity = 1 then
begin
if lRelation.DestinationMaxMultiplicity = 1
then lCodigoClasse.Write('@OneToOne(cascade = CascadeType.ALL')
else lCodigoClasse.Write('@OneToMany(cascade = CascadeType.ALL');
else lCodigoClasse.Write('@ManyToOne(cascade = CascadeType.ALL');
end
else
begin
lsTipoAttribute := 'final List<'+ lsTipoAttribute +'>';
if lRelation.DestinationMaxMultiplicity = 1
then lCodigoClasse.Write('@ManyToOne(cascade = CascadeType.ALL')
then lCodigoClasse.Write('@OneToMany(cascade = CascadeType.ALL')
else lCodigoClasse.Write('@ManyToMany(cascade = CascadeType.ALL');
end;
if lRelation.DestinationPropertyName <> ''
then lCodigoClasse.WriteLine(', mappedby = "'+lRelation.DestinationPropertyName+'")')
else lCodigoClasse.WriteLine(')');
then lCodigoClasse.WriteLine(', mappedBy = "'+lRelation.DestinationPropertyName+'")')
else
begin
lCodigoClasse.WriteLine(')');
if (lRelationPersistenceMapTicket is acDirectDBRelationMapTicket) and (acDirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKColumnName <> '') then
lCodigoClasse.WriteLine('@JoinColumn(name = "'+acDirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKColumnName+'")');
lCodigoClasse.WriteLine('@JoinColumn(name = "'+acDirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKColumnName+'")')
else if (lRelationPersistenceMapTicket is acIndirectDBRelationMapTicket) and (acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).TableName <> '') then
lCodigoClasse.WriteLine('@JoinTable(name = "'+ acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).TableName + '"'+
', joinColumns = { @JoinColumn(name = "'+acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKDestinoName+'") }'+
', inverseJoinColumns = { @JoinColumn(name = "'+acIndirectDBRelationMapTicket(lRelationPersistenceMapTicket).FKOrigemName+'")'+
'} )');
end;
lCodigoClasse.WriteLine('private '+lsTipoAttribute+' '+lsAtributo + ';');
end;
end;
lCodigoClasse.WriteLine('');
// GETTER/SETTER: Percorre atributos da classe
if not lEhClasseHerdada then
EscreveGetterSetterClasse(lCodigoClasse, _NomeId, _DBTipoId, True);
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsAtributo := lClassTicket.Attributes.Strings[index];
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute);
end;
// GETTER/SETTER: Percorre relacionamentos
for index := 0 to lClassTicket.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsIn.Objects[index] as acRelationTicket);
if (lRelation.DestinationPropertyName <> '') then
begin
lsAtributo := lRelation.DestinationPropertyName;
if lRelation.DestinationMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+ lRelation.OriginClassTicket.DisplayName +'Entity>'
else lsTipoAttribute := lRelation.OriginClassTicket.DisplayName + 'Entity';
if lRelation.DestinationMaxMultiplicity = 1 then
if (lsAtributo <> '') then
begin
EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute);
end;
lsTipoAttribute := lRelation.OriginClassTicket.DisplayName + 'Entity';
if lRelation.DestinationMaxMultiplicity = 1
then EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute)
else EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute, true, true);
end;
end;
for index := 0 to lClassTicket.RelationTicketsOut.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsOut.Objects[index] as acRelationTicket);
if (lRelation.OriginPropertyName <> '') then
lsAtributo := lRelation.OriginPropertyName;
if (lsAtributo <> '') then
begin
lsTipoAttribute := lRelation.DestinationClassTicket.DisplayName + 'Entity';
if lRelation.OriginMaxMultiplicity = 1
then EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute)
else EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute, true, true);
end;
end;
// Obter parametros para incluir no construtor
lClassTicketPai := lClassTicket;
while Assigned(lClassTicketPai) do
begin
for index := 0 to lClassTicketPai.Attributes.Count - 1 do
begin
lAttributeTicket := lClassTicketPai.Attributes.Objects[index] as acAttributeTicket;
lsAtributo := lClassTicketPai.Attributes.Strings[index];
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
if lClassTicketPai.ID <> lClassTicket.ID then
lListaChamadaSuper.Add('pi' + lsAtributo);
end;
for index := 0 to lClassTicketPai.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicketPai.RelationTicketsIn.Objects[index] as acRelationTicket);
lsAtributo := lRelation.DestinationPropertyName;
if (lsAtributo <> '') then
begin
if lRelation.DestinationMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+ lRelation.OriginClassTicket.DisplayName +'Entity>'
else lsTipoAttribute := lRelation.OriginClassTicket.DisplayName + 'Entity';
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
if lClassTicketPai.ID <> lClassTicket.ID then
lListaChamadaSuper.Add('pi' + lsAtributo);
end;
end;
for index := 0 to lClassTicketPai.RelationTicketsOut.Count - 1 do
begin
lRelation := (lClassTicketPai.RelationTicketsOut.Objects[index] as acRelationTicket);
lsAtributo := lRelation.OriginPropertyName;
if (lsAtributo <> '') then
begin
if lRelation.OriginMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+ lRelation.DestinationClassTicket.DisplayName +'Entity>'
else lsTipoAttribute := lRelation.DestinationClassTicket.DisplayName + 'Entity';
if lRelation.OriginMaxMultiplicity = 1 then
begin
EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute);
lParamsConstrutor := lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
if lClassTicketPai.ID <> lClassTicket.ID then
lListaChamadaSuper.Add('pi' + lsAtributo);
end;
end;
lClassTicketPai := lClassTicketPai.ParentClassTicket;
end;
// Escrever mtodos
// Escrever construtor vazio
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('public '+lsNomeClasse+'() { }');
lCodigoClasse.WriteLine('public '+lsNomeClasseDB+'() {');
lCodigoClasse.Indent();
for index := 0 to lClassTicket.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsIn.Objects[index] as acRelationTicket);
lsAtributo := lRelation.DestinationPropertyName;
if (lsAtributo <> '') and (lRelation.DestinationMaxMultiplicity > 1) then
lCodigoClasse.WriteLine(lsAtributo + ' = new ArrayList<>();');
end;
for index := 0 to lClassTicket.RelationTicketsOut.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsOut.Objects[index] as acRelationTicket);
lsAtributo := lRelation.OriginPropertyName;
if (lsAtributo <> '') and (lRelation.OriginMaxMultiplicity > 1) then
lCodigoClasse.WriteLine(lsAtributo + ' = new ArrayList<>();');
end;
lCodigoClasse.Outdent();
lCodigoClasse.WriteLine('}');
// Escrever construtor sem id com relacionamentos
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('public '+lsNomeClasse+'('+strutils.LeftStr(lParamsConstrutor, Length(lParamsConstrutor)-2)+') {');
lCodigoClasse.WriteLine('public '+lsNomeClasseDB+'('+strutils.LeftStr(lParamsConstrutor, Length(lParamsConstrutor)-2)+') {');
lCodigoClasse.Indent();
if lEhClasseHerdada then
lCodigoClasse.WriteLine('super(' + lListaChamadaSuper.CommaText + ');');
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lsAtributo := lClassTicket.Attributes.Strings[index];
lCodigoClasse.WriteLine(lsAtributo + ' = pi' + lsAtributo + ';');
EscreverInicializacaoAtributo(lCodigoClasse, lsAtributo, 1);
end;
for index := 0 to lClassTicket.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsIn.Objects[index] as acRelationTicket);
if (lRelation.DestinationPropertyName <> '') then
EscreverInicializacaoAtributo(lCodigoClasse, lRelation.DestinationPropertyName, lRelation.DestinationMaxMultiplicity);
end;
for index := 0 to lClassTicket.RelationTicketsOut.Count - 1 do
begin
lsAtributo := lRelation.DestinationPropertyName;
if lRelation.DestinationMaxMultiplicity = 1 then
lRelation := (lClassTicket.RelationTicketsOut.Objects[index] as acRelationTicket);
EscreverInicializacaoAtributo(lCodigoClasse, lRelation.OriginPropertyName, lRelation.OriginMaxMultiplicity);
end;
lCodigoClasse.Outdent();
lCodigoClasse.WriteLine('}');
// Escrever construtor com id com relacionamentos
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('public '+lsNomeClasseDB+'('+_DBTipoId+' piId, '+strutils.LeftStr(lParamsConstrutor, Length(lParamsConstrutor)-2)+') {');
lCodigoClasse.Indent();
if lEhClasseHerdada then
lCodigoClasse.WriteLine('super(piId, ' + lListaChamadaSuper.CommaText + ');')
else
lCodigoClasse.WriteLine(_NomeId+' = piId;');
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lCodigoClasse.WriteLine(lsAtributo + ' = pi' + lsAtributo + ';');
lsAtributo := lClassTicket.Attributes.Strings[index];
EscreverInicializacaoAtributo(lCodigoClasse, lsAtributo, 1);
end;
for index := 0 to lClassTicket.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsIn.Objects[index] as acRelationTicket);
EscreverInicializacaoAtributo(lCodigoClasse, lRelation.DestinationPropertyName, lRelation.DestinationMaxMultiplicity);
end;
for index := 0 to lClassTicket.RelationTicketsOut.Count - 1 do
begin
lRelation := (lClassTicket.RelationTicketsOut.Objects[index] as acRelationTicket);
EscreverInicializacaoAtributo(lCodigoClasse, lRelation.OriginPropertyName, lRelation.OriginMaxMultiplicity);
end;
lCodigoClasse.Outdent();
lCodigoClasse.WriteLine('}');
......@@ -5371,9 +5470,9 @@ begin
lCodigoClasse.WriteLine('@Override');
lCodigoClasse.WriteLine('public String toString() {');
lCodigoClasse.Indent();
lCodigoClasse.WriteLine('return "'+lsNomeClasse+'{ " +');
lCodigoClasse.WriteLine('return "'+lsNomeClasseDB+'{ " +');
if not lEhClasseHerdada then
lCodigoClasse.WriteLine('"id="+ id +');
lCodigoClasse.WriteLine('"id="+ '+_NomeId+' +');
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lsAtributo := lClassTicket.Attributes.Strings[index];
......@@ -5391,26 +5490,12 @@ begin
Result := lCodigoClasse.AsString;
finally
lCodigoClasse.Free;
lListaChamadaSuper.Free;
end;
end;
function TUtil.GerarClassPreview_JavaDomain(piClass: IUMLClass): string;
function ObterTipoAtributo(piTipoCurio: string): string;
begin
if piTipoCurio = 'acString' then Result := 'String'
else if piTipoCurio = 'acText' then Result := 'String'
else if piTipoCurio = 'acBlob' then Result := 'bynary[]'
else if piTipoCurio = 'acGraphic' then Result := 'bynary[]'
else if piTipoCurio = 'acDateTime' then Result := 'OffsetDateTime'
else if piTipoCurio = 'acInt' then Result := 'Integer'
else if piTipoCurio = 'acCurrency' then Result := 'BigDecimal'
else if piTipoCurio = 'acDouble' then Result := 'BigDecimal'
else if piTipoCurio = 'acBoolean' then Result := 'boolean'
else Result := piTipoCurio;
end;
procedure EscreveAtributoClasse(const piCodigoClasse: PStringWriter; piNomeAtributo, piTipoAtributo: String; piVisibility: Integer);
begin
//Escreve atributo
......@@ -5432,6 +5517,43 @@ function TUtil.GerarClassPreview_JavaDomain(piClass: IUMLClass): string;
piCodigoClasse.WriteLine('');
end;
procedure IncluirImports(const piCodigoClasse: PStringWriter; piClassTicket: acClassTicket; const piTipoId: string);
var
lAttributeTicket: acAttributeTicket;
lHasImport: array[0..2] of Boolean;
index: integer;
lsTipoAttribute: string;
begin
piCodigoClasse.WriteLine('import java.util.List;');
for index := 0 to 2 do
lHasImport[index] := False;
if piTipoId = 'Long' then
begin
piCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end;
for index := 0 to piClassTicket.Attributes.Count - 1 do
begin
lAttributeTicket := piClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
if (lsTipoAttribute = 'BigDecimal') and (not lHasImport[0]) then
begin
piCodigoClasse.WriteLine('import java.math.BigDecimal;');
lHasImport[0] := True;
end
else if (lsTipoAttribute = 'Long') and (not lHasImport[1]) then
begin
piCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end
else if (lsTipoAttribute = 'OffsetDateTime') and (not lHasImport[2]) then
begin
piCodigoClasse.WriteLine('import java.time.OffsetDateTime;');
lHasImport[2] := True;
end;
end;
end;
const
_TipoId = 'Long';
_NomeId = 'Id';
......@@ -5446,46 +5568,18 @@ var
lCodigoClasse: PStringWriter;
lParamsConstrutor: string;
lRelation: acRelationTicket;
lHasImport: array[0..2] of Boolean;
begin
Result := '';
lParamsConstrutor := '';
lsNomeClasse := piClass.Name;
lClassTicket := MetaModel.GetClassTicketByName(lsNomeClasse);
for index := 0 to 2 do
lHasImport[index] := False;
lCodigoClasse := PStringWriter.Create;
try
lCodigoClasse.WriteLine('package domain;');
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('import java.util.List;');
//lCodigoClasse.WriteLine('package domain;');
//lCodigoClasse.WriteLine('');
// Imports de tipos
if _TipoId = 'Long' then
begin
lCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end;
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
if (lsTipoAttribute = 'BigDecimal') and (not lHasImport[0]) then
begin
lCodigoClasse.WriteLine('import java.math.BigDecimal;');
lHasImport[0] := True;
end
else if (lsTipoAttribute = 'Long') and (not lHasImport[1]) then
begin
lCodigoClasse.WriteLine('import java.lang.Long;');
lHasImport[1] := True;
end
else if (lsTipoAttribute = 'OffsetDateTime') and (not lHasImport[2]) then
begin
lCodigoClasse.WriteLine('import java.time.OffsetDateTime;');
lHasImport[2] := True;
end;
end;
IncluirImports(lCodigoClasse, lClassTicket, _TipoId);
lCodigoClasse.WriteLine('');
// Incio da classe
lCodigoClasse.WriteLine('public class ' + lsNomeClasse + ' {');
......@@ -5499,7 +5593,7 @@ begin
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsAtributo := lClassTicket.Attributes.Strings[index];
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
EscreveAtributoClasse(lCodigoClasse, lsAtributo, lsTipoAttribute, lAttributeTicket.Visibility);
end;
......@@ -5536,7 +5630,7 @@ begin
begin
lAttributeTicket := lClassTicket.Attributes.Objects[index] as acAttributeTicket;
lsAtributo := lClassTicket.Attributes.Strings[index];
lsTipoAttribute := ObterTipoAtributo(lAttributeTicket.AttributeType);
lsTipoAttribute := ObterTipoAtributoJava(lAttributeTicket.AttributeType);
lParamsConstrutor:= lParamsConstrutor + lsTipoAttribute + ' pi'+ lsAtributo + ', ';
EscreveGetterSetterClasse(lCodigoClasse, lsAtributo, lsTipoAttribute);
......@@ -5559,7 +5653,6 @@ begin
lRelation := (lClassTicket.RelationTicketsOut.Objects[index] as acRelationTicket);
if (lRelation.OriginPropertyName <> '') then
begin
//Escreve atributo
lsAtributo := lRelation.OriginPropertyName;
if lRelation.OriginMaxMultiplicity > 1
then lsTipoAttribute := 'List<'+lRelation.DestinationClassTicket.DisplayName+'>'
......@@ -5573,7 +5666,7 @@ begin
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('public '+lsNomeClasse+'('+_TipoId+' piId, '+strutils.LeftStr(lParamsConstrutor, Length(lParamsConstrutor)-2)+') {');
lCodigoClasse.Indent();
lCodigoClasse.WriteLine('fId = piId;');
lCodigoClasse.WriteLine('f'+_NomeId+' = piId;');
for index := 0 to lClassTicket.Attributes.Count - 1 do
begin
lsAtributo := lClassTicket.Attributes.Strings[index];
......@@ -5622,8 +5715,87 @@ begin
end;
function TUtil.GerarClassPreview_JavaMapper(piClass: IUMLClass): string;
var
lsNomeClasseMapper,
lsNomeClasseDominio,
lsNomeClasseDB,
lsUltAtributo,
lsAttributo: string;
index: integer;
lClassTicket,
lClassTicketPai: acClassTicket;
lCodigoClasse: PStringWriter;
lRelation: acRelationTicket;
lAttributList: TStringList;
begin
Result := '';
lsNomeClasseDominio := piClass.Name;
lsNomeClasseDB := lsNomeClasseDominio + 'Entity';
lsNomeClasseMapper := RightStr(lsNomeClasseDominio, Length(lsNomeClasseDominio)-2) + 'Mapper';
lClassTicket := MetaModel.GetClassTicketByName(lsNomeClasseDominio);
lCodigoClasse := PStringWriter.Create;
try
lCodigoClasse.WriteLine('package adapters.persistence.mappers;');
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('import adapters.persistence.entities.'+lsNomeClasseDB+';');
lCodigoClasse.WriteLine('import domain.'+lsNomeClasseDominio+';');
lCodigoClasse.WriteLine('');
// Incio da classe
lCodigoClasse.WriteLine('public final class ' + lsNomeClasseMapper + ' {');
lCodigoClasse.WriteLine('');
lCodigoClasse.Indent();
// toDomain: Escrever mtodo toDomain
lCodigoClasse.WriteLine('');
lCodigoClasse.WriteLine('public static '+lsNomeClasseDominio+' toDomain('+lsNomeClasseDB + ' piDBObject) { ');
lCodigoClasse.Indent();
lCodigoClasse.WriteLine('return new ' + lsNomeClasseDominio + '(');
lCodigoClasse.Indent();
lAttributList := TStringList.Create;
try
lAttributList.Add('piDBObject.getId()');
// toDomain: obter lista de atributos da classe atual + classe pai
lClassTicketPai := lClassTicket;
while Assigned(lClassTicketPai) do
begin
for index := 0 to lClassTicketPai.Attributes.Count - 1 do
begin
lAttributList.Add('piDBObject.get%s()', [lClassTicketPai.Attributes.Strings[index]]);
end;
for index := 0 to lClassTicketPai.RelationTicketsIn.Count - 1 do
begin
lRelation := (lClassTicketPai.RelationTicketsIn.Objects[index] as acRelationTicket);
if (lRelation.DestinationPropertyName <> '') then
lAttributList.Add(Format('piDBObject.get%s()', [lRelation.DestinationPropertyName]));
end;
lClassTicketPai := lClassTicketPai.ParentClassTicket;
end;
// toDomain: escrever lista de atributos encontrados
lsUltAtributo := lAttributList.Strings[lAttributList.Count - 1];
lAttributList.Delete(lAttributList.Count - 1);
for lsAttributo in lAttributList.CommaText.Split([',']) do
lCodigoClasse.WriteLine(lsAttributo + ',');
lCodigoClasse.WriteLine(lsUltAtributo + ';');
finally
lAttributList.Free;
end;
lCodigoClasse.Outdent();
lCodigoClasse.WriteLine(');');
lCodigoClasse.Outdent();
lCodigoClasse.WriteLine('}');
// Escrever mtodo fromDomain
//Fim
lCodigoClasse.Outdent();
lCodigoClasse.WriteLine('}');
Result := lCodigoClasse.AsString;
finally
lCodigoClasse.Free;
end;
end;
function TUtil.GerarClassPreview_Pascal(piClass : IUMLClass): string;
......@@ -6081,7 +6253,6 @@ begin
end;
end;
procedure TUtil.CarregarMetodosNGU(pUMLClass: IUMLClass; pInstantCodeClass: TInstantCodeClass);
var
lMetCont, liCont, liCont2, liParCount, liParIndex: integer;
......@@ -6158,7 +6329,6 @@ begin
end;
procedure TUtil.ConvertXSDsToUseCaseXSD(piProgress: TFShowProgress);
function XSDExiste(piXSDFile: utXSDFile; piXSD: string): string;
......@@ -6397,7 +6567,6 @@ begin
result := lsResult;
end;
procedure TUtil.Reversa(psNomePacote, psPrjPath, psSTARUMLprj: string);
var
lEnum: acEnumerator;
......@@ -6630,93 +6799,7 @@ begin
end;
end;
{
procedure TUtil.CriarUMLAttributes(piClassTicket: acClassTicket; piUMLClass: IUMLClass; piFactory: IUMLFactory);
var lindex, lNullable, llength, lprec, lscale: Integer;
lbVariable: boolean;
lAttribute: IUMLAttribute;
lsAttribute, lsTipoAttribute, lsDBTableName, lsDBTypeAttribute: String;
lClassToDBMapTicket: acClassToDBMapTicket;
lAttributeTicket: acAttributeTicket;
lAttributeVisibility: acAttributeVisibility;
qryUtil: TQuery;
begin
// ISQLMetaData.
qryUtil := TQuery.Create(nil);
qryUtil.DatabaseName := 'dbSGIES';
// Obtm classe responsvel por mapeamento OO-DB
lClassToDBMapTicket := (MetaModel.DefaultMetaModelPersistenceMap as acMetaModelPersistenceMapSQL).GetClassToDBMapTicket(piClassTicket);
lsDBTableName := lClassToDBMapTicket.TableName;
qryUtil.SQL.Text := 'select sysobjects.name as tablename,' +#13#10+
' syscolumns.name as columnname,' +#13#10+
' syscolumns.length,' +#13#10+
' syscolumns.xprec,' +#13#10+
' syscolumns.xscale,' +#13#10+
' syscolumns.isnullable,' +#13#10+
' systypes.name as typename,' +#13#10+
' systypes.variable as variable' +#13#10+
'from sysobjects, syscolumns, systypes' +#13#10+
'where sysobjects.id = syscolumns.id' +#13#10+
'and syscolumns.xtype = systypes.xtype' +#13#10+
'and sysobjects.type = ''U''' +#13#10+
'and sysobjects.name = '''+lsDBTableName+'''' +#13#10+
'and syscolumns.name = :column_name';
//Preenche a Classe UML criada com seus atributos
for lindex := 0 to (piClassTicket.Attributes.Count - 1) do
begin
lsAttribute := piClassTicket.Attributes.Strings[lindex];
lAttributeTicket := piClassTicket.Attributes.Objects[lindex] as acAttributeTicket;
lAttribute := piFactory.CreateAttribute(piUMLClass);
lAttribute.Name := lsAttribute;
// Obtm a string do tipo do atributo situado em ObjectClass de ClassTicket
lsTipoAttribute := piClassTicket.ObjectClass.GetPropType(lsAttribute).ClassName;
//*** lsTipoAttribute := lPropertyRegisterTicket.Tipo;
lAttributeVisibility := lAttributeTicket.Visibility;
// Atribui a string do tipo do atributo ao UML Atributo
lAttribute.SetType2(lsTipoAttribute);
case lAttributeVisibility of
pvPublic : lAttribute.Visibility := vkPublic;
pvProtected : lAttribute.Visibility := vkProtected;
pvPrivate : lAttribute.Visibility := vkPrivate;
else lAttribute.Visibility := vkPrivate;
end;
// Seta nome da coluna do BD como valor atribudo
lAttribute.SetTaggedValueAsString('DBMappings', 'DBAttributeMap', 'Name', lClassToDBMapTicket.ColumnTicket[lindex].ColumnName);
qryUtil.ParamByName('column_name').AsString := lClassToDBMapTicket.ColumnTicket[lindex].ColumnName;
qryUtil.Open;
if not qryUtil.IsEmpty then
begin
lNullable := qryUtil.FieldByName('isnullable').AsInteger;
if lNullable = 1 then
lAttribute.SetTaggedValueAsBoolean('DBMappings', 'DBAttributeMap', 'Mand', true)
else lAttribute.SetTaggedValueAsBoolean('DBMappings', 'DBAttributeMap', 'Mand', false);
llength := qryUtil.FieldByName('length').AsInteger;
lprec := qryUtil.FieldByName('xprec').AsInteger;
lscale := qryUtil.FieldByName('xscale').AsInteger;
lbVariable := qryUtil.FieldByName('variable').AsBoolean;
if lprec <> 0 then
begin
lAttribute.SetTaggedValueAsInteger('DBMappings', 'DBAttributeMap', 'FSize', lprec);
lAttribute.SetTaggedValueAsInteger('DBMappings', 'DBAttributeMap', 'VSize', lscale)
end else
begin
if lbVariable then
lAttribute.SetTaggedValueAsInteger('DBMappings', 'DBAttributeMap', 'VSize', llength)
else lAttribute.SetTaggedValueAsInteger('DBMappings', 'DBAttributeMap', 'FSize', llength);
end;
lsDBTypeAttribute := qryUtil.FieldByName('typename').AsString;
lAttribute.SetTaggedValueAsString('DBMappings', 'DBAttributeMap', 'Type', lsDBTypeAttribute);
end;
qryUtil.Close;
end;
end;
}
// Procedure responsvel por criar a estrutura de rvore de todo modelo (cria generalizaes e UML classes envolvidas)
procedure TUtil.CriarArvore(piIStarUMLApp: IStarUMLApplication; piUMLClass: IUMLClass; piUMLPackage: IUMLPackage; piClassTicket: acClassTicket);
var
......@@ -7123,6 +7206,20 @@ begin
gStarUMLApp.AddMessageItem(piMessageType, piMessage, piElement);
end;
function TUtil.ObterTipoAtributoJava(piTipoCurio: string): string;
begin
if piTipoCurio = 'acString' then Result := 'String'
else if piTipoCurio = 'acText' then Result := 'String'
else if piTipoCurio = 'acBlob' then Result := 'bynary[]'
else if piTipoCurio = 'acGraphic' then Result := 'bynary[]'
else if piTipoCurio = 'acDateTime' then Result := 'OffsetDateTime'
else if piTipoCurio = 'acInt' then Result := 'Integer'
else if piTipoCurio = 'acCurrency' then Result := 'BigDecimal'
else if piTipoCurio = 'acDouble' then Result := 'BigDecimal'
else if piTipoCurio = 'acBoolean' then Result := 'Boolean'
else Result := piTipoCurio;
end;
function TUtil.EncodeMultiplicity(piMultiplicity: Integer): string;
begin
if (piMultiplicity = N)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment