/*******************************************************************************
* Copyright (c) 2008, 2012 Obeo.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Obeo - initial API and implementation
*******************************************************************************/
package org.eclipse.emf.eef.codegen.ecore.util;
import java.io.ByteArrayInputStream;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.codegen.ecore.generator.AbstractGeneratorAdapter;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.codegen.ecore.genmodel.generator.GenBaseGeneratorAdapter;
import org.eclipse.emf.common.EMFPlugin;
import org.eclipse.emf.common.util.BasicMonitor;
import org.eclipse.emf.common.util.Diagnostic;
import org.eclipse.emf.common.util.Monitor;
import org.eclipse.emf.common.util.URI;
/**
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
public class EEFGeneratorAdapter extends AbstractGeneratorAdapter {
private static final String JAVA_EXT_FILE = "java";
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.codegen.ecore.generator.AbstractGeneratorAdapter#canGenerate(java.lang.Object,
* java.lang.Object)
*/
@Override
public boolean canGenerate(Object object, Object projectType) {
return EMFPlugin.IS_ECLIPSE_RUNNING && object instanceof GenModel;
}
/**
* {@inheritDoc}
*
* @see org.eclipse.emf.codegen.ecore.generator.AbstractGeneratorAdapter#doGenerate(java.lang.Object,
* java.lang.Object, org.eclipse.emf.common.util.Monitor)
*/
@Override
protected Diagnostic doGenerate(Object object, Object projectType,
Monitor monitor) throws Exception {
GenModel genmodel = (GenModel) object;
IFolder folder = null;
final IProgressMonitor progressMonitor = BasicMonitor
.toIProgressMonitor(monitor);
if (projectType == GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE) {
final Object codeFormatter = createCodeFormatter(null,
URI.createPlatformResourceURI(genmodel.getModelDirectory(),
true));
folder = ResourcesPlugin.getWorkspace().getRoot()
.getFolder(new Path(genmodel.getModelDirectory())); // path);
if (folder != null && folder.isAccessible()) {
folder.accept(new ResourceVisitorFormatter(codeFormatter,
progressMonitor));
}
} else if (projectType == GenBaseGeneratorAdapter.EDIT_PROJECT_TYPE) {
final Object codeFormatter = createCodeFormatter(null,
URI.createPlatformResourceURI(genmodel.getEditDirectory(),
true));
folder = ResourcesPlugin.getWorkspace().getRoot()
.getFolder(new Path(genmodel.getEditDirectory()));
if (folder != null && folder.isAccessible()) {
folder.accept(new ResourceVisitorFormatter(codeFormatter,
progressMonitor));
}
} else if (projectType == GenBaseGeneratorAdapter.EDITOR_PROJECT_TYPE) {
final Object codeFormatter = createCodeFormatter(null,
URI.createPlatformResourceURI(
genmodel.getEditorDirectory(), true));
folder = ResourcesPlugin.getWorkspace().getRoot()
.getFolder(new Path(genmodel.getEditorDirectory()));
if (folder != null && folder.isAccessible()) {
folder.accept(new ResourceVisitorFormatter(codeFormatter,
progressMonitor));
}
}
return Diagnostic.OK_INSTANCE;
}
/**
* @param genmodel
* @param genPack
* @return
*/
protected IPath buildModelPath(GenModel genmodel, GenPackage genPack) {
String pathStr = genmodel.getModelDirectory() + "/"
+ genPack.getQualifiedPackageName().replaceAll("\\.", "/");
IPath path = new Path(pathStr);
return path;
}
/**
* @param genmodel
* @param genPack
* @return
*/
protected IPath buildProviderPath(GenModel genmodel, GenPackage genPack) {
String pathStr = genmodel.getEditDirectory();
if (genPack.getProviderPackageName() != null
&& !genPack.getProviderPackageName().equals("")) {
pathStr += "/"
+ genPack.getProviderPackageName().replaceAll("\\.", "/");
}
IPath path = new Path(pathStr);
return path;
}
/**
* @param genmodel
* @param genPack
* @return
*/
protected IPath buildPresentationPath(GenModel genmodel, GenPackage genPack) {
String pathStr = genmodel.getEditorDirectory();
if (genPack.getPresentationPackageName() != null
&& !genPack.getPresentationPackageName().equals("")) {
pathStr += "/"
+ genPack.getPresentationPackageName().replaceAll("\\.",
"/");
}
IPath path = new Path(pathStr);
return path;
}
/**
* IResourceVisitor responsible to format all java code in a given folder.
*
* @author <a href="mailto:goulwen.lefur@obeo.fr">Goulwen Le Fur</a>
*/
private final class ResourceVisitorFormatter implements IResourceVisitor {
private final Object codeFormatter;
private final IProgressMonitor progressMonitor;
private ResourceVisitorFormatter(Object codeFormatter,
IProgressMonitor progressMonitor) {
this.codeFormatter = codeFormatter;
this.progressMonitor = progressMonitor;
}
public boolean visit(IResource resource) throws CoreException {
try {
if (resource instanceof IFile
&& ((IFile) resource).getFileExtension().equals(
JAVA_EXT_FILE)) {
formatFile((IFile) resource, codeFormatter, progressMonitor);
}
return true;
} catch (Exception e) {
return false;
}
}
/**
* @param file
* @param codeFormatter
* @param progressMonitor
* @throws Exception
*/
private void formatFile(IFile file, Object codeFormatter,
IProgressMonitor progressMonitor) throws Exception {
URI createPlatformResourceURI = URI.createURI(file.getFullPath()
.toString(), true);
final String contentsStr = getContents(createPlatformResourceURI,
null);
String formatedContentsStr = formatCode(contentsStr, codeFormatter);
ByteArrayInputStream formatedContents = new ByteArrayInputStream(
formatedContentsStr.getBytes());
file.setContents(formatedContents, true, true, progressMonitor);
formatedContents.close();
}
}
}