blob: b416079bd43fbf10e84b468aedfdce664e12cc93 [file] [log] [blame]
/*****************************************************************************
* Copyright (c) 2019 CEA LIST.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Yupanqui Munoz (CEA LIST) yupanqui.munozjulho@cea.fr - Initial API and implementation
* Vincent Lorenzo (CEA LIST) vincent.lorenzo@cea.fr - Initial API and implementation
*****************************************************************************/
package org.eclipse.papyrus.model2doc.core.internal.transcriber;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.papyrus.model2doc.core.builtintypes.BasicList;
import org.eclipse.papyrus.model2doc.core.builtintypes.BasicRow;
import org.eclipse.papyrus.model2doc.core.builtintypes.BasicTable;
import org.eclipse.papyrus.model2doc.core.builtintypes.BuiltInTypesFactory;
import org.eclipse.papyrus.model2doc.core.builtintypes.CellLocation;
import org.eclipse.papyrus.model2doc.core.builtintypes.ListItem;
import org.eclipse.papyrus.model2doc.core.builtintypes.TextCell;
import org.eclipse.papyrus.model2doc.core.builtintypes.TextListItem;
import org.eclipse.papyrus.model2doc.core.service.DiagramToImageService;
import org.eclipse.papyrus.model2doc.core.service.DiagramToImageServiceImpl;
import org.eclipse.papyrus.model2doc.core.transcriber.Transcriber;
import org.eclipse.papyrus.model2doc.core.transcription.ImageDescription;
import org.eclipse.papyrus.model2doc.core.transcription.Transcription;
import org.eclipse.papyrus.uml.internationalization.utils.utils.UMLLabelInternationalization;
import org.eclipse.uml2.uml.Class;
import org.eclipse.uml2.uml.Package;
import org.eclipse.uml2.uml.Property;
import org.eclipse.uml2.uml.Type;
/**
* Default Transcriber for UML model.
*
*/
public class UMLTranscriber implements Transcriber {
private Package root = null;
private Transcription transcription = null;
private List<Class> classes = new ArrayList<>();
private UMLLabelInternationalization umlLabelInternationalization = null;
private String imageOutputFolder = null;
private DiagramToImageService diagramToImageService = new DiagramToImageServiceImpl();
/**
*
* Constructor.
*
* @param rootPackage
* the root package
* @param transcription
* the object in charge to do the transcription
*/
public UMLTranscriber(Package rootPackage, Transcription transcription) {
root = rootPackage;
this.transcription = transcription;
umlLabelInternationalization = UMLLabelInternationalization.getInstance();
// in this version, we don't have an intermediate model storing images in its dedicated folder, so
// we use the project folder
imageOutputFolder = transcription.getGeneratorConfig().getDocumentFolder();
}
/**
* Read UML model and transcribe it.
*/
@Override
public String transcribe() {
// Transcribe label of root package how document main title
transcription.writeDocumentMainTitle(umlLabelInternationalization.getLabel(root));
transcription.writeTableOfContents("Table Of Contents");
// Get images generated of diagrams
List<ImageDescription> images = diagramToImageService.getImagesOfDiagrams(root, imageOutputFolder);
// Import images
for (ImageDescription image : images) {
transcription.importImage(image, image.getSubtitle());
}
// Transcribe classes directly owned by root package
transcribeClasses(root);
// Add table of list of packages and their owned classes
// 1. create a new table
final BasicTable table = BuiltInTypesFactory.eINSTANCE.createBasicTable();
// 2. create the column headers
final BasicRow columnHeaderRow = BuiltInTypesFactory.eINSTANCE.createBasicRow();
table.getRows().add(columnHeaderRow);
final TextCell cornerCell = BuiltInTypesFactory.eINSTANCE.createTextCell();
cornerCell.setText("");// TODO add a default text value to empty string
cornerCell.setLocation(CellLocation.CORNER);
columnHeaderRow.getCells().add(cornerCell);
final TextCell columnHeaderPackageCell = BuiltInTypesFactory.eINSTANCE.createTextCell();
columnHeaderRow.getCells().add(columnHeaderPackageCell);
columnHeaderPackageCell.setText("Packages");// TODO add a default text value to empty string
columnHeaderPackageCell.setLocation(CellLocation.COLUMN_HEADER);
final TextCell columnHeaderClassedCell = BuiltInTypesFactory.eINSTANCE.createTextCell();
columnHeaderRow.getCells().add(columnHeaderClassedCell);
columnHeaderClassedCell.setText("Classes");
columnHeaderClassedCell.setLocation(CellLocation.COLUMN_HEADER);
// 3. create row header and the body
final Iterator<Package> packIter = root.getNestedPackages().iterator();
int nbRow = 0;
while (packIter.hasNext()) {
nbRow++;
final Package nestedPackage = packIter.next();
final BasicRow row = BuiltInTypesFactory.eINSTANCE.createBasicRow();
table.getRows().add(row);
final TextCell rowHeaderCell = BuiltInTypesFactory.eINSTANCE.createTextCell();
row.getCells().add(rowHeaderCell);
rowHeaderCell.setText(Integer.toString(nbRow));
rowHeaderCell.setLocation(CellLocation.ROW_HEADER);
final TextCell packageCellBody = BuiltInTypesFactory.eINSTANCE.createTextCell();
row.getCells().add(packageCellBody);
packageCellBody.setText(this.umlLabelInternationalization.getLabel(nestedPackage));
packageCellBody.setLocation(CellLocation.BODY);
final TextCell classesCellBody = BuiltInTypesFactory.eINSTANCE.createTextCell();
row.getCells().add(classesCellBody);
final StringBuilder builder = new StringBuilder();
final Iterator<Class> classIterator = nestedPackage.getOwnedTypes().stream().filter(Class.class::isInstance).map(Class.class::cast).collect(Collectors.toList()).iterator();
while (classIterator.hasNext()) {
final Class current = classIterator.next();
builder.append(umlLabelInternationalization.getLabel(current));
if (classIterator.hasNext()) {
builder.append(", "); //$NON-NLS-1$
}
}
classesCellBody.setText(builder.toString());
classesCellBody.setLocation(CellLocation.BODY);
}
transcription.writeTable(table);
// Transcribe nested packages owned by root package
for (Package nestedPackage : root.getNestedPackages()) {
transcribeNestedPackages(nestedPackage, 1);
}
transcription.refreshTablesOfIndexes();
// Save transcription
return transcription.save(umlLabelInternationalization.getLabel(root));
}
/**
* Get nested packages and transcribe them.
*
* @param owner
* owner package
* @param level
* nested package level
*/
private void transcribeNestedPackages(Package owner, int level) {
// Transcribe label of owner package how section title
transcription.writeSectionTitle(umlLabelInternationalization.getLabel(owner), level);
// Get images generated of diagrams
List<ImageDescription> images = diagramToImageService.getImagesOfDiagrams(owner, imageOutputFolder);
// Import images
for (ImageDescription image : images) {
transcription.importImage(image, image.getSubtitle());
}
// Transcribe classes directly owned by owner package
transcribeClasses(owner);
for (Package nestedPackage : owner.getNestedPackages()) {
// Transcribe nested packages owned by owner package
transcribeNestedPackages(nestedPackage, level + 1);
}
}
/**
* Get classes and transcribe them.
*
* @param owner
* owner package
*/
private void transcribeClasses(Package owner) {
// Get classes owned by owner package
for (Type type : owner.getOwnedTypes()) {
if (type instanceof Class) {
classes.add((Class) type);
}
}
// Transcribe classes
for (Class clazz : classes) {
// Transcribe label of class how paragraph
transcription.writeParagraph(umlLabelInternationalization.getLabel(clazz), false);
// Transcribe properties of each class
transcribeProperties(clazz);
// Get images generated of diagrams
List<ImageDescription> images = diagramToImageService.getImagesOfDiagrams(clazz, imageOutputFolder);
// Import images
for (ImageDescription image : images) {
transcription.importImage(image, image.getSubtitle());
}
}
classes.clear();
}
/**
* Get properties and transcribe them.
*
* @param owner
* owner class
*/
private void transcribeProperties(Class owner) {
final List<ListItem> items = new ArrayList<>();
// Get properties owned by owner class
for (Property property : owner.getOwnedAttributes()) {
final TextListItem item = BuiltInTypesFactory.eINSTANCE.createTextListItem();
item.setText(umlLabelInternationalization.getLabel(property));
items.add(item);
}
if (items.size() > 0) {
final BasicList list = BuiltInTypesFactory.eINSTANCE.createBasicList();
list.getItems().addAll(items);
transcription.writeList(list, false);
}
}
}