/*
* Licensed to Laurent Broudoux (the "Author") under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. Author licenses this
* file to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package com.github.lbroudoux.dsl.eip.gen.camel.ui.common;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.core.resources.IContainer;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.osgi.framework.Bundle;
/**
* Main entry point of the 'EIP to Camel Xml' generation module.
*/
public class GenerateXml {
/**
* The model URI.
*/
private URI modelURI;
/**
* The output folder.
*/
private IContainer targetFolder;
/**
* The other arguments.
*/
List<? extends Object> arguments;
/**
* Constructor.
*
* @param modelURI
* is the URI of the model.
* @param targetFolder
* is the output folder
* @param arguments
* are the other arguments
* @throws IOException
* Thrown when the output cannot be saved.
* @generated
*/
public GenerateXml(URI modelURI, IContainer targetFolder, List<? extends Object> arguments) {
this.modelURI = modelURI;
this.targetFolder = targetFolder;
this.arguments = arguments;
}
/**
* Launches the generation.
*
* @param monitor
* This will be used to display progress information to the user.
* @throws IOException
* Thrown when the output cannot be saved.
* @generated
*/
public void doGenerate(IProgressMonitor monitor) throws IOException {
if (!targetFolder.getLocation().toFile().exists()) {
targetFolder.getLocation().toFile().mkdirs();
}
// final URI template0 = getTemplateURI("com.github.lbroudoux.dsl.eip.gen.camel", new Path("/com/github/lbroudoux/dsl/eip/gen/camel/main/generateJavaRoutes.emtl"));
// com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateJavaRoutes gen0 = new com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateJavaRoutes(modelURI, targetFolder.getLocation().toFile(), arguments) {
// protected URI createTemplateURI(String entry) {
// return template0;
// }
//};
//gen0.doGenerate(BasicMonitor.toMonitor(monitor));
monitor.subTask("Loading...");
com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes gen0 = new com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes(modelURI, targetFolder.getLocation().toFile(), arguments);
monitor.worked(1);
String generationID = org.eclipse.acceleo.engine.utils.AcceleoLaunchingUtil.computeUIProjectID("com.github.lbroudoux.dsl.eip.gen.camel", "com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateJavaRoutes", modelURI.toString(), targetFolder.getFullPath().toString(), new ArrayList<String>());
gen0.setGenerationID(generationID);
gen0.doGenerate(BasicMonitor.toMonitor(monitor));
// EObject model = gen0.getModel();
// if (model != null) {
//final URI template1 = getTemplateURI("com.github.lbroudoux.dsl.eip.gen.camel", new Path("/com/github/lbroudoux/dsl/eip/gen/camel/main/generateXmlRoutes.emtl"));
//com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes gen1 = new com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes(model, targetFolder.getLocation().toFile(), arguments) {
// protected URI createTemplateURI(String entry) {
// return template1;
// }
//};
//gen1.doGenerate(BasicMonitor.toMonitor(monitor));
// monitor.subTask("Loading...");
// com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes gen1 = new com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes(model, targetFolder.getLocation().toFile(), arguments);
// monitor.worked(1);
// generationID = org.eclipse.acceleo.engine.utils.AcceleoLaunchingUtil.computeUIProjectID("com.github.lbroudoux.dsl.eip.gen.camel", "com.github.lbroudoux.dsl.eip.gen.camel.main.GenerateXmlRoutes", modelURI.toString(), targetFolder.getFullPath().toString(), new ArrayList<String>());
// gen1.setGenerationID(generationID);
// gen1.doGenerate(BasicMonitor.toMonitor(monitor));
// }
}
/**
* Finds the template in the plug-in. Returns the template plug-in URI.
*
* @param bundleID
* is the plug-in ID
* @param relativePath
* is the relative path of the template in the plug-in
* @return the template URI
* @throws IOException
* @generated
*/
@SuppressWarnings("unchecked")
private URI getTemplateURI(String bundleID, IPath relativePath) throws IOException {
Bundle bundle = Platform.getBundle(bundleID);
if (bundle == null) {
// no need to go any further
return URI.createPlatformResourceURI(new Path(bundleID).append(relativePath).toString(), false);
}
URL url = bundle.getEntry(relativePath.toString());
if (url == null && relativePath.segmentCount() > 1) {
Enumeration<URL> entries = bundle.findEntries("/", "*.emtl", true);
if (entries != null) {
String[] segmentsRelativePath = relativePath.segments();
while (url == null && entries.hasMoreElements()) {
URL entry = entries.nextElement();
IPath path = new Path(entry.getPath());
if (path.segmentCount() > relativePath.segmentCount()) {
path = path.removeFirstSegments(path.segmentCount() - relativePath.segmentCount());
}
String[] segmentsPath = path.segments();
boolean equals = segmentsPath.length == segmentsRelativePath.length;
for (int i = 0; equals && i < segmentsPath.length; i++) {
equals = segmentsPath[i].equals(segmentsRelativePath[i]);
}
if (equals) {
url = bundle.getEntry(entry.getPath());
}
}
}
}
URI result;
if (url != null) {
result = URI.createPlatformPluginURI(new Path(bundleID).append(new Path(url.getPath())).toString(), false);
} else {
result = URI.createPlatformResourceURI(new Path(bundleID).append(relativePath).toString(), false);
}
return result;
}
}