/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.apache.ivy.plugins.repository; import java.io.File; import org.apache.ivy.core.event.IvyEvent; /** * TransferEvent is used to notify TransferListeners about progress in transfer of resources form/to * the respository This class is LARGELY inspired by org.apache.maven.wagon.events.TransferEvent * released under the following copyright license: * *
* * Copyright 2001-2005 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ** * Orginal class written by Michal Maczka. */ public class TransferEvent extends IvyEvent { /** * A transfer was attempted, but has not yet commenced. */ public static final int TRANSFER_INITIATED = 0; /** * A transfer was started. */ public static final int TRANSFER_STARTED = 1; /** * A transfer is completed. */ public static final int TRANSFER_COMPLETED = 2; /** * A transfer is in progress. */ public static final int TRANSFER_PROGRESS = 3; /** * An error occurred during transfer */ public static final int TRANSFER_ERROR = 4; /** * Used to check event type validity: should always be 0 <= type <= LAST_EVENT_TYPE */ private static final int LAST_EVENT_TYPE = TRANSFER_ERROR; /** * Indicates GET transfer (from the repository) */ public static final int REQUEST_GET = 5; /** * Indicates PUT transfer (to the repository) */ public static final int REQUEST_PUT = 6; public static final String TRANSFER_INITIATED_NAME = "transfer-initiated"; public static final String TRANSFER_STARTED_NAME = "transfer-started"; public static final String TRANSFER_PROGRESS_NAME = "transfer-progress"; public static final String TRANSFER_COMPLETED_NAME = "transfer-completed"; public static final String TRANSFER_ERROR_NAME = "transfer-error"; private Resource resource; private int eventType; private int requestType; private Exception exception; private File localFile; private Repository repository; private long length; private long totalLength; private boolean isTotalLengthSet = false; /** * This attribute is used to store the time at which the event enters a type. *
* The array should better be seen as a Map from event type (int) to the time at which the event * entered that type, 0 if it never entered this type. *
*/ private long[] timeTracking = new long[LAST_EVENT_TYPE + 1]; public TransferEvent(final Repository repository, final Resource resource, final int eventType, final int requestType) { super(getName(eventType)); this.repository = repository; setResource(resource); setEventType(eventType); setRequestType(requestType); } public TransferEvent(final Repository repository, final Resource resource, final Exception exception, final int requestType) { this(repository, resource, TRANSFER_ERROR, requestType); this.exception = exception; } public TransferEvent(final Repository repository, final Resource resource, long length, final int requestType) { this(repository, resource, TRANSFER_PROGRESS, requestType); this.length = length; this.totalLength = length; } private static String getName(int eventType) { switch (eventType) { case TRANSFER_INITIATED: return TRANSFER_INITIATED_NAME; case TRANSFER_STARTED: return TRANSFER_STARTED_NAME; case TRANSFER_PROGRESS: return TRANSFER_PROGRESS_NAME; case TRANSFER_COMPLETED: return TRANSFER_COMPLETED_NAME; case TRANSFER_ERROR: return TRANSFER_ERROR_NAME; default: return null; } } /** * @return Returns the resource. */ public Resource getResource() { return resource; } /** * @return Returns the exception. */ public Exception getException() { return exception; } /** * Returns the request type. * * @return Returns the request type. The Request type is one of *TransferEvent.REQUEST_GET or TransferEvent.REQUEST_PUT
*/
public int getRequestType() {
return requestType;
}
/**
* Sets the request type
*
* @param requestType
* The requestType to set. The Request type value should be either
* TransferEvent.REQUEST_GET or TransferEvent.REQUEST_PUT.
* @throws IllegalArgumentException
* when
*/
protected void setRequestType(final int requestType) {
switch (requestType) {
case REQUEST_PUT:
break;
case REQUEST_GET:
break;
default:
throw new IllegalArgumentException("Illegal request type: " + requestType);
}
this.requestType = requestType;
addAttribute("request-type", requestType == REQUEST_GET ? "get" : "put");
}
/**
* @return Returns the eventType.
*/
public int getEventType() {
return eventType;
}
/**
* @param eventType
* The eventType to set.
*/
protected void setEventType(final int eventType) {
checkEventType(eventType);
if (this.eventType != eventType) {
this.eventType = eventType;
timeTracking[eventType] = System.currentTimeMillis();
if (eventType > TRANSFER_INITIATED) {
addAttribute("total-duration",
String.valueOf(getElapsedTime(TRANSFER_INITIATED, eventType)));
if (eventType > TRANSFER_STARTED) {
addAttribute("duration",
String.valueOf(getElapsedTime(TRANSFER_STARTED, eventType)));
}
}
}
}
/**
* @param resource
* The resource to set.
*/
protected void setResource(final Resource resource) {
this.resource = resource;
addAttribute("resource", this.resource.getName());
}
/**
* @return Returns the local file.
*/
public File getLocalFile() {
return localFile;
}
/**
* @param localFile
* The local file to set.
*/
protected void setLocalFile(File localFile) {
this.localFile = localFile;
}
public long getLength() {
return length;
}
protected void setLength(long length) {
this.length = length;
}
public long getTotalLength() {
return totalLength;
}
protected void setTotalLength(long totalLength) {
this.totalLength = totalLength;
}
public void setException(Exception exception) {
this.exception = exception;
}
public boolean isTotalLengthSet() {
return isTotalLengthSet;
}
public void setTotalLengthSet(boolean isTotalLengthSet) {
this.isTotalLengthSet = isTotalLengthSet;
}
public Repository getRepository() {
return repository;
}
/**
* Returns the elapsed time (in ms) between when the event entered one type until it entered
* another event time.
*
* This is especially useful to get the elapsed transfer time:
*
*
* getElapsedTime(TransferEvent.TRANSFER_STARTED, TransferEvent.TRANSFER_COMPLETED);
*
*
*
*
* Special cases:
*
* - returns -1 if the event never entered the fromEventType or the toEventType.
* - returns 0 if the event entered toEventType before fromEventType
*
*
*
* @param fromEventType
* the event type constant from which time should be measured
* @param toEventType
* the event type constant to which time should be measured
* @return the elapsed time (in ms) between when the event entered fromEventType until it
* entered toEventType.
* @throws IllegalArgumentException
* if either type is not a known constant event type.
*/
public long getElapsedTime(int fromEventType, int toEventType) {
checkEventType(fromEventType);
checkEventType(toEventType);
long start = timeTracking[fromEventType];
long end = timeTracking[toEventType];
if (start == 0 || end == 0) {
return -1;
} else if (end < start) {
return 0;
} else {
return end - start;
}
}
/**
* Checks the given event type is a valid event type, throws an {@link IllegalArgumentException}
* if it isn't
*
* @param eventType
* the event type to check
*/
private void checkEventType(int eventType) {
if (eventType < 0 || eventType > LAST_EVENT_TYPE) {
throw new IllegalArgumentException("invalid event type " + eventType);
}
}
}