001    /**
002     * Copyright 2010-2012 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.maven.wagon;
017    
018    import java.net.URI;
019    import java.net.URISyntaxException;
020    
021    import org.apache.maven.wagon.events.SessionEvent;
022    import org.apache.maven.wagon.events.SessionListener;
023    import org.apache.maven.wagon.events.TransferEvent;
024    import org.apache.maven.wagon.events.TransferListener;
025    import org.slf4j.Logger;
026    import org.slf4j.LoggerFactory;
027    
028    /**
029     * Listen for events about the transfer and record timing and byte count information
030     *
031     * @author Jeff Caddel
032     * @since May 27, 2010 5:08:12 PM
033     */
034    public class S3Listener implements TransferListener, SessionListener {
035        final Logger log = LoggerFactory.getLogger(S3Listener.class);
036        SimpleFormatter formatter = new SimpleFormatter();
037        SessionTracker sessionTracker = new SessionTracker();
038    
039        public void transferCompleted(final TransferEvent transferEvent) {
040            TransferTracker tt = sessionTracker.getCurrentTransfer();
041            tt.setCompleted(System.currentTimeMillis());
042            // System.out.println();
043            // log(tt.toString());
044        }
045    
046        public void transferError(final TransferEvent transferEvent) {
047            log.error("Transfer error: " + transferEvent.getException(), transferEvent.getException());
048        }
049    
050        public void transferInitiated(final TransferEvent transferEvent) {
051            sessionTracker.addTransfer(new TransferTracker());
052            TransferTracker tt = sessionTracker.getCurrentTransfer();
053            tt.setInitiated(System.currentTimeMillis());
054        }
055    
056        public void transferProgress(final TransferEvent transferEvent, final byte[] buffer, final int length) {
057            // No bytes were actually read
058            if (length == -1) {
059                return;
060            }
061            TransferTracker tt = sessionTracker.getCurrentTransfer();
062            int byteCount = tt.getByteCount() + length;
063            tt.setByteCount(byteCount);
064        }
065    
066        public void transferStarted(final TransferEvent transferEvent) {
067            TransferTracker tt = sessionTracker.getCurrentTransfer();
068            tt.setStarted(System.currentTimeMillis());
069            if (transferEvent.getRequestType() == TransferEvent.REQUEST_GET) {
070                log.info("Downloading: " + getURI(transferEvent));
071            } else {
072                log.info("Uploading: " + getURI(transferEvent));
073            }
074            // System.out.print("[INFO] ");
075        }
076    
077        protected String getURI(final TransferEvent event) {
078            return getNormalizedURI(event.getWagon().getRepository().getUrl() + "/" + event.getResource().getName());
079        }
080    
081        protected String getNormalizedURI(final String uri) {
082            try {
083                URI rawUri = new URI(uri);
084                return rawUri.normalize().toString();
085            } catch (URISyntaxException e) {
086                return uri;
087            }
088        }
089    
090        /**
091         * @see SessionListener#sessionOpening(SessionEvent)
092         */
093        public void sessionOpening(final SessionEvent sessionEvent) {
094            sessionTracker.addSessionEvent(sessionEvent);
095        }
096    
097        /**
098         * @see SessionListener#sessionOpened(SessionEvent)
099         */
100        public void sessionOpened(final SessionEvent sessionEvent) {
101            sessionTracker.addSessionEvent(sessionEvent);
102            sessionTracker.setOpened(System.currentTimeMillis());
103            // log(sessionEvent.getWagon().getRepository().getUrl() + " - Session: Opened  ");
104        }
105    
106        /**
107         * @see SessionListener#sessionDisconnecting(SessionEvent)
108         */
109        public void sessionDisconnecting(final SessionEvent sessionEvent) {
110            sessionTracker.addSessionEvent(sessionEvent);
111            sessionTracker.setDisconnecting(System.currentTimeMillis());
112            // log(sessionEvent.getWagon().getRepository().getUrl() + " - Session: Disconnecting  ");
113        }
114    
115        /**
116         * @see SessionListener#sessionDisconnected(SessionEvent)
117         */
118        public void sessionDisconnected(final SessionEvent sessionEvent) {
119            sessionTracker.addSessionEvent(sessionEvent);
120            // log(sessionEvent.getWagon().getRepository().getUrl() + " - Disconnected");
121            sessionTracker.setDisconnected(System.currentTimeMillis());
122            int transferCount = sessionTracker.getTransfers().size();
123            long byteCount = 0;
124            // long transferElapsed = 0;
125            for (TransferTracker tt : sessionTracker.getTransfers()) {
126                byteCount += tt.getByteCount();
127                // transferElapsed += tt.getCompleted() - tt.getStarted();
128            }
129            long elapsed = sessionTracker.getDisconnected() - sessionTracker.getOpened();
130            StringBuilder sb = new StringBuilder();
131            sb.append("Transfers: " + transferCount);
132            sb.append(" Time: " + formatter.getTime(elapsed));
133            sb.append(" Amount: " + formatter.getSize(byteCount));
134            // sb.append(" Rate: " + formatter.getRate(transferElapsed, byteCount));
135            sb.append(" Throughput: " + formatter.getRate(elapsed, byteCount));
136            if (transferCount > 0) {
137                log.info(sb.toString());
138            }
139        }
140    
141        /**
142         * @see SessionListener#sessionConnectionRefused(SessionEvent)
143         */
144        public void sessionConnectionRefused(final SessionEvent sessionEvent) {
145            sessionTracker.addSessionEvent(sessionEvent);
146            log.warn(sessionEvent.getWagon().getRepository().getUrl() + " - Connection refused");
147        }
148    
149        /**
150         * @see SessionListener#sessionLoggedIn(SessionEvent)
151         */
152        public void sessionLoggedIn(final SessionEvent sessionEvent) {
153            sessionTracker.addSessionEvent(sessionEvent);
154            sessionTracker.setLoggedIn(System.currentTimeMillis());
155            log.info("Logged in - " + sessionEvent.getWagon().getRepository().getHost());
156        }
157    
158        /**
159         * @see SessionListener#sessionLoggedOff(SessionEvent)
160         */
161        public void sessionLoggedOff(final SessionEvent sessionEvent) {
162            sessionTracker.addSessionEvent(sessionEvent);
163            sessionTracker.setLoggedOff(System.currentTimeMillis());
164            log.info("Logged off - " + sessionEvent.getWagon().getRepository().getHost());
165        }
166    
167        public void sessionError(final SessionEvent sessionEvent) {
168            sessionTracker.addSessionEvent(sessionEvent);
169            log.error("Session error: " + sessionEvent.getException(), sessionEvent.getException());
170        }
171    
172        public void debug(final String message) {
173            log.debug(message);
174        }
175    
176    }