/**
* @author : Paul Taylor
* @author : Eric Farng
*
* Version @version:$Id: AbstractFrameBodyUrlLink.java 895 2010-04-15 15:21:45Z paultaylor $
*
* MusicTag Copyright (C)2003,2004
*
* This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser
* General Public License as published by the Free Software Foundation; either version 2.1 of the License,
* or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License along with this library; if not,
* you can get a copy from http://www.opensource.org/licenses/lgpl-license.php or write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*
*/
package org.jaudiotagger.tag.id3.framebody;
import org.jaudiotagger.logging.ErrorMessage;
import org.jaudiotagger.tag.InvalidTagException;
import org.jaudiotagger.tag.datatype.DataTypes;
import org.jaudiotagger.tag.datatype.StringSizeTerminated;
import org.jaudiotagger.tag.id3.valuepair.TextEncoding;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetEncoder;
/**
* Abstract super class of all URL Frames
*/
public abstract class AbstractFrameBodyUrlLink extends AbstractID3v2FrameBody {
/**
* Creates a new FrameBodyUrlLink datatype.
*/
protected AbstractFrameBodyUrlLink() {
super();
}
/**
* Copy Constructor
*
* @param body
*/
protected AbstractFrameBodyUrlLink(AbstractFrameBodyUrlLink body) {
super(body);
}
/**
* Creates a new FrameBodyUrlLink datatype., set up with data.
*
* @param urlLink
*/
public AbstractFrameBodyUrlLink(String urlLink) {
setObjectValue(DataTypes.OBJ_URLLINK, urlLink);
}
/**
* Creates a new FrameBodyUrlLink datatype.
*
* @param byteBuffer
* @param frameSize
* @throws InvalidTagException if unable to create framebody from buffer
*/
protected AbstractFrameBodyUrlLink(ByteBuffer byteBuffer, int frameSize) throws InvalidTagException {
super(byteBuffer, frameSize);
}
public String getUserFriendlyValue() {
return getUrlLink();
}
/**
* Set URL Link
*
* @param urlLink
*/
public void setUrlLink(String urlLink) {
if (urlLink == null) {
throw new IllegalArgumentException(ErrorMessage.GENERAL_INVALID_NULL_ARGUMENT.getMsg());
}
setObjectValue(DataTypes.OBJ_URLLINK, urlLink);
}
/**
* Get URL Link
*
* @return the urllink
*/
public String getUrlLink() {
return (String) getObjectValue(DataTypes.OBJ_URLLINK);
}
/**
* If the description cannot be encoded using the current encoding change the encoder
*/
public void write(ByteArrayOutputStream tagBuffer) {
CharsetEncoder encoder = Charset.forName(TextEncoding.CHARSET_ISO_8859_1).newEncoder();
String origUrl = getUrlLink();
if (!encoder.canEncode(origUrl)) {
//ALL W Frames only support ISO-8859-1 for the url itself, if unable to encode let us assume
//the link just needs url encoding
setUrlLink(encodeURL(origUrl));
//We still cant convert so just set log error and set to blank to allow save to continue
if (!encoder.canEncode(getUrlLink())) {
//logger.warning(ErrorMessage.MP3_UNABLE_TO_ENCODE_URL.getMsg(origUrl));
setUrlLink("");
}
//it was ok, just note the modification made
else {
//logger.warning(ErrorMessage.MP3_URL_SAVED_ENCODED.getMsg(origUrl, getUrlLink()));
}
}
super.write(tagBuffer);
}
/**
*
*/
protected void setupObjectList() {
objectList.add(new StringSizeTerminated(DataTypes.OBJ_URLLINK, this));
}
/**
* Encode url because may receive url already encoded or not, but we can only store as ISO8859-1
*
* @param url
* @return
*/
private String encodeURL(String url) {
try {
final String[] splitURL = url.split("(?<!/)/(?!/)", -1);
final StringBuffer sb = new StringBuffer(splitURL[0]);
for (int i = 1; i < splitURL.length; i++) {
sb.append("/").append(URLEncoder.encode(splitURL[i], "utf-8"));
}
return sb.toString();
} catch (UnsupportedEncodingException uee) {
//Should never happen as utf-8 is always availablebut in case it does we just return the utl
//unmodified
//logger.warning("Uable to url encode because utf-8 charset not available:" + uee.getMessage());
return url;
}
}
}