1 /******************************************************************************* 2 * Copyright (c) 2009, 2018 IBM Corporation and others. 3 * 4 * This program and the accompanying materials 5 * are made available under the terms of the Eclipse Public License 2.0 6 * which accompanies this distribution, and is available at 7 * https://www.eclipse.org/legal/epl-2.0/ 8 * 9 * SPDX-License-Identifier: EPL-2.0 10 * 11 * Contributors: 12 * IBM Corporation - initial API and implementation 13 *******************************************************************************/ 14 package org.eclipse.equinox.p2.internal.repository.tools.tasks; 15 16 import java.io.File; 17 import java.util.ArrayList; 18 import java.util.List; 19 import org.apache.tools.ant.BuildException; 20 import org.eclipse.core.runtime.IStatus; 21 import org.eclipse.equinox.p2.core.ProvisionException; 22 import org.eclipse.equinox.p2.internal.repository.tools.Messages; 23 import org.eclipse.equinox.p2.internal.repository.tools.MirrorApplication; 24 import org.eclipse.equinox.p2.metadata.IInstallableUnit; 25 import org.eclipse.equinox.p2.query.IQuery; 26 import org.eclipse.equinox.p2.query.QueryUtil; 27 import org.eclipse.equinox.p2.repository.artifact.IArtifactDescriptor; 28 29 public class MirrorTask extends AbstractRepositoryTask { 30 31 private File mirrorLog; // file to log mirror output to (optional) 32 private ComparatorDescription comparator; 33 private boolean ignoreErrors = false; 34 MirrorTask()35 public MirrorTask() { 36 application = new MirrorApplication(); 37 } 38 39 @Override execute()40 public void execute() throws BuildException { 41 try { 42 if (mirrorLog != null) 43 ((MirrorApplication) application).setLog(mirrorLog); 44 else 45 ((MirrorApplication) application).setLog(new AntMirrorLog(this)); 46 47 if (comparator != null) { 48 // Enable comparison 49 ((MirrorApplication) application).setCompare(true); 50 // Set baseline location 51 if (comparator.getBaseline() != null) 52 ((MirrorApplication) application).setBaseline(comparator.getBaseline().getDescriptor().getRepoLocation()); 53 // Set comparator to use 54 if (comparator.getComparator() != null) 55 ((MirrorApplication) application).setComparatorID(comparator.getComparator()); 56 // Set comparator log 57 if (comparator.getComparatorLog() != null) 58 ((MirrorApplication) application).setComparatorLog(comparator.getComparatorLog()); 59 ((MirrorApplication) application).setComparatorExclusions(createCompareExclusions()); 60 } 61 62 prepareSourceRepos(); 63 application.initializeRepos(null); 64 List<IInstallableUnit> ius = prepareIUs(); 65 application.setSourceIUs(ius); 66 IStatus result = application.run(null); 67 if (!ignoreErrors && result.matches(IStatus.ERROR)) 68 throw new BuildException(TaskHelper.statusToString(result, IStatus.ERROR, null).toString()); 69 } catch (ProvisionException e) { 70 throw new BuildException(e); 71 } catch (NoSuchMethodException e) { 72 // Should not occur 73 throw new BuildException(e); 74 } 75 } 76 createCompareExclusions()77 private IQuery<IArtifactDescriptor> createCompareExclusions() { 78 if (comparator == null || comparator.getExcluded() == null) 79 return null; 80 81 List<ArtifactDescription> artifacts = comparator.getExcluded(); 82 List<IQuery<IArtifactDescriptor>> queries = new ArrayList<>(); 83 for (ArtifactDescription artifactDescription : artifacts) 84 queries.add(artifactDescription.createDescriptorQuery()); 85 86 if (queries.size() == 1) 87 return queries.get(0); 88 89 return QueryUtil.createCompoundQuery(queries, false); 90 } 91 createSlicingOptions()92 public SlicingOption createSlicingOptions() { 93 SlicingOption options = new SlicingOption(); 94 ((MirrorApplication) application).setSlicingOptions(options.getOptions()); 95 return options; 96 } 97 98 /* 99 * Set the comparison information 100 */ createComparator()101 public ComparatorDescription createComparator() { 102 if (comparator != null) 103 throw new BuildException(Messages.exception_onlyOneComparator); 104 comparator = new ComparatorDescription(); 105 return comparator; 106 } 107 108 /* 109 * Set the location of the mirror log 110 */ setLog(String value)111 public void setLog(String value) { 112 mirrorLog = new File(value); 113 } 114 115 /* 116 * Set whether or not we should ignore errors when running the mirror application. 117 */ setIgnoreErrors(boolean value)118 public void setIgnoreErrors(boolean value) { 119 ignoreErrors = value; 120 ((MirrorApplication) application).setIgnoreErrors(value); 121 } 122 123 /* 124 * Set whether or not the the artifacts are raw. 125 */ setRaw(boolean value)126 public void setRaw(boolean value) { 127 ((MirrorApplication) application).setRaw(value); 128 } 129 130 /* 131 * Set whether or not the mirror application should be run in verbose mode. 132 */ setVerbose(boolean value)133 public void setVerbose(boolean value) { 134 ((MirrorApplication) application).setVerbose(value); 135 } 136 setValidate(boolean value)137 public void setValidate(boolean value) { 138 ((MirrorApplication) application).setValidate(value); 139 } 140 setIncludePacked(boolean value)141 public void setIncludePacked(boolean value) { 142 ((MirrorApplication) application).setIncludePacked(value); 143 } 144 setReferences(boolean value)145 public void setReferences(boolean value) { 146 ((MirrorApplication) application).setReferences(value); 147 } 148 setMirrorProperties(boolean value)149 public void setMirrorProperties(boolean value) { 150 ((MirrorApplication) application).setMirrorProperties(value); 151 } 152 } 153