/*!
* 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-2015 Pentaho Corporation.. All rights reserved.
*/
package org.pentaho.reporting.designer.extensions.pentaho.repository.actions;
import java.awt.Component;
import java.awt.Cursor;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.commons.vfs2.FileObject;
import org.pentaho.reporting.designer.core.ReportDesignerBoot;
import org.pentaho.reporting.designer.core.ReportDesignerContext;
import org.pentaho.reporting.designer.core.auth.AuthenticationData;
import org.pentaho.reporting.designer.core.util.exceptions.UncaughtExceptionsModel;
import org.pentaho.reporting.designer.extensions.pentaho.repository.Messages;
import org.pentaho.reporting.designer.extensions.pentaho.repository.util.PublishUtil;
import org.pentaho.reporting.engine.classic.core.AttributeNames;
import org.pentaho.reporting.engine.classic.core.MasterReport;
import org.pentaho.reporting.libraries.docbundle.DocumentMetaData;
import org.pentaho.reporting.libraries.docbundle.ODFMetaAttributeNames;
import org.pentaho.reporting.libraries.docbundle.WriteableDocumentMetaData;
import org.pentaho.reporting.libraries.pensol.JCRSolutionFileSystem;
public class PublishToServerTask implements AuthenticatedServerTask {
private static final Log logger = LogFactory.getLog( PublishToServerTask.class );
private ReportDesignerContext reportDesignerContext;
private Component uiContext;
private AuthenticationData loginData;
private boolean storeUpdates;
public PublishToServerTask( final ReportDesignerContext reportDesignerContext, final Component uiContext ) {
this.reportDesignerContext = reportDesignerContext;
this.uiContext = uiContext;
}
public void setLoginData( final AuthenticationData loginData, final boolean storeUpdates ) {
this.loginData = loginData;
this.storeUpdates = storeUpdates;
}
public void run() {
final MasterReport report = reportDesignerContext.getActiveContext().getContextRoot();
final DocumentMetaData metaData = report.getBundle().getMetaData();
try {
final String oldName = extractLastFileName( report );
SelectFileForPublishTask selectFileForPublishTask = new SelectFileForPublishTask( uiContext );
readBundleMetaData( report, metaData, selectFileForPublishTask );
final String selectedReport = selectFileForPublishTask.selectFile( loginData, oldName );
if ( selectedReport == null ) {
return;
}
loginData.setOption( "lastFilename", selectedReport );
storeBundleMetaData( report, selectedReport, selectFileForPublishTask );
reportDesignerContext.getActiveContext().getAuthenticationStore().add( loginData, storeUpdates );
final byte[] data = PublishUtil.createBundleData( report );
int responseCode = PublishUtil.publish( data, selectedReport, loginData );
if ( responseCode == 200 ) {
final Component glassPane = SwingUtilities.getRootPane( uiContext ).getGlassPane();
try {
glassPane.setVisible( true );
glassPane.setCursor( new Cursor( Cursor.WAIT_CURSOR ) );
FileObject fileSystemRoot = PublishUtil.createVFSConnection( loginData );
final JCRSolutionFileSystem fileSystem = (JCRSolutionFileSystem) fileSystemRoot.getFileSystem();
fileSystem.getLocalFileModel().refresh();
} catch ( Exception e1 ) {
UncaughtExceptionsModel.getInstance().addException( e1 );
} finally {
glassPane.setVisible( false );
glassPane.setCursor( new Cursor( Cursor.DEFAULT_CURSOR ) );
}
if ( JOptionPane.showConfirmDialog( uiContext, Messages.getInstance().getString(
"PublishToServerAction.Successful.LaunchNow" ), Messages.getInstance().getString(
"PublishToServerAction.Successful.LaunchTitle" ), JOptionPane.YES_NO_OPTION ) == JOptionPane.YES_OPTION ) {
PublishUtil.launchReportOnServer( loginData.getUrl(), selectedReport );
}
} else if ( responseCode == 403 ) {
logger.error( "Publish failed. Server responded with status-code " + responseCode );
JOptionPane.showMessageDialog( uiContext, Messages.getInstance().getString(
"PublishToServerAction.FailedAccess" ), Messages.getInstance().getString(
"PublishToServerAction.FailedAccessTitle" ), JOptionPane.ERROR_MESSAGE );
} else {
logger.error( "Publish failed. Server responded with status-code " + responseCode );
showErrorMessage();
}
} catch ( Exception exception ) {
logger.error( "Publish failed. Unexpected error:", exception );
showErrorMessage();
}
}
private String extractLastFileName( final MasterReport report ) {
final Object lastFilenameAttr =
report.getAttribute( ReportDesignerBoot.DESIGNER_NAMESPACE, ReportDesignerBoot.LAST_FILENAME );
final String oldName;
if ( lastFilenameAttr != null ) {
oldName = (String) lastFilenameAttr;
} else {
oldName = null;
}
return oldName;
}
private void readBundleMetaData( final MasterReport report, final DocumentMetaData metaData,
final SelectFileForPublishTask selectFileForPublishTask ) {
final String oldDescription =
(String) metaData.getBundleAttribute( ODFMetaAttributeNames.DublinCore.NAMESPACE,
ODFMetaAttributeNames.DublinCore.DESCRIPTION );
final String oldTitle =
(String) metaData.getBundleAttribute( ODFMetaAttributeNames.DublinCore.NAMESPACE,
ODFMetaAttributeNames.DublinCore.TITLE );
final boolean oldLockOutput =
Boolean.TRUE.equals( report.getAttribute( AttributeNames.Core.NAMESPACE,
AttributeNames.Core.LOCK_PREFERRED_OUTPUT_TYPE ) );
final String oldExportType =
(String) report.getAttribute( AttributeNames.Core.NAMESPACE, AttributeNames.Core.PREFERRED_OUTPUT_TYPE );
selectFileForPublishTask.setDescription( oldDescription );
selectFileForPublishTask.setReportTitle( oldTitle );
selectFileForPublishTask.setLockOutputType( oldLockOutput );
selectFileForPublishTask.setExportType( oldExportType );
}
private void storeBundleMetaData( final MasterReport report, final String selectedReport,
final SelectFileForPublishTask selectFileForPublishTask ) {
final DocumentMetaData metaData = report.getBundle().getMetaData();
report.setAttribute( ReportDesignerBoot.DESIGNER_NAMESPACE, ReportDesignerBoot.LAST_FILENAME, selectedReport );
if ( metaData instanceof WriteableDocumentMetaData ) {
final WriteableDocumentMetaData writeableDocumentMetaData = (WriteableDocumentMetaData) metaData;
writeableDocumentMetaData.setBundleAttribute( ODFMetaAttributeNames.DublinCore.NAMESPACE,
ODFMetaAttributeNames.DublinCore.DESCRIPTION, selectFileForPublishTask.getDescription() );
writeableDocumentMetaData.setBundleAttribute( ODFMetaAttributeNames.DublinCore.NAMESPACE,
ODFMetaAttributeNames.DublinCore.TITLE, selectFileForPublishTask.getReportTitle() );
}
report.setAttribute( AttributeNames.Core.NAMESPACE, AttributeNames.Core.LOCK_PREFERRED_OUTPUT_TYPE, Boolean
.valueOf( selectFileForPublishTask.isLockOutputType() ) );
report.setAttribute( AttributeNames.Core.NAMESPACE, AttributeNames.Core.PREFERRED_OUTPUT_TYPE,
selectFileForPublishTask.getExportType() );
}
private void showErrorMessage() {
JOptionPane.showMessageDialog( uiContext, Messages.getInstance().getString( "PublishToServerAction.Failed" ),
Messages.getInstance().getString( "PublishToServerAction.FailedTitle" ), JOptionPane.ERROR_MESSAGE );
}
}