try {
repoLock.lock(Action.read);
if (P2Constants.CONTENT_XML.equals(request.getRequestPath())
|| P2Constants.CONTENT_JAR.equals(request.getRequestPath())) {
try {
final AbstractStorageItem contentItem = doRetrieveLocalItem(request, repository);
if (request.isRequestLocalOnly() || !isContentOld(contentItem, repository)) {
return contentItem;
}
}
catch (final ItemNotFoundException e) {
// fall through
}
// give away the lock on content.xml as we will regenerate it
itemLock.unlock();
try {
// we need to get new file, so update the lock
repoLock.lock(Action.delete);
// recheck the condition now that we have an exclusive lock
try {
final AbstractStorageItem contentItem = doRetrieveLocalItem(request, repository);
if (!isContentOld(contentItem, repository)) {
return contentItem;
}
}
catch (final ItemNotFoundException e) {
// fall through
}
try {
final StorageItem result = doRetrieveContentItems(request.getRequestContext(), repository).get(
request.getRequestPath()
);
doRetrieveArtifactsItems(request.getRequestContext(), repository);
return result;
}
catch (final P2RuntimeExceptionMaskedAsINFException e) {
return doRetrieveLocalOnTransferError(request, repository, e);
}
}
finally {
// release repo
repoLock.unlock();
// get back the lock we gave in
itemLock.lock(Action.read);
}
}
else if (P2Constants.ARTIFACTS_XML.equals(request.getRequestPath())
|| P2Constants.ARTIFACTS_JAR.equals(request.getRequestPath())) {
try {
final AbstractStorageItem artifactsItem = doRetrieveLocalItem(request, repository);
if (request.isRequestLocalOnly() || !isArtifactsOld(artifactsItem, repository)) {
return artifactsItem;
}
}
catch (final ItemNotFoundException e) {
// fall through
}
// give away the lock on artifacts.xml as we will regenerate it
itemLock.unlock();
try {
// we need to get new file, so update the lock
repoLock.lock(Action.delete);
// recheck the condition now that we have an exclusive lock
try {
final AbstractStorageItem artifactsItem = doRetrieveLocalItem(request, repository);
if (!isArtifactsOld(artifactsItem, repository)) {
return artifactsItem;
}
}
catch (final ItemNotFoundException e) {