1 /*******************************************************************************
2  * Copyright (c) 2009, 2017 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.net.URI;
17 import java.net.URISyntaxException;
18 import org.apache.tools.ant.BuildException;
19 import org.eclipse.core.runtime.IStatus;
20 import org.eclipse.core.runtime.URIUtil;
21 import org.eclipse.equinox.p2.core.ProvisionException;
22 import org.eclipse.equinox.p2.internal.repository.tools.CompositeRepositoryApplication;
23 import org.eclipse.equinox.p2.internal.repository.tools.RepositoryDescriptor;
24 
25 public class CompositeRepositoryTask extends AbstractRepositoryTask {
26 	private static String COMPOSITE_REMOVE = "p2.composite.artifact.repository.remove"; //$NON-NLS-1$
27 	private static String COMPOSITE_ADD = "p2.composite.artifact.repository.add"; //$NON-NLS-1$
28 
CompositeRepositoryTask()29 	public CompositeRepositoryTask() {
30 		application = new CompositeRepositoryApplication();
31 	}
32 
33 	@Override
execute()34 	public void execute() throws BuildException {
35 		try {
36 			IStatus result = application.run(null);
37 			if (result.matches(IStatus.ERROR)) {
38 				throw new BuildException(TaskHelper.statusToString(result, IStatus.ERROR, null).toString());
39 			}
40 		} catch (ProvisionException e) {
41 			throw new BuildException(e);
42 		}
43 	}
44 
45 	/*
46 	 * Add the listed repositories to the composite repository
47 	 */
addConfiguredAdd(RepositoryList list)48 	public void addConfiguredAdd(RepositoryList list) {
49 		if (list.getRepoLocation() != null) {
50 			RepositoryDescriptor descriptor = new RepositoryDescriptor();
51 			//don't use RepositoryList#getRepoLocationURI() because we want relative URIs if they were specified
52 			try {
53 				descriptor.setLocation(URIUtil.fromString(list.getRepoLocation()));
54 				descriptor.setOptional(list.isOptional());
55 				if (!list.isBoth()) {
56 					descriptor.setKind(list.isArtifact() ? RepositoryDescriptor.KIND_ARTIFACT : RepositoryDescriptor.KIND_METADATA);
57 				}
58 				((CompositeRepositoryApplication) application).addChild(descriptor);
59 			} catch (URISyntaxException e) {
60 				//no good
61 			}
62 		}
63 
64 		for (DestinationRepository repo : list.getRepositoryList()) {
65 			((CompositeRepositoryApplication) application).addChild(repo.getDescriptor());
66 		}
67 	}
68 
69 	/*
70 	 * Remove the listed repositories from the composite repository
71 	 */
addConfiguredRemove(RepositoryList list)72 	public void addConfiguredRemove(RepositoryList list) {
73 		if (list.getRepoLocation() != null) {
74 			RepositoryDescriptor descriptor = new RepositoryDescriptor();
75 			try {
76 				//don't use RepositoryList#getRepoLocationURI() because we want relative URIs if they were specified
77 				descriptor.setLocation(URIUtil.fromString(list.getRepoLocation()));
78 				descriptor.setOptional(list.isOptional());
79 				if (!list.isBoth()) {
80 					descriptor.setKind(list.isArtifact() ? RepositoryDescriptor.KIND_ARTIFACT : RepositoryDescriptor.KIND_METADATA);
81 				}
82 				((CompositeRepositoryApplication) application).removeChild(descriptor);
83 			} catch (URISyntaxException e) {
84 				// no good, don't remove
85 			}
86 		}
87 		for (DestinationRepository repo : list.getRepositoryList()) {
88 			((CompositeRepositoryApplication) application).removeChild(repo.getDescriptor());
89 		}
90 	}
91 
92 	/*
93 	 * Set whether the task should fail if the repository already exists
94 	 */
setFailOnExists(boolean value)95 	public void setFailOnExists(boolean value) {
96 		((CompositeRepositoryApplication) application).setFailOnExists(value);
97 	}
98 
setValidate(String value)99 	public void setValidate(String value) {
100 		((CompositeRepositoryApplication) application).setComparator(value);
101 	}
102 
103 	/*  p2.composite.artifact.repository.add
104 	 *  p2.composite.artifact.repository.remove*/
setLocation(String value)105 	public void setLocation(String value) {
106 		super.setDestination(value);
107 	}
108 
109 	/*  p2.composite.artifact.repository.add
110 	 *  p2.composite.artifact.repository.remove*/
setChild(String value)111 	public void setChild(String value) throws URISyntaxException {
112 		URI childURI = URIUtil.fromString(value);
113 		RepositoryDescriptor repo = new RepositoryDescriptor();
114 		repo.setLocation(childURI);
115 
116 		if (getTaskName().equals(COMPOSITE_ADD))
117 			((CompositeRepositoryApplication) application).addChild(repo);
118 		else if (getTaskName().equals(COMPOSITE_REMOVE))
119 			((CompositeRepositoryApplication) application).removeChild(repo);
120 	}
121 
122 	/*  p2.composite.artifact.repository.add */
setComparatorID(String value)123 	public void setComparatorID(String value) {
124 		if (value != null && !value.startsWith(ANT_PREFIX))
125 			((CompositeRepositoryApplication) application).setComparator(value);
126 	}
127 
128 	/*  p2.composite.artifact.repository.remove */
setAllChildren(String value)129 	public void setAllChildren(String value) {
130 		if (value != null && !value.startsWith(ANT_PREFIX))
131 			((CompositeRepositoryApplication) application).setRemoveAll(Boolean.parseBoolean(value));
132 	}
133 }
134