org.artificer.shell.core.UploadArtifactCommand.java Source code

Java tutorial

Introduction

Here is the source code for org.artificer.shell.core.UploadArtifactCommand.java

Source

/*
 * Copyright 2012 JBoss Inc
 *
 * 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.
 */
package org.artificer.shell.core;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.artificer.client.ArtificerAtomApiClient;
import org.artificer.common.ArtifactType;
import org.artificer.common.ArtifactTypeEnum;
import org.artificer.common.visitors.ArtifactVisitorHelper;
import org.artificer.shell.common.AbstractCommand;
import org.artificer.shell.i18n.Messages;
import org.artificer.shell.util.ArtifactTypeCompleter;
import org.artificer.shell.util.FileNameCompleterDelegate;
import org.artificer.shell.util.PrintArtifactMetaDataVisitor;
import org.jboss.aesh.cl.Arguments;
import org.jboss.aesh.cl.CommandDefinition;
import org.jboss.aesh.cl.Option;
import org.jboss.aesh.cl.completer.OptionCompleter;
import org.jboss.aesh.console.command.CommandResult;
import org.jboss.aesh.console.command.completer.CompleterInvocation;
import org.jboss.aesh.console.command.invocation.CommandInvocation;
import org.oasis_open.docs.s_ramp.ns.s_ramp_v1.BaseArtifactType;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.List;

/**
 * Uploads an artifact to the s-ramp repository.
 *
 * @author Brett Meyer
 * @author eric.wittmann@redhat.com
 */
@CommandDefinition(name = "uploadArtifact", description = "The \"upload\" command uploads the content of a local file to the Artificer repository, creating a new artifact.  The artifact type can optionally be provided.  If excluded, the artifact type will be automatically detected based on various contextual clues.\n")
public class UploadArtifactCommand extends AbstractCommand {

    @Arguments(description = "<file path>", completer = Completer.class)
    private List<String> arguments;

    @Option(name = "type", hasValue = true, required = false, completer = ArtifactTypeCompleter.class, description = "Artifact type")
    private String type;

    @Option(name = "local", hasValue = false, required = false, description = "Use if the file is reachable by the Artificer server, through its absolute path (local file, network storage, etc.).  Reduces HTTP overhead.")
    private boolean local;

    @Option(name = "name", hasValue = true, required = false, description = "Artifact name")
    private String name;

    @Option(name = "description", hasValue = true, required = false, description = "Artifact description")
    private String description;

    @Override
    protected CommandResult doExecute(CommandInvocation commandInvocation) throws Exception {
        if (CollectionUtils.isEmpty(arguments)) {
            return doHelp(commandInvocation);
        }

        String filePath = requiredArgument(commandInvocation, arguments, 0);

        ArtificerAtomApiClient client = client(commandInvocation);
        InputStream content = null;
        try {
            ArtifactType artifactType = null;
            if (StringUtils.isNotBlank(type)) {
                artifactType = ArtifactType.valueOf(type);
                if (artifactType.isExtendedType()) {
                    artifactType = ArtifactType.ExtendedDocument(artifactType.getExtendedType());
                }
            }

            File file = new File(filePath);
            BaseArtifactType artifact;
            if (local) {
                String path;
                if (file.exists()) {
                    path = file.getAbsolutePath();
                } else {
                    URL url = this.getClass().getClassLoader().getResource(filePath);
                    if (url != null) {
                        path = url.getPath();
                    } else {
                        commandInvocation.getShell().out()
                                .println(Messages.i18n.format("Upload.FileNotFound", filePath));
                        return CommandResult.FAILURE;
                    }
                }
                artifact = client.uploadArtifact(artifactType, path);
            } else {
                if (file.exists()) {
                    content = FileUtils.openInputStream(file);
                } else {
                    URL url = this.getClass().getClassLoader().getResource(filePath);
                    if (url != null) {
                        content = url.openStream();
                    } else {
                        commandInvocation.getShell().out()
                                .println(Messages.i18n.format("Upload.FileNotFound", filePath));
                        return CommandResult.FAILURE;
                    }
                }
                artifact = client.uploadArtifact(artifactType, content, file.getName());
            }

            if (StringUtils.isNotBlank(name) || StringUtils.isNotBlank(description)) {
                if (StringUtils.isNotBlank(name)) {
                    artifact.setName(name);
                }
                if (StringUtils.isNotBlank(description)) {
                    artifact.setDescription(description);
                }
                client.updateArtifactMetaData(artifact);
            }

            // Put the artifact in the session as the active artifact
            context(commandInvocation).setCurrentArtifact(artifact);
            commandInvocation.getShell().out().println(Messages.i18n.format("Upload.Success"));
            PrintArtifactMetaDataVisitor visitor = new PrintArtifactMetaDataVisitor(commandInvocation);
            ArtifactVisitorHelper.visitArtifact(visitor, artifact);

            return CommandResult.SUCCESS;
        } catch (Exception e) {
            commandInvocation.getShell().out().println(Messages.i18n.format("Upload.Failure"));
            commandInvocation.getShell().out().println("\t" + e.getMessage());
            return CommandResult.FAILURE;
        } finally {
            IOUtils.closeQuietly(content);
        }
    }

    private static class Completer implements OptionCompleter<CompleterInvocation> {
        @Override
        public void complete(CompleterInvocation completerInvocation) {
            UploadArtifactCommand command = (UploadArtifactCommand) completerInvocation.getCommand();
            if (CollectionUtils.isEmpty(command.arguments)) {
                FileNameCompleterDelegate.complete(completerInvocation);
            } else if (command.arguments.size() == 1) {
                String currentValue = completerInvocation.getGivenCompleteValue();
                for (ArtifactTypeEnum t : ArtifactTypeEnum.values()) {
                    String candidate = t.getType();
                    if (StringUtils.isBlank(currentValue) || candidate.startsWith(currentValue)) {
                        completerInvocation.addCompleterValue(candidate);
                    }
                }
            }
        }
    }

    @Override
    protected String getName() {
        return "uploadArtifact";
    }

}