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.core.facet; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.FileListing; import com.liferay.ide.project.core.ProjectCore; import com.liferay.ide.sdk.core.ISDKConstants; import com.liferay.ide.sdk.core.SDK; import com.liferay.ide.sdk.core.SDKManager; import com.liferay.ide.server.util.ServerUtil; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.util.List; import org.eclipse.core.resources.IContainer; 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.IWorkspace; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.core.runtime.Platform; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jst.common.project.facet.core.libprov.LibraryInstallDelegate; import org.eclipse.jst.j2ee.project.facet.IJ2EEFacetConstants; import org.eclipse.jst.j2ee.project.facet.IJ2EEModuleFacetInstallDataModelProperties; import org.eclipse.wst.common.componentcore.ComponentCore; import org.eclipse.wst.common.componentcore.datamodel.FacetInstallDataModelProvider; import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetDataModelProperties; import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties; import org.eclipse.wst.common.componentcore.internal.util.IModuleConstants; import org.eclipse.wst.common.componentcore.resources.IVirtualComponent; import org.eclipse.wst.common.componentcore.resources.IVirtualFolder; import org.eclipse.wst.common.frameworks.datamodel.IDataModel; import org.eclipse.wst.common.project.facet.core.IDelegate; import org.eclipse.wst.common.project.facet.core.IFacetedProject.Action; import org.eclipse.wst.common.project.facet.core.IFacetedProjectWorkingCopy; import org.eclipse.wst.common.project.facet.core.IProjectFacetVersion; import org.eclipse.wst.common.project.facet.core.runtime.IRuntime; /** * @author Greg Amerson */ @SuppressWarnings("restriction") public abstract class PluginFacetInstall implements IDelegate, IPluginProjectDataModelProperties { protected static final String DEFAULT_DEPLOY_PATH = "/WEB-INF/classes"; //$NON-NLS-1$ /** * copied from ProjectFacetPreferencesGroup */ private static final String PATH_IN_PROJECT = ".settings/org.eclipse.wst.common.project.facet.core.prefs.xml"; //$NON-NLS-1$ protected IDataModel masterModel = null; protected IDataModel model = null; protected IProgressMonitor monitor; protected IProject project; protected void configureDeploymentAssembly(final String srcPath, final String deployPath) { IVirtualComponent vProject = ComponentCore.createComponent(this.project); IVirtualFolder vProjectFolder = vProject.getRootFolder(); IVirtualFolder deployFolder = vProjectFolder.getFolder(new Path(deployPath)); try { deployFolder.createLink(new Path(srcPath), IResource.FORCE, null); } catch (CoreException e) { ProjectCore.logError("Unable to create link", e); //$NON-NLS-1$ } try { IPath outputLocation = JavaCore.create(this.project).getOutputLocation(); vProject.setMetaProperty(IModuleConstants.PROJ_REL_JAVA_OUTPUT_PATH, outputLocation.toPortableString()); } catch (JavaModelException e) { ProjectCore.logError("Unable to set java-ouput-path", e); //$NON-NLS-1$ } } protected void copyToProject(IPath parent, File newFile) throws CoreException, IOException { if (newFile == null || !shouldCopyToProject(newFile)) { return; } IResource projectEntry = null; IPath newFilePath = new Path(newFile.getPath()); IPath newFileRelativePath = newFilePath.makeRelativeTo(parent); if (newFile.isDirectory()) { projectEntry = this.project.getFolder(newFileRelativePath); } else { projectEntry = this.project.getFile(newFileRelativePath); } if (projectEntry.exists()) { if (projectEntry instanceof IFolder) { // folder already exists, we can return return; } else if (projectEntry instanceof IFile) { ((IFile) projectEntry).setContents(new FileInputStream(newFile), IResource.FORCE, null); } } else if (projectEntry instanceof IFolder) { IFolder newProjectFolder = (IFolder) projectEntry; newProjectFolder.create(true, true, null); } else if (projectEntry instanceof IFile) { ((IFile) projectEntry).create(new FileInputStream(newFile), IResource.FORCE, null); } } protected boolean deletePath(IPath path) { if (path != null && path.toFile().exists()) { return path.toFile().delete(); } return false; } @Override public void execute(IProject project, IProjectFacetVersion fv, Object config, IProgressMonitor monitor) throws CoreException { if (!(config instanceof IDataModel)) { return; } else { this.model = (IDataModel) config; this.masterModel = (IDataModel) this.model.getProperty(FacetInstallDataModelProvider.MASTER_PROJECT_DM); this.project = project; this.monitor = monitor; } // IDE-195 // If the user has the plugins sdk in the workspace, trying to write to the P/foo-portlet/.settings/ will find // the file first in the the plugins-sdk that is in the workspace and will fail to find the file. try { final IFile f = this.project.getProject().getFile(PATH_IN_PROJECT); final File file = f.getLocation().toFile(); final IWorkspace ws = ResourcesPlugin.getWorkspace(); final IWorkspaceRoot wsroot = ws.getRoot(); final IPath path = new Path(file.getAbsolutePath()); final IFile[] wsFiles = wsroot.findFilesForLocationURI(path.toFile().toURI()); if (!CoreUtil.isNullOrEmpty(wsFiles)) { for (IFile wsFile : wsFiles) { wsFile.getParent().getParent().refreshLocal(IResource.DEPTH_INFINITE, null); } } } catch (Exception ex) { // best effort to make sure directories are current } if (shouldInstallPluginLibraryDelegate()) { installPluginLibraryDelegate(); } if (shouldSetupDefaultOutputLocation()) { setupDefaultOutputLocation(); IJavaProject javaProject = JavaCore.create(project); IPath outputLocation = project.getFolder(getDefaultOutputLocation()).getFullPath(); javaProject.setOutputLocation(outputLocation, monitor); } } protected IPath getAppServerDir() { IRuntime serverRuntime; if (masterModel != null) { serverRuntime = (IRuntime) masterModel.getProperty(PluginFacetInstallDataModelProvider.FACET_RUNTIME); } else { serverRuntime = getFacetedProject().getPrimaryRuntime(); } return ServerUtil.getAppServerDir(serverRuntime); } protected abstract String getDefaultOutputLocation(); protected IDataModel getFacetDataModel(String facetId) { IFacetedProjectWorkingCopy fp = getFacetedProject(); for (IProjectFacetVersion pfv : fp.getProjectFacets()) { if (pfv.getProjectFacet().getId().equals(facetId)) { Action action = fp.getProjectFacetAction(pfv.getProjectFacet()); if (action != null) { Object config = action.getConfig(); return (IDataModel) Platform.getAdapterManager().getAdapter(config, IDataModel.class); } } } return null; } protected IFacetedProjectWorkingCopy getFacetedProject() { return (IFacetedProjectWorkingCopy) this.model .getProperty(IFacetDataModelProperties.FACETED_PROJECT_WORKING_COPY); } protected String getRuntimeLocation() { try { return ServerUtil.getRuntime(this.project).getLocation().toOSString(); } catch (CoreException e) { e.printStackTrace(); } return null; } protected SDK getSDK() { String sdkName = null; try { sdkName = masterModel.getStringProperty(IPluginProjectDataModelProperties.LIFERAY_SDK_NAME); } catch (Exception ex) { } if (sdkName == null) { try { sdkName = model.getStringProperty(IPluginProjectDataModelProperties.LIFERAY_SDK_NAME); } catch (Exception ex) { } } return SDKManager.getInstance().getSDK(sdkName); } protected IFolder getWebRootFolder() { IDataModel webFacetDataModel = null; if (masterModel != null) { FacetDataModelMap map = (FacetDataModelMap) masterModel .getProperty(IFacetProjectCreationDataModelProperties.FACET_DM_MAP); webFacetDataModel = map.getFacetDataModel(IJ2EEFacetConstants.DYNAMIC_WEB_FACET.getId()); } else { webFacetDataModel = getFacetDataModel(IModuleConstants.JST_WEB_MODULE); } IPath webrootFullPath = null; if (webFacetDataModel != null) { webrootFullPath = this.project.getFullPath().append( webFacetDataModel.getStringProperty(IJ2EEModuleFacetInstallDataModelProperties.CONFIG_FOLDER)); } else { IVirtualComponent component = ComponentCore.createComponent(this.project); if (component != null) { webrootFullPath = component.getRootFolder().getUnderlyingFolder().getFullPath(); } } return ResourcesPlugin.getWorkspace().getRoot().getFolder(webrootFullPath); } protected void installPluginLibraryDelegate() throws CoreException { LibraryInstallDelegate libraryDelegate = (LibraryInstallDelegate) this.model .getProperty(IPluginProjectDataModelProperties.LIFERAY_PLUGIN_LIBRARY_DELEGATE); libraryDelegate.execute(monitor); } protected boolean isProjectInSDK() { return masterModel.getBooleanProperty(LIFERAY_USE_SDK_LOCATION); } protected void processNewFiles(IPath path) throws CoreException { try { List<File> newFiles = FileListing.getFileListing(path.toFile()); for (File file : newFiles) { try { copyToProject(path, file); } catch (Exception e) { ProjectCore.logError(e); } } } catch (FileNotFoundException e1) { throw new CoreException(ProjectCore.createErrorStatus(e1)); } } // protected boolean promptForOverwrite( final IResource projectEntryPath ) // { // final boolean[] retval = new boolean[1]; // // PlatformUI.getWorkbench().getDisplay().syncExec( new Runnable() // { // public void run() // { // retval[0] = // MessageDialog.openQuestion( // PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Overwrite project file?", // "Overwrite project file: " + projectEntryPath.getLocation() ); // } // // } ); // // return retval[0]; // } protected void setupDefaultOutputLocation() throws CoreException { IJavaProject jProject = JavaCore.create(this.project); IFolder folder = this.project.getFolder(getDefaultOutputLocation()); if (folder.getParent().exists()) { CoreUtil.prepareFolder(folder); IPath oldOutputLocation = jProject.getOutputLocation(); IFolder oldOutputFolder = CoreUtil.getWorkspaceRoot().getFolder(oldOutputLocation); jProject.setOutputLocation(folder.getFullPath(), null); try { if (!folder.equals(oldOutputFolder) && oldOutputFolder.exists()) { IContainer outputParent = oldOutputFolder.getParent(); oldOutputFolder.delete(true, null); if (outputParent.members().length == 0 && outputParent.getName().equals("build")) //$NON-NLS-1$ { outputParent.delete(true, null); } } } catch (Exception e) { // best effort } } } protected boolean shouldConfigureDeploymentAssembly() { return this.model.getBooleanProperty(CONFIGURE_DEPLOYMENT_ASSEMBLY); } protected boolean shouldCopyToProject(File file) { if (isProjectInSDK()) { return true; } for (String name : ISDKConstants.PORTLET_PLUGIN_ZIP_IGNORE_FILES) { if (file.getName().equals(name)) { return false; } } return true; } protected boolean shouldInstallPluginLibraryDelegate() { return this.model.getBooleanProperty(INSTALL_LIFERAY_PLUGIN_LIBRARY_DELEGATE); } protected boolean shouldSetupDefaultOutputLocation() { return this.model.getBooleanProperty(SETUP_DEFAULT_OUTPUT_LOCATION); } protected boolean shouldSetupExtClasspath() { return this.model.getBooleanProperty(SETUP_EXT_CLASSPATH); } }