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