Skip to content

Commit

Permalink
[Templates] Refactor templates and template manifest handling
Browse files Browse the repository at this point in the history
- De-duplicate lots of code and refactor

- Create the template manifest in one place in AbstractTemplate

- AbstractTemplate#save() just copies and updates the zip, it doesn't regenerate the thumbnail images
  • Loading branch information
Phillipus committed Dec 29, 2024
1 parent d66d442 commit 3ede895
Show file tree
Hide file tree
Showing 11 changed files with 251 additions and 356 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
*/
package com.archimatetool.canvas.templates.model;

import java.io.File;

import org.eclipse.swt.graphics.Image;

import com.archimatetool.canvas.ICanvasImages;
Expand All @@ -24,10 +26,10 @@ public class CanvasModelTemplate extends AbstractTemplate {
public CanvasModelTemplate() {
}

public CanvasModelTemplate(String id) {
super(id);
public CanvasModelTemplate(File file) {
super(file);
}

@Override
public String getType() {
return XML_CANVAS_TEMPLATE_ATTRIBUTE_TYPE_MODEL;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,14 @@

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;

import org.eclipse.swt.graphics.Image;
import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;

import com.archimatetool.canvas.CanvasEditorPlugin;
import com.archimatetool.canvas.ICanvasImages;
import com.archimatetool.editor.ArchiPlugin;
import com.archimatetool.editor.utils.ZipUtils;
import com.archimatetool.jdom.JDOMUtils;
import com.archimatetool.templates.model.ITemplate;
import com.archimatetool.templates.model.ITemplateGroup;
import com.archimatetool.templates.model.ITemplateXMLTags;
import com.archimatetool.templates.model.TemplateGroup;
import com.archimatetool.templates.model.TemplateManager;

Expand All @@ -46,8 +38,7 @@ protected ITemplateGroup loadInbuiltTemplates() {
if(folder.exists()) {
for(File file : folder.listFiles()) {
if(file.getName().toLowerCase().endsWith(CANVAS_TEMPLATE_FILE_EXTENSION)) {
ITemplate template = new CanvasModelTemplate();
template.setFile(file);
ITemplate template = new CanvasModelTemplate(file);
group.addTemplate(template);
}
}
Expand All @@ -68,52 +59,20 @@ public String getTemplateFileExtension() {
@Override
public ITemplate createTemplate(File file) throws IOException {
if(isValidTemplateFile(file)) {
return new CanvasModelTemplate(null);
return new CanvasModelTemplate(file);
}
else {
throw new IOException("Wrong template format."); //$NON-NLS-1$
}
}

@Override
protected ITemplate createTemplate(String type) {
if(CanvasModelTemplate.XML_CANVAS_TEMPLATE_ATTRIBUTE_TYPE_MODEL.equals(type)) {
return new CanvasModelTemplate();
}
return null;
}

@Override
public Image getMainImage() {
return ICanvasImages.ImageFactory.getImage(ICanvasImages.ICON_CANVAS_MODEL);
}

@Override
protected boolean isValidTemplateFile(File file) throws IOException {
if(file == null || !file.exists()) {
return false;
}

// Ensure the template is of the right kind
String xmlString = ZipUtils.extractZipEntry(file, ZIP_ENTRY_MANIFEST, Charset.forName("UTF-8")); //$NON-NLS-1$
if(xmlString == null) {
return false;
}

// If the attribute "type" exists then return true if its value is "canvas".
// If the attribute doesn't exist it was from an older version (before 2.1)
try {
Document doc = JDOMUtils.readXMLString(xmlString);
Element root = doc.getRootElement();
Attribute attType = root.getAttribute(ITemplateXMLTags.XML_TEMPLATE_ATTRIBUTE_TYPE);
if(attType != null) {
return CanvasModelTemplate.XML_CANVAS_TEMPLATE_ATTRIBUTE_TYPE_MODEL.equals(attType.getValue());
}
}
catch(JDOMException ex) {
return false;
}

return true;
protected String getTemplateType() {
return CanvasModelTemplate.XML_CANVAS_TEMPLATE_ATTRIBUTE_TYPE_MODEL;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,21 @@
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.jdom2.Document;
import org.jdom2.Element;

import com.archimatetool.canvas.model.ICanvasModel;
import com.archimatetool.canvas.templates.model.CanvasModelTemplate;
import com.archimatetool.canvas.templates.model.CanvasTemplateManager;
import com.archimatetool.editor.diagram.commands.DiagramCommandFactory;
import com.archimatetool.editor.model.IArchiveManager;
import com.archimatetool.editor.utils.ZipUtils;
import com.archimatetool.jdom.JDOMUtils;
import com.archimatetool.model.IArchimateFactory;
import com.archimatetool.model.IArchimateModel;
import com.archimatetool.model.IDiagramModelReference;
import com.archimatetool.model.IFolder;
import com.archimatetool.model.ModelVersion;
import com.archimatetool.model.util.UUIDFactory;
import com.archimatetool.templates.model.ITemplate;
import com.archimatetool.templates.model.ITemplateGroup;
import com.archimatetool.templates.model.ITemplateXMLTags;
import com.archimatetool.templates.model.TemplateManager;
import com.archimatetool.templates.wizard.TemplateUtils;

Expand Down Expand Up @@ -181,35 +178,16 @@ private void createZipFile(File zipFile) throws IOException {
}

private String createManifest() throws IOException {
Document doc = new Document();
Element root = new Element(ITemplateXMLTags.XML_TEMPLATE_ELEMENT_MANIFEST);
doc.setRootElement(root);
// Create a new template and create the manifest from that
ITemplate template = new CanvasModelTemplate();

// Type
root.setAttribute(ITemplateXMLTags.XML_TEMPLATE_ATTRIBUTE_TYPE, CanvasModelTemplate.XML_CANVAS_TEMPLATE_ATTRIBUTE_TYPE_MODEL);

// Timestamp
root.setAttribute(ITemplateXMLTags.XML_TEMPLATE_ATTRIBUTE_TIMESTAMP, Long.toString(System.currentTimeMillis()));

// Name
Element elementName = new Element(ITemplateXMLTags.XML_TEMPLATE_ELEMENT_NAME);
elementName.setText(fTemplateName);
root.addContent(elementName);

// Description
Element elementDescription = new Element(ITemplateXMLTags.XML_TEMPLATE_ELEMENT_DESCRIPTION);
elementDescription.setText(fTemplateDescription);
root.addContent(elementDescription);

// Thumbnail
template.setName(fTemplateName);
template.setDescription(fTemplateDescription);
if(fIncludeThumbnail) {
String keyThumb = TemplateManager.ZIP_ENTRY_THUMBNAILS + "1.png"; //$NON-NLS-1$
Element elementKeyThumb = new Element(ITemplateXMLTags.XML_TEMPLATE_ELEMENT_KEY_THUMBNAIL);
elementKeyThumb.setText(keyThumb);
root.addContent(elementKeyThumb);
template.setKeyThumbnailPath(TemplateManager.ZIP_ENTRY_THUMBNAILS + "1.png"); //$NON-NLS-1$
}
return JDOMUtils.write2XMLString(doc);

return template.createManifest();
}

private File saveModelToTempFile() throws IOException {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,21 @@

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.HashSet;
import java.util.Set;

import org.eclipse.jface.dialogs.IInputValidator;
import org.eclipse.jface.dialogs.InputDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.jface.window.Window;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.BusyIndicator;
import org.eclipse.swt.custom.CLabel;
import org.eclipse.swt.custom.SashForm;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridData;
Expand Down Expand Up @@ -78,7 +75,7 @@ public class TemplateManagerDialog extends ExtendedTitleAreaDialog {
protected ITemplate fSelectedTemplate;
protected ITemplateGroup fSelectedTemplateGroup;

protected List<ITemplate> fModifiedTemplates = new ArrayList<ITemplate>();
protected Set<ITemplate> fModifiedTemplates = new HashSet<>();

protected TemplateManager fTemplateManager;

Expand Down Expand Up @@ -138,7 +135,7 @@ protected Control createDialogArea(Composite parent) {
fTableViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
Object o = ((IStructuredSelection)event.getSelection()).getFirstElement();
Object o = event.getStructuredSelection().getFirstElement();
fSelectedControl = fTableViewer;
updateControls(o);
}
Expand All @@ -161,7 +158,7 @@ public void selectionChanged(SelectionChangedEvent event) {
fTreeViewer.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event) {
Object o = ((IStructuredSelection)event.getSelection()).getFirstElement();
Object o = event.getStructuredSelection().getFirstElement();
fSelectedControl = fTreeViewer;
updateControls(o);
}
Expand Down Expand Up @@ -226,28 +223,23 @@ public void widgetSelected(SelectionEvent e) {
fNameTextField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
fNameTextField.setEnabled(false);

fNameTextField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String text = fNameTextField.getText();
if(fIsSettingFields || !StringUtils.isSet(text)) {
return;
}

// Edit Template name
if(fSelectedTemplate != null) {
fSelectedTemplate.setName(text);
if(!fModifiedTemplates.contains(fSelectedTemplate)) {
fModifiedTemplates.add(fSelectedTemplate);
}
fTableViewer.refresh();
fTreeViewer.refresh();
}
// Edit Group name
else if(fSelectedTemplateGroup != null) {
fSelectedTemplateGroup.setName(text);
fTreeViewer.refresh();
}
fNameTextField.addModifyListener(e -> {
String text = fNameTextField.getText();
if(fIsSettingFields || !StringUtils.isSet(text)) {
return;
}

// Edit Template name
if(fSelectedTemplate != null) {
fSelectedTemplate.setName(text);
fModifiedTemplates.add(fSelectedTemplate);
fTableViewer.refresh();
fTreeViewer.refresh();
}
// Edit Group name
else if(fSelectedTemplateGroup != null) {
fSelectedTemplateGroup.setName(text);
fTreeViewer.refresh();
}
});

Expand All @@ -260,19 +252,14 @@ else if(fSelectedTemplateGroup != null) {
gd = new GridData(GridData.FILL_BOTH);
gd.heightHint = 100;
fDescriptionTextField.setLayoutData(gd);
fDescriptionTextField.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
String text = fDescriptionTextField.getText();
if(fIsSettingFields || !StringUtils.isSet(text)) {
return;
}
if(fSelectedTemplate != null) {
fSelectedTemplate.setDescription(fDescriptionTextField.getText());
if(!fModifiedTemplates.contains(fSelectedTemplate)) {
fModifiedTemplates.add(fSelectedTemplate);
}
}
fDescriptionTextField.addModifyListener(e -> {
String text = fDescriptionTextField.getText();
if(fIsSettingFields || !StringUtils.isSet(text)) {
return;
}
if(fSelectedTemplate != null) {
fSelectedTemplate.setDescription(fDescriptionTextField.getText());
fModifiedTemplates.add(fSelectedTemplate);
}
});

Expand Down Expand Up @@ -339,18 +326,14 @@ protected void openTemplate() {
return;
}

BusyIndicator.showWhile(null, new Runnable() {
@Override
public void run() {
try {
ITemplate template = fTemplateManager.createTemplate(file);
template.setFile(file);
fTemplateManager.addUserTemplate(template);
fTableViewer.refresh();
}
catch(IOException ex) {
MessageDialog.openError(getShell(), Messages.TemplateManagerDialog_18, ex.getMessage());
}
BusyIndicator.showWhile(null, () -> {
try {
ITemplate template = fTemplateManager.createTemplate(file);
fTemplateManager.addUserTemplate(template);
fTableViewer.refresh();
}
catch(IOException ex) {
MessageDialog.openError(getShell(), Messages.TemplateManagerDialog_18, ex.getMessage());
}
});
}
Expand Down Expand Up @@ -398,11 +381,11 @@ boolean hasGroup(String name) {
protected void deleteSelectedObjects() {
// Table
if(fSelectedControl == fTableViewer) {
for(Object o : ((IStructuredSelection)fTableViewer.getSelection()).toArray()) {
if(o instanceof ITemplate) {
fTemplateManager.getUserTemplates().remove(o);
for(Object o : fTableViewer.getStructuredSelection().toArray()) {
if(o instanceof ITemplate template) {
fTemplateManager.getUserTemplates().remove(template);
for(ITemplateGroup group : fTemplateManager.getUserTemplateGroups()) {
group.removeTemplate((ITemplate)o);
group.removeTemplate(template);
}
}
}
Expand All @@ -413,15 +396,14 @@ protected void deleteSelectedObjects() {
else if(fSelectedControl == fTreeViewer) {
// Do it this way because we can't get template parents
for(TreeItem item : fTreeViewer.getTree().getSelection()) {
if(item.getData() instanceof ITemplate) {
ITemplate template = (ITemplate)item.getData();
if(item.getData() instanceof ITemplate template) {
TreeItem parent = item.getParentItem();
if(parent.getData() instanceof ITemplateGroup) {
((ITemplateGroup)parent.getData()).removeTemplate(template);
if(parent.getData() instanceof ITemplateGroup group) {
group.removeTemplate(template);
}
}
else if(item.getData() instanceof ITemplateGroup) {
fTemplateManager.getUserTemplateGroups().remove(item.getData());
else if(item.getData() instanceof ITemplateGroup group) {
fTemplateManager.getUserTemplateGroups().remove(group);
}
}
fTreeViewer.refresh();
Expand All @@ -447,16 +429,16 @@ protected void updateControls(Object o) {
// Buttons
fButtonRemove.setEnabled(o instanceof ITemplate || o instanceof ITemplateGroup);

if(o instanceof ITemplate) {
fSelectedTemplate = (ITemplate)o;
if(o instanceof ITemplate template) {
fSelectedTemplate = template;
fSelectedTemplateGroup = null;
fNameTextField.setText(StringUtils.safeString(fSelectedTemplate.getName()));
fDescriptionTextField.setText(StringUtils.safeString(fSelectedTemplate.getDescription()));
fFileTextField.setText(StringUtils.safeString(fSelectedTemplate.getFile().getAbsolutePath()));
}
else if(o instanceof ITemplateGroup) {
else if(o instanceof ITemplateGroup group) {
fSelectedTemplate = null;
fSelectedTemplateGroup = (ITemplateGroup)o;
fSelectedTemplateGroup = group;
fNameTextField.setText(StringUtils.safeString(fSelectedTemplateGroup.getName()));
}

Expand Down
Loading

0 comments on commit 3ede895

Please sign in to comment.