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.maven.core; import com.liferay.ide.core.IWebProject; import com.liferay.ide.core.LiferayCore; import com.liferay.ide.core.util.CoreUtil; import com.liferay.ide.core.util.LaunchHelper; import com.liferay.ide.project.core.util.ProjectUtil; import com.liferay.ide.project.core.util.SearchFilesVisitor; import com.liferay.ide.server.remote.AbstractRemoteServerPublisher; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import org.apache.maven.project.MavenProject; 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.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; import org.eclipse.debug.core.DebugPlugin; import org.eclipse.debug.core.ILaunchConfigurationType; import org.eclipse.debug.core.ILaunchConfigurationWorkingCopy; import org.eclipse.debug.core.ILaunchManager; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.launching.IJavaLaunchConfigurationConstants; import org.eclipse.m2e.core.project.IMavenProjectFacade; import org.eclipse.m2e.core.project.ResolverConfiguration; import org.eclipse.wst.server.core.model.IModuleResourceDelta; /** * @author Simon Jiang * @author Gregory Amerson */ public class MavenProjectRemoteServerPublisher extends AbstractRemoteServerPublisher { private final String ATTR_GOALS = "M2_GOALS"; private final String ATTR_POM_DIR = IJavaLaunchConfigurationConstants.ATTR_WORKING_DIRECTORY; private final String ATTR_PROFILES = "M2_PROFILES"; private final String ATTR_SKIP_TESTS = "M2_SKIP_TESTS"; private final String ATTR_UPDATE_SNAPSHOTS = "M2_UPDATE_SNAPSHOTS"; private final String ATTR_WORKSPACE_RESOLUTION = "M2_WORKSPACE_RESOLUTION"; private final String LAUNCH_CONFIGURATION_TYPE_ID = "org.eclipse.m2e.Maven2LaunchConfigurationType"; public MavenProjectRemoteServerPublisher(IProject project) { super(project); } private boolean execMavenLaunch(final IProject project, final String goal, final IMavenProjectFacade facade, IProgressMonitor monitor) throws CoreException { final ILaunchManager launchManager = DebugPlugin.getDefault().getLaunchManager(); final ILaunchConfigurationType launchConfigurationType = launchManager .getLaunchConfigurationType(LAUNCH_CONFIGURATION_TYPE_ID); final IPath basedirLocation = project.getLocation(); final String newName = launchManager.generateLaunchConfigurationName(basedirLocation.lastSegment()); final ILaunchConfigurationWorkingCopy workingCopy = launchConfigurationType.newInstance(null, newName); workingCopy.setAttribute(IJavaLaunchConfigurationConstants.ATTR_VM_ARGUMENTS, "-Dmaven.multiModuleProjectDirectory"); workingCopy.setAttribute(ATTR_POM_DIR, basedirLocation.toString()); workingCopy.setAttribute(ATTR_GOALS, goal); workingCopy.setAttribute(ATTR_UPDATE_SNAPSHOTS, true); workingCopy.setAttribute(ATTR_WORKSPACE_RESOLUTION, true); workingCopy.setAttribute(ATTR_SKIP_TESTS, true); if (facade != null) { final ResolverConfiguration configuration = facade.getResolverConfiguration(); final String selectedProfiles = configuration.getSelectedProfiles(); if (selectedProfiles != null && selectedProfiles.length() > 0) { workingCopy.setAttribute(ATTR_PROFILES, selectedProfiles); } new LaunchHelper().launch(workingCopy, "run", monitor); return true; } else { return false; } } private String getMavenDeployGoals() { return "package war:war"; } private boolean isServiceBuilderProject(IProject project, String pluginType, MavenProject parentProject) { final List<IFile> serviceXmls = (new SearchFilesVisitor()).searchFiles(project, "service.xml"); return serviceXmls != null && serviceXmls.size() > 0 && pluginType.equalsIgnoreCase(ILiferayMavenConstants.DEFAULT_PLUGIN_TYPE) && parentProject != null; } @Override public void processResourceDeltas(final IModuleResourceDelta[] deltas, ZipOutputStream zip, Map<ZipEntry, String> deleteEntries, final String deletePrefix, final String deltaPrefix, final boolean adjustGMTOffset) throws IOException, CoreException { for (final IModuleResourceDelta delta : deltas) { final IResource deltaResource = (IResource) delta.getModuleResource().getAdapter(IResource.class); final IProject deltaProject = deltaResource.getProject(); final IWebProject lrproject = LiferayCore.create(IWebProject.class, deltaProject); if (lrproject == null || lrproject.getDefaultDocrootFolder() == null) { continue; } final IFolder webappRoot = lrproject.getDefaultDocrootFolder(); final int deltaKind = delta.getKind(); final IPath deltaFullPath = deltaResource.getFullPath(); boolean deltaZip = false; IPath deltaPath = null; if (webappRoot != null && webappRoot.exists()) { final IPath containerFullPath = webappRoot.getFullPath(); if (containerFullPath.isPrefixOf(deltaFullPath)) { deltaZip = true; deltaPath = new Path(deltaPrefix + deltaFullPath.makeRelativeTo(containerFullPath)); } } if (deltaZip == false && new Path("WEB-INF").isPrefixOf(delta.getModuleRelativePath())) { final List<IFolder> folders = CoreUtil.getSourceFolders(JavaCore.create(deltaProject)); for (IFolder folder : folders) { final IPath folderPath = folder.getFullPath(); if (folderPath.isPrefixOf(deltaFullPath)) { deltaZip = true; break; } } } if (deltaZip == false && (deltaKind == IModuleResourceDelta.ADDED || deltaKind == IModuleResourceDelta.CHANGED || deltaKind == IModuleResourceDelta.REMOVED)) { final IPath targetPath = JavaCore.create(deltaProject).getOutputLocation(); deltaZip = true; deltaPath = new Path("WEB-INF/classes").append(deltaFullPath.makeRelativeTo(targetPath)); } if (deltaZip) { if (deltaKind == IModuleResourceDelta.ADDED || deltaKind == IModuleResourceDelta.CHANGED) { addToZip(deltaPath, deltaResource, zip, adjustGMTOffset); } else if (deltaKind == IModuleResourceDelta.REMOVED) { addRemoveProps(deltaPath, deltaResource, zip, deleteEntries, deletePrefix); } else if (deltaKind == IModuleResourceDelta.NO_CHANGE) { final IModuleResourceDelta[] children = delta.getAffectedChildren(); processResourceDeltas(children, zip, deleteEntries, deletePrefix, deltaPrefix, adjustGMTOffset); } } } } public IPath publishModuleFull(IProgressMonitor monitor) throws CoreException { IPath retval = null; if (runMavenGoal(getProject(), monitor)) { final IMavenProjectFacade projectFacade = MavenUtil.getProjectFacade(getProject(), monitor); final MavenProject mavenProject = projectFacade.getMavenProject(monitor); final String targetFolder = mavenProject.getBuild().getDirectory(); final String targetWar = mavenProject.getBuild().getFinalName() + "." + mavenProject.getPackaging(); retval = new Path(targetFolder).append(targetWar); } return retval; } private boolean runMavenGoal(final IProject project, final IProgressMonitor monitor) throws CoreException { boolean retval = false; final IMavenProjectFacade facade = MavenUtil.getProjectFacade(project, monitor); String pluginType = MavenUtil.getLiferayMavenPluginType(facade.getMavenProject(monitor)); if (pluginType == null) { pluginType = ILiferayMavenConstants.DEFAULT_PLUGIN_TYPE; } final MavenProject parentProject = facade.getMavenProject(monitor).getParent(); final String goal = getMavenDeployGoals(); if (isServiceBuilderProject(project, pluginType, parentProject)) { retval = execMavenLaunch(ProjectUtil.getProject(parentProject.getName()), " package -am -pl " + project.getName(), MavenUtil.getProjectFacade(project, monitor), monitor); } else { retval = execMavenLaunch(project, goal, facade, monitor); } return retval; } }