| /******************************************************************************* |
| * Copyright (c) 2009 Daniel Le Berre and others. All rights reserved. This |
| * program and the accompanying materials are made available under the terms of |
| * the Eclipse Public License v1.0 which accompanies this distribution, and is |
| * available at http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Daniel Le Berre - initial API and implementation |
| * IBM - ongoing development |
| ******************************************************************************/ |
| package org.eclipse.equinox.p2.cudf.solver; |
| |
| import java.util.Arrays; |
| import org.eclipse.core.runtime.*; |
| import org.eclipse.equinox.p2.cudf.Main; |
| import org.eclipse.equinox.p2.cudf.metadata.IRequiredCapability; |
| import org.eclipse.equinox.p2.cudf.metadata.InstallableUnit; |
| import org.eclipse.osgi.util.NLS; |
| |
| public abstract class Explanation implements Comparable { |
| |
| public static class HardRequirement extends Explanation { |
| public final InstallableUnit iu; |
| public final IRequiredCapability req; |
| |
| public HardRequirement(InstallableUnit iu, IRequiredCapability req) { |
| this.iu = iu; |
| this.req = req; |
| } |
| |
| public int orderValue() { |
| return 5; |
| } |
| |
| public IStatus toStatus() { |
| MultiStatus result = new MultiStatus(Main.PLUGIN_ID, 1, Messages.Explanation_unsatisfied, null); |
| result.add(new Status(IStatus.ERROR, Main.PLUGIN_ID, NLS.bind(Messages.Explanation_from, getUserReadableName(iu)))); |
| result.add(new Status(IStatus.ERROR, Main.PLUGIN_ID, NLS.bind(Messages.Explanation_to, req))); |
| return result; |
| } |
| |
| public String toString() { |
| return NLS.bind(Messages.Explanation_hardDependency, iu, req); |
| } |
| } |
| |
| public static class IUInstalled extends Explanation { |
| public final InstallableUnit iu; |
| |
| public IUInstalled(InstallableUnit iu) { |
| this.iu = iu; |
| } |
| |
| public int orderValue() { |
| return 2; |
| } |
| |
| public String toString() { |
| return NLS.bind(Messages.Explanation_alreadyInstalled, iu); |
| } |
| |
| public IStatus toStatus() { |
| return new Status(IStatus.ERROR, Main.PLUGIN_ID, NLS.bind(Messages.Explanation_alreadyInstalled, getUserReadableName(iu))); |
| } |
| } |
| |
| public static class IUToInstall extends Explanation { |
| public final InstallableUnit iu; |
| |
| public IUToInstall(InstallableUnit iu) { |
| this.iu = iu; |
| } |
| |
| public int orderValue() { |
| return 1; |
| } |
| |
| public String toString() { |
| return NLS.bind(Messages.Explanation_toInstall, iu); |
| } |
| |
| public IStatus toStatus() { |
| return new Status(IStatus.ERROR, Main.PLUGIN_ID, NLS.bind(Messages.Explanation_toInstall, getUserReadableName(iu))); |
| } |
| } |
| |
| public static class MissingIU extends Explanation { |
| public final InstallableUnit iu; |
| public final IRequiredCapability req; |
| |
| public MissingIU(InstallableUnit iu, IRequiredCapability req) { |
| this.iu = iu; |
| this.req = req; |
| } |
| |
| public int orderValue() { |
| return 3; |
| } |
| |
| public int shortAnswer() { |
| return MISSING_REQUIREMENT; |
| } |
| |
| public String toString() { |
| return NLS.bind(Messages.Explanation_missingRequired, iu, req); |
| } |
| |
| public IStatus toStatus() { |
| return new Status(IStatus.ERROR, Main.PLUGIN_ID, NLS.bind(Messages.Explanation_missingRequired, getUserReadableName(iu), req)); |
| } |
| } |
| |
| public static class Singleton extends Explanation { |
| public final InstallableUnit[] ius; |
| |
| public Singleton(InstallableUnit[] ius) { |
| this.ius = ius; |
| } |
| |
| public int orderValue() { |
| return 4; |
| } |
| |
| public int shortAnswer() { |
| return VIOLATED_SINGLETON_CONSTRAINT; |
| } |
| |
| public IStatus toStatus() { |
| MultiStatus result = new MultiStatus(Main.PLUGIN_ID, 1, NLS.bind(Messages.Explanation_singleton, ""), null); //$NON-NLS-1$ |
| for (int i = 0; i < ius.length; i++) |
| result.add(new Status(IStatus.ERROR, Main.PLUGIN_ID, getUserReadableName(ius[i]))); |
| return result; |
| } |
| |
| public String toString() { |
| return NLS.bind(Messages.Explanation_singleton, Arrays.asList(ius)); |
| } |
| |
| } |
| |
| public static final int MISSING_REQUIREMENT = 1; |
| |
| public static final Explanation OPTIONAL_REQUIREMENT = new Explanation() { |
| |
| public int orderValue() { |
| return 6; |
| } |
| |
| public String toString() { |
| return Messages.Explanation_optionalDependency; |
| } |
| }; |
| |
| public static final int VIOLATED_SINGLETON_CONSTRAINT = 2; |
| |
| protected Explanation() { |
| super(); |
| } |
| |
| public int compareTo(Object arg0) { |
| Explanation exp = (Explanation) arg0; |
| if (this.orderValue() == exp.orderValue()) { |
| return this.toString().compareTo(exp.toString()); |
| } |
| return this.orderValue() - exp.orderValue(); |
| } |
| |
| protected abstract int orderValue(); |
| |
| public int shortAnswer() { |
| throw new UnsupportedOperationException(); |
| } |
| |
| /** |
| * Returns a representation of this explanation as a status object. |
| */ |
| public IStatus toStatus() { |
| return new Status(IStatus.ERROR, Main.PLUGIN_ID, toString()); |
| } |
| |
| protected String getUserReadableName(InstallableUnit iu) { |
| if (iu == null) |
| return ""; //$NON-NLS-1$ |
| String result = getLocalized(iu); |
| if (result == null) |
| return iu.toString(); |
| return result + ' ' + iu.getVersion() + " (" + iu.toString() + ')'; //$NON-NLS-1$ |
| } |
| |
| private String getLocalized(InstallableUnit iu) { |
| return iu.getId(); |
| } |
| } |