001/*
002 * Copyright 2011 The Kuali Foundation.
003 * 
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 * 
008 * http://www.opensource.org/licenses/ecl2.php
009 * 
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016package org.kuali.ole.select.service.impl;
017
018import org.kuali.ole.select.businessobject.DocInfoBean;
019import org.kuali.ole.sys.OLEConstants;
020import org.kuali.ole.sys.context.SpringContext;
021import org.kuali.rice.core.api.config.property.ConfigurationService;
022import org.xml.sax.Attributes;
023import org.xml.sax.SAXException;
024import org.xml.sax.helpers.DefaultHandler;
025
026import javax.xml.parsers.SAXParser;
027import javax.xml.parsers.SAXParserFactory;
028import java.io.ByteArrayInputStream;
029import java.io.InputStream;
030import java.util.ArrayList;
031import java.util.List;
032import java.util.Properties;
033
034public class BuildDocInfoBean {
035    private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(BuildDocInfoBean.class);
036
037    private DocInfoBean docInfoBean;
038    private List<DocInfoBean> docInfoBeanList = null;
039    private StringBuilder stringBuilder = null;
040    private String noOfRecords = null;
041    private String attribute = null;
042
043
044    public List<DocInfoBean> getDocInfoBeanList(String query) {
045        docInfoBeanList = new ArrayList<DocInfoBean>();
046        try {
047            initiateDocument(query);
048        } catch (Exception ex) {
049            LOG.error("Exception while getting DocInfoBeanList"+ex);
050        }
051        return docInfoBeanList;
052    }
053
054    private void initiateDocument(String query) throws Exception {
055
056        if (query == null || query.length() == 0) {
057            Properties properties = new Properties();
058            try {
059                //properties.load(new FileInputStream("org/kuali/ole/select/service/impl/bibinfo.properties"));
060                query = properties.getProperty("filename");
061            } catch (Exception e) {
062                LOG.error("Exception while initiating the document"+e);
063            }
064        }
065        SAXParserFactory factory = SAXParserFactory.newInstance();
066        SAXParser saxParser = factory.newSAXParser();
067
068        DefaultHandler handler = new DefaultHandler() {
069
070            //boolean author = false;
071            boolean author_display = false;
072
073            boolean dateOfPublication = false;
074
075            boolean date_d = false;
076
077            //boolean description = false;
078            boolean description_display = false;
079
080            boolean dimentions = false;
081
082            boolean docType = false;
083
084            boolean extent = false;
085
086            boolean generalNote = false;
087
088            //boolean isbn = false;
089            boolean isbn_display = false;
090
091            boolean issn_display = false;
092
093            boolean mainEntryPersonalNameComposite = false;
094
095            boolean mainEntryPersonalNameComposite_suggest = false;
096
097            boolean modifyingAgency = false;
098
099            boolean modifyingAgency_suggest = false;
100
101            //boolean nameOfPublisher = false;
102            boolean publisher_display = false;
103
104            //boolean placeOfPublication = false;
105            boolean publicationPlace_search = false;
106
107            boolean placeOfPublication_suggest = false;
108
109            boolean price_f = false;
110
111            boolean remainderOfTitle = false;
112
113            boolean statementOfResponsibility = false;
114
115            //boolean subject = false;
116            boolean subject_display = false;
117
118            //boolean title = false;
119            boolean title_display = false;
120
121            boolean titleStatementComposite = false;
122
123            boolean title_suggest = false;
124
125            boolean topicalTermorgeographicnameElement = false;
126
127            boolean yearOfPublication = false;
128
129            boolean all_controlFields = false;
130
131            boolean all_subfields = false;
132
133            boolean all_text = false;
134
135            boolean itemLinks = false;
136
137            boolean uniqueId = false;
138
139            boolean instanceId = false;
140
141            boolean bibIdentifier = false;
142
143            boolean publisher_search = false;
144
145            boolean localIdentifier_search = false;
146
147            boolean publicationDate_search = false;
148
149
150            public void startElement(String uri, String localName,
151                                     String qName, Attributes attributes)
152                    throws SAXException {
153
154
155                if (qName.equalsIgnoreCase("doc")) {
156                    docInfoBean = new DocInfoBean();
157                }
158                if (qName.equalsIgnoreCase("result")) {
159                    noOfRecords = attributes.getValue("numFound");
160                }
161
162
163                if (qName.equalsIgnoreCase("str")) {
164                    String attribute = attributes.getValue("name");
165                    if (attributes.getValue("name") != null) {
166                        if ("Description_display".equalsIgnoreCase(attribute)) {
167                            stringBuilder = new StringBuilder();
168                            description_display = true;
169                        } else if ("ISBN_display".equalsIgnoreCase(attribute)) {
170                            stringBuilder = new StringBuilder();
171                            isbn_display = true;
172                        } else if ("Subject_display ".equalsIgnoreCase(attribute)) {
173                            stringBuilder = new StringBuilder();
174                            subject_display = true;
175                        } else if ("all_controlFields".equalsIgnoreCase(attribute)) {
176                            stringBuilder = new StringBuilder();
177                            all_controlFields = true;
178                        } else if ("all_subfields".equalsIgnoreCase(attribute)) {
179                            stringBuilder = new StringBuilder();
180                            all_subfields = true;
181                        } else if ("all_text".equalsIgnoreCase(attribute)) {
182                            stringBuilder = new StringBuilder();
183                            all_text = true;
184                        }
185                    }
186                }
187
188
189                if (qName.equalsIgnoreCase("arr")) {
190
191                    attribute = attributes.getValue("name");
192
193                    if ("Author_display".equalsIgnoreCase(attributes.getValue("name"))) {
194                        stringBuilder = new StringBuilder();
195                        author_display = true;
196                    } else if ("Description_display".equalsIgnoreCase(attributes.getValue("name"))) {
197                        stringBuilder = new StringBuilder();
198                        description_display = true;
199                    } else if ("Title_display".equalsIgnoreCase(attributes.getValue("name"))) {
200                        stringBuilder = new StringBuilder();
201                        title_display = true;
202                    } else if ("Publisher_display".equalsIgnoreCase(attributes.getValue("name"))) {
203                        stringBuilder = new StringBuilder();
204                        //nameOfPublisher= true;
205                        publisher_display = true;
206                    } else if ("Publisher_search".equalsIgnoreCase(attributes.getValue("name"))) {
207                        stringBuilder = new StringBuilder();
208                        //nameOfPublisher= true;
209                        publisher_search = true;
210                    } else if ("LocalId_search".equalsIgnoreCase(attributes.getValue("name"))) {
211                        stringBuilder = new StringBuilder();
212                        localIdentifier_search = true;
213                    } else if ("LocalId_display".equalsIgnoreCase(attributes.getValue("name"))) {
214                        stringBuilder = new StringBuilder();
215                        localIdentifier_search = true;
216                    } else if ("PublicationDate_search".equalsIgnoreCase(attributes.getValue("name"))) {
217                        stringBuilder = new StringBuilder();
218                        //nameOfPublisher= true;
219                        publicationDate_search = true;
220                    } else if ("ISBN_display".equalsIgnoreCase(attributes.getValue("name"))) {
221                        stringBuilder = new StringBuilder();
222                        isbn_display = true;
223                    } else if ("Subject_display".equalsIgnoreCase(attributes.getValue("name"))) {
224                        stringBuilder = new StringBuilder();
225                        subject_display = true;
226                    } else if ("all_controlFields".equalsIgnoreCase(attributes.getValue("name"))) {
227                        stringBuilder = new StringBuilder();
228                        all_controlFields = true;
229                    } else if ("all_subfields".equalsIgnoreCase(attributes.getValue("name"))) {
230                        stringBuilder = new StringBuilder();
231                        all_subfields = true;
232                    } else if ("all_text".equalsIgnoreCase(attributes.getValue("name"))) {
233                        stringBuilder = new StringBuilder();
234                        all_text = true;
235                    } else if ("ItemLinks".equalsIgnoreCase(attributes.getValue("name"))) {
236                        stringBuilder = new StringBuilder();
237                        itemLinks = true;
238                    } else if ("instanceIdentifier".equalsIgnoreCase(attributes.getValue("name"))) {
239                        stringBuilder = new StringBuilder();
240                        instanceId = true;
241                    } else if ("bibIdentifier".equalsIgnoreCase(attributes.getValue("name"))) {
242                        stringBuilder = new StringBuilder();
243                        bibIdentifier = true;
244                    }
245                }
246
247
248                if (qName.equalsIgnoreCase("str") || qName.equalsIgnoreCase("date") || qName.equalsIgnoreCase("float")) {
249
250                    if ("DateOfPublication".equalsIgnoreCase(attributes.getValue("name"))) {
251                        stringBuilder = new StringBuilder();
252                        dateOfPublication = true;
253                    } else if ("Date_d".equalsIgnoreCase(attributes.getValue("name"))) {
254                        stringBuilder = new StringBuilder();
255                        date_d = true;
256                    } else if ("Dimentions".equalsIgnoreCase(attributes.getValue("name"))) {
257                        stringBuilder = new StringBuilder();
258                        dimentions = true;
259                    } else if ("DocType".equalsIgnoreCase(attributes.getValue("name"))) {
260                        stringBuilder = new StringBuilder();
261                        docType = true;
262                    } else if ("Extent".equalsIgnoreCase(attributes.getValue("name"))) {
263                        stringBuilder = new StringBuilder();
264                        extent = true;
265                    } else if ("GeneralNote".equalsIgnoreCase(attributes.getValue("name"))) {
266                        stringBuilder = new StringBuilder();
267                        generalNote = true;
268                    } else if ("MainEntryPersonalNameComposite".equalsIgnoreCase(attributes.getValue("name"))) {
269                        stringBuilder = new StringBuilder();
270                        mainEntryPersonalNameComposite = true;
271                    } else if ("MainEntryPersonalNameComposite_suggest".equalsIgnoreCase(attributes.getValue("name"))) {
272                        stringBuilder = new StringBuilder();
273                        mainEntryPersonalNameComposite_suggest = true;
274                    } else if ("ModifyingAgency".equalsIgnoreCase(attributes.getValue("name"))) {
275                        stringBuilder = new StringBuilder();
276                        modifyingAgency = true;
277                    } else if ("ModifyingAgency_suggest".equalsIgnoreCase(attributes.getValue("name"))) {
278                        stringBuilder = new StringBuilder();
279                        modifyingAgency_suggest = true;
280                    } else if ("PublicationPlace_search".equalsIgnoreCase(attributes.getValue("name"))) {
281                        stringBuilder = new StringBuilder();
282                        publicationPlace_search = true;
283                    } else if ("PlaceOfPublication_suggest".equalsIgnoreCase(attributes.getValue("name"))) {
284                        stringBuilder = new StringBuilder();
285                        placeOfPublication_suggest = true;
286                    } else if ("Price_f".equalsIgnoreCase(attributes.getValue("name"))) {
287                        stringBuilder = new StringBuilder();
288                        price_f = true;
289                    } else if ("RemainderOfTitle".equalsIgnoreCase(attributes.getValue("name"))) {
290                        stringBuilder = new StringBuilder();
291                        remainderOfTitle = true;
292                    } else if ("StatementOfResponsibility".equalsIgnoreCase(attributes.getValue("name"))) {
293                        stringBuilder = new StringBuilder();
294                        statementOfResponsibility = true;
295                    } else if ("TitleStatementComposite".equalsIgnoreCase(attributes.getValue("name"))) {
296                        stringBuilder = new StringBuilder();
297                        titleStatementComposite = true;
298                    } else if ("Title_suggest".equalsIgnoreCase(attributes.getValue("name"))) {
299                        stringBuilder = new StringBuilder();
300                        title_suggest = true;
301                    } else if ("TopicalTermorgeographicnameElement".equalsIgnoreCase(attributes.getValue("name"))) {
302                        stringBuilder = new StringBuilder();
303                        topicalTermorgeographicnameElement = true;
304                    } else if ("YearOfPublication".equalsIgnoreCase(attributes.getValue("name"))) {
305                        stringBuilder = new StringBuilder();
306                        yearOfPublication = true;
307                    }
308            /* else if ("id".equalsIgnoreCase(attributes.getValue("name"))) {
309                 id= true;
310              }*/
311                    else if ("uniqueId".equalsIgnoreCase(attributes.getValue("name"))) {
312                        stringBuilder = new StringBuilder();
313                        uniqueId = true;
314                    }
315                }
316            }
317
318            public void endElement(String uri, String localName,
319                                   String qName)
320                    throws SAXException {
321                String value = null;
322                if (stringBuilder != null)
323                    if (!"".equals(stringBuilder.toString())) {
324                        value = stringBuilder.toString();
325                    }
326                if (author_display) {
327                    docInfoBean.setAuthor_display(value);
328                    stringBuilder = null;
329                    author_display = false;
330                } else if (dateOfPublication) {
331                    docInfoBean.setDateOfPublication(value);
332                    stringBuilder = null;
333                    dateOfPublication = false;
334                } else if (date_d) {
335                    docInfoBean.setDate_d(value);
336                    stringBuilder = null;
337                    date_d = false;
338                } else if (description_display) {
339                    docInfoBean.setDescription_display(value);
340                    stringBuilder = null;
341                    //System.out.println("description===    "+new String(ch, start, length));
342                    description_display = false;
343                } else if (dimentions) {
344                    docInfoBean.setDimentions(value);
345                    stringBuilder = null;
346                    dimentions = false;
347                } else if (docType) {
348                    docInfoBean.setDocType(value);
349                    stringBuilder = null;
350                    docType = false;
351                } else if (extent) {
352                    docInfoBean.setExtent(value);
353                    stringBuilder = null;
354                    extent = false;
355                } else if (generalNote) {
356                    docInfoBean.setGeneralNote(value);
357                    stringBuilder = null;
358                    generalNote = false;
359                } else if (isbn_display) {
360                    docInfoBean.setIsbn_display(value);
361                    stringBuilder = null;
362                    // System.out.println(new String(ch, start, length));
363                    isbn_display = false;
364                } else if (mainEntryPersonalNameComposite) {
365                    docInfoBean.setMainEntryPersonalNameComposite(value);
366                    stringBuilder = null;
367                    mainEntryPersonalNameComposite = false;
368                } else if (mainEntryPersonalNameComposite_suggest) {
369                    docInfoBean.setMainEntryPersonalNameComposite_suggest(value);
370                    stringBuilder = null;
371                    mainEntryPersonalNameComposite_suggest = false;
372                } else if (modifyingAgency) {
373                    docInfoBean.setModifyingAgency(value);
374                    stringBuilder = null;
375                    modifyingAgency = false;
376                } else if (modifyingAgency_suggest) {
377                    docInfoBean.setModifyingAgency_suggest(value);
378                    stringBuilder = null;
379                    modifyingAgency_suggest = false;
380                } else if (publisher_display) {
381                    docInfoBean.setPublisher_display(value);
382                    stringBuilder = null;
383                    publisher_display = false;
384                } else if (publisher_search) {
385                    docInfoBean.setPublisher_search(value);
386                    stringBuilder = null;
387                    publisher_search = false;
388                } else if (localIdentifier_search) {
389                    docInfoBean.setLocalIdentifier_search(value);
390                    stringBuilder = null;
391                    localIdentifier_search = false;
392                } else if (publicationDate_search) {
393                    if ("Date could not be determined".equalsIgnoreCase(value)) {
394                        docInfoBean.setPublicationDate_search("");
395                    } else {
396                        docInfoBean.setPublicationDate_search(value);
397                    }
398                    stringBuilder = null;
399                    publicationDate_search = false;
400                } else if (publicationPlace_search) {
401                    docInfoBean.setPublicationPlace_search(value);
402                    stringBuilder = null;
403                    publicationPlace_search = false;
404                } else if (placeOfPublication_suggest) {
405                    docInfoBean.setPlaceOfPublication_suggest(value);
406                    stringBuilder = null;
407                    placeOfPublication_suggest = false;
408                } else if (price_f) {
409                    docInfoBean.setPrice_f(value);
410                    stringBuilder = null;
411                    price_f = false;
412                } else if (remainderOfTitle) {
413                    docInfoBean.setRemainderOfTitle(value);
414                    stringBuilder = null;
415                    remainderOfTitle = false;
416                } else if (statementOfResponsibility) {
417                    docInfoBean.setStatementOfResponsibility(value);
418                    stringBuilder = null;
419                    statementOfResponsibility = false;
420                } else if (subject_display) {
421                    docInfoBean.setSubject_display(value);
422                    stringBuilder = null;
423                    subject_display = false;
424                } else if (title_display) {
425                    docInfoBean.setTitle_display(value);
426                    stringBuilder = null;
427                    title_display = false;
428                } else if (titleStatementComposite) {
429                    docInfoBean.setTitleStatementComposite(value);
430                    stringBuilder = null;
431                    titleStatementComposite = false;
432                } else if (title_suggest) {
433                    docInfoBean.setTitle_suggest(value);
434                    stringBuilder = null;
435                    title_suggest = false;
436                } else if (topicalTermorgeographicnameElement) {
437                    docInfoBean.setTopicalTermorgeographicnameElement(value);
438                    stringBuilder = null;
439                    topicalTermorgeographicnameElement = false;
440                } else if (yearOfPublication) {
441                    docInfoBean.setYearOfPublication(value);
442                    stringBuilder = null;
443                    yearOfPublication = false;
444                } else if (all_controlFields) {
445                    docInfoBean.setAll_controlFields(value);
446                    stringBuilder = null;
447                    // System.out.println(value);
448                    all_controlFields = false;
449                } else if (all_subfields) {
450                    docInfoBean.setAll_subfields(value);
451                    stringBuilder = null;
452                    // System.out.println(value);
453                    all_subfields = false;
454                } else if (all_text) {
455                    docInfoBean.setAll_text(value);
456                    stringBuilder = null;
457                    // System.out.println(value);
458                    all_text = false;
459                } else if (uniqueId) {
460                    docInfoBean.setUniqueId(value);
461                    stringBuilder = null;
462                    uniqueId = false;
463                } else if (bibIdentifier) {
464                    docInfoBean.setBibIdentifier(value);
465                    stringBuilder = null;
466                    bibIdentifier = false;
467                } else if (itemLinks) {
468                    docInfoBean.setTitleId(value);
469                    stringBuilder = null;
470                    itemLinks = false;
471                } else if (qName.equalsIgnoreCase("doc")) {
472                    docInfoBean.setNoOfRecords(noOfRecords);
473                    docInfoBeanList.add(docInfoBean);
474                } else if (instanceId) {
475                    docInfoBean.setTitleId(value);
476                    stringBuilder = null;
477                    instanceId = false;
478                }
479            /* if(id){
480            //docInfoBean.setId(stringBuilder.toString());
481            docInfoBean.setTitleId(stringBuilder.toString());
482            id=false;
483        }*/
484
485            }
486
487            public void characters(char ch[], int start, int length)
488                    throws SAXException {
489
490                if (stringBuilder != null)
491                    stringBuilder.append(ch, start, length);
492            }
493
494        };
495
496        WebClientServiceImpl webclientService = new WebClientServiceImpl();
497        String url = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.DOCSEARCH_URL_KEY);
498        String contentType = SpringContext.getBean(ConfigurationService.class).getPropertyValueAsString(OLEConstants.DOCSTORE_APP_CONTENT_TYPE_KEY);
499        String response = webclientService.sendRequest(url, contentType, query);
500        InputStream is = new ByteArrayInputStream(response.getBytes("UTF-8"));
501        saxParser.parse(is, handler);
502    }
503
504}
505
506