Skip to content

Commit

Permalink
Added IURIWriterFactory to DefaultGenerationStrategy.
Browse files Browse the repository at this point in the history
  • Loading branch information
ylussaud committed Feb 29, 2024
1 parent 443b60e commit 73252cb
Show file tree
Hide file tree
Showing 16 changed files with 207 additions and 56 deletions.
4 changes: 3 additions & 1 deletion plugins/org.eclipse.acceleo.aql.ide/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -13,5 +13,7 @@ Require-Bundle: org.eclipse.core.runtime,
org.eclipse.core.resources,
org.eclipse.acceleo.query
Bundle-Activator: org.eclipse.acceleo.aql.ide.AcceleoPlugin$Implementation
Export-Package: org.eclipse.acceleo.aql.ide
Export-Package: org.eclipse.acceleo.aql.ide,
org.eclipse.acceleo.aql.ide.evaluation.strategy,
org.eclipse.acceleo.aql.ide.evaluation.writer
Automatic-Module-Name: org.eclipse.acceleo.aql.ide
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*******************************************************************************
* Copyright (c) 2024 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.acceleo.aql.ide.evaluation.strategy;

import java.nio.charset.Charset;

import org.eclipse.acceleo.OpenModeKind;
import org.eclipse.acceleo.aql.evaluation.strategy.DefaultURIWriterFactory;
import org.eclipse.acceleo.aql.evaluation.strategy.IURIWriterFactory;
import org.eclipse.acceleo.aql.evaluation.writer.AcceleoURIWriter;
import org.eclipse.acceleo.aql.ide.evaluation.writer.AcceleoWorkspaceURIWriter;
import org.eclipse.acceleo.query.runtime.impl.namespace.JavaLoader;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.resource.URIConverter;

/**
* The default {@link IURIWriterFactory}.
*
* @author <a href="mailto:yvan.lussaud@obeo.fr">Yvan Lussaud</a>
*/
public class AcceleoWorkspaceURIWriterFactory extends DefaultURIWriterFactory {

@Override
public AcceleoURIWriter createWriter(OpenModeKind openModeKind, URI uri, URIConverter uriConverter,
Charset charset, String lineDelimiter) {
final AcceleoURIWriter res;

if (openModeKind == OpenModeKind.OVERWRITE) {
if (EMFPlugin.IS_ECLIPSE_RUNNING && JavaLoader.JAVA.equals(uri.fileExtension())) {
res = new AcceleoWorkspaceURIWriter(uri, uriConverter, charset, lineDelimiter);
} else {
res = new AcceleoURIWriter(uri, uriConverter, charset);
}
} else {
res = new AcceleoURIWriter(uri, uriConverter, charset);
}

return res;
}

}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2017, 2023 Obeo.
* Copyright (c) 2017, 2024 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
Expand All @@ -8,7 +8,7 @@
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.acceleo.aql.ide;
package org.eclipse.acceleo.aql.ide.evaluation.writer;

import java.io.IOException;
import java.io.InputStream;
Expand All @@ -20,13 +20,12 @@

