📄 abstractid3v2frame.java
字号:
catch (InvocationTargetException ite)
{
logger.severe(getLoggingFilename()+":"+"An error occurred within abstractID3v2FrameBody for identifier:"
+identifier+":"+ite.getCause().getMessage());
if(ite.getCause() instanceof Error)
{
throw (Error)ite.getCause();
}
else if(ite.getCause() instanceof RuntimeException)
{
throw (RuntimeException)ite.getCause();
}
else
{
throw new InvalidFrameException(ite.getCause().getMessage());
}
}
//No Such Method should not happen
catch (NoSuchMethodException sme)
{
logger.log(Level.SEVERE,getLoggingFilename()+":"+"No such method:"+sme.getMessage(),sme);
throw new RuntimeException(sme.getMessage());
}
//Instantiate Interface/Abstract should not happen
catch (InstantiationException ie)
{
logger.log(Level.SEVERE,getLoggingFilename()+":"+"Instantiation exception:"+ie.getMessage(),ie);
throw new RuntimeException(ie.getMessage());
}
//Private Constructor shouild not happen
catch (IllegalAccessException iae)
{
logger.log(Level.SEVERE,getLoggingFilename()+":"+"Illegal access exception :"+iae.getMessage(),iae);
throw new RuntimeException(iae.getMessage());
}
logger.finest(getLoggingFilename()+":"+"Created framebody:end" + frameBody.getIdentifier());
frameBody.setHeader(this);
return frameBody;
}
/**
* This creates a new body based of type identifier but populated by the data
* in the body. This is a different type to the body being created which is why
* TagUtility.copyObject() can't be used. This is used when converting between
* different versions of a tag for frames that have a non-trivial mapping such
* as TYER in v3 to TDRC in v4. This will only work where appropriate constructors
* exist in the frame body to be created, for example a FrameBodyTYER requires a constructor
* consisting of a FrameBodyTDRC.
*
* If this method is called and a suitable constructor does not exist then an InvalidFrameException
* will be thrown
*
* @param identifier to determine type of the frame
* @throws InvalidFrameException if unable to construct a framebody for the identifier and body provided.
* @return newly created framebody for this type
*/
protected AbstractID3v2FrameBody readBody(String identifier, AbstractID3v2FrameBody body)
throws InvalidFrameException
{
/* Use reflection to map id to frame body, which makes things much easier
* to keep things up to date, although slight performance hit.
*/
AbstractID3v2FrameBody frameBody;
try
{
Class c = Class.forName("com.hadeslee.audiotag.tag.id3.framebody.FrameBody" + identifier);
Class[] constructorParameterTypes = {body.getClass()};
Object[] constructorParameterValues = {body};
Constructor construct = c.getConstructor(constructorParameterTypes);
frameBody = (AbstractID3v2FrameBody) (construct.newInstance(constructorParameterValues));
}
catch (ClassNotFoundException cex)
{
logger.info("Identifier not recognised:" + identifier + " unable to create framebody");
throw new InvalidFrameException("FrameBody"+identifier + " does not exist");
}
//If suitable constructor does not exist
catch (NoSuchMethodException sme)
{
logger.log(Level.SEVERE,"No such method:"+sme.getMessage(),sme);
throw new InvalidFrameException("FrameBody"+identifier + " does not have a constructor that takes:"+body.getClass().getName());
}
catch (InvocationTargetException ite)
{
logger.severe("An error occurred within abstractID3v2FrameBody");
logger.log(Level.SEVERE,"Invocation target exception:"+ite.getCause().getMessage(),ite.getCause());
if(ite.getCause() instanceof Error)
{
throw (Error)ite.getCause();
}
else if(ite.getCause() instanceof RuntimeException)
{
throw (RuntimeException)ite.getCause();
}
else
{
throw new InvalidFrameException(ite.getCause().getMessage());
}
}
//Instantiate Interface/Abstract should not happen
catch (InstantiationException ie)
{
logger.log(Level.SEVERE,"Instantiation exception:"+ie.getMessage(),ie);
throw new RuntimeException(ie.getMessage());
}
//Private Constructor shouild not happen
catch (IllegalAccessException iae)
{
logger.log(Level.SEVERE,"Illegal access exception :"+iae.getMessage(),iae);
throw new RuntimeException(iae.getMessage());
}
logger.finer("frame Body created" + frameBody.getIdentifier());
frameBody.setHeader(this);
return frameBody;
}
public byte[] getRawContent()
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
write(baos);
return baos.toByteArray();
}
public abstract void write(ByteArrayOutputStream tagBuffer);
/**
*
* @param b
*/
public void isBinary(boolean b)
{
//do nothing because whether or not a field is binary is defined by its id and is immutable
}
public boolean isEmpty()
{
AbstractTagFrameBody body = this.getBody();
if(body==null)
{
return true;
}
//TODO depends on the body
return false;
}
protected StatusFlags getStatusFlags()
{
return statusFlags;
}
protected EncodingFlags getEncodingFlags()
{
return encodingFlags;
}
class StatusFlags
{
protected static final String TYPE_FLAGS = "statusFlags";
protected byte originalFlags;
protected byte writeFlags;
protected StatusFlags()
{
}
/**
* This returns the flags as they were originally read or created
*/
public byte getOriginalFlags()
{
return originalFlags;
}
/**
* This returns the flags amended to meet specification
*/
public byte getWriteFlags()
{
return writeFlags;
}
public void createStructure()
{
}
}
class EncodingFlags
{
protected static final String TYPE_FLAGS = "encodingFlags";
protected byte flags;
protected EncodingFlags()
{
resetFlags();
}
protected EncodingFlags(byte flags)
{
setFlags(flags);
}
public byte getFlags()
{
return flags;
}
public void setFlags(byte flags)
{
this.flags=flags;
}
public void resetFlags()
{
setFlags((byte) 0);
}
public void createStructure()
{
}
}
/**
* Return String Representation of frame
*/
public void createStructure()
{
MP3File.getStructureFormatter().openHeadingElement(TYPE_FRAME, getIdentifier());
MP3File.getStructureFormatter().closeHeadingElement(TYPE_FRAME);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -