SFTP с компонентом Java - PullRequest
0 голосов
/ 03 июля 2019

Привет всем У меня есть поток, который выполняет передачу sftp с помощью компонента java, который реализует ClamAV для анализа входящих файлов перед передачей. Меня беспокоит то, что я получаю объект типа InputStream, но когда я передаю его в качестве параметра методу сканирования ClamAV, я получаю это сообщение об ошибке. Спасибо за помощь.

<sftp:connector name="SftpConnector"
        validateConnections="true" doc:name="SFTP" />
    <sftp:endpoint name="QuerySingleFileEndpoint" host="${sftp.host}"
        port="${sftp.port}" autoDelete="false" connector-ref="SftpConnector"
        user="${sftp.username}" password="${sftp.password}" path="${sftp.path}"
        doc:name="SFTP" exchange-pattern="request-response" responseTimeout="10000" />
    <file:connector name="File" autoDelete="false"
        streaming="true" validateConnections="true" doc:name="File" />


    <flow name="ScanWithClamAvAndTransferFileOK">
        <sftp:inbound-endpoint connector-ref="SftpConnector"
            host="${sftp.host}" port="${sftp.port}" path="${sftp.path}" user="${sftp.username}"
            password="${sftp.password}" responseTimeout="30000" pollingFrequency="10000"
            doc:name="Transfer file to SFTP Server" />
        <logger level="INFO" message="Le fichier à lire depuis SFTP est : #[payload]"
            doc:name="Log 
        files to read" />
        <logger level="INFO"
            message="Le nom du fichier à lire 
        depuis SFTP est : #[message.inboundProperties.originalFilename]"
            doc:name="Log 
        files to read" />
        <logger level="INFO"
            message="Le fichier du fichier à lire 
        depuis SFTP est : #[message.payload]"
            doc:name="Log files to read" />
        <set-variable variableName="fileName" value="#[payload]"
            doc:name="Set fileName flowVar" />
        <set-variable variableName="nameFile"
            value="#[message.inboundProperties.originalFilename]" doc:name="Set fileName flowVar" />
        <component class="reporting.AntivirusClamAv" doc:name="Java Antivirus ClamAV" />

    </flow>






public class AntivirusClamAv implements Callable, Startable {

    private static Logger logger = Logger.getLogger(AntivirusClamAv.class);
    private SftpConnector sftpConnector;
    private ImmutableEndpoint immutableEndpoint;
    private SftpReceiverRequesterUtil util;
    @Inject
    private MuleContext muleContext;
    private ClamAVClient clamAV;

    @Override
    public void start() throws MuleException {
        // Recherche du connecteur SFTP dans le registre Mule
        sftpConnector = (SftpConnector) this.muleContext.getRegistry().lookupConnector("SftpConnector");
        final EndpointBuilder endpointBuilder = this.muleContext.getRegistry().lookupObject("QuerySingleFileEndpoint");

        // Construit un noeud final entrant en fonction des propriétés fournies dans le
        // noeud final global
        this.immutableEndpoint = endpointBuilder.buildInboundEndpoint();
        this.util = new SftpReceiverRequesterUtil(immutableEndpoint);
    }

    @Override
    public Object onCall(MuleEventContext eventContext) throws Exception {
        // Créer un notificateur qui notifiera les abonnés à la notification de cet
        // événement SFTP
        final SftpNotifier notifier = new SftpNotifier(sftpConnector, eventContext.getMessage(), immutableEndpoint,
                eventContext.getFlowConstruct().getName());
        // Obtient le nom du fichier à télécharger à partir d'une variable de flux
        final String fileName = eventContext.getMessage().getProperty("nameFile", PropertyScope.INVOCATION);
        if (StringUtils.isBlank(fileName)) {
            throw new Exception(
                    "La variable de flux 'fileName' ne peut pas être nulle car elle indique le fichier à extraire du serveur SFTP.");
        }
        try {
            // Télécharger le fichier
            final InputStream inputStream = util.retrieveFile(fileName, notifier);
            // Nous ne le faisons que parce que org.mule.transport.sftp.SftpStream est
            // package-private, mais les sous-classes sont publiques.
            if (inputStream instanceof SftpFileArchiveInputStream) {
                final SftpFileArchiveInputStream sftpArchiveInputStream = (SftpFileArchiveInputStream) inputStream;
                sftpArchiveInputStream.performPostProcessingOnClose(this.shouldDeleteFile());
            }

            if (inputStream instanceof SftpInputStream) {
                final SftpInputStream sftpInputStream = (SftpInputStream) inputStream;
                sftpInputStream.performPostProcessingOnClose(this.shouldDeleteFile());
            }
            logger.debug("Début du Scan du Fichier");
            byte[] reply = getReply(inputStream);
            return inputStream;
        } catch (Exception e) {
            throw new DefaultMuleException(MessageFactory.createStaticMessage(
                    "Un IOException a été lancée tout en essayant de télécharger : "+ fileName), e);
        }
    }

    /**
     * Une méthode qui vérifie simplement si un fichier doit être supprimé ou non en
     * fonction de la propriété 'autoDelete' défini sur le connecteur ou le noeud
     * final global. Si vous souhaitez résoudre ce problème de manière dynamique en
     * vous basant sur le message Mule, vous pouvez l'ajouter en tant que paramètre.
     */
    protected boolean shouldDeleteFile() {
        final String endpointAutoDelete = (String) immutableEndpoint.getProperty("autoDelete");
        final boolean connectorAutoDelete = sftpConnector.isAutoDelete();
        return connectorAutoDelete || Boolean.valueOf(endpointAutoDelete);
    }

    private byte[] getReply(InputStream stream) throws IllegalStateException{
        try {
            return clamAV.scan(stream);
        } catch (Exception e) {
            throw new IllegalStateException("Le fichier ne peut pas etre scanner, cause : "+e.getMessage(),e);
        }
    }

    public ClamAVClient getClamAV() {
        return clamAV;
    }

    public void setClamAV(ClamAVClient clamAV) {
        this.clamAV = clamAV;
    }

}
...