/*
* Entagged Audio Tag library
* Copyright (c) 2003-2005 Raphaël Slinckx <raphael@slinckx.net>
*
* 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, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jaudiotagger.audio.generic;
import org.jaudiotagger.logging.ErrorMessage;
import org.jaudiotagger.tag.*;
import org.jaudiotagger.tag.datatype.Artwork;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
/**
* This is a complete example implementation of
* {@link AbstractTag} and it currenlty used to provide basic support to audio formats with only read tagging
* ability such as Real or Wav files <br>
*
* @author Raphaël Slinckx
*/
public abstract class GenericTag extends AbstractTag {
private static EnumSet<FieldKey> supportedKeys;
static {
supportedKeys = EnumSet.of(FieldKey.ALBUM, FieldKey.ARTIST, FieldKey.TITLE, FieldKey.TRACK, FieldKey.GENRE, FieldKey.COMMENT, FieldKey.YEAR);
}
/**
* Implementations of {@link TagTextField} for use with
* "ISO-8859-1" strings.
*
* @author Raphaël Slinckx
*/
private class GenericTagTextField implements TagTextField {
/**
* Stores the string.
*/
private String content;
/**
* Stores the identifier.
*/
private final String id;
/**
* Creates an instance.
*
* @param fieldId The identifier.
* @param initialContent The string.
*/
public GenericTagTextField(String fieldId, String initialContent) {
this.id = fieldId;
this.content = initialContent;
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#copyContent(org.jaudiotagger.tag.TagField)
*/
public void copyContent(TagField field) {
if (field instanceof TagTextField) {
this.content = ((TagTextField) field).getContent();
}
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagTextField#getContent()
*/
public String getContent() {
return this.content;
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagTextField#getEncoding()
*/
public String getEncoding() {
return "ISO-8859-1";
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#getId()
*/
public String getId() {
return id;
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#getRawContent()
*/
public byte[] getRawContent() {
return this.content == null ? new byte[]{} : Utils.getDefaultBytes(this.content, getEncoding());
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#isBinary()
*/
public boolean isBinary() {
return false;
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#isBinary(boolean)
*/
public void isBinary(boolean b) {
/* not supported */
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#isCommon()
*/
public boolean isCommon() {
return true;
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagField#isEmpty()
*/
public boolean isEmpty() {
return this.content.equals("");
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagTextField#setContent(java.lang.String)
*/
public void setContent(String s) {
this.content = s;
}
/**
* (overridden)
*
* @see org.jaudiotagger.tag.TagTextField#setEncoding(java.lang.String)
*/
public void setEncoding(String s) {
/* Not allowed */
}
/**
* (overridden)
*
* @see java.lang.Object#toString()
*/
public String toString() {
return getContent();
}
}
/**
* (overridden)
*
* @see org.jaudiotagger.audio.generic.AbstractTag#isAllowedEncoding(java.lang.String)
*/
protected boolean isAllowedEncoding(String enc) {
return true;
}
public TagField createField(FieldKey genericKey, String value) throws KeyNotFoundException, FieldDataInvalidException {
if (supportedKeys.contains(genericKey)) {
return new GenericTagTextField(genericKey.name(), value);
} else {
throw new UnsupportedOperationException(ErrorMessage.GENERIC_NOT_SUPPORTED.getMsg());
}
}
/**
* @param genericKey
* @return
* @throws KeyNotFoundException
*/
public String getFirst(FieldKey genericKey) throws KeyNotFoundException {
return getValue(genericKey, 0);
}
public String getValue(FieldKey genericKey, int index) throws KeyNotFoundException {
if (supportedKeys.contains(genericKey)) {
return getItem(genericKey.name(), index);
} else {
throw new UnsupportedOperationException(ErrorMessage.GENERIC_NOT_SUPPORTED.getMsg());
}
}
/**
* @param genericKey
* @throws KeyNotFoundException
*/
public void deleteField(FieldKey genericKey) throws KeyNotFoundException {
if (supportedKeys.contains(genericKey)) {
deleteField(genericKey.name());
} else {
throw new UnsupportedOperationException(ErrorMessage.GENERIC_NOT_SUPPORTED.getMsg());
}
}
/**
* @param genericKey
* @return
* @throws KeyNotFoundException
*/
public TagField getFirstField(FieldKey genericKey) throws KeyNotFoundException {
if (supportedKeys.contains(genericKey)) {
return getFirstField(genericKey.name());
} else {
throw new UnsupportedOperationException(ErrorMessage.GENERIC_NOT_SUPPORTED.getMsg());
}
}
public List<Artwork> getArtworkList() {
return Collections.emptyList();
}
public TagField createField(Artwork artwork) throws FieldDataInvalidException {
throw new UnsupportedOperationException(ErrorMessage.GENERIC_NOT_SUPPORTED.getMsg());
}
}