OBJXArchive* OBJXArchiveFactory::getOBJXArchiveFromPlainOBJFile(istream &in) throw (InvalidArgumentException) {
                if (!(in.good())) {
                    // Try to rewind the stream.
                    clog << "Trying to rewind the stream." << endl;
                    in.clear();
                    in.seekg(ios::beg);

                    if (!(in.good())) {
                        HESPERIA_CORE_THROW_EXCEPTION(InvalidArgumentException, "Given inputstream is invalid.");
                    }
                }

                OBJXArchive *objxArchive = new OBJXArchive();

                char c;
                stringstream s;
                while (in.good()) {
                    in.get(c);
                    s << c;
                }
                objxArchive->setContentsOfObjFile(s.str());

                return objxArchive;
            }
            OBJXArchive* OBJXArchiveFactory::getOBJXArchive(istream &in) throw (InvalidArgumentException) {
                if (!(in.good())) {
                    // Try to rewind the stream.
                    clog << "Trying to rewind the stream." << endl;
                    in.clear();
                    in.seekg(ios::beg);

                    if (!(in.good())) {
                        HESPERIA_CORE_THROW_EXCEPTION(InvalidArgumentException, "Given inputstream is invalid.");
                    }
                }

                OBJXArchive *objxArchive = NULL;

                // Use CompressionFactory to read the contents of the OBJXArchive.
                core::wrapper::DecompressedData *data = core::wrapper::CompressionFactory::getInstance().getContents(in);

                if (data != NULL) {
                    // Create OBJXArchive.
                    objxArchive = new OBJXArchive();

                    vector<string> listOfEntries = data->getListOfEntries();
                    vector<string>::iterator it = listOfEntries.begin();

                    while (it != listOfEntries.end()) {
                        string entry = (*it++);

                        if (entry.find(".obj") != string::npos) {
                            // Set object file.
                            istream *stream = data->getInputStreamFor(entry);

                            char c;
                            stringstream s;
                            while (stream->good()) {
                                stream->get(c);
                                s << c;
                            }
                            objxArchive->setContentsOfObjFile(s.str());
                        } else if (entry.find(".mtl") != string::npos) {
                            // Set material file.
                            istream *stream = data->getInputStreamFor(entry);

                            char c;
                            stringstream s;
                            while (stream->good()) {
                                stream->get(c);
                                s << c;
                            }
                            objxArchive->setContentsOfMtlFile(s.str());
                        } else {
                            // Try to load an image.
                            istream *stream = data->getInputStreamFor(entry);

                            if (stream != NULL) {
                                core::wrapper::Image *image = core::wrapper::ImageFactory::getInstance().getImage(*stream);

                                if (image != NULL) {
                                    // TODO: Check where origin lies.
                                    image->rotate(static_cast<float>(data::Constants::PI));

                                    // Remove any directory prefixes from the entry.
                                    string name = entry;
                                    if (name.rfind('/') != string::npos) {
                                        name = name.substr(name.rfind('/') + 1);
                                    }

                                    objxArchive->addImage(name, image);
                                }
                            }
                        }

                    }
                }

                return objxArchive;
            }