This is an automated email from the ASF dual-hosted git repository. elharo pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/maven-assembly-plugin.git
The following commit(s) were added to refs/heads/master by this push: new 289a4b6 remove dependency on maven-shared-io (#31) 289a4b6 is described below commit 289a4b6d99d8539b0f54c5c98390117176a07d5a Author: Elliotte Rusty Harold <elh...@users.noreply.github.com> AuthorDate: Tue Jul 7 08:28:13 2020 -0400 remove dependency on maven-shared-io (#31) * remove dependency on maven-shared-io --- pom.xml | 6 +- ....java => ClasspathResourceLocatorStrategy.java} | 38 +- .../plugins/assembly/io/DefaultAssemblyReader.java | 13 +- .../plugins/assembly/io/DefaultMessageHolder.java | 594 +++++++++++++++++++++ .../maven/plugins/assembly/io/FileLocation.java | 175 ++++++ ...catorStrategy.java => FileLocatorStrategy.java} | 20 +- .../apache/maven/plugins/assembly/io/Location.java | 77 +++ .../apache/maven/plugins/assembly/io/Locator.java | 114 ++++ .../maven/plugins/assembly/io/LocatorStrategy.java | 35 ++ .../maven/plugins/assembly/io/MessageHolder.java | 290 ++++++++++ .../maven/plugins/assembly/io/MessageLevels.java | 117 ++++ .../maven/plugins/assembly/io/MessageSink.java | 55 ++ .../io/PrefixedClasspathLocatorStrategy.java | 4 - .../assembly/io/RelativeFileLocatorStrategy.java | 5 - .../maven/plugins/assembly/io/URLLocation.java | 81 +++ .../io/PrefixedClasspathLocatorStrategyTest.java | 14 +- 16 files changed, 1570 insertions(+), 68 deletions(-) diff --git a/pom.xml b/pom.xml index b99246d..710b01a 100644 --- a/pom.xml +++ b/pom.xml @@ -141,11 +141,7 @@ under the License. <artifactId>plexus-archiver</artifactId> <version>4.2.1</version> </dependency> - <dependency> - <groupId>org.apache.maven.shared</groupId> - <artifactId>maven-shared-io</artifactId> - <version>3.0.0</version> - </dependency> + <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java b/src/main/java/org/apache/maven/plugins/assembly/io/ClasspathResourceLocatorStrategy.java similarity index 57% copy from src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java copy to src/main/java/org/apache/maven/plugins/assembly/io/ClasspathResourceLocatorStrategy.java index b0062ba..7d65dec 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java +++ b/src/main/java/org/apache/maven/plugins/assembly/io/ClasspathResourceLocatorStrategy.java @@ -19,42 +19,46 @@ package org.apache.maven.plugins.assembly.io; * under the License. */ -import org.apache.maven.shared.io.location.FileLocation; -import org.apache.maven.shared.io.location.Location; -import org.apache.maven.shared.io.location.LocatorStrategy; -import org.apache.maven.shared.io.logging.MessageHolder; - -import java.io.File; +import java.net.URL; /** - * + * classpath resource locator strategy. */ -class RelativeFileLocatorStrategy +class ClasspathResourceLocatorStrategy implements LocatorStrategy { - private final File basedir; + private String tempFilePrefix = "location."; + + private String tempFileSuffix = ".cpurl"; - RelativeFileLocatorStrategy( File basedir ) + private boolean tempFileDeleteOnExit = true; + + /** + * Create instance. + */ + ClasspathResourceLocatorStrategy() { - this.basedir = basedir; } - @Override + /** {@inheritDoc} */ public Location resolve( String locationSpecification, MessageHolder messageHolder ) { - File file = new File( basedir, locationSpecification ); - messageHolder.addInfoMessage( "Searching for file location: " + file.getAbsolutePath() ); + ClassLoader cloader = Thread.currentThread().getContextClassLoader(); + + URL resource = cloader.getResource( locationSpecification ); Location location = null; - if ( file.exists() ) + if ( resource != null ) { - location = new FileLocation( file, locationSpecification ); + location = new URLLocation( resource, locationSpecification, tempFilePrefix, tempFileSuffix, + tempFileDeleteOnExit ); } else { - messageHolder.addMessage( "File: " + file.getAbsolutePath() + " does not exist." ); + messageHolder.addMessage( "Failed to resolve classpath resource: " + locationSpecification + + " from classloader: " + cloader ); } return location; diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java b/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java index a638d3c..3344c53 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java +++ b/src/main/java/org/apache/maven/plugins/assembly/io/DefaultAssemblyReader.java @@ -37,11 +37,6 @@ import org.apache.maven.plugins.assembly.model.io.xpp3.ComponentXpp3Reader; import org.apache.maven.plugins.assembly.resolved.AssemblyId; import org.apache.maven.plugins.assembly.utils.InterpolationConstants; import org.apache.maven.project.MavenProject; -import org.apache.maven.shared.io.location.ClasspathResourceLocatorStrategy; -import org.apache.maven.shared.io.location.FileLocatorStrategy; -import org.apache.maven.shared.io.location.Location; -import org.apache.maven.shared.io.location.Locator; -import org.apache.maven.shared.io.location.LocatorStrategy; import org.apache.maven.shared.utils.ReaderFactory; import org.codehaus.plexus.interpolation.PrefixAwareRecursionInterceptor; import org.codehaus.plexus.interpolation.RecursionInterceptor; @@ -368,10 +363,10 @@ public class DefaultAssemblyReader /** * Add the contents of all included components to main assembly * - * @param assembly The assembly - * @param assemblyDir The assembly directory - * @param transformer The component interpolator - * @throws AssemblyReadException . + * @param assembly the assembly + * @param assemblyDir the assembly directory + * @param transformer the component interpolator + * @throws AssemblyReadException */ protected void mergeComponentsWithMainAssembly( final Assembly assembly, final File assemblyDir, final AssemblerConfigurationSource configSource, diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/DefaultMessageHolder.java b/src/main/java/org/apache/maven/plugins/assembly/io/DefaultMessageHolder.java new file mode 100644 index 0000000..5826f5d --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/DefaultMessageHolder.java @@ -0,0 +1,594 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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.Iterator; +import java.util.List; + +/** + * Default Message Holder. + * + */ +class DefaultMessageHolder + implements MessageHolder +{ + + private List<Message> messages = new ArrayList<Message>(); + + private Message currentMessage; + + private int defaultMessageLevel = MessageLevels.LEVEL_INFO; + + private boolean[] messageLevelStates; + + private MessageSink onDemandSink; + + /** + * Create instance. + */ + DefaultMessageHolder() + { + this.messageLevelStates = MessageLevels.getLevelStates( MessageLevels.LEVEL_INFO ); + } + + /** {@inheritDoc} */ + public MessageHolder addMessage( CharSequence messagePart, Throwable error ) + { + return addMessage( defaultMessageLevel, messagePart, error ); + } + + /** + * @param level Level. + * @param messagePart Message part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addMessage( int level, CharSequence messagePart, Throwable error ) + { + newMessage( level ); + append( messagePart.toString() ); + append( error ); + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder addMessage( CharSequence messagePart ) + { + return addMessage( defaultMessageLevel, messagePart ); + } + + /** + * @param level level. + * @param messagePart message part. + * @return {@link MessageHolder} + */ + protected MessageHolder addMessage( int level, CharSequence messagePart ) + { + newMessage( level ); + append( messagePart.toString() ); + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder addMessage( Throwable error ) + { + return addMessage( defaultMessageLevel, error ); + } + + /** + * @param level level. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + protected MessageHolder addMessage( int level, Throwable error ) + { + newMessage( level ); + append( error ); + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder append( CharSequence messagePart ) + { + if ( currentMessage == null ) + { + newMessage(); + } + + currentMessage.append( messagePart.toString() ); + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder append( Throwable error ) + { + if ( currentMessage == null ) + { + newMessage(); + } + + currentMessage.setError( error ); + + return this; + } + + /** {@inheritDoc} */ + public boolean isEmpty() + { + return messages.isEmpty(); + } + + /** {@inheritDoc} */ + public MessageHolder newMessage() + { + newMessage( defaultMessageLevel ); + + return this; + } + + /** + * @param messageLevel message level. + */ + protected void newMessage( int messageLevel ) + { + if ( onDemandSink != null && currentMessage != null ) + { + renderTo( currentMessage, onDemandSink ); + } + + currentMessage = new Message( messageLevel, onDemandSink ); + messages.add( currentMessage ); + } + + /** {@inheritDoc} */ + public String render() + { + StringBuffer buffer = new StringBuffer(); + + int counter = 1; + for ( Iterator<Message> it = messages.iterator(); it.hasNext(); ) + { + Message message = (Message) it.next(); + + int ml = message.getMessageLevel(); + + if ( ml >= messageLevelStates.length || ml < 0 ) + { + ml = MessageLevels.LEVEL_DEBUG; + } + + if ( !messageLevelStates[ml] ) + { + continue; + } + + CharSequence content = message.render(); + String label = MessageLevels.getLevelLabel( message.getMessageLevel() ); + + if ( content.length() > label.length() + 3 ) + { + buffer.append( '[' ).append( counter++ ).append( "] " ); + buffer.append( content.toString() ); + + if ( it.hasNext() ) + { + buffer.append( "\n\n" ); + } + } + } + + return buffer.toString(); + } + + /** {@inheritDoc} */ + public int size() + { + return messages.size(); + } + + 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; + } + + public Message setError( Throwable pError ) + { + this.error = pError; + return this; + } + + public Message append( CharSequence pMessage ) + { + this.message.append( pMessage.toString() ); + return this; + } + + /** + * @return message level. + */ + public int getMessageLevel() + { + return messageLevel; + } + + /** + * @return Sequence. + */ + public 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; + } + } + + /** {@inheritDoc} */ + public MessageHolder addDebugMessage( CharSequence messagePart, Throwable error ) + { + return addMessage( MessageLevels.LEVEL_DEBUG, messagePart, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addDebugMessage( CharSequence messagePart ) + { + return addMessage( MessageLevels.LEVEL_DEBUG, messagePart ); + } + + /** {@inheritDoc} */ + public MessageHolder addDebugMessage( Throwable error ) + { + return addMessage( MessageLevels.LEVEL_DEBUG, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addErrorMessage( CharSequence messagePart, Throwable error ) + { + return addMessage( MessageLevels.LEVEL_ERROR, messagePart, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addErrorMessage( CharSequence messagePart ) + { + return addMessage( MessageLevels.LEVEL_ERROR, messagePart ); + } + + /** {@inheritDoc} */ + public MessageHolder addErrorMessage( Throwable error ) + { + return addMessage( MessageLevels.LEVEL_ERROR, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addInfoMessage( CharSequence messagePart, Throwable error ) + { + return addMessage( MessageLevels.LEVEL_INFO, messagePart, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addInfoMessage( CharSequence messagePart ) + { + return addMessage( MessageLevels.LEVEL_INFO, messagePart ); + } + + /** {@inheritDoc} */ + public MessageHolder addInfoMessage( Throwable error ) + { + return addMessage( MessageLevels.LEVEL_INFO, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addSevereMessage( CharSequence messagePart, Throwable error ) + { + return addMessage( MessageLevels.LEVEL_SEVERE, messagePart, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addSevereMessage( CharSequence messagePart ) + { + return addMessage( MessageLevels.LEVEL_SEVERE, messagePart ); + } + + /** {@inheritDoc} */ + public MessageHolder addSevereMessage( Throwable error ) + { + return addMessage( MessageLevels.LEVEL_SEVERE, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addWarningMessage( CharSequence messagePart, Throwable error ) + { + return addMessage( MessageLevels.LEVEL_WARNING, messagePart, error ); + } + + /** {@inheritDoc} */ + public MessageHolder addWarningMessage( CharSequence messagePart ) + { + return addMessage( MessageLevels.LEVEL_WARNING, messagePart ); + } + + /** {@inheritDoc} */ + public MessageHolder addWarningMessage( Throwable error ) + { + return addMessage( MessageLevels.LEVEL_WARNING, error ); + } + + /** {@inheritDoc} */ + public int countDebugMessages() + { + return countMessagesOfType( MessageLevels.LEVEL_DEBUG ); + } + + /** {@inheritDoc} */ + public int countErrorMessages() + { + return countMessagesOfType( MessageLevels.LEVEL_ERROR ); + } + + /** {@inheritDoc} */ + public int countInfoMessages() + { + return countMessagesOfType( MessageLevels.LEVEL_INFO ); + } + + /** {@inheritDoc} */ + public int countMessages() + { + return size(); + } + + /** {@inheritDoc} */ + public int countSevereMessages() + { + return countMessagesOfType( MessageLevels.LEVEL_SEVERE ); + } + + /** {@inheritDoc} */ + public int countWarningMessages() + { + return countMessagesOfType( MessageLevels.LEVEL_WARNING ); + } + + /** + * @param messageLevel leve. + * @return number of messages. + */ + private int countMessagesOfType( int messageLevel ) + { + int count = 0; + + for ( Message message : messages ) + { + if ( messageLevel == message.getMessageLevel() ) + { + count++; + } + } + + return count; + } + + /** {@inheritDoc} */ + public boolean isDebugEnabled() + { + return messageLevelStates[MessageLevels.LEVEL_DEBUG]; + } + + /** {@inheritDoc} */ + public boolean isErrorEnabled() + { + return messageLevelStates[MessageLevels.LEVEL_ERROR]; + } + + /** {@inheritDoc} */ + public boolean isInfoEnabled() + { + return messageLevelStates[MessageLevels.LEVEL_INFO]; + } + + /** {@inheritDoc} */ + public boolean isSevereEnabled() + { + return messageLevelStates[MessageLevels.LEVEL_SEVERE]; + } + + /** {@inheritDoc} */ + public boolean isWarningEnabled() + { + return messageLevelStates[MessageLevels.LEVEL_WARNING]; + } + + /** {@inheritDoc} */ + public MessageHolder newDebugMessage() + { + if ( isDebugEnabled() ) + { + newMessage( MessageLevels.LEVEL_DEBUG ); + } + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder newErrorMessage() + { + if ( isErrorEnabled() ) + { + newMessage( MessageLevels.LEVEL_ERROR ); + } + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder newInfoMessage() + { + if ( isInfoEnabled() ) + { + newMessage( MessageLevels.LEVEL_INFO ); + } + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder newSevereMessage() + { + if ( isSevereEnabled() ) + { + newMessage( MessageLevels.LEVEL_SEVERE ); + } + + return this; + } + + /** {@inheritDoc} */ + public MessageHolder newWarningMessage() + { + if ( isWarningEnabled() ) + { + newMessage( MessageLevels.LEVEL_WARNING ); + } + + return this; + } + + /** {@inheritDoc} */ + public void setDebugEnabled( boolean enabled ) + { + messageLevelStates[MessageLevels.LEVEL_DEBUG] = enabled; + } + + /** {@inheritDoc} */ + public void setErrorEnabled( boolean enabled ) + { + messageLevelStates[MessageLevels.LEVEL_ERROR] = enabled; + } + + /** {@inheritDoc} */ + public void setInfoEnabled( boolean enabled ) + { + messageLevelStates[MessageLevels.LEVEL_INFO] = enabled; + } + + /** {@inheritDoc} */ + public void setSevereEnabled( boolean enabled ) + { + messageLevelStates[MessageLevels.LEVEL_SEVERE] = enabled; + } + + /** {@inheritDoc} */ + public void setWarningEnabled( boolean enabled ) + { + messageLevelStates[MessageLevels.LEVEL_WARNING] = enabled; + } + + /** {@inheritDoc} */ + public void flush() + { + if ( onDemandSink != null && currentMessage != null ) + { + renderTo( currentMessage, onDemandSink ); + currentMessage = null; + } + } + + /** {@inheritDoc} */ + public void render( MessageSink sink ) + { + for ( Message message : messages ) + { + renderTo( message, sink ); + } + } + + /** + * @param message {@link Message} + * @param sink {@link MessageSink} + */ + protected 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/plugins/assembly/io/FileLocation.java b/src/main/java/org/apache/maven/plugins/assembly/io/FileLocation.java new file mode 100644 index 0000000..ee13dda --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/FileLocation.java @@ -0,0 +1,175 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + + +/** + * file location implementation. + * + */ +class FileLocation + implements Location +{ + + private File file; + private FileChannel channel; + private final String specification; + private FileInputStream stream; + + /** + * @param file {@link File} + * @param specification spec + */ + FileLocation( File file, String specification ) + { + this.file = file; + this.specification = specification; + } + + /** + * @param specification spec + */ + FileLocation( String specification ) + { + this.specification = specification; + } + + /** {@inheritDoc} */ + public void close() + { + if ( ( channel != null ) && channel.isOpen() ) + { + try + { + channel.close(); + } + catch ( IOException e ) + { + //swallow it. + } + } + + if ( stream != null ) + { + try + { + stream.close(); + } + catch ( IOException e ) + { + // swallow it. + } + } + } + + /** {@inheritDoc} */ + public File getFile() + throws IOException + { + initFile(); + + return unsafeGetFile(); + } + + /** + * @return {@link File} + */ + File unsafeGetFile() + { + return file; + } + + /** + * initialize file. + * @throws IOException in case of error + */ + private void initFile() + throws IOException + { + if ( file == null ) + { + file = new File( specification ); + } + } + + /** + * @param file {@link File} + */ + protected void setFile( File file ) + { + if ( channel != null ) + { + throw new IllegalStateException( "Location is already open; cannot setFile(..)." ); + } + + this.file = file; + } + + /** {@inheritDoc} */ + public String getSpecification() + { + return specification; + } + + /** {@inheritDoc} */ + public void open() + throws IOException + { + if ( stream == null ) + { + initFile(); + + stream = new FileInputStream( file ); + channel = stream.getChannel(); + } + } + + /** {@inheritDoc} */ + public int read( ByteBuffer buffer ) + throws IOException + { + open(); + return channel.read( buffer ); + } + + /** {@inheritDoc} */ + public int read( byte[] buffer ) + throws IOException + { + open(); + return channel.read( ByteBuffer.wrap( buffer ) ); + } + + /** {@inheritDoc} */ + public InputStream getInputStream() + throws IOException + { + open(); + return stream; + } + +} diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java b/src/main/java/org/apache/maven/plugins/assembly/io/FileLocatorStrategy.java similarity index 70% copy from src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java copy to src/main/java/org/apache/maven/plugins/assembly/io/FileLocatorStrategy.java index b0062ba..87e5385 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java +++ b/src/main/java/org/apache/maven/plugins/assembly/io/FileLocatorStrategy.java @@ -19,32 +19,20 @@ package org.apache.maven.plugins.assembly.io; * under the License. */ -import org.apache.maven.shared.io.location.FileLocation; -import org.apache.maven.shared.io.location.Location; -import org.apache.maven.shared.io.location.LocatorStrategy; -import org.apache.maven.shared.io.logging.MessageHolder; - import java.io.File; /** + * file locator strategy. * */ -class RelativeFileLocatorStrategy +class FileLocatorStrategy implements LocatorStrategy { - private final File basedir; - - RelativeFileLocatorStrategy( File basedir ) - { - this.basedir = basedir; - } - - @Override + /** {@inheritDoc} */ public Location resolve( String locationSpecification, MessageHolder messageHolder ) { - File file = new File( basedir, locationSpecification ); - messageHolder.addInfoMessage( "Searching for file location: " + file.getAbsolutePath() ); + File file = new File( locationSpecification ); Location location = null; diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/Location.java b/src/main/java/org/apache/maven/plugins/assembly/io/Location.java new file mode 100644 index 0000000..c30c4d4 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/Location.java @@ -0,0 +1,77 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.ByteBuffer; + +/** + * The location interface. + * + */ +interface Location +{ + + /** + * @return {@link File} + * @throws IOException in case of an error + */ + File getFile() throws IOException; + + /** + * Open the location. + * + * @throws IOException in case of an error + */ + void open() throws IOException; + + /** + * Close the location. + */ + void close(); + + /** + * @param buffer The buffer + * @return number of read bytes + * @throws IOException in case of an error + */ + int read( ByteBuffer buffer ) throws IOException; + + /** + * @param buffer the buffer + * @return number of read bytes + * @throws IOException in case of an error + */ + int read( byte[] buffer ) throws IOException; + + /** + * @return the resulting input stream. + * @throws IOException in case of an error + */ + InputStream getInputStream() throws IOException; + + /** + * @return spec + */ + String getSpecification(); + +} diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/Locator.java b/src/main/java/org/apache/maven/plugins/assembly/io/Locator.java new file mode 100644 index 0000000..8f992e3 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/Locator.java @@ -0,0 +1,114 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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.Iterator; +import java.util.List; + +/** + * The Locator. + * + */ +final class Locator +{ + + private List<LocatorStrategy> strategies; + private final MessageHolder messageHolder; + + /** + * @param strategies List of strategies + * @param messageHolder {@link MessageHolder} + */ + Locator( List<LocatorStrategy> strategies, MessageHolder messageHolder ) + { + this.messageHolder = messageHolder; + this.strategies = new ArrayList<LocatorStrategy>( strategies ); + } + + /** + * Create instance. + */ + Locator() + { + this.messageHolder = new DefaultMessageHolder(); + this.strategies = new ArrayList<LocatorStrategy>(); + } + + /** + * @return {@link MessageHolder} + */ + MessageHolder getMessageHolder() + { + return messageHolder; + } + + /** + * @param strategy The strategy to be added. + */ + void addStrategy( LocatorStrategy strategy ) + { + this.strategies.add( strategy ); + } + + /** + * @param strategy the strategy to remove. + */ + void removeStrategy( LocatorStrategy strategy ) + { + this.strategies.remove( strategy ); + } + + /** + * @param strategies the strategies to be set. + */ + void setStrategies( List<LocatorStrategy> strategies ) + { + this.strategies.clear(); + this.strategies.addAll( strategies ); + } + + /** + * @return list of strategies. + */ + List<LocatorStrategy> getStrategies() + { + return strategies; + } + + /** + * @param locationSpecification location spec + * @return {@link Location} + */ + Location resolve( String locationSpecification ) + { + Location location = null; + + for ( Iterator<LocatorStrategy> it = strategies.iterator(); location == null && it.hasNext(); ) + { + LocatorStrategy strategy = (LocatorStrategy) it.next(); + + location = strategy.resolve( locationSpecification, messageHolder ); + } + + return location; + } + +} diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/LocatorStrategy.java b/src/main/java/org/apache/maven/plugins/assembly/io/LocatorStrategy.java new file mode 100644 index 0000000..7ef73f8 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/LocatorStrategy.java @@ -0,0 +1,35 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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. + */ + +/** + * Locator Strategy interface. + */ +interface LocatorStrategy +{ + + /** + * @param locationSpecification the specification + * @param messageHolder {@link MessageHolder} + * @return {@link Location} + */ + Location resolve( String locationSpecification, MessageHolder messageHolder ); + +} diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/MessageHolder.java b/src/main/java/org/apache/maven/plugins/assembly/io/MessageHolder.java new file mode 100644 index 0000000..ff0ba38 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/MessageHolder.java @@ -0,0 +1,290 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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. + */ + +/** + * Message Holder class. + * + */ +interface MessageHolder +{ + + /** + * @return {@link MessageHolder} + */ + MessageHolder newMessage(); + + /** + * @return {@link MessageHolder} + */ + MessageHolder newDebugMessage(); + + /** + * @return {@link MessageHolder} + */ + MessageHolder newInfoMessage(); + + /** + * @return {@link MessageHolder} + */ + MessageHolder newWarningMessage(); + + /** + * @return {@link MessageHolder} + */ + MessageHolder newErrorMessage(); + + /** + * @return {@link MessageHolder} + */ + MessageHolder newSevereMessage(); + + /** + * @param messagePart message part. + * @return {@link MessageHolder} + */ + MessageHolder append( CharSequence messagePart ); + + /** + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder append( Throwable error ); + + /** + * @param messagePart Message Part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addMessage( CharSequence messagePart, Throwable error ); + + /** + * @param messagePart message part. + * @return {@link MessageHolder} + */ + MessageHolder addMessage( CharSequence messagePart ); + + /** + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addMessage( Throwable error ); + + /** + * @param messagePart message part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addDebugMessage( CharSequence messagePart, Throwable error ); + + /** + * @param messagePart messages part. + * @return {@link MessageHolder} + */ + MessageHolder addDebugMessage( CharSequence messagePart ); + + /** + * @param error messages part. + * @return {@link MessageHolder} + */ + MessageHolder addDebugMessage( Throwable error ); + + /** + * @param messagePart message part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addInfoMessage( CharSequence messagePart, Throwable error ); + + /** + * @param messagePart messages part. + * @return {@link MessageHolder} + */ + MessageHolder addInfoMessage( CharSequence messagePart ); + + /** + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addInfoMessage( Throwable error ); + + /** + * @param messagePart message part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addWarningMessage( CharSequence messagePart, Throwable error ); + + /** + * @param messagePart message part. + * @return {@link MessageHolder} + */ + MessageHolder addWarningMessage( CharSequence messagePart ); + + /** + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addWarningMessage( Throwable error ); + + /** + * @param messagePart message part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addErrorMessage( CharSequence messagePart, Throwable error ); + + /** + * @param messagePart message part. + * @return {@link MessageHolder} + */ + MessageHolder addErrorMessage( CharSequence messagePart ); + + /** + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addErrorMessage( Throwable error ); + + /** + * @param messagePart message part. + * @param error {@link Throwable} + * @return {@link MessageHolder} + */ + MessageHolder addSevereMessage( CharSequence messagePart, Throwable error ); + + /** + * @param messagePart message part. + * @return {@link MessageHolder} + */ + MessageHolder addSevereMessage( CharSequence messagePart ); + + /** + * @param error The error. + * @return {@link MessageHolder} + */ + MessageHolder addSevereMessage( Throwable error ); + + /** + * @return the size. + */ + int size(); + + /** + * @return count number of messages. + */ + int countMessages(); + + /** + * @return count number of debug messages. + */ + int countDebugMessages(); + + /** + * @return count number of info messages + */ + int countInfoMessages(); + + /** + * @return count number of warning messages + */ + int countWarningMessages(); + + /** + * @return count number of error messages + */ + int countErrorMessages(); + + /** + * @return count number of server messages + */ + int countSevereMessages(); + + /** + * @return true / false. + */ + boolean isDebugEnabled(); + + /** + * @param enabled enable debug + */ + void setDebugEnabled( boolean enabled ); + + /** + * @return true if info is enabled false otherwise + */ + boolean isInfoEnabled(); + + /** + * @param enabled true info enable false otherwise. + */ + void setInfoEnabled( boolean enabled ); + + /** + * @return true if warning is enabled false otherwise. + */ + boolean isWarningEnabled(); + + /** + * @param enabled enable warning or disable. + */ + void setWarningEnabled( boolean enabled ); + + /** + * @return true if error is enabled false otherwise. + */ + boolean isErrorEnabled(); + + /** + * @param enabled enable error or disable + */ + void setErrorEnabled( boolean enabled ); + + /** + * @return true if severe is enabled false otherwise. + */ + boolean isSevereEnabled(); + + /** + * @param enabled enable severe or disable + */ + void setSevereEnabled( boolean enabled ); + + /** + * @return true if empty, false otherwise + */ + boolean isEmpty(); + + /** + * @return rendered + */ + String render(); + + /** + * @param sink {@link MessageSink} + */ + void render( MessageSink sink ); + + /** + * flush + */ + void flush(); + +} diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/MessageLevels.java b/src/main/java/org/apache/maven/plugins/assembly/io/MessageLevels.java new file mode 100644 index 0000000..fd4e960 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/MessageLevels.java @@ -0,0 +1,117 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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 +{ + + /** + * Debug. + */ + public static final int LEVEL_DEBUG = 0; + /** + * Info + */ + public static final int LEVEL_INFO = 1; + /** + * Warning. + */ + public static final int LEVEL_WARNING = 2; + /** + * Error + */ + public static final int LEVEL_ERROR = 3; + /** + * Severe + */ + public static final int LEVEL_SEVERE = 4; + /** + * Disabled. + */ + public 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; + } + + /** + * @param messageLevel the message leve. + * @return The label. + */ + 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/plugins/assembly/io/MessageSink.java b/src/main/java/org/apache/maven/plugins/assembly/io/MessageSink.java new file mode 100644 index 0000000..9d37103 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/MessageSink.java @@ -0,0 +1,55 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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. + */ + + +/** + * Message Sink interface. + * + */ +interface MessageSink +{ + + /** + * @param message the message + */ + void debug( String message ); + + /** + * @param message the message + */ + void info( String message ); + + /** + * @param message the message + */ + void warning( String message ); + + /** + * @param message the message + */ + void error( String message ); + + /** + * @param message the message + */ + void severe( String message ); + +} diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategy.java b/src/main/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategy.java index f6f9cb4..47f3ccf 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategy.java +++ b/src/main/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategy.java @@ -19,10 +19,6 @@ package org.apache.maven.plugins.assembly.io; * under the License. */ -import org.apache.maven.shared.io.location.ClasspathResourceLocatorStrategy; -import org.apache.maven.shared.io.location.Location; -import org.apache.maven.shared.io.logging.MessageHolder; - /** * */ diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java b/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java index b0062ba..172eb5e 100644 --- a/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java +++ b/src/main/java/org/apache/maven/plugins/assembly/io/RelativeFileLocatorStrategy.java @@ -19,11 +19,6 @@ package org.apache.maven.plugins.assembly.io; * under the License. */ -import org.apache.maven.shared.io.location.FileLocation; -import org.apache.maven.shared.io.location.Location; -import org.apache.maven.shared.io.location.LocatorStrategy; -import org.apache.maven.shared.io.logging.MessageHolder; - import java.io.File; /** diff --git a/src/main/java/org/apache/maven/plugins/assembly/io/URLLocation.java b/src/main/java/org/apache/maven/plugins/assembly/io/URLLocation.java new file mode 100644 index 0000000..faaac78 --- /dev/null +++ b/src/main/java/org/apache/maven/plugins/assembly/io/URLLocation.java @@ -0,0 +1,81 @@ +package org.apache.maven.plugins.assembly.io; + +/* + * 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.File; +import java.io.IOException; +import java.net.URL; + +import org.apache.maven.shared.utils.io.FileUtils; + +/** + * The URL Location. + * + */ +class URLLocation + extends FileLocation +{ + + private final URL url; + + private final String tempFilePrefix; + + private final String tempFileSuffix; + + private final boolean tempFileDeleteOnExit; + + /** + * @param url the URL + * @param specification the spec + * @param tempFilePrefix the prefix + * @param tempFileSuffix the suffix + * @param tempFileDeleteOnExit delete on exit + */ + URLLocation( URL url, String specification, String tempFilePrefix, String tempFileSuffix, + boolean tempFileDeleteOnExit ) + { + super( specification ); + + this.url = url; + this.tempFilePrefix = tempFilePrefix; + this.tempFileSuffix = tempFileSuffix; + this.tempFileDeleteOnExit = tempFileDeleteOnExit; + } + + /** {@inheritDoc} */ + void initFile() + throws IOException + { + if ( unsafeGetFile() == null ) + { + File tempFile = File.createTempFile( tempFilePrefix, tempFileSuffix ); + + if ( tempFileDeleteOnExit ) + { + tempFile.deleteOnExit(); + } + + FileUtils.copyURLToFile( url, tempFile ); + + setFile( tempFile ); + } + } + +} diff --git a/src/test/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategyTest.java b/src/test/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategyTest.java index 9e00cd8..22507b7 100644 --- a/src/test/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategyTest.java +++ b/src/test/java/org/apache/maven/plugins/assembly/io/PrefixedClasspathLocatorStrategyTest.java @@ -20,10 +20,6 @@ package org.apache.maven.plugins.assembly.io; */ import junit.framework.TestCase; -import org.apache.maven.shared.io.location.Location; -import org.apache.maven.shared.io.location.LocatorStrategy; -import org.apache.maven.shared.io.logging.DefaultMessageHolder; -import org.apache.maven.shared.io.logging.MessageHolder; /** * @author Benjamin Bentmann @@ -31,11 +27,11 @@ import org.apache.maven.shared.io.logging.MessageHolder; public class PrefixedClasspathLocatorStrategyTest extends TestCase { + + private MessageHolder mh = new DefaultMessageHolder(); public void testResolvePrefixWithLeadingSlashAndWithTrailingSlash() { - MessageHolder mh = new DefaultMessageHolder(); - LocatorStrategy ls = new PrefixedClasspathLocatorStrategy( "/assemblies/" ); Location location = ls.resolve( "empty.xml", mh ); @@ -45,8 +41,6 @@ public class PrefixedClasspathLocatorStrategyTest public void testResolvePrefixWithLeadingSlashAndWithoutTrailingSlash() { - MessageHolder mh = new DefaultMessageHolder(); - LocatorStrategy ls = new PrefixedClasspathLocatorStrategy( "/assemblies" ); Location location = ls.resolve( "empty.xml", mh ); @@ -56,8 +50,6 @@ public class PrefixedClasspathLocatorStrategyTest public void testResolvePrefixWithoutLeadingSlashAndWithTrailingSlash() { - MessageHolder mh = new DefaultMessageHolder(); - LocatorStrategy ls = new PrefixedClasspathLocatorStrategy( "assemblies/" ); Location location = ls.resolve( "empty.xml", mh ); @@ -67,8 +59,6 @@ public class PrefixedClasspathLocatorStrategyTest public void testResolvePrefixWithoutLeadingSlashAndWithoutTrailingSlash() { - MessageHolder mh = new DefaultMessageHolder(); - LocatorStrategy ls = new PrefixedClasspathLocatorStrategy( "assemblies" ); Location location = ls.resolve( "empty.xml", mh );