package com.xaraya.wizard; import java.io.ByteArrayInputStream; import java.io.InputStream; import java.io.PipedInputStream; import java.io.PipedOutputStream; import java.io.PrintStream; import java.util.ArrayList; import java.util.Iterator; import java.util.StringTokenizer; import net.sourceforge.phpdt.internal.ui.util.StringUtil; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.IResourceStatus; import org.eclipse.core.resources.IWorkspace; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; import org.eclipse.core.runtime.SubProgressMonitor; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; import org.eclipse.ui.actions.WorkspaceModifyOperation; import org.eclipse.ui.dialogs.ContainerGenerator; import org.eclipse.ui.help.WorkbenchHelp; import org.eclipse.ui.internal.IHelpContextIds; import org.eclipse.ui.internal.WorkbenchMessages; import org.eclipse.ui.internal.WorkbenchPlugin; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.ui.internal.ide.misc.ResourceAndContainerGroup; public class XarayaModuleContainerPage extends WizardPage implements Listener { private static final int SIZING_CONTAINER_GROUP_HEIGHT = 250; private IStructuredSelection currentSelection; private IContainer currentParent; NewXarayaResourceWizard wizard; private IPath newModulePath; private IFolder newModule; // widgets private ResourceAndContainerGroup resourceGroup; public XarayaModuleContainerPage(String pageName, IStructuredSelection selection) { super(XarayaModuleMessages.getString("Xaraya.label.container")); setTitle(pageName); setDescription(XarayaModuleMessages.getString("Xaraya.label.container")); this.currentSelection = selection; } public void createControl(Composite parent) { initializeDialogUnits(parent); // top level group Composite composite = new Composite(parent,SWT.NONE); composite.setFont(parent.getFont()); composite.setLayout(new GridLayout()); composite.setLayoutData(new GridData( GridData.VERTICAL_ALIGN_FILL | GridData.HORIZONTAL_ALIGN_FILL)); WorkbenchHelp.setHelp(composite, IHelpContextIds.NEW_FOLDER_WIZARD_PAGE); resourceGroup = new ResourceAndContainerGroup(composite,this, XarayaModuleMessages.getString("Xaraya.label.container"), XarayaModuleMessages.getString("Xaraya.label.modversionname"), false, SIZING_CONTAINER_GROUP_HEIGHT); //$NON-NLS-2$ //$NON-NLS-1$ resourceGroup.setAllowExistingResources(false); initializePage(); validatePage(); // Show description on opening setErrorMessage(null); setMessage(null); setControl(composite); } protected void createFolder(IFolder folderHandle, IProgressMonitor monitor) throws CoreException { try { // Create the folder resource in the workspace // Update: Recursive to create any folders which do not exist already if (!folderHandle.exists()) { IContainer parent= folderHandle.getParent(); if (parent instanceof IFolder && (!((IFolder)parent).exists())) { createFolder((IFolder)parent, monitor); } folderHandle.create(false, true, monitor); } } catch (CoreException e) { // If the folder already existed locally, just refresh to get contents if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) folderHandle.refreshLocal(IResource.DEPTH_INFINITE, new SubProgressMonitor(monitor, 500)); else throw e; } if (monitor.isCanceled()) throw new OperationCanceledException(); } protected IFolder createFolderHandle(IPath folderPath) { return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFolder(folderPath); } public IFolder createNewModuleFolder() { if (newModule != null) return newModule; // create the new folder and cache it if successful final IPath containerPath = resourceGroup.getContainerFullPath(); newModulePath = containerPath.append(resourceGroup.getResource()); final IFolder newModuleHandle = createFolderHandle(newModulePath); WorkspaceModifyOperation op = new WorkspaceModifyOperation() { public void execute(IProgressMonitor monitor) throws CoreException { try { monitor.beginTask(WorkbenchMessages.getString("WizardNewFolderCreationPage.progress"), 2000); //$NON-NLS-1$ ContainerGenerator generator = new ContainerGenerator(containerPath); generator.generateContainer(new SubProgressMonitor(monitor, 1000)); createFolder(newModuleHandle, new SubProgressMonitor(monitor, 1000)); } finally { monitor.done(); } } }; try { getContainer().run(true, true, op); } catch (Exception e) { return null; } newModule = newModuleHandle; return newModule; } public boolean createNewGuiFolder() { final IPath containerPath = newModulePath; IPath newFolderPath = containerPath.append(XarayaModuleMessages.getString("Xaraya.folder.gui")); final IFolder newFolderHandle = createFolderHandle(newFolderPath); WorkspaceModifyOperation op = new WorkspaceModifyOperation() { public void execute(IProgressMonitor monitor) throws CoreException { try { monitor.beginTask(WorkbenchMessages.getString("WizardNewFolderCreationPage.progress"), 2000); //$NON-NLS-1$ ContainerGenerator generator = new ContainerGenerator(containerPath); generator.generateContainer(new SubProgressMonitor(monitor, 1000)); createFolder(newFolderHandle, new SubProgressMonitor(monitor, 1000)); } finally { monitor.done(); } } }; try { getContainer().run(true, true, op); } catch (Exception e) { return false; } return true; } protected void createFile(IFile fileHandle, InputStream contents, IProgressMonitor monitor) throws CoreException { if (contents == null) contents = new ByteArrayInputStream(new byte[0]); try { fileHandle.create(contents, false, monitor); } catch (CoreException e) { // If the file already existed locally, just refresh to get contents if (e.getStatus().getCode() == IResourceStatus.PATH_OCCUPIED) fileHandle.refreshLocal(IResource.DEPTH_ZERO, null); else throw e; } if (monitor.isCanceled()) throw new OperationCanceledException(); } protected IFile createFileHandle(IPath filePath) { return IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getFile(filePath); } public Object[] createNewModuleFiles(){ ArrayList fileAL = new ArrayList(); boolean isGuiDirCreated = false; fileAL.add(createNewFile(XarayaModuleMessages.getString("Xaraya.files.init"))); fileAL.add(createNewFile(XarayaModuleMessages.getString("Xaraya.files.version"))); if (XarayaVersionModel.isAdminApi()) fileAL.add(createNewFile(XarayaModuleMessages.getString("Xaraya.files.adminApi"))); if (XarayaVersionModel.isAdminGui()) { fileAL.add(createNewFile(XarayaModuleMessages.getString("Xaraya.files.adminGui"))); isGuiDirCreated=createNewGuiFolder(); } if (XarayaVersionModel.isUserApi()) fileAL.add(createNewFile(XarayaModuleMessages.getString("Xaraya.files.userApi"))); if (XarayaVersionModel.isUserGui()) { fileAL.add(createNewFile(XarayaModuleMessages.getString("Xaraya.files.userGui"))); if (!isGuiDirCreated) isGuiDirCreated=createNewGuiFolder(); } return fileAL.toArray(); } public IFile createNewFile(String fileName) { final IPath containerPath = newModulePath; IPath newFilePath = containerPath.append(fileName); final IFile newFileHandle = createFileHandle(newFilePath); final InputStream initialContents = getInitialContents(fileName); WorkspaceModifyOperation op = new WorkspaceModifyOperation() { protected void execute(IProgressMonitor monitor) throws CoreException, InterruptedException { try { monitor.beginTask("Progress", 2000); //$NON-NLS-1$ ContainerGenerator generator = new ContainerGenerator(containerPath); generator.generateContainer(new SubProgressMonitor(monitor, 1000)); createFile(newFileHandle,initialContents, new SubProgressMonitor(monitor, 1000)); } finally { monitor.done(); } } }; try { getContainer().run(true, true, op); } catch (Exception e) { return null; } return newFileHandle; } protected InputStream getInitialContents(String fileName) { StringBuffer inputString = new StringBuffer(); if (fileName.equals(XarayaModuleMessages.getString("Xaraya.files.init"))) inputString=XarayaModuleText.xarinit; if (fileName.equals(XarayaModuleMessages.getString("Xaraya.files.adminGui"))) inputString=XarayaModuleText.xaradmin; if (fileName.equals(XarayaModuleMessages.getString("Xaraya.files.adminApi"))) inputString=XarayaModuleText.xaradminapi; if (fileName.equals(XarayaModuleMessages.getString("Xaraya.files.userGui"))) inputString=XarayaModuleText.xaruser; if (fileName.equals(XarayaModuleMessages.getString("Xaraya.files.userApi"))) inputString=XarayaModuleText.xaruserapi; if (fileName.equals(XarayaModuleMessages.getString("Xaraya.files.version"))) inputString=XarayaModuleText.xarversion; ArrayList inserts = new ArrayList(); //makes things simpler to just refer to the arraylist... inserts.add(XarayaModuleMessages.getString("Xaraya.insert.name")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.id")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.version")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.description")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.official")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.author")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.contact")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.admin")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.user")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.securityschema")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.class")); inserts.add(XarayaModuleMessages.getString("Xaraya.insert.category")); ArrayList names = new ArrayList(); names.add(XarayaVersionModel.getModversionname()); names.add(XarayaVersionModel.getModversionid()); names.add(XarayaVersionModel.getModversionversion()); names.add(XarayaVersionModel.getModversiondescription()); names.add(XarayaVersionModel.getModversionofficial()); names.add(XarayaVersionModel.getModversionauthor()); names.add(XarayaVersionModel.getModversioncontact()); names.add(XarayaVersionModel.getModversionadmin()); names.add(XarayaVersionModel.getModversionuser()); names.add(XarayaVersionModel.getModversionsecurityschema()); names.add(XarayaVersionModel.getModversionclass()); names.add(XarayaVersionModel.getModversioncategory()); PipedOutputStream ps = null; PipedInputStream is = null; String buffer = inputString.toString(); for (int i=0; i 0) nameStatus = workspace.validateName(folderName, IResource.FOLDER); if (nameStatus != null && !nameStatus.isOK()) { setErrorMessage(nameStatus.getMessage()); return false; } if (!resourceGroup.areAllValuesValid()) { // if blank name then fail silently if (resourceGroup.getProblemType() == ResourceAndContainerGroup.PROBLEM_RESOURCE_EMPTY || resourceGroup.getProblemType() == ResourceAndContainerGroup.PROBLEM_CONTAINER_EMPTY) { setMessage(resourceGroup.getProblemMessage()); setErrorMessage(null); } else { setErrorMessage(resourceGroup.getProblemMessage()); } valid = false; } if (valid) { XarayaVersionModel.setModversionname(moduleName); setErrorMessage(null); } return valid; } }