/*!
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.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 Lesser General Public License for more details.
*
* Copyright (c) 2002-2013 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.extensions.pentaho.drilldown;
import org.pentaho.reporting.designer.core.ReportDesignerContext;
import org.pentaho.reporting.designer.core.auth.AuthenticationData;
import org.pentaho.reporting.designer.core.editor.drilldown.model.DrillDownParameter;
import org.pentaho.reporting.designer.extensions.pentaho.repository.dialogs.RepositoryLoginDialog;
import org.pentaho.reporting.libraries.base.util.IOUtils;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.base.util.StringUtils;
import org.pentaho.reporting.libraries.formula.util.FormulaUtil;
import org.pentaho.ui.xul.XulEventSource;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.util.HashMap;
public class PentahoPathModel implements XulEventSource {
private static class ExtensionMapping {
private String extension;
private String localMode;
private String remoteMode;
private String localNoParamMode;
private String remoteNoParamMode;
private ExtensionMapping( final String extension ) {
this.extension = extension;
}
public String getExtension() {
return extension;
}
public void set( final boolean local, final boolean noParameter, final String name ) {
if ( local ) {
if ( noParameter ) {
localNoParamMode = name;
} else {
localMode = name;
}
} else {
if ( noParameter ) {
remoteNoParamMode = name;
} else {
remoteMode = name;
}
}
}
public String get( final boolean local, final boolean noParameter ) {
if ( noParameter == true ) {
if ( local ) {
if ( localNoParamMode != null ) {
return localNoParamMode;
}
} else {
if ( remoteNoParamMode != null ) {
return remoteNoParamMode;
}
}
}
if ( local ) {
if ( localMode != null ) {
return localMode;
}
} else {
if ( remoteMode != null ) {
return remoteMode;
}
}
return localMode;
}
}
private PropertyChangeSupport propertyChangeSupport;
private String localPath;
private AuthenticationData loginData;
private HashMap<String, ExtensionMapping> extensionMap;
private boolean useRemoteServer;
private boolean hideParameterUi;
private ReportDesignerContext reportDesignerContext;
public static final String USE_REMOTE_SERVER_PROPERTY = "useRemoteServer";
public static final String HIDE_PARAMETER_UI_PROPERTY = "hideParameterUi";
public static final String SERVER_PATH_PROPERTY = "serverPath";
public static final String LOGIN_DATA_PROPERTY = "loginData";
public static final String LOCAL_PATH_PROPERTY = "localPath";
public PentahoPathModel( final ReportDesignerContext reportDesignerContext ) {
this.reportDesignerContext = reportDesignerContext;
propertyChangeSupport = new PropertyChangeSupport( this );
extensionMap = new HashMap<String, ExtensionMapping>();
}
public void registerExtension( final String extension, final boolean local, final boolean noParameter,
final String profileName ) {
ExtensionMapping mapping = extensionMap.get( extension );
if ( mapping == null ) {
mapping = new ExtensionMapping( extension );
extensionMap.put( extension, mapping );
}
mapping.set( local, noParameter, profileName );
}
public AuthenticationData getLoginData() {
return loginData;
}
public void setLoginData( final AuthenticationData loginData ) {
final String oldServerPath = getServerPath();
final AuthenticationData oldLoginData = this.loginData;
this.loginData = loginData;
this.propertyChangeSupport.firePropertyChange( LOGIN_DATA_PROPERTY, oldLoginData, loginData );
this.propertyChangeSupport.firePropertyChange( SERVER_PATH_PROPERTY, oldServerPath, getServerPath() );
}
public String getServerPath() {
if ( loginData == null ) {
return null;
}
return loginData.getUrl();
}
public void setServerPath( final String serverPath ) {
final String oldServerPath = getServerPath();
if ( ObjectUtilities.equal( oldServerPath, serverPath ) ) {
return;
}
if ( serverPath == null ) {
setLoginData( null );
propertyChangeSupport.firePropertyChange( SERVER_PATH_PROPERTY, oldServerPath, null );
return;
}
AuthenticationData loginData = RepositoryLoginDialog.getStoredLoginData( serverPath, reportDesignerContext );
if ( loginData == null ) {
loginData = new AuthenticationData( serverPath );
}
setLoginData( loginData );
propertyChangeSupport.firePropertyChange( SERVER_PATH_PROPERTY, oldServerPath, serverPath );
}
public boolean isUseRemoteServer() {
return useRemoteServer;
}
public void setUseRemoteServer( final boolean useRemoteServer ) {
final boolean oldUseRemoteServer = this.useRemoteServer;
this.useRemoteServer = useRemoteServer;
this.propertyChangeSupport.firePropertyChange( USE_REMOTE_SERVER_PROPERTY, oldUseRemoteServer, useRemoteServer );
}
public boolean isHideParameterUi() {
return hideParameterUi;
}
public void setHideParameterUi( final boolean hideParameterUi ) {
final boolean oldHide = this.hideParameterUi;
this.hideParameterUi = hideParameterUi;
this.propertyChangeSupport.firePropertyChange( HIDE_PARAMETER_UI_PROPERTY, oldHide, hideParameterUi );
}
public String getLocalPath() {
return localPath;
}
public void setLocalPath( final String localPath ) {
final String oldValue = this.localPath;
this.localPath = localPath;
this.propertyChangeSupport.firePropertyChange( LOCAL_PATH_PROPERTY, oldValue, localPath );
}
public void setLocalPathFromParameter( final DrillDownParameter[] params ) {
String solution = null;
String path = null;
String name = null;
String localPath = null;
for ( int i = 0; i < params.length; i++ ) {
final DrillDownParameter drillDownParameter = params[i];
if ( "solution".equals( drillDownParameter.getName() ) ) { // NON-NLS
solution = FormulaUtil.extractStaticTextFromFormulaFragment( drillDownParameter.getFormulaFragment() );
} else if ( "path".equals( drillDownParameter.getName() ) ) { // NON-NLS
path = FormulaUtil.extractStaticTextFromFormulaFragment( drillDownParameter.getFormulaFragment() );
} else if ( "name".equals( drillDownParameter.getName() ) ) { // NON-NLS
name = FormulaUtil.extractStaticTextFromFormulaFragment( drillDownParameter.getFormulaFragment() );
} else if ( "::pentaho-path".equals( drillDownParameter.getName() ) ) { // NON-NLS
localPath = FormulaUtil.extractStaticTextFromFormulaFragment( drillDownParameter.getFormulaFragment() );
}
}
if ( StringUtils.isEmpty( localPath ) == false ) {
setLocalPath( localPath );
} else {
final StringBuilder b = new StringBuilder();
if ( StringUtils.isEmpty( solution ) == false ) {
b.append( solution );
}
if ( StringUtils.isEmpty( path ) == false ) {
b.append( "/" );
b.append( path );
}
if ( StringUtils.isEmpty( name ) == false ) {
b.append( "/" );
b.append( name );
}
if ( b.length() == 0 ) {
setLocalPath( null );
} else {
setLocalPath( b.toString() );
}
}
}
public String getPath() {
if ( localPath == null ) {
return null;
}
final String normalizedPath = localPath.replace( '\\', '/' );
final String[] path = StringUtils.split( normalizedPath, "/" );
final StringBuilder b = new StringBuilder();
for ( int i = 1; i < path.length - 1; i++ ) {
if ( i > 1 ) {
b.append( '/' );
}
final String pathElement = path[i];
b.append( pathElement );
}
return b.toString();
}
public String getName() {
if ( localPath == null ) {
return null;
}
final String normalizedPath = localPath.replace( '\\', '/' );
final String[] path = StringUtils.split( normalizedPath, "/" );
if ( path.length > 1 ) {
return path[path.length - 1];
}
return null;
}
public String getSolution() {
if ( localPath == null ) {
return null;
}
final String normalizedPath = localPath.replace( '\\', '/' );
final String[] path = StringUtils.split( normalizedPath, "/" );
if ( path.length > 0 ) {
return path[0];
}
return null;
}
public void addPropertyChangeListener( final String propertyName, final PropertyChangeListener listener ) {
propertyChangeSupport.addPropertyChangeListener( propertyName, listener );
}
public void removePropertyChangeListener( final String propertyName, final PropertyChangeListener listener ) {
propertyChangeSupport.removePropertyChangeListener( propertyName, listener );
}
public void addPropertyChangeListener( final PropertyChangeListener listener ) {
this.propertyChangeSupport.addPropertyChangeListener( listener );
}
public void removePropertyChangeListener( final PropertyChangeListener listener ) {
this.propertyChangeSupport.removePropertyChangeListener( listener );
}
public String getDrillDownProfile() {
final String name = getName();
if ( name == null ) {
return null;
}
final String extension = IOUtils.getInstance().getFileExtension( name );
ExtensionMapping mapping = extensionMap.get( extension );
if ( mapping == null ) {
mapping = extensionMap.get( null );
if ( mapping == null ) {
return null;
}
}
return mapping.get( isUseRemoteServer() == false, hideParameterUi );
}
public String[] getExtensions() {
return extensionMap.keySet().toArray( new String[extensionMap.size()] );
}
/**
* @return PropertyChangeSupport
*
* added to facilitate unit testing
*/
PropertyChangeSupport getChangeListeners() {
return propertyChangeSupport;
}
}