Java tutorial
/*! * * This program is free software; you can redistribute it and/or modify it under the * terms of the GNU General Public License, version 2 as published by the Free Software * Foundation. * * You should have received a copy of the GNU General Public License along with this * program; if not, you can obtain a copy at http://www.gnu.org/licenses/gpl-2.0.html * or from the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * * Copyright (c) 2002-2019 Hitachi Vantara. All rights reserved. * */ package org.pentaho.platform.engine.services; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.Node; import org.pentaho.platform.api.engine.IActionSequence; import org.pentaho.platform.api.engine.IPentahoSession; import org.pentaho.platform.api.repository2.unified.IFileFilter; import org.pentaho.platform.api.repository2.unified.IUnifiedRepository; import org.pentaho.platform.api.repository2.unified.RepositoryFile; import org.pentaho.platform.api.repository2.unified.RepositoryFilePermission; import org.pentaho.platform.api.repository2.unified.data.simple.SimpleRepositoryFileData; import org.pentaho.platform.engine.core.system.PentahoSessionHolder; import org.pentaho.platform.engine.core.system.PentahoSystem; import org.pentaho.platform.engine.services.actionsequence.SequenceDefinition; import org.pentaho.platform.engine.services.messages.Messages; import org.pentaho.platform.util.messages.LocaleHelper; import org.pentaho.platform.util.xml.dom4j.XmlDom4JHelper; import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Properties; import java.util.StringTokenizer; /** * @author wseyler * */ public class ActionSequenceJCRHelper { protected static final String PROPERTIES_SUFFIX = ".properties"; //$NON-NLS-1$ protected static final Log logger = LogFactory.getLog(ActionSequenceJCRHelper.class); private IPentahoSession pentahoSession; private IUnifiedRepository repository; public ActionSequenceJCRHelper() { this(PentahoSessionHolder.getSession()); } public ActionSequenceJCRHelper(IPentahoSession pentahoSession) { super(); assert pentahoSession != null; this.pentahoSession = pentahoSession; repository = PentahoSystem.get(IUnifiedRepository.class, pentahoSession); if (repository == null) { final String errorMessage = Messages.getInstance() .getErrorString("ActionSequenceJCRHelper.ERROR_0001_INVALID_REPOSITORY"); //$NON-NLS-1$ logger.error(errorMessage); throw new IllegalStateException(errorMessage); } } /** * This legacy method ignores the requested actionOperation and defines read as the permission. * * @deprecated use getActionSequence(String actionPath, int loggingLevel, RepositoryFilePermission * actionOperation) instead. */ @Deprecated public IActionSequence getActionSequence(String actionPath, int loggingLevel, int actionOperation) { return getActionSequence(actionPath, loggingLevel, RepositoryFilePermission.READ); } public IActionSequence getActionSequence(String actionPath, int loggingLevel, RepositoryFilePermission actionOperation) { Document actionSequenceDocument = getSolutionDocument(actionPath, actionOperation); if (actionSequenceDocument == null) { return null; } IActionSequence actionSequence = SequenceDefinition.ActionSequenceFactory(actionSequenceDocument, actionPath, pentahoSession, PentahoSystem.getApplicationContext(), loggingLevel); if (actionSequence == null) { return null; } return actionSequence; } public Document getSolutionDocument(final String documentPath, final RepositoryFilePermission actionOperation) { RepositoryFile file = repository.getFile(documentPath); Document document = null; SimpleRepositoryFileData data = null; if (file != null) { data = repository.getDataForRead(file.getId(), SimpleRepositoryFileData.class); if (data != null) { try { document = XmlDom4JHelper.getDocFromStream(data.getStream()); } catch (Throwable t) { logger.error(Messages.getInstance().getErrorString( "ActionSequenceJCRHelper.ERROR_0017_INVALID_XML_DOCUMENT", documentPath), t); //$NON-NLS-1$ return null; } } else { logger.error(Messages.getInstance() .getErrorString("ActionSequenceJCRHelper.ERROR_0019_NO_DATA_IN_FILE", file.getName())); //$NON-NLS-1$ return null; } if ((document == null) && (file != null) && (data != null)) { // the document exists but cannot be parsed logger.error(Messages.getInstance() .getErrorString("ActionSequenceJCRHelper.ERROR_0009_INVALID_DOCUMENT", documentPath)); //$NON-NLS-1$ return null; } localizeDoc(document, file); } return document; } public String getURL(String filePath) { RepositoryFile file = repository.getFile(filePath); if (file == null || !file.getName().endsWith(".url")) { //$NON-NLS-1$ return ""; //$NON-NLS-1$ } SimpleRepositoryFileData data = null; data = repository.getDataForRead(file.getId(), SimpleRepositoryFileData.class); StringWriter writer = new StringWriter(); try { IOUtils.copy(data.getStream(), writer); } catch (IOException e) { return ""; //$NON-NLS-1$ } String props = writer.toString(); StringTokenizer tokenizer = new StringTokenizer(props, "\n"); //$NON-NLS-1$ while (tokenizer.hasMoreTokens()) { String line = tokenizer.nextToken(); int pos = line.indexOf('='); if (pos > 0) { String propname = line.substring(0, pos); String value = line.substring(pos + 1); if ((value != null) && (value.length() > 0) && (value.charAt(value.length() - 1) == '\r')) { value = value.substring(0, value.length() - 1); } if ("URL".equalsIgnoreCase(propname)) { //$NON-NLS-1$ return value; } } } // No URL found return ""; } public void localizeDoc(final Node document, final RepositoryFile file) { String fileName = file.getName(); int dotIndex = fileName.indexOf('.'); String baseName = fileName.substring(0, dotIndex); // TODO read in nodes from the locale file and use them to override the // ones in the main document try { List nodes = document.selectNodes("descendant::*"); //$NON-NLS-1$ Iterator nodeIterator = nodes.iterator(); while (nodeIterator.hasNext()) { Node node = (Node) nodeIterator.next(); String name = node.getText(); if (name.startsWith("%") && !node.getPath().endsWith("/text()")) { //$NON-NLS-1$ //$NON-NLS-2$ try { String localeText = getLocaleString(name, baseName, file, true); if (localeText != null) { node.setText(localeText); } } catch (Exception e) { logger.warn(Messages.getInstance().getString( "ActionSequenceJCRHelper.WARN_MISSING_RESOURCE_PROPERTY", name.substring(1), //$NON-NLS-1$ baseName, getLocale().toString())); } } } } catch (Exception e) { logger.error(Messages.getInstance().getErrorString( "ActionSequenceJCRHelper.ERROR_0007_COULD_NOT_READ_PROPERTIES", file.getPath()), e); //$NON-NLS-1$ } } protected String getLocaleString(final String key, String baseName, final RepositoryFile baseFile, boolean marchUpParents) { String parentPath = FilenameUtils.getFullPathNoEndSeparator(baseFile.getPath()); RepositoryFile searchDir = repository.getFile(parentPath); if (baseFile.isFolder()) { searchDir = baseFile; } try { boolean searching = true; while (searching) { RepositoryFile[] propertyFiles = listFiles(searchDir, new IFileFilter() { public boolean accept(RepositoryFile file) { return file.getName().toLowerCase().endsWith(PROPERTIES_SUFFIX); } }); RepositoryFile blcv = null; RepositoryFile blc = null; RepositoryFile bl = null; RepositoryFile b = null; for (RepositoryFile element : propertyFiles) { if (element.getName().equalsIgnoreCase(baseName + '_' + getLocale().getLanguage() + '_' + getLocale().getCountry() + '_' + getLocale().getVariant() + PROPERTIES_SUFFIX)) { blcv = element; } if (element.getName().equalsIgnoreCase(baseName + '_' + getLocale().getLanguage() + '_' + getLocale().getCountry() + PROPERTIES_SUFFIX)) { blc = element; } if (element.getName() .equalsIgnoreCase(baseName + '_' + getLocale().getLanguage() + PROPERTIES_SUFFIX)) { bl = element; } if (element.getName().equalsIgnoreCase(baseName + PROPERTIES_SUFFIX)) { b = element; } } String localeText = getLocaleText(key, blcv); if (localeText == null) { localeText = getLocaleText(key, blc); if (localeText == null) { localeText = getLocaleText(key, bl); if (localeText == null) { localeText = getLocaleText(key, b); } } } if (localeText != null) { return localeText; } if (searching && marchUpParents) { if (!baseName.equals("messages")) { //$NON-NLS-1$ baseName = "messages"; //$NON-NLS-1$ } else { parentPath = FilenameUtils.getFullPathNoEndSeparator(searchDir.getPath()); // If the parent path is empty or the same as the parent's parent path (meaning root) if (parentPath == null || parentPath.length() < 1 || parentPath.equals(searchDir.getPath())) { searching = false; } else { searchDir = repository.getFile(parentPath); } } } else if (!marchUpParents) { searching = false; } } return null; } catch (Exception e) { logger.error(Messages.getInstance().getErrorString( "ActionSequenceJCRHelper.ERROR_0007_COULD_NOT_READ_PROPERTIES", baseFile.getPath()), e); //$NON-NLS-1$ } return null; } protected Locale getLocale() { return LocaleHelper.getLocale(); } protected String getLocaleText(final String key, final RepositoryFile file) throws IOException { if (file != null) { SimpleRepositoryFileData data = null; data = repository.getDataForRead(file.getId(), SimpleRepositoryFileData.class); Properties p = new Properties(); p.load(data.getStream()); String localeText = p.getProperty(key.substring(1)); if (localeText == null) { localeText = p.getProperty(key); } if (localeText != null) { return localeText; } } return null; } private RepositoryFile[] listFiles(RepositoryFile searchDir, final IFileFilter filter) { List<RepositoryFile> matchedFiles = new ArrayList<RepositoryFile>(); Object[] objArray = repository.getChildren(searchDir.getId(), null, true).toArray(); for (Object element : objArray) { if (filter.accept((RepositoryFile) element)) { matchedFiles.add((RepositoryFile) element); } } return matchedFiles.toArray(new RepositoryFile[] {}); } }