blob: b2ad69971a9f24df19b35e7ebcd6801afab94fe5 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2017 IBM Corporation 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.equinox.internal.p2.engine.phases;
import java.util.*;
import org.eclipse.core.runtime.*;
import org.eclipse.equinox.internal.p2.engine.*;
import org.eclipse.equinox.p2.core.ProvisionException;
import org.eclipse.equinox.p2.engine.IProfile;
import org.eclipse.equinox.p2.engine.ProvisioningContext;
import org.eclipse.equinox.p2.engine.spi.ProvisioningAction;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.ITouchpointType;
import org.eclipse.equinox.p2.metadata.expression.ExpressionUtil;
import org.eclipse.equinox.p2.query.*;
import org.eclipse.equinox.p2.repository.artifact.*;
public class Sizing extends InstallableUnitPhase {
private static final String PHASE_ID = "sizing"; //$NON-NLS-1$
private static final String COLLECT_PHASE_ID = "collect"; //$NON-NLS-1$
private long sizeOnDisk;
private long dlSize;
public Sizing(int weight) {
super(PHASE_ID, weight);
}
@Override
protected boolean isApplicable(InstallableUnitOperand op) {
return (op.second() != null && !op.second().equals(op.first()));
}
public long getDiskSize() {
return sizeOnDisk;
}
public long getDownloadSize() {
return dlSize;
}
@Override
protected List<ProvisioningAction> getActions(InstallableUnitOperand operand) {
IInstallableUnit unit = operand.second();
List<ProvisioningAction> parsedActions = getActions(unit, COLLECT_PHASE_ID);
if (parsedActions != null)
return parsedActions;
ITouchpointType type = unit.getTouchpointType();
if (type == null || type == ITouchpointType.NONE)
return null;
String actionId = getActionManager().getTouchpointQualifiedActionId(COLLECT_PHASE_ID, type);
ProvisioningAction action = getActionManager().getAction(actionId, null);
if (action == null) {
return null;
}
return Collections.singletonList(action);
}
@Override
protected String getProblemMessage() {
return Messages.Phase_Sizing_Error;
}
@Override
protected IStatus completePhase(IProgressMonitor monitor, IProfile profile, Map<String, Object> parameters) {
@SuppressWarnings("unchecked")
List<IArtifactRequest[]> artifactRequests = (List<IArtifactRequest[]>) parameters.get(Collect.PARM_ARTIFACT_REQUESTS);
ProvisioningContext context = (ProvisioningContext) parameters.get(PARM_CONTEXT);
int statusCode = 0;
Set<IArtifactRequest> artifactsToObtain = new HashSet<>(artifactRequests.size());
for (IArtifactRequest[] requests : artifactRequests) {
if (requests == null)
continue;
for (int i = 0; i < requests.length; i++) {
artifactsToObtain.add(requests[i]);
}
}
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
SubMonitor sub = SubMonitor.convert(monitor, 1000);
IQueryable<IArtifactRepository> repoQueryable = context.getArtifactRepositories(sub.newChild(500));
IQuery<IArtifactRepository> all = new ExpressionMatchQuery<>(IArtifactRepository.class, ExpressionUtil.TRUE_EXPRESSION);
IArtifactRepository[] repositories = repoQueryable.query(all, sub.newChild(500)).toArray(IArtifactRepository.class);
for (IArtifactRequest artifactRequest : artifactsToObtain) {
if (sub.isCanceled())
break;
boolean found = false;
for (int i = 0; i < repositories.length; i++) {
IArtifactRepository repo = repositories[i];
if (sub.isCanceled())
return Status.CANCEL_STATUS;
IArtifactDescriptor[] descriptors = repo.getArtifactDescriptors(artifactRequest.getArtifactKey());
if (descriptors.length > 0) {
if (descriptors[0].getProperty(IArtifactDescriptor.ARTIFACT_SIZE) != null)
sizeOnDisk += Long.parseLong(descriptors[0].getProperty(IArtifactDescriptor.ARTIFACT_SIZE));
else
statusCode = ProvisionException.ARTIFACT_INCOMPLETE_SIZING;
if (descriptors[0].getProperty(IArtifactDescriptor.DOWNLOAD_SIZE) != null)
dlSize += Long.parseLong(descriptors[0].getProperty(IArtifactDescriptor.DOWNLOAD_SIZE));
else
statusCode = ProvisionException.ARTIFACT_INCOMPLETE_SIZING;
found = true;
break;
}
}
if (!found)
// The artifact wasn't present in any repository
return new Status(IStatus.ERROR, EngineActivator.ID, ProvisionException.ARTIFACT_NOT_FOUND, Messages.Phase_Sizing_Error, null);
}
if (statusCode != 0)
return new Status(IStatus.WARNING, EngineActivator.ID, statusCode, Messages.Phase_Sizing_Warning, null);
return null;
}
@Override
protected IStatus initializePhase(IProgressMonitor monitor, IProfile profile, Map<String, Object> parameters) {
parameters.put(Collect.PARM_ARTIFACT_REQUESTS, new ArrayList<IArtifactRequest[]>());
return null;
}
@Override
protected IStatus initializeOperand(IProfile profile, InstallableUnitOperand operand, Map<String, Object> parameters, IProgressMonitor monitor) {
IStatus status = super.initializeOperand(profile, operand, parameters, monitor);
// defer setting the IU until after the super method to avoid triggering touchpoint initialization
IInstallableUnit iu = operand.second();
parameters.put(PARM_IU, iu);
return status;
}
}