Remove dependency on maven-shared-io (#7)

* remove dependency on maven-shared-io
diff --git a/.gitignore b/.gitignore
index 8e6c938..1054878 100644
--- a/.gitignore
+++ b/.gitignore
@@ -14,3 +14,4 @@
 /bootstrap
 /dependencies.xml
 .java-version
+.checkstyle
diff --git a/pom.xml b/pom.xml
index 5abeb80..419d662 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,11 +72,6 @@
       <artifactId>maven-plugin-api</artifactId>
       <version>${mavenVersion}</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.maven.shared</groupId>
-      <artifactId>maven-shared-io</artifactId>
-      <version>3.0.0</version>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.maven.shared</groupId>
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java b/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
index 3631e7f..311dcf9 100644
--- a/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/FileSetManager.java
@@ -33,11 +33,6 @@
 import java.util.Set;
 
 import org.apache.maven.plugin.logging.Log;
-import org.apache.maven.shared.io.logging.DefaultMessageHolder;
-import org.apache.maven.shared.io.logging.MessageHolder;
-import org.apache.maven.shared.io.logging.MessageLevels;
-import org.apache.maven.shared.io.logging.MojoLogSink;
-import org.apache.maven.shared.io.logging.PlexusLoggerSink;
 import org.apache.maven.shared.model.fileset.FileSet;
 import org.apache.maven.shared.model.fileset.mappers.FileNameMapper;
 import org.apache.maven.shared.model.fileset.mappers.MapperException;
@@ -68,20 +63,20 @@
     /**
      * Create a new manager instance with the supplied log instance and flag for whether to output verbose messages.
      *
-     * @param log The mojo log instance
-     * @param verbose Whether to output verbose messages
+     * @param log the mojo log instance
+     * @param verbose whether to output verbose messages
      */
     public FileSetManager( Log log, boolean verbose )
     {
         if ( verbose )
         {
             this.messages =
-                new DefaultMessageHolder( MessageLevels.LEVEL_DEBUG, MessageLevels.LEVEL_INFO, new MojoLogSink( log ) );
+                new MessageHolder( MessageLevels.LEVEL_DEBUG, MessageLevels.LEVEL_INFO, new MojoLogSink( log ) );
         }
         else
         {
             this.messages =
-                new DefaultMessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO, new MojoLogSink( log ) );
+                new MessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO, new MojoLogSink( log ) );
         }
 
         this.verbose = verbose;
@@ -95,7 +90,7 @@
     public FileSetManager( Log log )
     {
         this.messages =
-            new DefaultMessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO, new MojoLogSink( log ) );
+            new MessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO, new MojoLogSink( log ) );
         this.verbose = false;
     }
 
