Skip to content

Commit

Permalink
Add backup generation before code generation
Browse files Browse the repository at this point in the history
  • Loading branch information
danstooamerican committed Oct 23, 2020
1 parent 21da08a commit eae5e9f
Show file tree
Hide file tree
Showing 8 changed files with 134 additions and 23 deletions.
12 changes: 2 additions & 10 deletions milestones.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,19 +23,11 @@

## Mögliche Erweiterungen - bis 08.11.2020
- Klassendiagramm aus bestehenden Code generieren
- Umsetzung zusätzlicher UML-Klassendiagramm-Elemente
- Umsetzung zusätzlicher UML-Klassendiagramm-Elemente (optional)
- Aggregation
- Komposition
- Assoziation (mit Kardinalitäten)
- Assoziationsklasse (optional)
- Enum (optional)
- Syntaxüberprüfung während das Klassendiagramm erstellt wird
- Konfigurationsmöglichkeit von verfügbaren Elementen (optional)
- Darstellung von Beziehungen verbessern (nicht nur geradlinig) (optional)
- Möglichkeit Klassen zu Paketen zuzuordnen (optional)

- Darstellung von Beziehungen verbessern (optional)
- Warnung bei Veränderungen
- Klassen ausblenden
- Selektive Codegenerierung
- Backup vor Codegenerierung
- Exportieren als Bild (SVG)
6 changes: 6 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,12 @@
<version>2.0.0</version>
</dependency>

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>

<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package class_diagram_editor.bluej_adapters.source_control;

