/** * Copyright 2013 European Parliament * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * * http://joinup.ec.europa.eu/software/page/eupl * * Unless required by applicable law or agreed to in writing, software distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and limitations under the Licence. */ package org.nsesa.editor.gwt.an.common.server.service.gwt; import com.inspiresoftware.lib.dto.geda.assembler.Assembler; import com.inspiresoftware.lib.dto.geda.assembler.DTOAssembler; import com.inspiresoftware.lib.dto.geda.assembler.dsl.impl.DefaultDSLRegistry; import freemarker.ext.dom.NodeModel; import freemarker.template.Configuration; import freemarker.template.TemplateException; import org.nsesa.editor.gwt.an.common.server.convertor.CalendarDateConvertor; import org.nsesa.editor.gwt.core.client.service.gwt.GWTDocumentService; import org.nsesa.editor.gwt.core.shared.ClientContext; import org.nsesa.editor.gwt.core.shared.DocumentDTO; import org.nsesa.server.dto.DocumentContentDTO; import org.nsesa.server.service.api.DocumentContentService; import org.nsesa.server.service.api.DocumentService; import org.springframework.core.io.Resource; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import javax.xml.parsers.ParserConfigurationException; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.StringWriter; import java.nio.charset.Charset; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Date: 24/06/12 19:57 * * @author <a href="mailto:philip.luppens@gmail.com">Philip Luppens</a> * @version $Id$ */ public class GWTDocumentServiceImpl extends SpringRemoteServiceServlet implements GWTDocumentService { private DocumentService documentService; private DocumentContentService documentContentService; private Resource documentTemplate; private CalendarDateConvertor calendarDateConvertor; final Assembler documentAssembler = DTOAssembler.newAssembler(DocumentDTO.class, org.nsesa.server.dto.DocumentDTO.class); @Override public HashMap<String, String> getMetaInformation(final ClientContext clientContext, final String documentID) { return null; } @Override public DocumentDTO getDocument(final ClientContext clientContext, final String documentID) { final org.nsesa.server.dto.DocumentDTO fromServices = documentService.getDocument(documentID); DocumentDTO documentDTO = new DocumentDTO(); documentAssembler.assembleDto(documentDTO, fromServices, getConvertors(), new DefaultDSLRegistry()); return documentDTO; } @Override public String getDocumentFragment(final ClientContext clientContext, final String documentID, final String elementID) { return documentContentService.getDocumentFragment(documentID, elementID); } @Override public ArrayList<DocumentDTO> getAvailableTranslations(final ClientContext clientContext, final String documentID) { final List<org.nsesa.server.dto.DocumentDTO> availableTranslations = documentService.getAvailableTranslations(documentID); final List<DocumentDTO> documentDTOs = new ArrayList<DocumentDTO>(); if (availableTranslations != null) { documentAssembler.assembleDtos(documentDTOs, availableTranslations, getConvertors(), new DefaultDSLRegistry()); return new ArrayList<DocumentDTO>(documentDTOs); } return new ArrayList<DocumentDTO>(); } @Override public ArrayList<DocumentDTO> getRelatedDocuments(ClientContext clientContext, String documentID) { final List<org.nsesa.server.dto.DocumentDTO> relatedDocuments = documentService.getRelatedDocuments(documentID); final List<DocumentDTO> documentDTOs = new ArrayList<DocumentDTO>(); if (relatedDocuments != null) { documentAssembler.assembleDtos(documentDTOs, relatedDocuments, getConvertors(), new DefaultDSLRegistry()); return new ArrayList<DocumentDTO>(documentDTOs); } return new ArrayList<DocumentDTO>(); } @Override public org.nsesa.editor.gwt.core.shared.DocumentContentDTO getDocumentContent(final ClientContext clientContext, final String documentID) { final DocumentContentDTO fromBackend = documentContentService.getDocumentContent(documentID); final org.nsesa.editor.gwt.core.shared.DocumentContentDTO documentContentDTO = new org.nsesa.editor.gwt.core.shared.DocumentContentDTO(); documentContentDTO.setDocumentID(fromBackend.getDocumentID()); documentContentDTO.setDocumentContentType(fromBackend.getDocumentContentType()); if ("XML".equalsIgnoreCase(fromBackend.getDocumentContentType())) { final InputSource inputSource; if (fromBackend.getContent() != null) { byte[] bytes = fromBackend.getContent().getBytes(Charset.forName("UTF-8")); inputSource = new InputSource(new ByteArrayInputStream(bytes)); } else { throw new RuntimeException("Could not retrieve document content."); } try { final NodeModel model = NodeModel.parse(inputSource); final Configuration configuration = new Configuration(); configuration.setDefaultEncoding("UTF-8"); configuration.setDirectoryForTemplateLoading(documentTemplate.getFile().getParentFile()); final StringWriter sw = new StringWriter(); Map<String, Object> root = new HashMap<String, Object>(); root.put("doc", model); configuration.getTemplate(documentTemplate.getFile().getName()).process(root, sw); documentContentDTO.setContent(sw.toString()); return documentContentDTO; } catch (IOException e) { throw new RuntimeException("Could not read file.", e); } catch (SAXException e) { throw new RuntimeException("Could not parse file.", e); } catch (ParserConfigurationException e) { throw new RuntimeException("Could not parse file.", e); } catch (TemplateException e) { throw new RuntimeException("Could not load template.", e); } } else if ("PLAIN".equalsIgnoreCase(fromBackend.getDocumentContentType())) { // no transformation at the moment documentContentDTO.setContent(fromBackend.getContent()); return documentContentDTO; } else { throw new UnsupportedOperationException("Not yet implemented."); } } @Override public void saveDocumentContent(final ClientContext clientContext, final String documentID, final String content) { DocumentContentDTO documentContentDTO = new DocumentContentDTO(); documentContentDTO.setDocumentID(documentID); documentContentDTO.setContent(content); documentContentService.saveDocumentContent(documentContentDTO); } // TODO replace with assemblers /*private DocumentDTO fromBackend(org.nsesa.server.dto.DocumentDTO fromServices) { if (fromServices == null) return null; final DocumentDTO document = new DocumentDTO(); document.setDocumentID(fromServices.getDocumentID()); document.setAmendable(fromServices.isAmendable()); document.setName(fromServices.getName()); document.setLanguageIso(fromServices.getLanguageIso()); document.setDeadline(fromServices.getDeadline() != null ? new Date(fromServices.getDeadline().getTime().getTime()) : null); return document; }*/ private Map<String, Object> getConvertors() { final Map<String, Object> map = new HashMap<String, Object>(); map.put("calendarDateConvertor", calendarDateConvertor); return map; } // Spring setters ---------------------- public void setDocumentTemplate(Resource documentTemplate) { this.documentTemplate = documentTemplate; } public void setDocumentService(DocumentService documentService) { this.documentService = documentService; } public void setDocumentContentService(DocumentContentService documentContentService) { this.documentContentService = documentContentService; } public void setCalendarDateConvertor(CalendarDateConvertor calendarDateConvertor) { this.calendarDateConvertor = calendarDateConvertor; } }