001    /**
002     * Copyright 2010-2013 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.kuali.common.aws.s3.SimpleFormatter;
026    import org.slf4j.Logger;
027    import org.slf4j.LoggerFactory;
028    
029    /**
030     * Listen for events about the transfer and record timing and byte count information
031     *
032     * @author Jeff Caddel
033     * @since May 27, 2010 5:08:12 PM
034     */
035    public class S3Listener implements TransferListener, SessionListener {
036            final Logger log = LoggerFactory.getLogger(S3Listener.class);
037            SimpleFormatter formatter = new SimpleFormatter();
038            SessionTracker sessionTracker = new SessionTracker();
039    
040            public void transferCompleted(final TransferEvent transferEvent) {
041                    TransferTracker tt = sessionTracker.getCurrentTransfer();
042                    tt.setCompleted(System.currentTimeMillis());
043                    // System.out.println();
044                    // log(tt.toString());
045            }
046    
047            public void transferError(final TransferEvent transferEvent) {
048                    log.error("Transfer error: " + transferEvent.getException(), transferEvent.getException());
049            }
050    
051            public void transferInitiated(final TransferEvent transferEvent) {
052                    sessionTracker.addTransfer(new TransferTracker());
053                    TransferTracker tt = sessionTracker.getCurrentTransfer();
054                    tt.setInitiated(System.currentTimeMillis());
055            }
056    
057            public void transferProgress(final TransferEvent transferEvent, final byte[] buffer, final int length) {
058                    // No bytes were actually read
059                    if (length == -1) {
060                            return;
061                    }
062                    TransferTracker tt = sessionTracker.getCurrentTransfer();
063                    int byteCount = tt.getByteCount() + length;
064                    tt.setByteCount(byteCount);
065            }
066    
067            public void transferStarted(final TransferEvent transferEvent) {
068                    TransferTracker tt = sessionTracker.getCurrentTransfer();
069                    tt.setStarted(System.currentTimeMillis());
070                    if (transferEvent.getRequestType() == TransferEvent.REQUEST_GET) {
071                            log.info("Downloading: " + getURI(transferEvent));
072                    } else {
073                            log.info("Uploading: " + getURI(transferEvent));
074                    }
075                    // System.out.print("[INFO] ");
076            }
077    
078            protected String getURI(final TransferEvent event) {
079                    return getNormalizedURI(event.getWagon().getRepository().getUrl() + "/" + event.getResource().getName());
080            }
081    
082            protected String getNormalizedURI(final String uri) {
083                    try {
084                            URI rawUri = new URI(uri);
085                            return rawUri.normalize().toString();
086                    } catch (URISyntaxException e) {
087                            return uri;
088                    }
089            }
090    
091            /**
092             * @see SessionListener#sessionOpening(SessionEvent)
093             */
094            public void sessionOpening(final SessionEvent sessionEvent) {
095                    sessionTracker.addSessionEvent(sessionEvent);
096            }
097    
098            /**
099             * @see SessionListener#sessionOpened(SessionEvent)
100             */
101            public void sessionOpened(final SessionEvent sessionEvent) {
102                    sessionTracker.addSessionEvent(sessionEvent);
103                    sessionTracker.setOpened(System.currentTimeMillis());
104                    // log(sessionEvent.getWagon().getRepository().getUrl() + " - Session: Opened  ");
105            }
106    
107            /**
108             * @see SessionListener#sessionDisconnecting(SessionEvent)
109             */
110            public void sessionDisconnecting(final SessionEvent sessionEvent) {
111                    sessionTracker.addSessionEvent(sessionEvent);
112                    sessionTracker.setDisconnecting(System.currentTimeMillis());
113                    // log(sessionEvent.getWagon().getRepository().getUrl() + " - Session: Disconnecting  ");
114            }
115    
116            /**
117             * @see SessionListener#sessionDisconnected(SessionEvent)
118             */
119            public void sessionDisconnected(final SessionEvent sessionEvent) {
120                    sessionTracker.addSessionEvent(sessionEvent);
121                    // log(sessionEvent.getWagon().getRepository().getUrl() + " - Disconnected");
122                    sessionTracker.setDisconnected(System.currentTimeMillis());
123                    int transferCount = sessionTracker.getTransfers().size();
124                    long byteCount = 0;
125                    // long transferElapsed = 0;
126                    for (TransferTracker tt : sessionTracker.getTransfers()) {
127                            byteCount += tt.getByteCount();
128                            // transferElapsed += tt.getCompleted() - tt.getStarted();
129                    }
130                    long elapsed = sessionTracker.getDisconnected() - sessionTracker.getOpened();
131                    StringBuilder sb = new StringBuilder();
132                    sb.append("Transfers: " + transferCount);
133                    sb.append(" Time: " + formatter.getTime(elapsed));
134                    sb.append(" Amount: " + formatter.getSize(byteCount));
135                    // sb.append(" Rate: " + formatter.getRate(transferElapsed, byteCount));
136                    sb.append(" Throughput: " + formatter.getRate(elapsed, byteCount));
137                    if (transferCount > 0) {
138                            log.info(sb.toString());
139                    }
140            }
141    
142            /**
143             * @see SessionListener#sessionConnectionRefused(SessionEvent)
144             */
145            public void sessionConnectionRefused(final SessionEvent sessionEvent) {
146                    sessionTracker.addSessionEvent(sessionEvent);
147                    log.warn(sessionEvent.getWagon().getRepository().getUrl() + " - Connection refused");
148            }
149    
150            /**
151             * @see SessionListener#sessionLoggedIn(SessionEvent)
152             */
153            public void sessionLoggedIn(final SessionEvent sessionEvent) {
154                    sessionTracker.addSessionEvent(sessionEvent);
155                    sessionTracker.setLoggedIn(System.currentTimeMillis());
156                    log.info("Logged in - " + sessionEvent.getWagon().getRepository().getHost());
157            }
158    
159            /**
160             * @see SessionListener#sessionLoggedOff(SessionEvent)
161             */
162            public void sessionLoggedOff(final SessionEvent sessionEvent) {
163                    sessionTracker.addSessionEvent(sessionEvent);
164                    sessionTracker.setLoggedOff(System.currentTimeMillis());
165                    log.info("Logged off - " + sessionEvent.getWagon().getRepository().getHost());
166            }
167    
168            public void sessionError(final SessionEvent sessionEvent) {
169                    sessionTracker.addSessionEvent(sessionEvent);
170                    log.error("Session error: " + sessionEvent.getException(), sessionEvent.getException());
171            }
172    
173            public void debug(final String message) {
174                    log.debug(message);
175            }
176    
177    }