/** * The contents of this file are subject to the license and copyright * detailed in the LICENSE and NOTICE files at the root of the source * tree and available online at * * http://www.dspace.org/license/ */ package org.dspace.core; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.ArrayList; import java.util.List; import org.dspace.core.service.NewsService; import org.dspace.services.ConfigurationService; import org.dspace.services.factory.DSpaceServicesFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; /** * Encapsulate access to the news texts. * * @author mhwood */ public class NewsServiceImpl implements NewsService { private final Logger log = LoggerFactory.getLogger(NewsServiceImpl.class); private List<String> acceptableFilenames; @Autowired(required = true) private ConfigurationService configurationService; public void setAcceptableFilenames(List<String> acceptableFilenames) { this.acceptableFilenames = addLocalesToAcceptableFilenames(acceptableFilenames); } protected List<String> addLocalesToAcceptableFilenames(List<String> acceptableFilenames) { String [] locales = configurationService.getArrayProperty("webui.supported.locales"); List<String> newAcceptableFilenames = new ArrayList<>(); newAcceptableFilenames.addAll(acceptableFilenames); for (String local : locales) { for (String acceptableFilename : acceptableFilenames) { int lastPoint = acceptableFilename.lastIndexOf("."); newAcceptableFilenames.add( acceptableFilename.substring(0, lastPoint) + "_" + local + acceptableFilename.substring(lastPoint)); } } return newAcceptableFilenames; } /** Not instantiable. */ protected NewsServiceImpl() {} @Override public String readNewsFile(String newsFile) { if (!validate(newsFile)) { throw new IllegalArgumentException("The file " + newsFile + " is not a valid news file"); } String fileName = getNewsFilePath(); fileName += newsFile; StringBuilder text = new StringBuilder(); try { // retrieve existing news from file FileInputStream fir = new FileInputStream(fileName); InputStreamReader ir = new InputStreamReader(fir, "UTF-8"); BufferedReader br = new BufferedReader(ir); String lineIn; while ((lineIn = br.readLine()) != null) { text.append(lineIn); } br.close(); ir.close(); fir.close(); } catch (IOException e) { log.warn("news_read: " + e.getLocalizedMessage()); } return text.toString(); } @Override public String writeNewsFile(String newsFile, String news) { if (!validate(newsFile)) { throw new IllegalArgumentException("The file "+ newsFile + " is not a valid news file"); } String fileName = getNewsFilePath(); fileName += newsFile; try { // write the news out to the appropriate file FileOutputStream fos = new FileOutputStream(fileName); OutputStreamWriter osr = new OutputStreamWriter(fos, "UTF-8"); PrintWriter out = new PrintWriter(osr); out.print(news); out.close(); } catch (IOException e) { log.warn("news_write: " + e.getLocalizedMessage()); } return news; } @Override public String getNewsFilePath() { String filePath = DSpaceServicesFactory.getInstance().getConfigurationService().getProperty("dspace.dir") + File.separator + "config" + File.separator; return filePath; } @Override public boolean validate(String newsName) { if (acceptableFilenames != null) { return acceptableFilenames.contains(newsName); } return false; } }