Completed
Pull Request — master (#233)
by
unknown
05:24
created

OPDSRenderer::startXmlDocument()   C

Complexity

Conditions 11
Paths 72

Size

Total Lines 78
Code Lines 63

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 70
CRAP Score 11
Metric Value
dl 0
loc 78
ccs 70
cts 70
cp 1
rs 5.3527
cc 11
eloc 63
nc 72
nop 1
crap 11

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/**
3
 * COPS (Calibre OPDS PHP Server) class file
4
 *
5
 * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
6
 * @author     S�bastien Lucas <[email protected]>
7
 */
8
9
require_once ("base.php");
10
11
class OPDSRenderer
12
{
13
    private $xmlStream = NULL;
14
    private $updated = NULL;
15
16 14
    private function getUpdatedTime () {
17 14
        if (is_null ($this->updated)) {
18 14
            $this->updated = time();
19 14
        }
20 14
        return date (DATE_ATOM, $this->updated);
21
    }
22
23 14
    private function getXmlStream () {
24 14
        if (is_null ($this->xmlStream)) {
25 14
            $this->xmlStream = new XMLWriter();
26 14
            $this->xmlStream->openMemory();
27 14
            $this->xmlStream->setIndent (true);
28 14
        }
29 14
        return $this->xmlStream;
30
    }
31
32 1
    public function getOpenSearch () {
33 1
        global $config;
34 1
        $xml = new XMLWriter ();
35 1
        $xml->openMemory ();
36 1
        $xml->setIndent (true);
37 1
        $xml->startDocument('1.0','UTF-8');
38 1
            $xml->startElement ("OpenSearchDescription");
39 1
                $xml->writeAttribute ("xmlns", "http://a9.com/-/spec/opensearch/1.1/");
40 1
                $xml->startElement ("ShortName");
41 1
                    $xml->text ("My catalog");
42 1
                $xml->endElement ();
43 1
                $xml->startElement ("Description");
44 1
                    $xml->text ("Search for ebooks");
45 1
                $xml->endElement ();
46 1
                $xml->startElement ("InputEncoding");
47 1
                    $xml->text ("UTF-8");
48 1
                $xml->endElement ();
49 1
                $xml->startElement ("OutputEncoding");
50 1
                    $xml->text ("UTF-8");
51 1
                $xml->endElement ();
52 1
                $xml->startElement ("Image");
53 1
                    $xml->writeAttribute ("type", "image/x-icon");
54 1
                    $xml->writeAttribute ("width", "16");
55 1
                    $xml->writeAttribute ("height", "16");
56 1
                    $xml->text ($config['cops_icon']);
57 1
                $xml->endElement ();
58 1
                $xml->startElement ("Url");
59 1
                    $xml->writeAttribute ("type", 'application/atom+xml');
60 1
                    $urlparam = "?query={searchTerms}";
61 1
                    if (!is_null (GetUrlParam (DB))) {
62
                    	$urlparam = addURLParameter ($urlparam, DB, GetUrlParam (DB));
63
                    	$urlparam = addURLParameter ($urlparam, VL, GetUrlParam (VL, 0));
64
                    }
65 1
                    $urlparam = str_replace ("%7B", "{", $urlparam);
66 1
                    $urlparam = str_replace ("%7D", "}", $urlparam);
67 1
                    $xml->writeAttribute ("template", $config['cops_full_url'] . 'feed.php' . $urlparam);
68 1
                $xml->endElement ();
69 1
                $xml->startElement ("Query");
70 1
                    $xml->writeAttribute ("role", "example");
71 1
                    $xml->writeAttribute ("searchTerms", "robot");
72 1
                $xml->endElement ();
73 1
            $xml->endElement ();
74 1
        $xml->endDocument();
75 1
        return $xml->outputMemory(true);
76
    }
77
78 14
    private function startXmlDocument ($page) {
79 14
        global $config;
80 14
        self::getXmlStream ()->startDocument('1.0','UTF-8');
81 14
        self::getXmlStream ()->startElement ("feed");
82 14
            self::getXmlStream ()->writeAttribute ("xmlns", "http://www.w3.org/2005/Atom");
83 14
            self::getXmlStream ()->writeAttribute ("xmlns:xhtml", "http://www.w3.org/1999/xhtml");
84 14
            self::getXmlStream ()->writeAttribute ("xmlns:opds", "http://opds-spec.org/2010/catalog");
85 14
            self::getXmlStream ()->writeAttribute ("xmlns:opensearch", "http://a9.com/-/spec/opensearch/1.1/");
86 14
            self::getXmlStream ()->writeAttribute ("xmlns:dcterms", "http://purl.org/dc/terms/");
87 14
            self::getXmlStream ()->startElement ("title");
88 14
                self::getXmlStream ()->text ($page->title);
89 14
            self::getXmlStream ()->endElement ();
90 14
            if ($page->subtitle != "")
91 14
            {
92 1
                self::getXmlStream ()->startElement ("subtitle");
93 1
                    self::getXmlStream ()->text ($page->subtitle);
94 1
                self::getXmlStream ()->endElement ();
95 1
            }
96 14
            self::getXmlStream ()->startElement ("id");
97 14
                if ($page->idPage)
98 14
                {
99 13
                    $idPage = $page->idPage;
100 13
                    if (!is_null (GetUrlParam (DB))) $idPage = str_replace ("cops:", "cops:" . GetUrlParam (DB) . ":", $idPage);
101 13
                    self::getXmlStream ()->text ($idPage);
102 13
                }
103
                else
104
                {
105 1
                    self::getXmlStream ()->text ($_SERVER['REQUEST_URI']);
106
                }
107 14
            self::getXmlStream ()->endElement ();
108 14
            self::getXmlStream ()->startElement ("updated");
109 14
                self::getXmlStream ()->text (self::getUpdatedTime ());
110 14
            self::getXmlStream ()->endElement ();
111 14
            self::getXmlStream ()->startElement ("icon");
112 14
                self::getXmlStream ()->text ($page->favicon);
113 14
            self::getXmlStream ()->endElement ();
114 14
            self::getXmlStream ()->startElement ("author");
115 14
                self::getXmlStream ()->startElement ("name");
116 14
                    self::getXmlStream ()->text ($page->authorName);
117 14
                self::getXmlStream ()->endElement ();
118 14
                self::getXmlStream ()->startElement ("uri");
119 14
                    self::getXmlStream ()->text ($page->authorUri);
120 14
                self::getXmlStream ()->endElement ();
121 14
                self::getXmlStream ()->startElement ("email");
122 14
                    self::getXmlStream ()->text ($page->authorEmail);
123 14
                self::getXmlStream ()->endElement ();
124 14
            self::getXmlStream ()->endElement ();
125 14
            $link = new LinkNavigation ("", "start", "Home");
126 14
            self::renderLink ($link);
127 14
            $link = new LinkNavigation ("?" . getQueryString (), "self");
128 14
            self::renderLink ($link);
129 14
            $urlparam = "?";
130 14
            if (!is_null (GetUrlParam (DB))) {
131 1
            	$urlparam = addURLParameter ($urlparam, DB, GetUrlParam (DB));
132 1
            	$urlparam = addURLParameter ($urlparam, VL, GetUrlParam (VL, 0));
133 1
            }
134 14
            if ($config['cops_generate_invalid_opds_stream'] == 0 || preg_match("/(MantanoReader|FBReader)/", $_SERVER['HTTP_USER_AGENT'])) {
135
                // Good and compliant way of handling search
136 14
                $urlparam = addURLParameter ($urlparam, "page", Base::PAGE_OPENSEARCH);
137 14
                $link = new Link ("feed.php" . $urlparam, "application/opensearchdescription+xml", "search", "Search here");
138 14
            }
139
            else
140
            {
141
                // Bad way, will be removed when OPDS client are fixed
142 1
                $urlparam = addURLParameter ($urlparam, "query", "{searchTerms}");
143 1
                $urlparam = str_replace ("%7B", "{", $urlparam);
144 1
                $urlparam = str_replace ("%7D", "}", $urlparam);
145 1
                $link = new Link ($config['cops_full_url'] . 'feed.php' . $urlparam, "application/atom+xml", "search", "Search here");
146
            }
147 14
            self::renderLink ($link);
148 14
            if ($page->containsBook () && !is_null ($config['cops_books_filter']) && count ($config['cops_books_filter']) > 0) {
149 1
                $Urlfilter = getURLParam ("tag", "");
150 1
                foreach ($config['cops_books_filter'] as $lib => $filter) {
151 1
                    $link = new LinkFacet ("?" . addURLParameter (getQueryString (), "tag", $filter), $lib, localize ("tagword.title"), $filter == $Urlfilter);
152 1
                    self::renderLink ($link);
153 1
                }
154 1
            }
155 14
    }
156
157 14
    private function endXmlDocument () {
158 14
        self::getXmlStream ()->endElement ();
159 14
        self::getXmlStream ()->endDocument ();
160 14
        return self::getXmlStream ()->outputMemory(true);
161
    }
162
163 14
    private function renderLink ($link) {
164 14
        self::getXmlStream ()->startElement ("link");
165 14
            self::getXmlStream ()->writeAttribute ("href", $link->href);
166 14
            self::getXmlStream ()->writeAttribute ("type", $link->type);
167 14
            if (!is_null ($link->rel)) {
168 14
                self::getXmlStream ()->writeAttribute ("rel", $link->rel);
169 14
            }
170 14
            if (!is_null ($link->title)) {
171 14
                self::getXmlStream ()->writeAttribute ("title", $link->title);
172 14
            }
173 14
            if (!is_null ($link->facetGroup)) {
174 1
                self::getXmlStream ()->writeAttribute ("opds:facetGroup", $link->facetGroup);
175 1
            }
176 14
            if ($link->activeFacet) {
177 1
                self::getXmlStream ()->writeAttribute ("opds:activeFacet", "true");
178 1
            }
179 14
        self::getXmlStream ()->endElement ();
180 14
    }
181
182
183 14
    private function renderEntry ($entry) {
184 14
        self::getXmlStream ()->startElement ("title");
185 14
            self::getXmlStream ()->text ($entry->title);
186 14
        self::getXmlStream ()->endElement ();
187 14
        self::getXmlStream ()->startElement ("updated");
188 14
            self::getXmlStream ()->text (self::getUpdatedTime ());
189 14
        self::getXmlStream ()->endElement ();
190 14
        self::getXmlStream ()->startElement ("id");
191 14
            self::getXmlStream ()->text ($entry->id);
192 14
        self::getXmlStream ()->endElement ();
193 14
        self::getXmlStream ()->startElement ("content");
194 14
            self::getXmlStream ()->writeAttribute ("type", $entry->contentType);
195 14
            if ($entry->contentType == "text") {
196 9
                self::getXmlStream ()->text ($entry->content);
197 9
            } else {
198 5
                self::getXmlStream ()->writeRaw ($entry->content);
199
            }
200 14
        self::getXmlStream ()->endElement ();
201 14
        foreach ($entry->linkArray as $link) {
202 14
            self::renderLink ($link);
203 14
        }
204
205 14
        if (get_class ($entry) != "EntryBook") {
206 9
            return;
207
        }
208
209 5
        foreach ($entry->book->getAuthors () as $author) {
210 5
            self::getXmlStream ()->startElement ("author");
211 5
                self::getXmlStream ()->startElement ("name");
212 5
                    self::getXmlStream ()->text ($author->name);
213 5
                self::getXmlStream ()->endElement ();
214 5
                self::getXmlStream ()->startElement ("uri");
215 5
                    self::getXmlStream ()->text ("feed.php" . $author->getUri ());
216 5
                self::getXmlStream ()->endElement ();
217 5
            self::getXmlStream ()->endElement ();
218 5
        }
219 5
        foreach ($entry->book->getTags () as $category) {
220 5
            self::getXmlStream ()->startElement ("category");
221 5
                self::getXmlStream ()->writeAttribute ("term", $category->name);
222 5
                self::getXmlStream ()->writeAttribute ("label", $category->name);
223 5
            self::getXmlStream ()->endElement ();
224 5
        }
225 5
        if ($entry->book->getPubDate () != "") {
226 5
            self::getXmlStream ()->startElement ("dcterms:issued");
227 5
                self::getXmlStream ()->text (date ("Y-m-d", $entry->book->pubdate));
228 5
            self::getXmlStream ()->endElement ();
229 5
            self::getXmlStream ()->startElement ("published");
230 5
                self::getXmlStream ()->text (date ("Y-m-d", $entry->book->pubdate) . "T08:08:08Z");
231 5
            self::getXmlStream ()->endElement ();
232 5
        }
233
234 5
        $lang = $entry->book->getLanguages ();
235 5
        if (!empty ($lang)) {
236 5
            self::getXmlStream ()->startElement ("dcterms:language");
237 5
                self::getXmlStream ()->text ($lang);
238 5
            self::getXmlStream ()->endElement ();
239 5
        }
240
241 5
    }
242
243 14
    public function render ($page) {
244 14
        global $config;
245 14
        self::startXmlDocument ($page);
246 14
        if ($page->isPaginated ())
247 14
        {
248 1
            self::getXmlStream ()->startElement ("opensearch:totalResults");
249 1
                self::getXmlStream ()->text ($page->totalNumber);
250 1
            self::getXmlStream ()->endElement ();
251 1
            self::getXmlStream ()->startElement ("opensearch:itemsPerPage");
252 1
                self::getXmlStream ()->text ($config['cops_max_item_per_page']);
253 1
            self::getXmlStream ()->endElement ();
254 1
            self::getXmlStream ()->startElement ("opensearch:startIndex");
255 1
                self::getXmlStream ()->text (($page->n - 1) * $config['cops_max_item_per_page'] + 1);
256 1
            self::getXmlStream ()->endElement ();
257 1
            $prevLink = $page->getPrevLink ();
258 1
            $nextLink = $page->getNextLink ();
259 1
            if (!is_null ($prevLink)) {
260 1
                self::renderLink ($prevLink);
261 1
            }
262 1
            if (!is_null ($nextLink)) {
263 1
                self::renderLink ($nextLink);
264 1
            }
265 1
        }
266 14
        foreach ($page->entryArray as $entry) {
267 14
            self::getXmlStream ()->startElement ("entry");
268 14
                self::renderEntry ($entry);
269 14
            self::getXmlStream ()->endElement ();
270 14
        }
271 14
        return self::endXmlDocument ();
272
    }
273
}
274
275