@@ -109,12 +104,12 @@
     {
         if ( verbose )
         {
-            this.messages = new DefaultMessageHolder( MessageLevels.LEVEL_DEBUG, MessageLevels.LEVEL_INFO,
+            this.messages = new MessageHolder( MessageLevels.LEVEL_DEBUG, MessageLevels.LEVEL_INFO,
                                                       new PlexusLoggerSink( log ) );
         }
         else
         {
-            this.messages = new DefaultMessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO,
+            this.messages = new MessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO,
                                                       new PlexusLoggerSink( log ) );
         }
 
@@ -129,7 +124,7 @@
     public FileSetManager( Logger log )
     {
         this.messages =
-            new DefaultMessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO, new PlexusLoggerSink( log ) );
+            new MessageHolder( MessageLevels.LEVEL_INFO, MessageLevels.LEVEL_INFO, new PlexusLoggerSink( log ) );
         this.verbose = false;
     }
 
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/MessageHolder.java b/src/main/java/org/apache/maven/shared/model/fileset/util/MessageHolder.java
new file mode 100644
index 0000000..81f4814
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/MessageHolder.java
@@ -0,0 +1,236 @@
+package org.apache.maven.shared.model.fileset.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+class MessageHolder
+{
+
+    private List<Message> messages = new ArrayList<Message>();
+
+    private Message currentMessage;
+
+    private int defaultMessageLevel = MessageLevels.LEVEL_INFO;
+
+    private boolean[] messageLevelStates;
+
+    private MessageSink onDemandSink;
+
+    MessageHolder( int maxMessageLevel, int defaultMessageLevel, MessageSink onDemandSink )
+    {
+        this.defaultMessageLevel = defaultMessageLevel;
+        this.onDemandSink = onDemandSink;
+        this.messageLevelStates = MessageLevels.getLevelStates( maxMessageLevel );
+    }
+
+    private MessageHolder addMessage( int level, CharSequence messagePart )
+    {
+        newMessage( level );
+        append( messagePart.toString() );
+
+        return this;
+    }
+
+    private MessageHolder addMessage( int level, Throwable error )
+    {
+        newMessage( level );
+        append( error );
+
+        return this;
+    }
+
+    private MessageHolder append( CharSequence messagePart )
+    {
+        if ( currentMessage == null )
+        {
+            newMessage();
+        }
+
+        currentMessage.append( messagePart.toString() );
+
+        return this;
+    }
+
+    private MessageHolder append( Throwable error )
+    {
+        if ( currentMessage == null )
+        {
+            newMessage();
+        }
+
+        currentMessage.setError( error );
+
+        return this;
+    }
+
+    MessageHolder newMessage()
+    {
+        newMessage( defaultMessageLevel );
+
+        return this;
+    }
+
+    private void newMessage( int messageLevel )
+    {
+        if ( onDemandSink != null && currentMessage != null )
+        {
+            renderTo( currentMessage, onDemandSink );
+        }
+
+        currentMessage = new Message( messageLevel, onDemandSink );
+        messages.add( currentMessage );
+    }
+
+    private static final class Message
+    {
+        private StringBuffer message = new StringBuffer();
+
+        private Throwable error;
+
+        private final int messageLevel;
+
+        private final MessageSink onDemandSink;
+
+        Message( int messageLevel, MessageSink onDemandSink )
+        {
+            this.messageLevel = messageLevel;
+
+            this.onDemandSink = onDemandSink;
+        }
+
+        Message setError( Throwable pError )
+        {
+            this.error = pError;
+            return this;
+        }
+
+        Message append( CharSequence pMessage )
+        {
+            this.message.append( pMessage.toString() );
+            return this;
+        }
+
+        private int getMessageLevel()
+        {
+            return messageLevel;
+        }
+
+        private CharSequence render()
+        {
+            StringBuffer buffer = new StringBuffer();
+
+            if ( onDemandSink == null )
+            {
+                buffer.append( '[' ).append( MessageLevels.getLevelLabel( messageLevel ) ).append( "] " );
+            }
+            if ( message != null && message.length() > 0 )
+            {
+                buffer.append( message );
+
+                if ( error != null )
+                {
+                    buffer.append( '\n' );
+                }
+            }
+
+            if ( error != null )
+            {
+                buffer.append( "Error:\n" );
+
+                StringWriter sw = new StringWriter();
+                PrintWriter pw = new PrintWriter( sw );
+                error.printStackTrace( pw );
+
+                buffer.append( sw.toString() );
+            }
+
+            return buffer;
+        }
+    }
+
+    MessageHolder addDebugMessage( CharSequence messagePart )
+    {
+        return addMessage( MessageLevels.LEVEL_DEBUG, messagePart );
+    }
+
+    MessageHolder addInfoMessage( CharSequence messagePart )
+    {
+        return addMessage( MessageLevels.LEVEL_INFO, messagePart );
+    }
+
+    MessageHolder addWarningMessage( Throwable error )
+    {
+        return addMessage( MessageLevels.LEVEL_WARNING, error );
+    }
+
+    MessageHolder addWarningMessage( CharSequence messagePart )
+    {
+        return addMessage( MessageLevels.LEVEL_WARNING, messagePart );
+    }
+
+    boolean isDebugEnabled()
+    {
+        return messageLevelStates[MessageLevels.LEVEL_DEBUG];
+    }
+
+    boolean isWarningEnabled()
+    {
+        return messageLevelStates[MessageLevels.LEVEL_WARNING];
+    }
+
+    void flush()
+    {
+        if ( onDemandSink != null && currentMessage != null )
+        {
+            renderTo( currentMessage, onDemandSink );
+            currentMessage = null;
+        }
+    }
+
+    private void renderTo( Message message, MessageSink sink )
+    {
+        switch ( message.getMessageLevel() )
+        {
+            case ( MessageLevels.LEVEL_SEVERE ):
+                sink.severe( message.render().toString() );
+                break;
+
+            case ( MessageLevels.LEVEL_ERROR ):
+                sink.error( message.render().toString() );
+                break;
+
+            case ( MessageLevels.LEVEL_WARNING ):
+                sink.warning( message.render().toString() );
+                break;
+
+            case ( MessageLevels.LEVEL_INFO ):
+                sink.info( message.render().toString() );
+                break;
+
+            default:
+                sink.debug( message.render().toString() );
+        }
+    }
+
+}
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/MessageLevels.java b/src/main/java/org/apache/maven/shared/model/fileset/util/MessageLevels.java
new file mode 100644
index 0000000..af28dc1
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/MessageLevels.java
@@ -0,0 +1,93 @@
+package org.apache.maven.shared.model.fileset.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+
+final class MessageLevels
+{
+
+    static final int LEVEL_DEBUG = 0;
+    static final int LEVEL_INFO = 1;
+    static final int LEVEL_WARNING = 2;
+    static final int LEVEL_ERROR = 3;
+    static final int LEVEL_SEVERE = 4;
+    static final int LEVEL_DISABLED = 5;
+
+    private static final List<String> LEVEL_NAMES;
+
+    static
+    {
+        List<String> names = new ArrayList<String>();
+        names.add( "DEBUG" );
+        names.add( "INFO" );
+        names.add( "WARN" );
+        names.add( "ERROR" );
+        names.add( "SEVERE" );
+
+        LEVEL_NAMES = Collections.unmodifiableList( names );
+    }
+
+    private MessageLevels()
+    {
+    }
+
+    /**
+     * @param maxMessageLevel for which level
+     * @return level states
+     */
+    static boolean[] getLevelStates( int maxMessageLevel )
+    {
+        boolean[] states = new boolean[5];
+
+        Arrays.fill( states, false );
+
+        switch ( maxMessageLevel )
+        {
+            case ( LEVEL_DEBUG ):
+                states[LEVEL_DEBUG] = true;
+            case ( LEVEL_INFO ):
+                states[LEVEL_INFO] = true;
+            case ( LEVEL_WARNING ):
+                states[LEVEL_WARNING] = true;
+            case ( LEVEL_ERROR ):
+                states[LEVEL_ERROR] = true;
+            case ( LEVEL_SEVERE ):
+                states[LEVEL_SEVERE] = true;
+            default:
+        }
+
+        return states;
+    }
+
+    static String getLevelLabel( int messageLevel )
+    {
+        if ( messageLevel > -1 && LEVEL_NAMES.size() > messageLevel )
+        {
+            return (String) LEVEL_NAMES.get( messageLevel );
+        }
+
+        throw new IllegalArgumentException( "Invalid message level: " + messageLevel );
+    }
+}
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/MessageSink.java b/src/main/java/org/apache/maven/shared/model/fileset/util/MessageSink.java
new file mode 100644
index 0000000..843931a
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/MessageSink.java
@@ -0,0 +1,35 @@
+package org.apache.maven.shared.model.fileset.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+interface MessageSink
+{
+
+    void debug( String message );
+
+    void info( String message );
+
+    void warning( String message );
+
+    void error( String message );
+
+    void severe( String message );
+
+}
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/MojoLogSink.java b/src/main/java/org/apache/maven/shared/model/fileset/util/MojoLogSink.java
new file mode 100644
index 0000000..71fea4a
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/MojoLogSink.java
@@ -0,0 +1,60 @@
+package org.apache.maven.shared.model.fileset.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import org.apache.maven.plugin.logging.Log;
+
+class MojoLogSink
+    implements MessageSink
+{
+
+    private final Log logger;
+
+    MojoLogSink( Log logger )
+    {
+        this.logger = logger;
+    }
+
+    public void debug( String message )
+    {
+        logger.debug( message );
+    }
+
+    public void error( String message )
+    {
+        logger.error( message );
+    }
+
+    public void info( String message )
+    {
+        logger.info( message );
+    }
+
+    public void severe( String message )
+    {
+        logger.error( message );
+    }
+
+    public void warning( String message )
+    {
+        logger.warn( message );
+    }
+
+}
diff --git a/src/main/java/org/apache/maven/shared/model/fileset/util/PlexusLoggerSink.java b/src/main/java/org/apache/maven/shared/model/fileset/util/PlexusLoggerSink.java
new file mode 100644
index 0000000..88e3d6f
--- /dev/null
+++ b/src/main/java/org/apache/maven/shared/model/fileset/util/PlexusLoggerSink.java
@@ -0,0 +1,63 @@
+package org.apache.maven.shared.model.fileset.util;
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you 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.
+ */
+
+import org.codehaus.plexus.logging.Logger;
+
+/**
+ * The plexus logger sink implementation.
+ */
+class PlexusLoggerSink
+    implements MessageSink
+{
+
+    private final Logger logger;
+
+    PlexusLoggerSink( Logger logger )
+    {
+        this.logger = logger;
+    }
+
+    public void debug( String message )
+    {
+        logger.debug( message );
+    }
+
+    public void error( String message )
+    {
+        logger.error( message );
+    }
+
+    public void info( String message )
+    {
+        logger.info( message );
+    }
+
+    public void severe( String message )
+    {
+        logger.fatalError( message );
+    }
+
+    public void warning( String message )
+    {
+        logger.warn( message );
+    }
+
+}