/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
package pt.webdetails.cdf.dd;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Element;
import pt.webdetails.cdf.dd.util.Utils;
import pt.webdetails.cpf.packager.origin.PathOrigin;
import pt.webdetails.cpf.packager.origin.PluginRepositoryOrigin;
import pt.webdetails.cpf.packager.origin.StaticSystemOrigin;
import pt.webdetails.cdf.dd.util.CdeEnvironment;
import pt.webdetails.cpf.PluginSettings;
import pt.webdetails.cpf.repository.api.IBasicFile;
import pt.webdetails.cpf.repository.api.IRWAccess;
import pt.webdetails.cpf.repository.api.IReadAccess;
import pt.webdetails.cpf.utils.CharsetHelper;
public class CdeSettings {
protected static Log logger = LogFactory.getLog(CdeSettings.class);
public static enum FolderType { STATIC, REPO }
private CdeSettings(){}
private static CdfDDSettings settings = new CdfDDSettings();
public static CdfDDSettings getSettings(){
return settings;
}
//<path origin="psystem"><>
// public LocationSet getComponentLocations() {
//
// }
public static Collection<PathOrigin> getCustomComponentLocations() {
return settings.getComponentLocations();
}
/**
* @deprecated
*/
public static IReadAccess[] getComponentLocations(){
ArrayList<IReadAccess> componentAccesses = new ArrayList<IReadAccess>();
CdfDDSettings settings = getSettings();
for(Element element : settings.getComponentLocationElements()){
String path = element.getText();
if (path != null) {
path = StringUtils.strip(path, "/");
//ex: <path>system/pentaho-cdf-dd/resources/custom/components</path>, <path>system/cdc/cdeComponents</path>
if(path.startsWith(CdeEnvironment.getSystemDir() + "/")){
path = path.replaceFirst(CdeEnvironment.getSystemDir() + "/", "");
// ex: <path>system/pentaho-cdf-dd/resources/custom/components</path>
if(path.startsWith(CdeEnvironment.getPluginId() + "/")){
path = path.replaceFirst(CdeEnvironment.getPluginId() + "/", "");
if (CdeEnvironment.getPluginSystemReader().fileExists(path) && CdeEnvironment.getPluginSystemReader().fetchFile(path).isDirectory()) {
componentAccesses.add(CdeEnvironment.getPluginSystemReader(path));
}
} else {
//XXX this isn't supposed to happen
// ex: <path>system/cdc/cdeComponents</path>
String pluginId = path.substring(0, path.indexOf("/"));
path = path.replaceFirst(pluginId + "/", "");
if (CdeEnvironment.getOtherPluginSystemReader(pluginId).fileExists(path) && CdeEnvironment.getOtherPluginSystemReader(pluginId).fetchFile(path).isDirectory()) {
componentAccesses.add(CdeEnvironment.getOtherPluginSystemReader(pluginId, path));
}
}
} else if(path.startsWith(CdeEnvironment.getPluginRepositoryDir() + "/")){
// ex: <path>cde/components</path>
path = path.replaceFirst(CdeEnvironment.getPluginRepositoryDir() + "/", "");
if (CdeEnvironment.getPluginSystemReader().fileExists(path) && CdeEnvironment.getPluginSystemReader().fetchFile(path).isDirectory()) {
componentAccesses.add(CdeEnvironment.getPluginRepositoryReader(path));
}
} else {
logger.warn("Components directory '" + element.getText() + "' was not found.");
}
}
}
return componentAccesses.toArray(new IReadAccess[componentAccesses.size()]);
}
public static String[] getFilePickerHiddenFolderPaths( FolderType folderType ) {
List<String> paths = new ArrayList<String>();
// method IBasicFile[] getFilePickerHiddenFolders( folderType ) is already validating if folders exist
IBasicFile[] files = getFilePickerHiddenFolders( folderType );
if( files != null ) {
for( IBasicFile file : files ) {
paths.add( file.getFullPath() );
}
}
return paths.toArray( new String[ files.length ] );
}
public static IBasicFile[] getFilePickerHiddenFolders( FolderType folderType ) {
String[] paths = getSettings().getFilePickerHiddenFoldersByType( folderType );
List<IBasicFile> files = new ArrayList<IBasicFile>();
if( paths != null ){
for( String path : paths ){
IReadAccess access = Utils.getAppropriateReadAccess( path );
if( access != null && access.fileExists( path ) && access.fetchFile( path ).isDirectory() ){
files.add( access.fetchFile( path ) );
} else {
logger.error( "Discarding path '" + path + "': file does not exist or isn't a directory." );
}
}
}
return files.toArray( new IBasicFile[ files.size() ] );
}
public static String getEncoding(){
return CharsetHelper.getEncoding();
}
public static class CdfDDSettings extends PluginSettings {
public CdfDDSettings( IRWAccess writeAccess ){
super( writeAccess ); // useful when unit testing / mocking
}
public CdfDDSettings(){
super(CdeEnvironment.getPluginSystemWriter());
}
List<Element> getComponentLocationElements(){
return getSettingsXmlSection("custom-components/path");
}
public List<PathOrigin> getComponentLocations() {
List<Element> pathElements = getSettingsXmlSection("custom-components/path");
ArrayList<PathOrigin> locations = new ArrayList<PathOrigin>();
for (Element pathElement : pathElements) {
String path = StringUtils.strip(pathElement.getTextTrim());
String origin = pathElement.attributeValue("origin");
if(!StringUtils.isEmpty(origin)) {
if (StringUtils.equals(origin, "static")) {
locations.add(new StaticSystemOrigin(path));
}
else if (StringUtils.equals(origin, "repo")) {
locations.add(new PluginRepositoryOrigin(CdeEngine.getEnv().getPluginRepositoryDir(), path));
}
}
else {
logger.error("Must specify origin (static|repo), location '" + path + " 'ignored.");
}
}
return locations;
}
public String[] getFilePickerHiddenFoldersByType( CdeSettings.FolderType folderType ) {
List<String> hiddenFolders = new ArrayList<String>();
List<Element> xmlPathElements = getSettingsXmlSection( "file-picker/hidden-folders/path" );
if( xmlPathElements != null ) {
for ( Element xmlPathElement : xmlPathElements ) {
String path = StringUtils.strip( xmlPathElement.getTextTrim() );
String origin = xmlPathElement.attributeValue( "origin" );
if ( StringUtils.isEmpty( path ) || StringUtils.isEmpty( origin ) ) {
logger.error( "Must specify origin (static|repo) and location '" + path + "." );
continue;
}
if ( folderType == FolderType.valueOf( origin.toUpperCase() ) ) {
hiddenFolders.add( path );
}
}
}
return hiddenFolders.toArray( new String[ hiddenFolders.size() ] );
}
}
}