package org.jboss.tools.seam.ui.wizard; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.apache.tools.ant.types.FilterSet; import org.apache.tools.ant.types.FilterSetCollection; import org.apache.tools.ant.types.resources.FileResource; import org.apache.tools.ant.types.resources.StringResource; import org.apache.tools.ant.util.ResourceUtils; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.datatools.connectivity.IConnectionProfile; import org.eclipse.datatools.connectivity.ProfileManager; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.dialogs.WizardNewFileCreationPage; import org.eclipse.ui.ide.IDE; import org.eclipse.ui.internal.dialogs.DialogUtil; import org.eclipse.ui.internal.wizards.newresource.ResourceMessages; import org.eclipse.ui.wizards.newresource.BasicNewResourceWizard; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.jboss.tools.common.ui.IValidator; import org.jboss.tools.common.ui.widget.editor.IFieldEditor; import org.jboss.tools.seam.core.ISeamProject; import org.jboss.tools.seam.core.SeamCorePlugin; import org.jboss.tools.seam.core.SeamProjectsSet; import org.jboss.tools.seam.core.project.facet.SeamProjectPreferences; import org.jboss.tools.seam.core.project.facet.SeamRuntime; import org.jboss.tools.seam.core.project.facet.SeamRuntimeManager; import org.jboss.tools.seam.internal.core.project.facet.ISeamFacetDataModelProperties; import org.jboss.tools.seam.internal.core.project.facet.SeamFacetFilterSetFactory; import org.jboss.tools.seam.internal.core.project.facet.SeamFacetInstallDataModelProvider; import org.jboss.tools.seam.internal.core.project.facet.SeamFacetPreInstallDelegate; import org.jboss.tools.seam.internal.core.project.facet.SeamValidatorFactory; public class SeamDSXMLWizard extends BasicNewResourceWizard { public static final String WIZARD_ID = "org.jboss.tools.seam.ui.wizard.SeamDSXMLWizard"; //$NON-NLS-1$ WizardNewDSXMLFileCreationPage mainPage; private boolean fOpenEditorOnFinish; public SeamDSXMLWizard() { } public void addPages() { super.addPages(); mainPage = new WizardNewDSXMLFileCreationPage("newFilePage1", getSelection()); mainPage.setTitle("New DS XML"); addPage(mainPage); } @Override public boolean performFinish() { IFile file = mainPage.createNewFile(); if (file == null) { return false; } selectAndReveal(file); if (fOpenEditorOnFinish) { // Open editor on new file. IWorkbenchWindow dw = getWorkbench().getActiveWorkbenchWindow(); try { if (dw != null) { IWorkbenchPage page = dw.getActivePage(); if (page != null) { IDE.openEditor(page, file, true); } } } catch (PartInitException e) { DialogUtil.openError(dw.getShell(), ResourceMessages.FileResource_errorMessage, e.getMessage(), e); } } return true; } class WizardNewDSXMLFileCreationPage extends WizardNewFileCreationPage { private IFieldEditor connProfileSelEditor; public WizardNewDSXMLFileCreationPage(String pageName, IStructuredSelection selection) { super(pageName, selection); } protected InputStream getInitialContents() { Object connection = connProfileSelEditor.getValue(); // 1. Find template. For Seam project it is done by its runtime. IPath containerPath = getContainerFullPath(); IProject currentProject = ResourcesPlugin.getWorkspace().getRoot().getFolder(containerPath).getProject(); SeamProjectsSet set = new SeamProjectsSet(currentProject); IProject project = set.getWarProject(); if(project == null) { return null; } ISeamProject seamProject = SeamCorePlugin.getSeamProject(project, true); if(seamProject == null) { return null; } SeamRuntime seamRuntime = SeamRuntimeManager.getInstance().findRuntimeByName(seamProject.getRuntimeName()); String seamHomePath = seamRuntime.getHomeDir(); File dataSourceDsFile = new File(seamHomePath + "/seam-gen/resources/datasource-ds.xml"); //$NON-NLS-1$ //2. Create filter set for Ant. FilterSetCollection viewFilterSetCollection = new FilterSetCollection(); // For Seam project set is filled by reusing data model provider. SeamFacetInstallDataModelProvider provider = new SeamFacetInstallDataModelProvider(); IDataModel model = (IDataModel)provider.create(); model.setProperty(ISeamFacetDataModelProperties.SEAM_PROJECT_NAME, project.getName()); model.setProperty(ISeamFacetDataModelProperties.SEAM_CONNECTION_PROFILE, connection); IConnectionProfile connProfile = ProfileManager.getInstance().getProfileByName(connection.toString()); if(connProfile == null) { return null; } try { new SeamFacetPreInstallDelegate().execute(project, null, model, new NullProgressMonitor()); } catch (CoreException e) { SeamCorePlugin.getDefault().logError(e); return null; } FilterSet jdbcFilterSet = SeamFacetFilterSetFactory.createJdbcFilterSet(model); FilterSet projectFilterSet = SeamFacetFilterSetFactory.createProjectFilterSet(model); viewFilterSetCollection.addFilterSet(jdbcFilterSet); viewFilterSetCollection.addFilterSet(projectFilterSet); try { // 3. Run Ant - copy template with replaces to StringResource. StringResource sr = new StringResource(); ResourceUtils.copyResource(new FileResource(dataSourceDsFile), sr, viewFilterSetCollection, null, true, false, false, null, null, null, false); // 4. Return input stream for new ds file taken from temp file. return sr.getInputStream(); } catch (IOException e) { SeamCorePlugin.getDefault().logError(e); return null; } } public void createControl(Composite parent) { super.createControl(parent); Composite topLevel = (Composite)getControl(); connProfileSelEditor = SeamWizardFactory.createConnectionProfileSelectionFieldEditor(getConnectionProfileDefaultValue(), new IValidator() { public Map<String, IStatus> validate(Object value, Object context) { validatePage(); return SeamValidatorFactory.NO_ERRORS; } }); Composite q = new Composite(topLevel, 0); GridLayout l = new GridLayout(4, false); q.setLayout(l); connProfileSelEditor.doFillIntoGrid(q); // sync.register(connProfileSelEditor); validatePage(); } } /** * @return */ private Object getConnectionProfileDefaultValue() { String defaultDs = SeamProjectPreferences .getStringPreference(SeamProjectPreferences.SEAM_DEFAULT_CONNECTION_PROFILE); return getConnectionProfileNameList().contains(defaultDs) ? defaultDs : ""; //$NON-NLS-1$ } private static List<String> getConnectionProfileNameList() { IConnectionProfile[] profiles = ProfileManager.getInstance() .getProfilesByCategory( "org.eclipse.datatools.connectivity.db.category"); //$NON-NLS-1$ List<String> names = new ArrayList<String>(); for (IConnectionProfile connectionProfile : profiles) { names.add(connectionProfile.getName()); } return names; } }