public enum GenerationType {
NO_BACKUP,
WITH_BACKUP,
NO_GENERATION;
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,18 @@
* Test implementation which prints the generated source code to the console.
*/
public class PrintCodeSourceControl implements SourceCodeControl {

/**
* Generates the Java source code for all elements in the given {@link ClassDiagram class diagram}
* and prints out the result.
*
* This implementation ignores the {@code performBackup} flag and never performs a backup.
*
* @param classDiagram the {@link ClassDiagram class diagram} which is generated.
* @param generationType additional settings for the code generation (ignored).
*/
@Override
public void generateCode(ClassDiagram classDiagram) {
public void generateCode(ClassDiagram classDiagram, GenerationType generationType) {
Iterator<CodeElement> iterator = classDiagram.iterator();

while (iterator.hasNext()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,14 @@ public interface SourceCodeControl {

/**
* Generates source code for all elements in the given {@link ClassDiagram class diagram}.
* The backup is placed in the same folder as the folder which contains the generated code.
* The name of the backup folder is the generated code folder's name with a -backup suffix.
* If the backup folder already exists it is overwritten.
*
* @param classDiagram the {@link ClassDiagram class diagram} which is generated.
* @param generationType additional settings for the code generation.
*/
void generateCode(ClassDiagram classDiagram);
void generateCode(ClassDiagram classDiagram, GenerationType generationType);

/**
* Creates a new {@link ClassDiagram class diagram} which is based on the source code.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
import class_diagram_editor.code_generation.CodeElement;
import class_diagram_editor.code_generation.JavaCodeGenerator;
import class_diagram_editor.diagram.ClassDiagram;
import org.apache.commons.io.FileUtils;

import java.io.File;
import java.io.IOException;
import java.nio.file.CopyOption;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
Expand All @@ -41,12 +43,21 @@ public SourceControl(BProject project) {
}

@Override
public void generateCode(ClassDiagram classDiagram) {
public void generateCode(ClassDiagram classDiagram, GenerationType generationType) {
if (generationType == null || generationType.equals(GenerationType.NO_GENERATION)) {
return;
}

Iterator<CodeElement> iterator = classDiagram.iterator();

try {
BPackage bpackage = project.getPackages()[0];


if (generationType.equals(GenerationType.WITH_BACKUP)) {
createBackup(bpackage.getDir());
}

while (iterator.hasNext()) {
CodeElement codeElement = iterator.next();

Expand All @@ -58,7 +69,7 @@ public void generateCode(ClassDiagram classDiagram) {
System.err.println("Error generating code for " + codeElement.getName() + JAVA_FILE_EXTENSION);
}
}
} catch (ProjectNotOpenException e) {
} catch (ProjectNotOpenException | PackageNotFoundException e) {
e.printStackTrace();
}
}
Expand All @@ -84,6 +95,23 @@ public ClassDiagram generateDiagram() {
return classDiagramGenerator.generate();
}

private void createBackup(File directory) {
if (directory == null) {
return;
}

final File backupDir = new File(directory.getParentFile(), directory.getName() + "-backup");
backupDir.mkdirs();

try {
FileUtils.cleanDirectory(backupDir);
FileUtils.copyDirectory(directory, backupDir);
} catch (IOException e) {
System.err.println("Backup failed");
e.printStackTrace();
}
}

private Editor createFile(BPackage bPackage, CodeElement codeElement) {
Editor editor = null;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package class_diagram_editor.presentation;

import class_diagram_editor.bluej_adapters.source_control.GenerationType;
import class_diagram_editor.presentation.create_element.CreateElementService;
import class_diagram_editor.presentation.create_element.CreateElementView;
import class_diagram_editor.presentation.graph_editor.GraphController;
Expand All @@ -8,15 +9,22 @@
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBar;
import javafx.scene.control.ButtonType;
import javafx.scene.control.CheckBox;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.BorderPane;

import java.io.IOException;
import java.net.URL;
import java.util.Collection;
import java.util.ResourceBundle;

import static javafx.scene.control.ButtonType.OK;
import static javafx.scene.control.ButtonType.YES;

public class MainScreenView implements FxmlView<MainScreenViewModel>, Initializable {

@InjectViewModel
Expand Down Expand Up @@ -53,15 +61,29 @@ public void initialize(URL url, ResourceBundle resourceBundle) {

private void addControlHandlers() {
btnGenerateCode.setOnAction(e -> {
viewModel.generateCode();
final GenerationType generationType = showCodeGenerationConfirmation();

viewModel.generateCode(generationType);
});

btnGenerateCodeSelected.setOnAction(e -> {
viewModel.generateCode(graphController.getSelectedElementIds());
final Collection<String> selectedElementIds = graphController.getSelectedElementIds();

if (!selectedElementIds.isEmpty()) {
final GenerationType generationType = showCodeGenerationConfirmation();

viewModel.generateCode(selectedElementIds, generationType);
} else {
showNoElementsSelectedDialog();
}
});

btnGenerateDiagram.setOnAction(e -> {
viewModel.generateClassDiagram();
final GenerationType generationType = showDiagramGenerationConfirmation();

if (!generationType.equals(GenerationType.NO_GENERATION)) {
viewModel.generateClassDiagram();
}
});

ckbAssociation.setOnAction(e -> {
Expand All @@ -71,11 +93,52 @@ private void addControlHandlers() {
btnCreateElement.setOnAction(e -> {
try {
CreateElementView.showCreateElementDialog(new CreateElementService());
} catch (IOException ioException) {
ioException.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
});
}

private GenerationType showCodeGenerationConfirmation() {
final String backupText = "Mit Backup";
ButtonType btnBackup = new ButtonType(backupText, ButtonBar.ButtonData.YES);

Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Code generieren");
alert.setHeaderText("Mit dieser Aktion können bereits bestehende Klassen überschrieben werden.");
alert.getButtonTypes().add(btnBackup);

ButtonType buttonType = alert.showAndWait().orElse(ButtonType.CANCEL);

if (buttonType.getText().equals(backupText)) {
return GenerationType.WITH_BACKUP;
} else if (buttonType.equals(OK)) {
return GenerationType.NO_BACKUP;
}

return GenerationType.NO_GENERATION;
}

private GenerationType showDiagramGenerationConfirmation() {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
alert.setTitle("Diagramm generieren");
alert.setHeaderText("Mit dieser Aktion wird das bereits bestehende Diagramm überschrieben.");


ButtonType buttonType = alert.showAndWait().orElse(ButtonType.CANCEL);

if (buttonType.equals(OK)) {
return GenerationType.NO_BACKUP;
}

return GenerationType.NO_GENERATION;
}

private void showNoElementsSelectedDialog() {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setTitle("Code generieren");
alert.setHeaderText("Es wurden keine Elemente zum Generieren ausgewählt.");

alert.show();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package class_diagram_editor.presentation;

import class_diagram_editor.bluej_adapters.source_control.GenerationType;
import class_diagram_editor.bluej_adapters.source_control.SourceCodeControl;
import class_diagram_editor.diagram.AttributeModel;
import class_diagram_editor.diagram.ClassDiagram;
Expand Down Expand Up @@ -28,15 +29,15 @@ public MainScreenViewModel(SourceCodeControl sourceCodeControl) {
this.drawAssociation = new SimpleBooleanProperty();
}

public void generateCode() {
public void generateCode(GenerationType generationType) {
if (sourceCodeControl != null) {
sourceCodeControl.generateCode(classDiagram);
sourceCodeControl.generateCode(classDiagram, generationType);
}
}

public void generateCode(Collection<String> selectedElementIds) {
public void generateCode(Collection<String> selectedElementIds, GenerationType generationType) {
if (sourceCodeControl != null) {
sourceCodeControl.generateCode(classDiagram.getSubDiagram(selectedElementIds));
sourceCodeControl.generateCode(classDiagram.getSubDiagram(selectedElementIds), generationType);
}
}

Expand Down

0 comments on commit eae5e9f

Please sign in to comment.