use of org.commonjava.indy.IndyWorkflowException in project indy by Commonjava.
the class DefaultContentManager method store.
@Override
public Transfer store(final ArtifactStore store, final String path, final InputStream stream, final TransferOperation op, final EventMetadata eventMetadata) throws IndyWorkflowException {
if (group == store.getKey().getType()) {
try {
final List<ArtifactStore> allMembers = storeManager.query().packageType(store.getPackageType()).enabledState(true).getOrderedConcreteStoresInGroup(store.getName());
final Transfer txfr = store(allMembers, store.getKey(), path, stream, op, eventMetadata);
logger.info("Stored: {} for group: {} in: {}", path, store.getKey(), txfr);
return txfr;
} catch (final IndyDataException e) {
throw new IndyWorkflowException("Failed to lookup concrete members of: %s. Reason: %s", e, store, e.getMessage());
}
}
logger.info("Storing: {} for: {} with event metadata: {}", path, store.getKey(), eventMetadata);
final Transfer txfr = downloadManager.store(store, path, stream, op, eventMetadata);
if (txfr != null) {
final KeyedLocation kl = (KeyedLocation) txfr.getLocation();
ArtifactStore transferStore;
try {
transferStore = storeManager.getArtifactStore(kl.getKey());
} catch (final IndyDataException e) {
throw new IndyWorkflowException("Failed to lookup store: %s. Reason: %s", e, kl.getKey(), e.getMessage());
}
for (final ContentGenerator generator : contentGenerators) {
generator.handleContentStorage(transferStore, path, txfr, eventMetadata);
}
if (!store.equals(transferStore)) {
for (final ContentGenerator generator : contentGenerators) {
generator.handleContentStorage(transferStore, path, txfr, eventMetadata);
}
}
}
return txfr;
}
use of org.commonjava.indy.IndyWorkflowException in project indy by Commonjava.
the class DefaultContentManager method store.
// @Override
// public Transfer store( final List<? extends ArtifactStore> stores, final String path, final InputStream stream,
// final TransferOperation op )
// throws IndyWorkflowException
// {
// return store( stores, path, stream, op, new EventMetadata() );
// }
@Override
public Transfer store(final List<? extends ArtifactStore> stores, final StoreKey topKey, final String path, final InputStream stream, final TransferOperation op, final EventMetadata eventMetadata) throws IndyWorkflowException {
logger.info("Storing: {} in: {} with event metadata: {}", path, stores, eventMetadata);
final Transfer txfr = downloadManager.store(stores, path, stream, op, eventMetadata);
if (txfr != null) {
final KeyedLocation kl = (KeyedLocation) txfr.getLocation();
ArtifactStore transferStore;
try {
transferStore = storeManager.getArtifactStore(kl.getKey());
} catch (final IndyDataException e) {
throw new IndyWorkflowException("Failed to lookup store: %s. Reason: %s", e, kl.getKey(), e.getMessage());
}
for (final ContentGenerator generator : contentGenerators) {
logger.info("{} Handling content storage of: {} in: {}", generator, path, transferStore.getKey());
generator.handleContentStorage(transferStore, path, txfr, eventMetadata);
}
}
return txfr;
}
use of org.commonjava.indy.IndyWorkflowException in project indy by Commonjava.
the class DefaultContentManager method retrieve.
@Override
public Transfer retrieve(final ArtifactStore store, final String path, final EventMetadata eventMetadata) throws IndyWorkflowException {
Transfer item;
if (group == store.getKey().getType()) {
List<ArtifactStore> members;
try {
members = storeManager.query().packageType(store.getPackageType()).enabledState(true).getOrderedConcreteStoresInGroup(store.getName());
} catch (final IndyDataException e) {
throw new IndyWorkflowException("Failed to lookup concrete members of: %s. Reason: %s", e, store, e.getMessage());
}
if (logger.isDebugEnabled()) {
logger.debug("{} is a group. Attempting downloads from (in order):\n {}", store.getKey(), StringUtils.join(members, "\n "));
}
item = null;
boolean generated = false;
for (final ContentGenerator generator : contentGenerators) {
if (generator.canProcess(path)) {
item = generator.generateGroupFileContent((Group) store, members, path, eventMetadata);
logger.debug("From content {}.generateGroupFileContent: {} (exists? {})", generator.getClass().getSimpleName(), item, item != null && item.exists());
generated = true;
break;
}
}
if (!generated) {
for (final ArtifactStore member : members) {
try {
item = doRetrieve(member, path, eventMetadata);
} catch (IndyWorkflowException e) {
logger.error("Failed to retrieve artifact from for path {} from {} in group {}, error is: {}", path, member, store, e.getMessage());
}
if (item != null) {
break;
}
}
}
} else {
item = doRetrieve(store, path, eventMetadata);
}
logger.info("Returning transfer: {}", item);
return item;
}
use of org.commonjava.indy.IndyWorkflowException in project indy by Commonjava.
the class FoloPomDownloadListener method onFileUpload.
public void onFileUpload(@Observes final FileStorageEvent event) {
// check for a TransferOperation of DOWNLOAD
final TransferOperation op = event.getType();
if (op != TransferOperation.DOWNLOAD) {
logger.trace("Not a download transfer operation. No pom existence check performed.");
return;
}
// check if it is a path that doesn't end in with ".pom"
final Transfer transfer = event.getTransfer();
if (transfer == null) {
logger.trace("No transfer. No pom existence check performed.");
return;
}
String txfrPath = transfer.getPath();
if (txfrPath.endsWith(".pom")) {
logger.trace("This is a pom download.");
return;
}
// use ArtifactPathInfo to parse into a GAV, just to verify that it's looking at an artifact download
ArtifactPathInfo artPathInfo = ArtifactPathInfo.parse(txfrPath);
if (artPathInfo == null) {
logger.trace("Not an artifact download ({}). No pom existence check performed.", txfrPath);
return;
}
// verify that the associated .pom file exists
String pomFilename = String.format("%s-%s.pom", artPathInfo.getArtifactId(), artPathInfo.getVersion());
ConcreteResource pomResource = transfer.getResource().getParent().getChild(pomFilename);
if (cacheProvider.exists(pomResource)) {
logger.trace("Pom {} already exists.", cacheProvider.getFilePath(pomResource));
return;
}
// trigger pom download by requesting it from the same repository as the original artifact
StoreKey storeKey = StoreKey.fromString(transfer.getLocation().getName());
ArtifactStore store;
try {
store = storeManager.getArtifactStore(storeKey);
} catch (final IndyDataException ex) {
logger.error("Error retrieving artifactStore with key " + storeKey, ex);
return;
}
try {
logger.debug("Downloading POM as automatic response to associated artifact download: {}/{}", storeKey, pomResource.getPath());
contentManager.retrieve(store, pomResource.getPath(), event.getEventMetadata());
} catch (final IndyWorkflowException ex) {
logger.error("Error while retrieving pom artifact " + pomResource.getPath() + " from store " + store, ex);
return;
}
}
use of org.commonjava.indy.IndyWorkflowException in project indy by Commonjava.
the class PromotionManager method runPathPromotions.
private PathsPromoteResult runPathPromotions(final PathsPromoteRequest request, final Set<String> pending, final Set<String> prevComplete, final Set<String> prevSkipped, final List<Transfer> contents, ValidationResult validation) {
if (pending == null || pending.isEmpty()) {
return new PathsPromoteResult(request, pending, prevComplete, prevSkipped, validation);
}
StoreKey targetKey = request.getTarget();
ReentrantLock lock;
synchronized (byPathTargetLocks) {
lock = byPathTargetLocks.get(targetKey);
if (lock == null) {
lock = new ReentrantLock();
byPathTargetLocks.put(targetKey, lock);
}
}
final Set<String> complete = prevComplete == null ? new HashSet<>() : new HashSet<>(prevComplete);
final Set<String> skipped = prevSkipped == null ? new HashSet<>() : new HashSet<>(prevSkipped);
List<String> errors = new ArrayList<>();
boolean locked = false;
try {
ArtifactStore sourceStore = storeManager.getArtifactStore(request.getSource());
ArtifactStore targetStore = storeManager.getArtifactStore(request.getTarget());
if (errors.isEmpty()) {
locked = lock.tryLock(config.getLockTimeoutSeconds(), TimeUnit.SECONDS);
if (!locked) {
String error = String.format("Failed to acquire promotion lock on target: %s in %d seconds.", targetKey, config.getLockTimeoutSeconds());
errors.add(error);
logger.warn(error);
}
}
if (errors.isEmpty()) {
logger.info("Running promotions from: {} (key: {})\n to: {} (key: {})", sourceStore, request.getSource(), targetStore, request.getTarget());
final boolean purgeSource = request.isPurgeSource();
contents.forEach((transfer) -> {
try {
final String path = transfer.getPath();
Transfer target = contentManager.getTransfer(targetStore, path, TransferOperation.UPLOAD);
// TODO: Should the request object have an overwrite attribute? Is that something the user is qualified to decide?
if (target != null && target.exists()) {
logger.warn("NOT promoting: {} from: {} to: {}. Target file already exists.", path, request.getSource(), request.getTarget());
// TODO: There's no guarantee that the pre-existing content is the same!
pending.remove(path);
skipped.add(path);
} else {
try (InputStream stream = transfer.openInputStream(true)) {
contentManager.store(targetStore, path, stream, TransferOperation.UPLOAD, new EventMetadata());
pending.remove(path);
complete.add(path);
stream.close();
if (purgeSource) {
contentManager.delete(sourceStore, path, new EventMetadata());
}
} catch (final IOException e) {
String msg = String.format("Failed to open input stream for: %s. Reason: %s", transfer, e.getMessage());
errors.add(msg);
logger.error(msg, e);
}
}
} catch (final IndyWorkflowException e) {
String msg = String.format("Failed to promote path: %s to: %s. Reason: %s", transfer, targetStore, e.getMessage());
errors.add(msg);
logger.error(msg, e);
}
});
}
} catch (InterruptedException e) {
String error = String.format("Interrupted waiting for promotion lock on target: %s", targetKey);
errors.add(error);
logger.warn(error);
} catch (final IndyDataException e) {
String msg = String.format("Failed to retrieve artifact store: %s. Reason: %s", request.getSource(), e.getMessage());
errors.add(msg);
logger.error(msg, e);
} finally {
if (locked) {
lock.unlock();
}
}
String error = null;
if (!errors.isEmpty()) {
error = StringUtils.join(errors, "\n");
}
return new PathsPromoteResult(request, pending, complete, skipped, error, validation);
}
Aggregations