Java tutorial
/******************************************************************************* * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more * details. * *******************************************************************************/ package com.liferay.ide.project.ui.wizard; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.StringPool; import com.liferay.ide.project.core.ISDKProjectsImportDataModelProperties; import com.liferay.ide.project.core.ProjectRecord; import com.liferay.ide.sdk.core.ISDKConstants; import com.liferay.ide.ui.util.SWTUtil; import java.io.File; import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.util.Collection; import java.util.HashSet; import java.util.Set; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Path; import org.eclipse.jface.layout.PixelConverter; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.IColorProvider; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.LabelProvider; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerComparator; import org.eclipse.osgi.util.NLS; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Color; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Text; import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; import org.eclipse.ui.internal.ide.StatusUtil; import org.eclipse.ui.statushandlers.StatusManager; import org.eclipse.wst.common.frameworks.datamodel.DataModelPropertyDescriptor; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.server.ui.ServerUIUtil; import org.eclipse.wst.web.ui.internal.wizards.DataModelFacetCreationWizardPage; /** * @author Greg Amerson */ @SuppressWarnings("restriction") public class SDKProjectConvertWizardPage extends DataModelFacetCreationWizardPage implements ISDKProjectsImportDataModelProperties { protected final class ProjectLabelProvider extends LabelProvider implements IColorProvider { public Color getBackground(Object element) { return null; } public Color getForeground(Object element) { ProjectRecord projectRecord = (ProjectRecord) element; if (projectRecord.hasConflicts()) { return getShell().getDisplay().getSystemColor(SWT.COLOR_GRAY); } return null; } public String getText(Object element) { return ((ProjectRecord) element).getProjectLabel(); } } public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$ protected long lastModified; protected String lastPath; protected CheckboxTreeViewer projectsList; protected Text sdkLocation; protected Text sdkVersion; protected ProjectRecord[] selectedProjects = new ProjectRecord[0]; protected Combo serverTargetCombo; protected IProject[] wsProjects; public SDKProjectConvertWizardPage(IDataModel model, String pageName) { super(model, pageName); setTitle(Msgs.convertProject); setDescription(Msgs.convertExistingProject); } public void updateProjectsList(final String path) { // on an empty path empty selectedProjects if (path == null || path.length() == 0) { setMessage(Msgs.importProjectsDescription); selectedProjects = new ProjectRecord[0]; projectsList.refresh(true); projectsList.setCheckedElements(selectedProjects); setPageComplete(projectsList.getCheckedElements().length > 0); lastPath = path; return; } final File directory = new File(path); long modified = directory.lastModified(); if (path.equals(lastPath) && lastModified == modified) { // since the file/folder was not modified and the path did not // change, no refreshing is required return; } lastPath = path; lastModified = modified; final boolean dirSelected = true; try { getContainer().run(true, true, new IRunnableWithProgress() { /* * (non-Javadoc) * @see org.eclipse.jface.operation.IRunnableWithProgress#run(org * .eclipse.core.runtime.IProgressMonitor) */ public void run(IProgressMonitor monitor) { monitor.beginTask(Msgs.searchingMessage, 100); monitor.worked(10); if (dirSelected && directory.isDirectory()) { ProjectRecord[] projectToConvert = (ProjectRecord[]) getDataModel() .getProperty(SELECTED_PROJECTS); IPath dir = new Path(directory.getPath()); if (dir.isPrefixOf(projectToConvert[0].getProjectLocation())) { selectedProjects = projectToConvert; } else { selectedProjects = new ProjectRecord[0]; } } else { monitor.worked(60); } monitor.done(); } }); } catch (InvocationTargetException e) { IDEWorkbenchPlugin.log(e.getMessage(), e); } catch (InterruptedException e) { // Nothing to do if the user interrupts. } projectsList.refresh(true); // ProjectRecord[] projects = getProjectRecords(); // boolean displayWarning = false; // for (int i = 0; i < projects.length; i++) { // if(projects[i].hasConflicts()) { // displayWarning = true; // projectsList.setGrayed(projects[i], true); // }else { // projectsList.setChecked(projects[i], true); // } // } // if (displayWarning) { // setMessage( // DataTransferMessages.WizardProjectsImportPage_projectsInWorkspace, // WARNING); // } else { // setMessage(DataTransferMessages.WizardProjectsImportPage_ImportProjectsDescription); // } if (!CoreUtil.isNullOrEmpty(selectedProjects)) { projectsList.setChecked(selectedProjects[0], true); } setPageComplete(projectsList.getCheckedElements().length > 0); if (selectedProjects.length == 0) { setMessage(Msgs.noProjectsToImport, WARNING); } Object[] checkedProjects = projectsList.getCheckedElements(); if (checkedProjects != null && checkedProjects.length > 0) { selectedProjects = new ProjectRecord[checkedProjects.length]; for (int i = 0; i < checkedProjects.length; i++) { selectedProjects[i] = (ProjectRecord) checkedProjects[i]; } getDataModel().setProperty(SELECTED_PROJECTS, selectedProjects); } } // private IProject[] getProjectsInWorkspace() { // if (wsProjects == null) { // wsProjects = // IDEWorkbenchPlugin.getPluginWorkspace().getRoot().getProjects(); // } // // return wsProjects; // } private boolean isLiferaySDKProjectDir(File file) { if (file != null && file.isDirectory() && isValidLiferayProjectDir(file)) { // check for build.xml and docroot File[] contents = file.listFiles(); boolean hasBuildXml = false; boolean hasDocroot = false; for (File content : contents) { if (content.getName().equals("build.xml") || //$NON-NLS-1$ file.getName().endsWith(ISDKConstants.HOOK_PLUGIN_PROJECT_SUFFIX)) { hasBuildXml = true; continue; } if (content.getName().equals(ISDKConstants.DEFAULT_DOCROOT_FOLDER)) { hasDocroot = true; continue; } } if (hasBuildXml && hasDocroot) { return true; } } return false; } protected boolean collectProjectsFromDirectory(Collection<File> eclipseProjectFiles, Collection<File> liferayProjectDirs, File directory, Set<String> directoriesVisited, boolean recurse, IProgressMonitor monitor) { if (monitor.isCanceled()) { return false; } monitor.subTask(NLS.bind(Msgs.checkingMessage, directory.getPath())); File[] contents = directory.listFiles(); if (contents == null) { return false; } // Initialize recursion guard for recursive symbolic links if (directoriesVisited == null) { directoriesVisited = new HashSet<String>(); try { directoriesVisited.add(directory.getCanonicalPath()); } catch (IOException exception) { StatusManager.getManager() .handle(StatusUtil.newStatus(IStatus.ERROR, exception.getLocalizedMessage(), exception)); } } // first look for project description files final String dotProject = IProjectDescription.DESCRIPTION_FILE_NAME; for (int i = 0; i < contents.length; i++) { File file = contents[i]; if (isLiferaySDKProjectDir(file)) { // recurse to see if it has project file int currentSize = eclipseProjectFiles.size(); collectProjectsFromDirectory(eclipseProjectFiles, liferayProjectDirs, contents[i], directoriesVisited, false, monitor); int newSize = eclipseProjectFiles.size(); if (newSize == currentSize) { liferayProjectDirs.add(file); } } else if (file.isFile() && file.getName().equals(dotProject)) { if (!eclipseProjectFiles.contains(file)) { eclipseProjectFiles.add(file); } // don't search sub-directories since we can't have nested // projects return true; } } // no project description found, so recurse into sub-directories for (int i = 0; i < contents.length; i++) { if (contents[i].isDirectory()) { if (!contents[i].getName().equals(METADATA_FOLDER)) { try { String canonicalPath = contents[i].getCanonicalPath(); if (!directoriesVisited.add(canonicalPath)) { // already been here --> do not recurse continue; } } catch (IOException exception) { StatusManager.getManager().handle( StatusUtil.newStatus(IStatus.ERROR, exception.getLocalizedMessage(), exception)); } // dont recurse directories that we have already determined // are Liferay projects if (!liferayProjectDirs.contains(contents[i]) && recurse) { collectProjectsFromDirectory(eclipseProjectFiles, liferayProjectDirs, contents[i], directoriesVisited, recurse, monitor); } } } } return true; } protected void createProjectsList(Composite workArea) { Label title = new Label(workArea, SWT.NONE); title.setText(Msgs.importProjectLabel); title.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false, 3, 1)); // Composite listComposite = new Composite(workArea, SWT.NONE); // GridLayout layout = new GridLayout(); // layout.numColumns = 2; // layout.marginWidth = 0; // layout.makeColumnsEqualWidth = false; // listComposite.setLayout(layout); // GridData gd = new GridData(GridData.GRAB_HORIZONTAL // | GridData.GRAB_VERTICAL | GridData.FILL_BOTH); // gd.grabExcessHorizontalSpace = true; // gd.horizontalSpan = 3; // listComposite.setLayoutData(gd); projectsList = new CheckboxTreeViewer(workArea, SWT.BORDER); GridData gridData = new GridData(SWT.FILL, SWT.FILL, true, true, 3, 1); gridData.widthHint = new PixelConverter(projectsList.getControl()).convertWidthInCharsToPixels(25); gridData.heightHint = new PixelConverter(projectsList.getControl()).convertHeightInCharsToPixels(10); projectsList.getControl().setLayoutData(gridData); projectsList.setContentProvider(new ITreeContentProvider() { public void dispose() { } public Object[] getChildren(Object parentElement) { return null; } public Object[] getElements(Object inputElement) { // return getProjectRecords(); return (Object[]) getDataModel().getProperty(SELECTED_PROJECTS); } public Object getParent(Object element) { return null; } public boolean hasChildren(Object element) { return false; } public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { } }); projectsList.setLabelProvider(new ProjectLabelProvider()); projectsList.addCheckStateListener(new ICheckStateListener() { /* * (non-Javadoc) * @see org.eclipse.jface.viewers.ICheckStateListener#checkStateChanged * (org.eclipse.jface.viewers.CheckStateChangedEvent) */ public void checkStateChanged(CheckStateChangedEvent event) { ProjectRecord element = (ProjectRecord) event.getElement(); if (element.hasConflicts()) { projectsList.setChecked(element, false); } getDataModel().setProperty(SELECTED_PROJECTS, projectsList.getCheckedElements()); setPageComplete(projectsList.getCheckedElements().length > 0); } }); projectsList.setInput(this); projectsList.setComparator(new ViewerComparator()); } protected void createSDKLocationField(Composite topComposite) { SWTUtil.createLabel(topComposite, SWT.LEAD, Msgs.liferayPluginSDKLocationLabel, 1); sdkLocation = SWTUtil.createText(topComposite, 2); this.synchHelper.synchText(sdkLocation, SDK_LOCATION, null); } protected void createSDKVersionField(Composite topComposite) { SWTUtil.createLabel(topComposite, SWT.LEAD, Msgs.liferayPluginSDKVersionLabel, 1); sdkVersion = SWTUtil.createText(topComposite, 2); this.synchHelper.synchText(sdkVersion, SDK_VERSION, null); SWTUtil.createLabel(topComposite, StringPool.EMPTY, 1); } protected void createTargetRuntimeGroup(Composite parent) { Label label = new Label(parent, SWT.NONE); label.setText(Msgs.liferayTargetRuntimeLabel); label.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING)); serverTargetCombo = new Combo(parent, SWT.BORDER | SWT.READ_ONLY); serverTargetCombo.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); Button newServerTargetButton = new Button(parent, SWT.NONE); newServerTargetButton.setText(Msgs.newButton); newServerTargetButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { final DataModelPropertyDescriptor[] preAdditionDescriptors = model .getValidPropertyDescriptors(FACET_RUNTIME); boolean isOK = ServerUIUtil.showNewRuntimeWizard(getShell(), getModuleTypeID(), null, "com.liferay."); //$NON-NLS-1$ if (isOK) { DataModelPropertyDescriptor[] postAdditionDescriptors = model .getValidPropertyDescriptors(FACET_RUNTIME); Object[] preAddition = new Object[preAdditionDescriptors.length]; for (int i = 0; i < preAddition.length; i++) { preAddition[i] = preAdditionDescriptors[i].getPropertyValue(); } Object[] postAddition = new Object[postAdditionDescriptors.length]; for (int i = 0; i < postAddition.length; i++) { postAddition[i] = postAdditionDescriptors[i].getPropertyValue(); } Object newAddition = CoreUtil.getNewObject(preAddition, postAddition); if (newAddition != null) { // can this ever be null? model.setProperty(FACET_RUNTIME, newAddition); } } } }); Control[] deps = new Control[] { newServerTargetButton }; synchHelper.synchCombo(serverTargetCombo, FACET_RUNTIME, deps); if (serverTargetCombo.getSelectionIndex() == -1 && serverTargetCombo.getVisibleItemCount() != 0) { serverTargetCombo.select(0); } } @Override protected Composite createTopLevelComposite(Composite parent) { Composite topComposite = SWTUtil.createTopComposite(parent, 1); GridLayout gl = new GridLayout(3, false); // gl.marginLeft = 5; topComposite.setLayout(gl); topComposite.setLayoutData(new GridData(SWT.FILL, SWT.CENTER, true, false, 1, 1)); createSDKLocationField(topComposite); createSDKVersionField(topComposite); SWTUtil.createVerticalSpacer(topComposite, 1, 3); createProjectsList(topComposite); createTargetRuntimeGroup(topComposite); return topComposite; } @Override protected void enter() { super.enter(); if (sdkLocation.getText() != null) { updateProjectsList(sdkLocation.getText()); } } @Override protected String[] getValidationPropertyNames() { return new String[] { SDK_LOCATION, SDK_VERSION, SELECTED_PROJECTS, FACET_RUNTIME }; } protected boolean isValidLiferayProjectDir(File dir) { String name = dir.getName(); if (name.endsWith(ISDKConstants.PORTLET_PLUGIN_PROJECT_SUFFIX) || name.endsWith(ISDKConstants.EXT_PLUGIN_PROJECT_SUFFIX) || name.endsWith(ISDKConstants.HOOK_PLUGIN_PROJECT_SUFFIX)) { return true; } return false; } private static class Msgs extends NLS { public static String checkingMessage; public static String convertExistingProject; public static String convertProject; public static String importProjectLabel; public static String importProjectsDescription; public static String liferayPluginSDKLocationLabel; public static String liferayPluginSDKVersionLabel; public static String liferayTargetRuntimeLabel; public static String newButton; public static String noProjectsToImport; public static String searchingMessage; static { initializeMessages(SDKProjectConvertWizardPage.class.getName(), Msgs.class); } } }