/* * 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()); } }