Java tutorial
/* ---------------------------------------------------------------- * 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) { } }