import org.eclipse.acceleo.aql.evaluation.writer.AcceleoURIWriter;
import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoWriter;
import org.eclipse.acceleo.query.runtime.impl.namespace.JavaLoader;
import org.eclipse.acceleo.aql.ide.AcceleoPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.codegen.merge.java.JControlModel;
import org.eclipse.emf.codegen.merge.java.JMerger;
import org.eclipse.emf.codegen.merge.java.facade.ast.ASTFacadeHelper;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.common.util.WrappedException;
import org.eclipse.emf.ecore.resource.URIConverter;
Expand All @@ -41,49 +40,46 @@ public class AcceleoWorkspaceURIWriter extends AcceleoURIWriter {
/** Size to use for our buffers. */
private static final int BUFFER_SIZE = 8192;

public AcceleoWorkspaceURIWriter(URI targetURI, URIConverter uriConverter, Charset charset)
throws IOException {
/**
* The line delimiter.
*/
private final String lineDelimiter;

public AcceleoWorkspaceURIWriter(URI targetURI, URIConverter uriConverter, Charset charset,
String lineDelimiter) {
super(targetURI, uriConverter, charset);
this.lineDelimiter = lineDelimiter;
}

@Override
public void close() throws IOException {
if (!EMFPlugin.IS_ECLIPSE_RUNNING || !JavaLoader.JAVA.equals(getTargetURI().fileExtension())
|| !uriConverter.exists(getTargetURI(), new LinkedHashMap<>())) {
if (!uriConverter.exists(getTargetURI(), new LinkedHashMap<>())) {
super.close();
} else {
try {
Class.forName("org.eclipse.emf.codegen.merge.java.JMerger"); //$NON-NLS-1$

final String mergedContent = mergeURIContent(getTargetURI(), getBuilder(), getCharset());
OutputStream output = uriConverter.createOutputStream(getTargetURI());
if (mergedContent != null) {
OutputStreamWriter writer = new OutputStreamWriter(output, getCharset());
writer.append(mergedContent);
writer.close();
} else {
super.close();
}
} catch (ClassNotFoundException e) {
AcceleoPlugin.getPlugin().log(new Status(IStatus.WARNING, AcceleoPlugin.PLUGIN_ID,
"Cannot find org.eclipse.emf.codegen.merge.java.JMerger in the classpath.", e));
final String mergedContent = mergeURIContent(getTargetURI(), getBuilder(), getCharset());
final OutputStream output = uriConverter.createOutputStream(getTargetURI());
if (mergedContent != null) {
OutputStreamWriter writer = new OutputStreamWriter(output, getCharset());
writer.append(mergedContent);
writer.close();
} else {
super.close();
}
}
}

private String mergeURIContent(URI targetURI, StringBuilder stringBuilder, Charset contentCharset)
throws IOException {
String jmergeFile = URI.createPlatformPluginURI(
final String jmergeFile = URI.createPlatformPluginURI(
"org.eclipse.emf.codegen.ecore/templates/emf-merge.xml", false).toString(); //$NON-NLS-1$
JControlModel model = new JControlModel();
final JControlModel model = new JControlModel();
model.initialize(new ASTFacadeHelper(), jmergeFile);
if (model.canMerge()) {
try (final InputStream existingContent = uriConverter.createInputStream(targetURI)) {
final String source = stringBuilder.toString();

try {
JMerger jMerger = new JMerger(model);
final JMerger jMerger = new JMerger(model);
jMerger.setSourceCompilationUnit(jMerger.createCompilationUnitForContents(source));
jMerger.setTargetCompilationUnit(jMerger.createCompilationUnitForInputStream(
existingContent, contentCharset.toString()));
Expand Down Expand Up @@ -124,12 +120,12 @@ private void createLostURI(URI targetURI, URI lostURI) throws IOException {
OutputStream destination = uriConverter.createOutputStream(lostURI)) {

// Print a time stamp of the current copy
// FIXME use delimiter specified by file block
StringBuilder timestamp = new StringBuilder();
timestamp.append('\n').append(Calendar.getInstance().getTime().toString()).append('\n');
timestamp.append(lineDelimiter).append(Calendar.getInstance().getTime().toString()).append(
lineDelimiter);
timestamp.append(
"================================================================================"); //$NON-NLS-1$
timestamp.append('\n');
timestamp.append(lineDelimiter);

destination.write(timestamp.toString().getBytes(getCharset()));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,9 @@
import org.eclipse.acceleo.aql.AcceleoUtil;
import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;
import org.eclipse.acceleo.aql.evaluation.GenerationResult;
import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;
import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoGenerationStrategy;
import org.eclipse.acceleo.aql.evaluation.strategy.DefaultGenerationStrategy;
import org.eclipse.acceleo.aql.evaluation.strategy.IAcceleoGenerationStrategy;
import org.eclipse.acceleo.aql.ide.evaluation.strategy.AcceleoWorkspaceURIWriterFactory;
import org.eclipse.acceleo.aql.parser.AcceleoParser;
import org.eclipse.acceleo.aql.parser.ModuleLoader;
import org.eclipse.acceleo.query.AQLUtils;
Expand Down Expand Up @@ -277,7 +278,7 @@ private GenerationResult launchGeneration() {
private void evaluate(AcceleoEvaluator evaluator, IQualifiedNameQueryEnvironment queryEnvironment,
Module mainModule, ResourceSet modelResourceSet, URI targetURI, URI logURI) {
final IAcceleoGenerationStrategy strategy = new DefaultGenerationStrategy(modelResourceSet
.getURIConverter());
.getURIConverter(), new AcceleoWorkspaceURIWriterFactory());
AcceleoUtil.generate(evaluator, queryEnvironment, mainModule, modelResourceSet, strategy, targetURI,
logURI);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@
import org.eclipse.acceleo.Template;
import org.eclipse.acceleo.aql.AcceleoUtil;
import org.eclipse.acceleo.aql.evaluation.AcceleoEvaluator;
import org.eclipse.acceleo.aql.evaluation.writer.DefaultGenerationStrategy;
import org.eclipse.acceleo.aql.evaluation.writer.IAcceleoGenerationStrategy;
import org.eclipse.acceleo.aql.evaluation.strategy.DefaultGenerationStrategy;
import org.eclipse.acceleo.aql.evaluation.strategy.IAcceleoGenerationStrategy;
import org.eclipse.acceleo.aql.ide.AcceleoPlugin;
import org.eclipse.acceleo.aql.ide.evaluation.strategy.AcceleoWorkspaceURIWriterFactory;
import org.eclipse.acceleo.aql.parser.AcceleoAstResult;
import org.eclipse.acceleo.aql.parser.AcceleoParser;
import org.eclipse.acceleo.aql.parser.ModuleLoader;
Expand Down Expand Up @@ -92,7 +93,7 @@ public void run() {
AcceleoParser.QUALIFIER_SEPARATOR, false));

final IAcceleoGenerationStrategy strategy = new DefaultGenerationStrategy(model
.getResourceSet().getURIConverter());
.getResourceSet().getURIConverter(), new AcceleoWorkspaceURIWriterFactory());
AcceleoUtil.generate(evaluator, queryEnvironment, module, model, strategy,
getDestination(), logURI);
}
Expand Down Expand Up @@ -376,7 +377,7 @@ protected void generateNoDebug(IQualifiedNameQueryEnvironment environment, Modul
false));

final IAcceleoGenerationStrategy strategy = new DefaultGenerationStrategy(modelResource
.getResourceSet().getURIConverter());
.getResourceSet().getURIConverter(), new AcceleoWorkspaceURIWriterFactory());
AcceleoUtil.generate(noDebugEvaluator, environment, module, modelResource, strategy, getDestination(),
logURI);

Expand Down

0 comments on commit 73252cb

Please sign in to comment.