feat: [EVOUMLPlugin] - Implementação de geração de Classe Java mapeando os...

feat: [EVOUMLPlugin] -  Implementação de geração de Classe Java mapeando os OQLs do OQLStudio, mudança no fluxo de exportação para acomodar diversas linguagens
parent 2bde221e
......@@ -459,7 +459,7 @@
</Other>
</CompilerOptions>
<Debugging>
<Exceptions Count="3">
<Exceptions Count="4">
<Item1>
<Name Value="EAbort"/>
</Item1>
......@@ -469,6 +469,9 @@
<Item3>
<Name Value="EFOpenError"/>
</Item3>
<Item4>
<Name Value="Exception"/>
</Item4>
</Exceptions>
</Debugging>
</CONFIG>
......@@ -2,10 +2,10 @@ object OQLExplorerV2: TOQLExplorerV2
Left = 534
Height = 552
Top = 331
Width = 1090
Width = 1091
Caption = 'Curio OQL Explorer'
ClientHeight = 552
ClientWidth = 1090
ClientWidth = 1091
Color = clBtnFace
Font.Color = clWindowText
Font.Height = -11
......@@ -11577,36 +11577,35 @@ object OQLExplorerV2: TOQLExplorerV2
001FF80000000000001FF80000000000001FFFFFFFFFFFFFFFFFFFFFFFFFFFFF
FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
}
Position = poScreenCenter
ShowInTaskBar = stAlways
OnClose = FormClose
OnCloseQuery = FormCloseQuery
OnCreate = FormCreate
OnResize = FormResize
OnShow = FormShow
Position = poScreenCenter
ShowInTaskBar = stAlways
LCLVersion = '2.2.4.0'
object pcCXOQL: TPageControl
Left = 0
Height = 517
Top = 35
Width = 1090
ActivePage = tsCXOQL
Width = 1091
ActivePage = tsPASunit
Align = alClient
TabIndex = 0
TabIndex = 1
TabOrder = 0
object tsCXOQL: TTabSheet
Caption = 'CXOQL'
ClientHeight = 491
ClientWidth = 1082
ClientWidth = 1083
object pnlCXOQL: TPanel
Left = 0
Height = 491
Top = 0
Width = 1082
Width = 1083
Align = alClient
BevelOuter = bvNone
ClientHeight = 491
ClientWidth = 1082
ClientWidth = 1083
ParentBackground = False
TabOrder = 0
object splVertical: TSplitter
......@@ -11615,8 +11614,8 @@ object OQLExplorerV2: TOQLExplorerV2
Top = 0
Width = 4
Color = clBtnFace
OnCanResize = splVerticalCanResize
ParentColor = False
OnCanResize = splVerticalCanResize
end
object pnlOQLList: TPanel
Left = 0
......@@ -11627,6 +11626,7 @@ object OQLExplorerV2: TOQLExplorerV2
BevelOuter = bvNone
ClientHeight = 491
ClientWidth = 274
ParentBackground = False
TabOrder = 0
object pnlList: TPanel
Left = 0
......@@ -11637,6 +11637,7 @@ object OQLExplorerV2: TOQLExplorerV2
BevelOuter = bvNone
ClientHeight = 465
ClientWidth = 274
ParentBackground = False
TabOrder = 0
object lvOQLList: TListView
Left = 0
......@@ -11696,17 +11697,18 @@ object OQLExplorerV2: TOQLExplorerV2
Left = 278
Height = 491
Top = 0
Width = 804
Width = 805
Align = alClient
BevelOuter = bvNone
ClientHeight = 491
ClientWidth = 804
ClientWidth = 805
ParentBackground = False
TabOrder = 1
object pnlOQLExplorer: TPanel
Left = 0
Height = 418
Top = 73
Width = 804
Width = 805
Align = alClient
BevelOuter = bvNone
ParentBackground = False
......@@ -11716,11 +11718,11 @@ object OQLExplorerV2: TOQLExplorerV2
Left = 0
Height = 73
Top = 0
Width = 804
Width = 805
Align = alTop
BevelOuter = bvNone
ClientHeight = 73
ClientWidth = 804
ClientWidth = 805
ParentBackground = False
TabOrder = 0
object labelName: TLabel
......@@ -11760,25 +11762,32 @@ object OQLExplorerV2: TOQLExplorerV2
object tsPASunit: TTabSheet
Caption = 'Unit'
ClientHeight = 491
ClientWidth = 1082
ClientWidth = 1083
ImageIndex = 1
object pnlPASUnit: TPanel
Left = 0
Height = 491
Top = 0
Width = 1082
Width = 1083
Align = alClient
BevelOuter = bvNone
ClientHeight = 491
ClientWidth = 1082
ClientWidth = 1083
ParentBackground = False
TabOrder = 0
inline memUnit: TSynEdit
AnchorSideLeft.Control = pnlPASUnit
AnchorSideTop.Control = pnlRadioOQL
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = pnlPASUnit
AnchorSideRight.Side = asrBottom
AnchorSideBottom.Control = pnlPASUnit
AnchorSideBottom.Side = asrBottom
Left = 0
Height = 491
Top = 0
Width = 1082
Align = alClient
Height = 467
Top = 24
Width = 1083
Anchors = [akTop, akLeft, akRight, akBottom]
Color = clWindow
Font.Color = clWindowText
Font.Height = 13
......@@ -12246,6 +12255,8 @@ object OQLExplorerV2: TOQLExplorerV2
object SynGutterMarks1: TSynGutterMarks
Width = 24
MouseActions = <>
MaxExtraMarksColums = 0
Options = [sgmoDeDuplicateMarksOnOverflow]
end
object SynGutterLineNumber1: TSynGutterLineNumber
Width = 13
......@@ -12278,6 +12289,38 @@ object OQLExplorerV2: TOQLExplorerV2
end
end
end
object pnlRadioOQL: TPanel
AnchorSideLeft.Control = memUnit
AnchorSideRight.Control = memUnit
AnchorSideRight.Side = asrBottom
Left = 0
Height = 24
Top = 0
Width = 1083
Anchors = [akTop, akLeft, akRight]
ClientHeight = 24
ClientWidth = 1083
ParentBackground = False
TabOrder = 1
object rdPascalClass: TRadioButton
Left = 8
Height = 17
Top = 0
Width = 48
Caption = 'Pascal'
TabOrder = 0
OnChange = rdPascalClassChange
end
object rdJavaClass: TRadioButton
Left = 64
Height = 17
Top = 0
Width = 41
Caption = 'Java'
TabOrder = 1
OnChange = rdJavaClassChange
end
end
end
end
end
......@@ -12285,7 +12328,7 @@ object OQLExplorerV2: TOQLExplorerV2
Left = 0
Height = 35
Top = 0
Width = 1090
Width = 1091
ButtonHeight = 24
ButtonWidth = 24
Caption = 'ToolBar1'
......@@ -12494,7 +12537,27 @@ object OQLExplorerV2: TOQLExplorerV2
CompilerMode = pcmObjFPC
NestedComments = True
TypeHelpers = False
StringMultilineMode = []
Left = 1002
Top = 12
end
object TaskDialog1: TTaskDialog
Buttons = <>
Caption = 'Export'
RadioButtons = <
item
Caption = 'Pascal'
end
item
Caption = 'Java'
end
item
Caption = 'Nenhum'
Default = True
end>
QueryItemIndex = 0
Text = 'Escolha a linguagem para poder exportar a classe OQL'
Title = 'Exportar classe OQL'
Left = 624
end
end
......@@ -14,12 +14,12 @@ uses
{$ENDIF}
Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls, utuOQL, Menus, ComCtrls, Buttons, ActnList, ituExplorerV2, ImgList,
ituDataBaseLogin, ToolWin, SynHighlighterPas, SynEdit;
ituDataBaseLogin, ToolWin, SynHighlighterPas, SynEdit, Types;
type
{ TOQLExplorerV2 }
TLingaguemExportada = (lgPascal, lgJava, lgNenhuma);
TOQLExplorerV2 = class(TForm)
abCXOQL: TAction;
abExportPAS: TAction;
......@@ -32,10 +32,14 @@ type
aNewOQL: TAction;
ActionList1: TActionList;
ilCXOQL: TImageList;
pnlRadioOQL: TPanel;
pcCXOQL: TPageControl;
rdPascalClass: TRadioButton;
rdJavaClass: TRadioButton;
SelectUnitDirectory: TSelectDirectoryDialog;
memUnit: TSynEdit;
SynFreePascalSyn1: TSynFreePascalSyn;
TaskDialog1: TTaskDialog;
ToolBar1: TToolBar;
ToolBar2: TToolBar;
ToolButton1: TToolButton;
......@@ -77,14 +81,18 @@ type
procedure aNewFileExecute(Sender: TObject);
procedure lvOQLListSelectItem(Sender: TObject; Item: TListItem;
Selected: Boolean);
procedure rdJavaClassChange(Sender: TObject);
procedure rdPascalClassChange(Sender: TObject);
procedure splVerticalCanResize(Sender: TObject; var NewSize: Integer; var Accept: Boolean);
private
{ Private declarations }
fFlagFormClosing : Boolean; // Impede que as OQLs sejam inutilmente verificados ao fechar o form
fExplorer: TExplorerV2;
fOQLList: utOQLFile;
function GerarUnitOQL(piXMLFileName: String): string;
lUnitText: string;
lJavaClassText: string;
function GerarUnitOQL(piXMLFileName: String; languageTag: TLingaguemExportada): string;
function GerarClasseJava(piXMLFileName: String; languageTag: TLingaguemExportada): string;
procedure InterfaceToSelectedOQL(piItem: TListItem);
function GetQueryType ( piExplorer : TExplorerV2 ) : Integer;
function ValidaQuery(piQuery: string; piOQLType: integer): string;
......@@ -130,6 +138,7 @@ end;
procedure TOQLExplorerV2.aExportPASExecute(Sender: TObject);
var lFileName: string;
var LanguageTag: TLingaguemExportada;
begin
if fOQLList.FileName = '' then
ShowMessage('You need to save before exporting.')
......@@ -139,15 +148,25 @@ begin
fOQLList.Save;
Screen.Cursor := crHourGlass;
try
memUnit.Lines.Text := GerarUnitOQL(fOQLList.FileName);
TaskDialog1.Execute;
if (TaskDialog1.RadioButton <> nil) and (TaskDialog1.RadioButton.Caption = 'Pascal') then LanguageTag:= lgPascal
else if (TaskDialog1.RadioButton <> nil) and (TaskDialog1.RadioButton.Caption = 'Java') then LanguageTag:= lgJava
else LanguageTag:= lgNenhuma;
finally
end;
try
lUnitText:=GerarUnitOQL(fOQLList.FileName, LanguageTag);
lJavaClassText:=GerarClasseJava(fOQLList.FileName, LanguageTag);
rdPascalClass.Checked:= true;
finally
Screen.Cursor := crDefault;
end;
pcCXOQL.ActivePage := tsPASUnit;
end;
end;
function TOQLExplorerV2.GerarUnitOQL(piXMLFileName: String): string;
function TOQLExplorerV2.GerarUnitOQL(piXMLFileName: String; LanguageTag: TLingaguemExportada): string;
procedure AddText(piStringStream: TStringStream; piIndent: integer = 0; piText: string = '');
begin
......@@ -418,20 +437,22 @@ begin
result := lUnit.DataString;
lFileName := 'utu' + lFileName + '.pas';
SelectUnitDirectory.FileName := lFileName;
if SelectUnitDirectory.Execute then
if (LanguageTag = lgPascal) then
begin
try
lUnitFile := TFileStream.Create(SelectUnitDirectory.FileName + DirectorySeparator + lFileName, fmCreate);
lUnit.Position := 0;
lUnitFile.CopyFrom(lUnit, lUnit.Size);
finally
lUnitFile.Free;
end;
end
lFileName := 'utu' + lFileName + '.pas';
SelectUnitDirectory.FileName := lFileName;
if SelectUnitDirectory.Execute then
begin
try
lUnitFile := TFileStream.Create(SelectUnitDirectory.FileName + DirectorySeparator + lFileName, fmCreate);
lUnit.Position := 0;
lUnitFile.CopyFrom(lUnit, lUnit.Size);
finally
lUnitFile.Free;
end;
end
end;
finally
lFieldOQLFile.free;
end;
......@@ -440,6 +461,224 @@ begin
end;
end;
function TOQLExplorerV2.GerarClasseJava(piXMLFileName: String; languageTag: TLingaguemExportada): string;
procedure AddText(piStringStream: TStringStream; piIndent: integer = 0; piText: string = '');
begin
piText := StringOfChar(' ', piIndent) + piText;
piStringStream.WriteString(concat(piText,#13#10));
end;
var
lJavaClass: TStringStream;
lJavaFile: TFileStream;
lFieldOQLFile, lFieldOQL: utField;
lAux: TStringList;
lOQLName, lOQLQuery, lMethodName: string;
lEnum, lEnumParams: acEnumerator;
lOQLParam: acOQLParam;
lOQLtoSQLTranslator: acOQLtoSQLTranslator;
lQueryParams: acQueryParams;
lFileName, lClassName: string;
lOQLType: integer;
lSQL: string;
lParamType: string;
begin
if not FileExists(piXMLFileName) then
raise Exception.Create('File "' + piXMLFileName + '" does not exist');
lJavaClass := TStringStream.Create('');
try
lFieldOQLFile := utField.Create;
try
lAux := TStringList.Create;
try
lAux.LoadFromFile(piXMLFileName);
lFieldOQLFile.LoadFieldFromXMLString(lAux.Text);
finally
lAux.free;
end;
lFileName := ExtractFileName(piXMLFileName);
lFileName := LeftStr(lFileName, pos('.', lFileName) - 1);
lClassName := 'ut' + lFileName + 'Queries';
// Package e imports
AddText(lJavaClass, 0, '//Lembre-se de Definir o pacote da classe');
AddText(lJavaClass);
AddText(lJavaClass, 0, 'import acuFramework.*;');
AddText(lJavaClass, 0, 'import acuOQL.*;');
AddText(lJavaClass);
// Início da classe
AddText(lJavaClass, 0, 'public class ' + lClassName + ' {');
AddText(lJavaClass);
lEnum := lFieldOQLFile.GetFieldsEnumerator;
try
//OQL Interfaces
while not lEnum.EOL do
begin
lFieldOQL := utField(lEnum.Current);
if not lFieldOQL.HasAttribute('name') then raise Exception.Create('Attribute "name" not found for OQL. Not a valid XML OQL file.');
lOQLName := lFieldOQL.AttributeByName('name').AsString;
if not lFieldOQL.HasField('query') then raise Exception.Create('Field "query" not found for OQL. Not a valid XML OQL file.');
lOQLQuery := lFieldOQL.FieldByName('query').AsString;
//Default cOQLQuery
lOQLType := cOQLQuery;
if lFieldOQL.HasAttribute('oqltype') then
lOQLType := lFieldOQL.AttributeByName('oqltype').AsInteger;
AddText(lJavaClass, 2, 'public interface I' + lOQLName + ' {');
lQueryParams := acQueryParams.Create;
try
lOQLtoSQLTranslator := acOQLtoSQLTranslator.Create(fExplorer.Util.MetaModelPersistenceMap);
try
case lOQLType of
cDataSetOQLDataSet:
begin
lSQL := lOQLtoSQLTranslator.TranslateOQLtoSQL(lOQLQuery, fExplorer.SQLDialect, fExplorer.Schema, acQueryResultKind.qrkDataSet, lQueryParams);
end;
else
begin
lSQL := lOQLtoSQLTranslator.TranslateOQLtoSQL(lOQLQuery, fExplorer.SQLDialect, fExplorer.Schema, acQueryResultKind.qrkObject, lQueryParams);
end;
end;
finally
lOQLtoSQLTranslator.Free;
end;
lEnumParams := lQueryParams.GetEnumerator;
try
while not lEnumParams.EOL do
begin
lOQLParam := acOQLParam(lEnumParams.Current);
AddText(lJavaClass, 4, lOQLParam.ClassName +' Param_' + lOQLParam.Name +'();');
lEnumParams.MoveNext;
end;
finally
lEnumParams.free;
end;
AddText(lJavaClass, 2, '}');
AddText(lJavaClass);
finally
lQueryParams.Free;
end;
lEnum.MoveNext;
end;
//OQL Types
lEnum.MoveFirst;
while not lEnum.EOL do
begin
lFieldOQL := utField(lEnum.Current);
lOQLName := lFieldOQL.AttributeByName('name').AsString;
lOQLQuery := lFieldOQL.FieldByName('query').AsString;
//Default cOQLQuery
lOQLType := cOQLQuery;
if lFieldOQL.HasAttribute('oqltype') then
lOQLType := lFieldOQL.AttributeByName('oqltype').AsInteger;
case lOQLType of
cDataSetOQLDataSet: AddText(lJavaClass, 2, 'public static class ' + lOQLName + ' extends acDataSetOQLQuery implements I' +lOQLName + '{');
else AddText(lJavaClass, 2, 'public static class ' + lOQLName + ' extends acOQLQuery implements I' +lOQLName + '{');
end;
lQueryParams := acQueryParams.Create;
try
lOQLtoSQLTranslator := acOQLtoSQLTranslator.Create(fExplorer.Util.MetaModelPersistenceMap);
try
case lOQLType of
cDataSetOQLDataSet:
begin
lSQL := lOQLtoSQLTranslator.TranslateOQLtoSQL(lOQLQuery, fExplorer.SQLDialect, fExplorer.Schema, acQueryResultKind.qrkDataSet, lQueryParams);
end;
else
begin
lSQL := lOQLtoSQLTranslator.TranslateOQLtoSQL(lOQLQuery, fExplorer.SQLDialect, fExplorer.Schema, acQueryResultKind.qrkObject, lQueryParams);
end;
end;
finally
lOQLtoSQLTranslator.Free;
end;
AddText(lJavaClass, 4, 'public ' + lOQLName + '(acPersistenceSession session) {');
AddText(lJavaClass, 6, 'super(session,' + UpperCase(lOQLName) +');');
AddText(lJavaClass, 4,'}');
lEnumParams := lQueryParams.GetEnumerator;
try
while not lEnumParams.EOL do
begin
lOQLParam := acOQLParam(lEnumParams.Current);
AddText(lJavaClass, 4, 'public ' + lOQLParam.ClassName + ' Param_'+ lOQLParam.Name + '() {');
AddText(lJavaClass, 6, 'return (' + lOQLParam.ClassName +') this.ParamByName("'+ lOQLParam.Name+'");');
AddText(lJavaClass, 4,'}');
lEnumParams.MoveNext;
end;
finally
lEnumParams.free;
end;
AddText(lJavaClass, 2, '}');
AddText(lJavaClass);
finally
lQueryParams.Free;
end;
lEnum.MoveNext;
end;
//Factory Class Implementation
AddText(lJavaClass, 0, '// OQLs');
AddText(lJavaClass);
lEnum.MoveFirst;
while not lEnum.EOL do
begin
lFieldOQL := utField(lEnum.Current);
lOQLName := lFieldOQL.AttributeByName('name').AsString;
lOQLQuery := lFieldOQL.FieldByName('query').AsString;
// Escapar aspas duplas para Java
lOQLQuery := StringReplace(lOQLQuery, '"', '\"', [rfReplaceAll]);
lOQLQuery := StringReplace(lOQLQuery, sLineBreak, ' " +' + sLineBreak + ' "', [rfReplaceAll]);
AddText(lJavaClass, 4, 'public static final String ' + UpperCase(lOQLName) + ' = "' + lOQLQuery + '";');
AddText(lJavaClass);
lEnum.MoveNext;
end;
finally
lEnum.free;
end;
AddText(lJavaClass, 0, '}');
result := lJavaClass.DataString;
if (LanguageTag = lgJava) then
begin
lFileName := lClassName + '.java';
SelectUnitDirectory.FileName := lFileName;
if SelectUnitDirectory.Execute then
begin
try
lJavaFile := TFileStream.Create(SelectUnitDirectory.FileName + DirectorySeparator + lFileName, fmCreate);
lJavaClass.Position := 0;
lJavaFile.CopyFrom(lJavaClass, lJavaClass.Size);
finally
lJavaFile.Free;
end;
end
end;
finally
lFieldOQLFile.free;
end;
finally
lJavaClass.free;
end;
end;
procedure TOQLExplorerV2.aLoadFileExecute(Sender: TObject);
var
lM: integer;
......@@ -518,6 +757,26 @@ begin
else SelectedOQLToInterface(Item);
end;
procedure TOQLExplorerV2.rdJavaClassChange(Sender: TObject);
begin
try
if rdJavaClass.Checked then
memUnit.Lines.Text := lJavaClassText;
finally
Screen.Cursor := crDefault;
end;
end;
procedure TOQLExplorerV2.rdPascalClassChange(Sender: TObject);
begin
try
if rdPascalClass.Checked then
memUnit.Lines.Text := lUnitText;
finally
Screen.Cursor := crDefault;
end;
end;
procedure TOQLExplorerV2.aNewOQLExecute(Sender: TObject);
var lListItem: TListItem;
lOQL: utOQL;
......
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