blob: b84ce1fc693aa1c06f7c8842e26ec6f88ac67e37 [file] [log] [blame]
package org.apache.maven.doxia.wrapper;
/*
* 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.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import org.codehaus.plexus.util.IOUtil;
import org.codehaus.plexus.util.StringUtils;
import com.ibm.icu.text.CharsetDetector;
/**
* Abstract File wrapper for Doxia converter.
*
* @author <a href="mailto:vincent.siveton@gmail.com">Vincent Siveton</a>
*/
abstract class AbstractFileWrapper
extends AbstractWrapper
{
public static final String AUTO_ENCODING = "auto";
private File file;
private String encoding;
/**
*
* @param absolutePath not null
* @param format could be null
* @param encoding could be null
* @param supportedFormat not null
* @throws UnsupportedEncodingException if the encoding is unsupported.
* @throws IllegalArgumentException if any
*/
AbstractFileWrapper( String absolutePath, String format, String encoding, String[] supportedFormat )
throws UnsupportedEncodingException
{
super( format, supportedFormat );
if ( StringUtils.isEmpty( absolutePath ) )
{
throw new IllegalArgumentException( "absolutePath is required" );
}
File filetoset = new File( absolutePath );
if ( !filetoset.isAbsolute() )
{
filetoset = new File( new File( "" ).getAbsolutePath(), absolutePath );
}
this.file = filetoset;
if ( StringUtils.isNotEmpty( encoding ) && !encoding.equalsIgnoreCase( encoding )
&& !validateEncoding( encoding ) )
{
StringBuilder msg = new StringBuilder();
msg.append( "The encoding '" + encoding + "' is not a valid one. The supported charsets are: " );
msg.append( StringUtils.join( CharsetDetector.getAllDetectableCharsets(), ", " ) );
throw new UnsupportedEncodingException( msg.toString() );
}
this.encoding = ( StringUtils.isNotEmpty( encoding ) ? encoding : AUTO_ENCODING );
}
/**
* @return the file
*/
public File getFile()
{
return file;
}
/**
* @param file new file.
*/
void setFile( File file )
{
this.file = file;
}
/**
* @return the encoding used for the file or <code>null</code> if not specified.
*/
public String getEncoding()
{
return encoding;
}
/**
* @param encoding new encoding.
*/
void setEncoding( String encoding )
{
this.encoding = encoding;
}
/**
* Validate if a charset is supported on this platform.
*
* @param charsetName the charsetName to be checked.
* @return <code>true</code> if the charset is supported by the JVM, <code>false</code> otherwise.
*/
static boolean validateEncoding( String charsetName )
{
if ( StringUtils.isEmpty( charsetName ) )
{
return false;
}
OutputStream ost = new ByteArrayOutputStream();
OutputStreamWriter osw = null;
try
{
osw = new OutputStreamWriter( ost, charsetName );
}
catch ( UnsupportedEncodingException exc )
{
return false;
}
finally
{
IOUtil.close( osw );
}
return true;
}
/** {@inheritDoc} */
@Override
public boolean equals( Object other )
{
if ( this == other )
{
return true;
}
if ( !( other instanceof AbstractFileWrapper ) )
{
return false;
}
AbstractFileWrapper that = (AbstractFileWrapper) other;
boolean result = true;
result = result && super.equals( other );
result = result && ( getFile() == null ? that.getFile() == null : getFile().equals( that.getFile() ) );
return result;
}
/** {@inheritDoc} */
@Override
public int hashCode()
{
final int result = super.hashCode();
final int hash = 37;
return hash * result + ( getFile() != null ? getFile().hashCode() : 0 );
}
/** {@inheritDoc} */
@Override
public java.lang.String toString()
{
StringBuilder buf = new StringBuilder( super.toString() + "\n" );
buf.append( "file= '" );
buf.append( getFile() + "'" );
return buf.toString();
}
}