package org.ebayopensource.turmeric.eclipse.maven.ui.utils; import java.util.Map; import org.apache.commons.lang.StringUtils; import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.project.MavenProject; import org.apache.maven.repository.metadata.ArtifactMetadata; import org.ebayopensource.turmeric.eclipse.core.logging.SOALogger; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants; import org.ebayopensource.turmeric.eclipse.core.resources.constants.SOAProjectConstants.SupportedProjectType; import org.ebayopensource.turmeric.eclipse.maven.core.utils.MavenCoreUtils; import org.ebayopensource.turmeric.eclipse.mavenapi.exception.MavenEclipseApiException; import org.ebayopensource.turmeric.eclipse.mavenapi.impl.MavenEclipseUtil; import org.ebayopensource.turmeric.eclipse.resources.model.IAssetInfo; import org.ebayopensource.turmeric.eclipse.utils.lang.StringUtil; import org.ebayopensource.turmeric.eclipse.utils.plugin.WorkspaceUtil; import org.ebayopensource.turmeric.eclipse.utils.ui.UIUtil; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.widgets.Shell; /** * The Class MavenUIUtils. * * @since 1.0 */ public class MavenUIUtils { private static final SOALogger logger = SOALogger.getLogger(); /** * Adds a dependency to a project. * * @param project the eclipse project * @param dependentLibraries dependency libraries to add * @param addRemove add = true, remove = false * @param monitor an eclipse progress monitor * @return returns true or false if the operation succeeded. * @throws CoreException the core exception * @throws MavenEclipseApiException the maven eclipse api exception */ public static boolean addDependency(final IProject project, Map<String, String> dependentLibraries, final boolean addRemove, IProgressMonitor monitor) throws CoreException, MavenEclipseApiException { ArtifactMetadata metadata = null; final IFile pomFile = MavenEclipseUtil.getPomFile(project); pomFile.refreshLocal(IResource.DEPTH_ZERO, monitor); final Model pom = MavenEclipseUtil.readPOM(project); if (pom == null) return false; for (String dependentName : dependentLibraries.keySet()) { final String type = dependentLibraries.get(dependentName); if (StringUtils.equals(type, IAssetInfo.TYPE_SERVICE_LIBRARY)) { // service dependency String groupId = MavenCoreUtils.getMavenOrgProviderInstance() .getProjectGroupId(SupportedProjectType.INTERFACE); final String libVersion = MavenCoreUtils.getLibraryVersion( groupId, dependentName, SOAProjectConstants.DEFAULT_SERVICE_VERSION); final String fullLibName = MavenCoreUtils.translateLibraryName( groupId, dependentName, libVersion); metadata = MavenCoreUtils.getLibraryIdentifier(fullLibName); } else if (StringUtils.equals(type, IAssetInfo.TYPE_PROJECT)) { final IProject dependentProject = WorkspaceUtil .getProject(dependentName); if (dependentProject != null && dependentProject.isAccessible()) { final Model dependentPom = MavenEclipseUtil .readPOM(dependentProject); if (dependentPom == null) return false; metadata = MavenEclipseUtil.artifactMetadata(dependentPom); } else if (dependentName .contains(SOAProjectConstants.DELIMITER_SEMICOLON)) { // it is Maven fully qualified identifier logger.warning( "library name to add is a fully qualified identifier->", dependentName); metadata = MavenEclipseUtil.artifactMetadata(dependentName); } } else if (StringUtils.equals(type, IAssetInfo.TYPE_LIBRARY)) { metadata = MavenCoreUtils.getLibraryIdentifier(dependentName); if (metadata == null && WorkspaceUtil.getProject(dependentName) .isAccessible()) { // could not find the lib, but exist as a project in the // workspace MavenProject mProj = MavenCoreUtils.getMavenProject(WorkspaceUtil .getProject(dependentName)); if (mProj != null) { metadata = MavenEclipseUtil .convertToArtifactMetadata(mProj.getModel()); } } } else { metadata = MavenCoreUtils.getLibraryIdentifier(dependentName); } if (metadata == null) { if (addRemove == true) { // we only report failed adding operation final String errMsg = StringUtil.toString( "Failed to add dependency->", dependentName, " to project->", project); logger.warning(errMsg); UIUtil.showErrorDialogInNewThread((Shell) null, "Error Occured", errMsg); } return false; } Dependency dependency = null; if (addRemove) { // adding a new dependency dependency = MavenEclipseUtil.dependency(metadata); if (dependency == null || dependency.getGroupId() == null) return false; if (MavenCoreUtils.findDependency(dependency.getGroupId(), dependency.getArtifactId(), pom) != null) { logger.warning("Dependency has already been added skipping it->" + dependency); return false; } pom.addDependency(dependency); } else { // removing an existing dependency dependency = MavenCoreUtils.findDependency(metadata.getGroupId(), metadata.getArtifactId(), pom); if (dependency == null) return false; pom.removeDependency(dependency); } if (StringUtils.equals(type, IAssetInfo.TYPE_SERVICE_LIBRARY)) { MavenCoreUtils.modifyRequiredServices(pom, dependentName, addRemove); } } MavenCoreUtils.mavenEclipseAPI().writePom(pomFile, pom); pomFile.refreshLocal(IResource.DEPTH_ZERO, monitor); return true; } }