## Using content types

> Note: For this discussion, we specifically avoid the use of the word file when talking about content. The runtime content engine does not assume that content is contained in a file in the file system. However, it does include protocol that allows content types to be associated with file-naming patterns. In practice, these file names represent files in the file system, but nothing in the implementation of the content system assumes that the content is located in the file system. File encoding and content types discusses the file-oriented content type capabilities contributed by the platform resources plug-in and is a must-read for developers interested in using the content type API in that context.

### Finding out about content types

Content types are represented by IContentType. This interface represents a unique content type that knows how to read a data stream and interpret content type-specific information. Content types are hierarchical in nature. For example, a content type for XML data is considered a child of the text content type. This allows new content types to leverage the attributes or behavior of more general content types.

The IContentTypeManager is the entry point that gives access to most of the content type related API provided by the platform runtime. To obtain a reference to the platform IContentTypeManager, clients can use the Platform API:

    IContentTypeManager contentTypeManager = Platform.getContentTypeManager();

Clients can use the platform IContentTypeManager to find out about the content types in the system.

- getAllContentTypes allows clients to get all of the content types defined in the platform.
- getContentType allows clients to obtain a content type by its unique identifier.

### Detecting the content type for a data stream

Given a stream of bytes, it is possible to determine its content type by calling the IContentTypeManager API as follows:

    InputStream stream = ...;
    IContentType contentType = contentTypeManager.findContentTypeFor(stream, "file.xml");
    stream.close();

This will return the most appropriate IContentType given the input provided, or `null` if none can be found. Multiple content types might be deemed appropriate for a given data stream. In that case, the platform uses some heuristics to determine which one should be selected. The file name is the first criterion by which content types are selected. It can be omitted, but this has two issues: the results might not be as correct because many unrelated content types might accept the same input; there is also a big performance hit, since all content types in the platform have to be given a chance of analysing the stream. So, unless it is not available, clients should always provide a file name along with the stream.

### Describing a data stream

Another interesting feature of the content type support in the platform is the ability of describing the contents of a binary or character stream. The following code snippet shows how to do that:

    InputStream stream = ...;
    IContentDescription description = contentTypeManager.getDescriptionFor(stream, "file.xml");
    stream.close();

The returned IContentDescription instance describes the content type and additional relevant information extracted from the contents provided. The content description stores content-specific properties in form of key/value pairs. The platform itself is able to describe properties such as the character set and the byte order of text-based streams, but others can be defined by content type providers.

### Providing content-sensitive features

New content types are often defined as specialization of existing ones. This hierarchy establishes a "is a" relationship between a derived content type and its base type. Plug-in developers must honor this when implementing content sensitive features. If a given feature is applicable to a given content type, the feature must be applicable to any derived content types as well. The IContentType.isKindOf(IContentType superType) method allows determining whether two IContentTypes are related. The method IContentType.getBaseType() allows determining the base type of a given IContentType.