/* ----------------------------------------------------------------
* Original File Name: GenModelGenerateDoctrineActionDelegate.java
* Creation Date: 2012-10-08
* Description: GenModelGenerateDoctrineActionDelegate
* ----------------------------------------------------------------
* ----------------------------------------------------------------
* Copyright (c) 2010 BestSolution.at EDV Systemhaus GmbH
* All Rights Reserved.
*
* BestSolution.at MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE
* SUITABILITY OF THE SOFTWARE , EITHER EXPRESS OR IMPLIED, INCLUDING
* BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT.
* BestSolution.at SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY
* LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS
* SOFTWARE OR ITS DERIVATIVES.
*
* This software must not be used, redistributed or based from in
* any other than the designated way without prior explicit written
* permission by BestSolution.at.
* -----------------------------------------------------------------
* -----------------------------------------------------------------
* $HeadURL: $
* $Revision: $
* Creator: martin.bluehweis@bestsolution.at
* Creation Date: 2012-10-08
*
* $LastChangedDate: $
* $LastChangedBy: $
* ----------------------------------------------------------------
*/
package at.bestsolution.persistence.emap.ecoregenerator;
import java.io.ByteArrayInputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.emf.codegen.ecore.genmodel.GenClass;
import org.eclipse.emf.codegen.ecore.genmodel.GenModel;
import org.eclipse.emf.codegen.ecore.genmodel.GenPackage;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EReference;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.widgets.Event;
import org.eclipse.ui.IEditorActionDelegate;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.actions.ActionDelegate;
import org.eclipse.ui.internal.EditorPluginAction;
import at.bestsolution.persistence.emap.ecoregenerator.generator.EClassMetaInfo;
import at.bestsolution.persistence.emap.ecoregenerator.generator.EMAPGenerator;
import at.bestsolution.persistence.emap.ecoregenerator.generator.TypeDefinition;
import at.bestsolution.persistence.emap.ecoregenerator.i18n.Messages;
import at.bestsolution.persistence.emap.ecoregenerator.preferences.PreferenceHelper;
/**
* GenModelGenerateDoctrineActionDelegate.
*/
@SuppressWarnings( "restriction" )
public class GenModelGenerateDoctrineActionDelegate extends ActionDelegate implements IEditorActionDelegate {
/**
* type mapping.
*/
public static final HashMap<String, TypeDefinition> TYPE_MAPPING = new HashMap<String, TypeDefinition>();
static {
TYPE_MAPPING.put( "EInt", new TypeDefinition( "int", "integer" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EInteger", new TypeDefinition( "int", "integer" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EString", new TypeDefinition( "string", "string" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "ELong", new TypeDefinition( "long", "bigint" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EBoolean", new TypeDefinition( "boolean", "boolean" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EDate", new TypeDefinition( "date", "datetime" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EDouble", new TypeDefinition( "double", "decimal" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EBigDecimal", new TypeDefinition( "double", "decimal" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
TYPE_MAPPING.put( "EByteArray", new TypeDefinition( "blob", "blob" ) ); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
@Override
public final void runWithEvent( final IAction action, final Event event ) {
if ( action instanceof EditorPluginAction ) {
ISelection s = ( (EditorPluginAction) action ).getSelection();
if ( s instanceof IStructuredSelection && !s.isEmpty() && ( (IStructuredSelection) s ).getFirstElement() instanceof GenModel ) {
try {
GenModel genModel = (GenModel) ( (IStructuredSelection) s ).getFirstElement();
IProject[] allProjects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
List<IProject> emapProjects = new ArrayList<IProject>();
for ( IProject p : allProjects ) {
if ( p.isOpen() && p.getNature( Messages.GenModelGenerateDoctrineActionDelegate_5 ) != null && p.getNature( "org.eclipse.xtext.ui.shared.xtextNature" ) != null ) {
emapProjects.add( p );
}
}
if ( emapProjects.isEmpty() ) {
MessageDialog.openError( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.GenModelGenerateDoctrineActionDelegate_6, Messages.GenModelGenerateDoctrineActionDelegate_7 );
}
else {
GeneratorOptionsDialog dlg = new GeneratorOptionsDialog( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), emapProjects );
if ( dlg.open() == IDialogConstants.OK_ID ) {
final IProject project = dlg.getSelectedProject();
if ( !project.exists() ) {
project.create( new NullProgressMonitor() );
}
if ( !project.isOpen() ) {
project.open( new NullProgressMonitor() );
}
final HashMap<EClass, EClassMetaInfo> metaInfo = new HashMap<EClass, EClassMetaInfo>();
try {
IFolder srcFolder = dlg.getSelectedFolder();
for ( GenPackage pack : genModel.getGenPackages() ) {
collectMetaPackageCode( metaInfo, project, srcFolder, srcFolder, pack );
}
for ( GenPackage pack : genModel.getGenPackages() ) {
generatePackageCode( metaInfo, project, srcFolder, pack );
}
}
finally {
metaInfo.clear();
}
}
}
}
catch ( CoreException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
MessageDialog.openError( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.GenModelGenerateDoctrineActionDelegate_8, Messages.GenModelGenerateDoctrineActionDelegate_9 );
}
}
else {
MessageDialog.openError( PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), Messages.GenModelGenerateDoctrineActionDelegate_10, Messages.GenModelGenerateDoctrineActionDelegate_11 );
}
}
/**
* collectMetaPackageCode.
*
* @param metaInfo
* metaInfo
* @param project
* project
* @param srcRootFolder
* srcParentFolder
* @param genParentFolder
* genParentFolder
* @param pack
* package
* @throws CoreException
* CoreException
*/
private void collectMetaPackageCode( final HashMap<EClass, EClassMetaInfo> metaInfo, final IProject project, final IFolder srcRootFolder, final IFolder srcFolder, final GenPackage pack ) throws CoreException {
IFolder packageSrcFolder = srcRootFolder.getFolder( new Path( pack.getBasePackage().toLowerCase().replaceAll( "\\.", "/" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$
for ( GenPackage subPack : pack.getNestedGenPackages() ) {
collectMetaPackageCode( metaInfo, project, srcRootFolder, packageSrcFolder, subPack );
}
for ( GenClass genClass : pack.getGenClasses() ) {
if ( !genClass.isDynamic() ) {
EClassMetaInfo info = metaInfo.get( genClass.getEcoreClass() );
if ( info == null ) {
info = new EClassMetaInfo();
metaInfo.put( genClass.getEcoreClass(), info );
}
info.setSrcFolder( packageSrcFolder.getFolder( new Path( pack.getPrefix().toLowerCase() ) ) );
info.setSrcClassName( genClass.getEcoreClass().getName() );
info.setSrcNamespace( info.getSrcFolder().getFullPath().makeRelativeTo( srcRootFolder.getFullPath() ).toString().replaceAll( "/", "." ) );
info.setGenNamespace( info.getSrcNamespace() );
info.setGenClassName( PreferenceHelper.getPrefixGeneratedClasses() + genClass.getEcoreClass().getName() );
info.setInputFilterClassName( info.getSrcClassName() + new Path( PreferenceHelper.getPostfixInputFilterClasses() ) );
for ( EReference ref : genClass.getEcoreClass().getEAllReferences() ) {
if ( ref.isMany() ) {
EClassMetaInfo mi = metaInfo.get( ref.getEReferenceType() );
if ( mi == null ) {
mi = new EClassMetaInfo();
metaInfo.put( ref.getEReferenceType(), mi );
}
mi.getQueries().add( ref );
}
}
}
}
}
private void createFolderIfNotExists( IFolder folder ) throws CoreException {
List<IFolder> structure = new ArrayList<>();
if ( folder.toString().contains( "Basedata" ) ) {
System.err.println();
}
while ( !folder.exists() ) {
structure.add( 0, folder );
if ( folder.getParent() instanceof IFolder ) {
folder = (IFolder) folder.getParent();
}
else {
throw new IllegalArgumentException( "Unexpected structure: " + folder );
}
}
for ( IFolder f : structure ) {
f.create( true, true, null );
}
}
/**
* generatePackageCode.
*
* @param metaInfo
* metaInfo
* @param project
* project
* @param srcParentFolder
* srcParentFolder
* @param genParentFolder
* genParentFolder
* @param pack
* package
* @throws CoreException
* CoreException
*/
private void generatePackageCode( final HashMap<EClass, EClassMetaInfo> metaInfo, final IProject project, final IFolder srcParentFolder, final GenPackage pack ) throws CoreException {
for ( GenPackage subPack : pack.getNestedGenPackages() ) {
IFolder subSrcFolder = srcParentFolder; // srcParentFolder.getFolder( new Path( subPack.getBasePackage().toLowerCase().replaceAll( "\\.", "/" ) ) ); //$NON-NLS-1$ //$NON-NLS-2$
generatePackageCode( metaInfo, project, subSrcFolder, subPack );
}
for ( GenClass genClass : pack.getGenClasses() ) {
if ( !genClass.isDynamic() && !genClass.isInterface() && !genClass.isAbstract() ) {
try {
// createFolderIfNotExists( metaInfo.get( genClass.getEcoreClass() ).getSrcFolder() );
{
String genContent = new EMAPGenerator().generate( genClass, metaInfo, TYPE_MAPPING ).toString();
IFile genOutFile = srcParentFolder.getFile( new Path( metaInfo.get( genClass.getEcoreClass() ).getGenClassName() + ".emap" ) ); //$NON-NLS-1$
if ( !genOutFile.exists() ) {
try {
genOutFile.create( new ByteArrayInputStream( genContent.getBytes() ), true, new NullProgressMonitor() );
}
catch ( CoreException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else {
try {
genOutFile.setContents( new ByteArrayInputStream( genContent.getBytes() ), IResource.KEEP_HISTORY | IResource.FORCE, new NullProgressMonitor() );
}
catch ( CoreException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// ICompilationUnit cu = null;
format( genOutFile );
}
}
catch ( Exception e ) {
// TODO Auto-generated catch block
System.err.println( Messages.GenModelGenerateDoctrineActionDelegate_15 + genClass.getEcoreClass().getName() );
e.printStackTrace();
}
}
}
}
private void format( IFile genOutFile ) {
// try {
// }
// catch ( IOException e ) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
// catch ( CoreException e ) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
}
@Override
public void setActiveEditor( final IAction action, final IEditorPart targetEditor ) {
}
}