/*
* 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 2008 Pentaho Corporation. All rights reserved.
*
* Created Mar 25, 2008
* @author Michael D'Amour
*/
package org.pentaho.mantle.server;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.mantle.client.MantleXulOverlay;
import org.pentaho.mantle.client.objects.JobDetail;
import org.pentaho.mantle.client.objects.JobSchedule;
import org.pentaho.mantle.client.objects.RolePermission;
import org.pentaho.mantle.client.objects.SimpleMessageException;
import org.pentaho.mantle.client.objects.SolutionFileInfo;
import org.pentaho.mantle.client.objects.SubscriptionBean;
import org.pentaho.mantle.client.objects.SubscriptionSchedule;
import org.pentaho.mantle.client.objects.SubscriptionState;
import org.pentaho.mantle.client.objects.UserPermission;
import org.pentaho.mantle.client.objects.WorkspaceContent;
import org.pentaho.mantle.client.service.MantleService;
import org.pentaho.mantle.client.usersettings.IMantleUserSettingsConstants;
import org.pentaho.platform.api.engine.IAclSolutionFile;
import org.pentaho.platform.api.engine.IActionSequence;
import org.pentaho.platform.api.engine.IBackgroundExecution;
import org.pentaho.platform.api.engine.IContentGeneratorInfo;
import org.pentaho.platform.api.engine.IContentInfo;
import org.pentaho.platform.api.engine.IFileInfo;
import org.pentaho.platform.api.engine.IPentahoSession;
import org.pentaho.platform.api.engine.IPermissionMask;
import org.pentaho.platform.api.engine.IPermissionRecipient;
import org.pentaho.platform.api.engine.IPluginManager;
import org.pentaho.platform.api.engine.IPluginOperation;
import org.pentaho.platform.api.engine.ISolutionFile;
import org.pentaho.platform.api.engine.IUserDetailsRoleListService;
import org.pentaho.platform.api.repository.IContentItem;
import org.pentaho.platform.api.repository.IContentRepository;
import org.pentaho.platform.api.repository.ISchedule;
import org.pentaho.platform.api.repository.ISolutionRepository;
import org.pentaho.platform.api.repository.ISubscribeContent;
import org.pentaho.platform.api.repository.ISubscription;
import org.pentaho.platform.api.repository.ISubscriptionRepository;
import org.pentaho.platform.api.scheduler.BackgroundExecutionException;
import org.pentaho.platform.api.scheduler.IJobDetail;
import org.pentaho.platform.api.scheduler.IJobSchedule;
import org.pentaho.platform.api.usersettings.IUserSettingService;
import org.pentaho.platform.api.usersettings.pojo.IUserSetting;
import org.pentaho.platform.engine.core.solution.ActionInfo;
import org.pentaho.platform.engine.core.solution.SimpleParameterProvider;
import org.pentaho.platform.engine.core.system.PentahoSystem;
import org.pentaho.platform.engine.security.SecurityHelper;
import org.pentaho.platform.engine.security.SimplePermissionMask;
import org.pentaho.platform.engine.security.SimpleRole;
import org.pentaho.platform.engine.security.SimpleUser;
import org.pentaho.platform.engine.security.acls.PentahoAclEntry;
import org.pentaho.platform.engine.services.solution.StandardSettings;
import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalog;
import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCatalogHelper;
import org.pentaho.platform.plugin.action.mondrian.catalog.MondrianCube;
import org.pentaho.platform.plugin.services.versionchecker.PentahoVersionCheckReflectHelper;
import org.pentaho.platform.repository.content.ContentItemFile;
import org.pentaho.platform.repository.messages.Messages;
import org.pentaho.platform.repository.subscription.Schedule;
import org.pentaho.platform.repository.subscription.Subscription;
import org.pentaho.platform.repository.subscription.SubscriptionHelper;
import org.pentaho.platform.scheduler.SchedulerHelper;
import org.pentaho.platform.util.VersionHelper;
import org.pentaho.platform.util.VersionInfo;
import org.pentaho.platform.util.messages.LocaleHelper;
import org.pentaho.platform.util.web.SimpleUrlFactory;
import org.pentaho.platform.web.http.session.HttpSessionParameterProvider;
import org.pentaho.platform.web.http.session.PentahoHttpSession;
import org.pentaho.platform.web.refactor.UserFilesComponent;
import org.pentaho.ui.xul.IMenuCustomization;
import org.pentaho.ui.xul.XulOverlay;
import org.pentaho.ui.xul.IMenuCustomization.CustomizationType;
import com.google.gwt.user.server.rpc.RemoteServiceServlet;
public class MantleServlet extends RemoteServiceServlet implements MantleService {
protected static final Log logger = LogFactory.getLog(MantleServlet.class);
private static final String DESC_SEPERATOR = " : "; //$NON-NLS-1$
protected void onBeforeRequestDeserialized(String serializedRequest) {
PentahoSystem.systemEntryPoint();
}
protected void onAfterResponseSerialized(String serializedResponse) {
PentahoSystem.systemExitPoint();
}
@Override
protected void doUnexpectedFailure(Throwable e) {
try {
getThreadLocalResponse().sendRedirect("../Home"); //$NON-NLS-1$
PentahoSystem.systemExitPoint();
} catch (IOException e1) {
logger.error("doUnexpectedFailure", e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
logger.warn("GET request not supported");
try {
resp.sendRedirect("../Home"); //$NON-NLS-1$
} catch (IOException e1) {
}
}
private IPentahoSession getPentahoSession() {
HttpSession session = getThreadLocalRequest().getSession();
IPentahoSession userSession = (IPentahoSession) session.getAttribute(IPentahoSession.PENTAHO_SESSION_KEY);
LocaleHelper.setLocale(getThreadLocalRequest().getLocale());
if (userSession != null) {
return userSession;
}
userSession = new PentahoHttpSession(getThreadLocalRequest().getRemoteUser(), getThreadLocalRequest().getSession(), getThreadLocalRequest().getLocale(),
null);
LocaleHelper.setLocale(getThreadLocalRequest().getLocale());
session.setAttribute(IPentahoSession.PENTAHO_SESSION_KEY, userSession);
return userSession;
}
public boolean isAdministrator() {
return SecurityHelper.isPentahoAdministrator(getPentahoSession());
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
private UserFilesComponent getUserFilesComponent() {
UserFilesComponent userFiles = PentahoSystem.get(UserFilesComponent.class, "IUserFilesComponent", getPentahoSession()); //$NON-NLS-1$
String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl();
String thisUrl = baseUrl + "UserContent?"; //$NON-NLS-1$
SimpleUrlFactory urlFactory = new SimpleUrlFactory(thisUrl);
userFiles.setUrlFactory(urlFactory);
userFiles.setRequest(getThreadLocalRequest());
userFiles.setResponse(getThreadLocalResponse());
userFiles.setMessages(new ArrayList());
userFiles.validate(getPentahoSession(), null);
return userFiles;
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
public String getSoftwareUpdatesDocument() {
if (PentahoVersionCheckReflectHelper.isVersionCheckerAvailable()) {
List results = PentahoVersionCheckReflectHelper.performVersionCheck(false, -1);
return PentahoVersionCheckReflectHelper.logVersionCheck(results, logger);
}
return "<vercheck><error><[!CDATA[Version Checker is disabled]]></error></vercheck>"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
public void executeGlobalActions() {
if (isAdministrator()) {
PentahoSystem.publish(getPentahoSession(), org.pentaho.platform.engine.core.system.GlobalListsPublisher.class.getName());
}
}
public String refreshMetadata() {
String result = null;
if (isAdministrator()) {
result = PentahoSystem.publish(getPentahoSession(), org.pentaho.platform.engine.services.metadata.MetadataPublisher.class.getName());
}
return result;
}
public void refreshSystemSettings() {
if (isAdministrator()) {
PentahoSystem.publish(getPentahoSession(), org.pentaho.platform.engine.core.system.SettingsPublisher.class.getName());
}
}
public boolean isAuthenticated() {
return getPentahoSession() != null && getPentahoSession().isAuthenticated();
}
public WorkspaceContent getWorkspaceContent() {
WorkspaceContent content = new WorkspaceContent();
content.setAllSchedules(getAllSchedules());
content.setCompletedJobs(getCompletedBackgroundContent());
content.setMySchedules(getMySchedules());
content.setScheduledJobs(getScheduledBackgroundContent());
content.setSubscriptions(getSubscriptionsForMyWorkspace());
return content;
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
public ArrayList<JobDetail> getScheduledBackgroundContent() {
getPentahoSession().resetBackgroundExecutionAlert();
IBackgroundExecution backgroundExecution = PentahoSystem.get(IBackgroundExecution.class, getPentahoSession());
if (backgroundExecution != null) {
try {
List<IJobDetail> jobsList = (List<IJobDetail>) backgroundExecution.getScheduledAndExecutingBackgroundJobs(getPentahoSession());
ArrayList<JobDetail> myJobs = new ArrayList<JobDetail>(jobsList.size());
for (IJobDetail jobDetail : jobsList) {
JobDetail myJobDetail = new JobDetail();
myJobDetail.id = jobDetail.getName();
myJobDetail.name = jobDetail.getActionName();
myJobDetail.fullname = jobDetail.getFullName();
myJobDetail.description = jobDetail.getDescription();
myJobDetail.timestamp = jobDetail.getSubmissionDate();
myJobDetail.group = jobDetail.getGroupName();
myJobs.add(myJobDetail);
}
return myJobs;
} catch (BackgroundExecutionException bee) {
// since this is GWT-RPC we cannot serialize this particular exception
// so we will return an empty list, like the else condition below
return new ArrayList<JobDetail>();
}
} else {
return new ArrayList<JobDetail>();
}
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
public ArrayList<JobDetail> getCompletedBackgroundContent() {
getPentahoSession().resetBackgroundExecutionAlert();
IBackgroundExecution backgroundExecution = PentahoSystem.get(IBackgroundExecution.class, getPentahoSession());
if (backgroundExecution != null) {
List<IContentItem> jobsList = (List<IContentItem>) backgroundExecution.getBackgroundExecutedContentList(getPentahoSession());
ArrayList<JobDetail> myJobs = new ArrayList<JobDetail>(jobsList.size());
SimpleDateFormat fmt = new SimpleDateFormat();
for (IContentItem contentItem : jobsList) {
JobDetail myJobDetail = new JobDetail();
myJobDetail.id = contentItem.getId();
String dateStr = ""; //$NON-NLS-1$
Date time = contentItem.getFileDateTime();
if (time != null) {
dateStr = fmt.format(time);
}
myJobDetail.name = contentItem.getTitle();
myJobDetail.fullname = contentItem.getActionName();
myJobDetail.description = contentItem.getActionName();
myJobDetail.timestamp = dateStr;
myJobDetail.size = Long.toString(contentItem.getFileSize());
myJobDetail.type = contentItem.getMimeType();
myJobs.add(myJobDetail);
}
return myJobs;
} else {
return new ArrayList<JobDetail>();
}
}
public boolean cancelBackgroundJob(String jobName, String jobGroup) {
UserFilesComponent userFiles = getUserFilesComponent();
boolean status = userFiles.cancelJob(jobName, jobGroup);
return status;
}
public boolean deleteContentItem(String contentId) {
UserFilesComponent userFiles = getUserFilesComponent();
boolean status = userFiles.deleteContent(contentId);
return status;
}
public void refreshRepository() {
if (isAdministrator()) {
PentahoSystem.get(ISolutionRepository.class, getPentahoSession()).reloadSolutionRepository(getPentahoSession(), getPentahoSession().getLoggingLevel());
}
}
public int cleanContentRepository(int daysBack) {
int deleteCount = 0;
if (isAdministrator()) {
// get daysback off the input
daysBack = Math.abs(daysBack) * -1;
// get todays calendar
Calendar calendar = Calendar.getInstance();
// subtract (by adding a negative number) the daysback amount
calendar.add(Calendar.DATE, daysBack);
// create the new date for the content repository to use
Date agedDate = new Date(calendar.getTimeInMillis());
// get the content repository and tell it to remove the items older than
// agedDate
IContentRepository contentRepository = PentahoSystem.get(IContentRepository.class, getPentahoSession());
deleteCount = contentRepository.deleteContentOlderThanDate(agedDate);
}
return deleteCount;
}
public void flushMondrianSchemaCache() {
if (isAdministrator()) {
MondrianCatalogHelper.getInstance().reInit(getPentahoSession());
}
}
public ArrayList<JobSchedule> getMySchedules() {
ArrayList<JobSchedule> jobSchedules = null;
try {
List<IJobSchedule> schedules = SchedulerHelper.getMySchedules(getPentahoSession());
jobSchedules = iJobSchedule2JobSchedule(schedules);
// these are functionally the same exact objects (mantle
// JobSchedule/platform JobSchedule)
} catch (Exception e) {
logger.error(e.getMessage());
jobSchedules = new ArrayList<JobSchedule>();
}
return jobSchedules;
}
public ArrayList<JobSchedule> getAllSchedules() {
ArrayList<JobSchedule> jobSchedules = null;
try {
List<IJobSchedule> schedules = SchedulerHelper.getAllSchedules(getPentahoSession());
jobSchedules = iJobSchedule2JobSchedule(schedules);
// these are functionally the same exact objects (mantle
// JobSchedule/platform JobSchedule)
} catch (Exception e) {
logger.error(e.getMessage());
jobSchedules = new ArrayList<JobSchedule>();
}
return jobSchedules;
}
private ArrayList<JobSchedule> iJobSchedule2JobSchedule(List<IJobSchedule> iJobSchedules) {
ArrayList<JobSchedule> jobSchedules = new ArrayList<JobSchedule>();
for (IJobSchedule iJobSchedule : iJobSchedules) {
JobSchedule jobSchedule = new JobSchedule();
jobSchedule.fullname = iJobSchedule.getFullname();
jobSchedule.jobDescription = iJobSchedule.getJobDescription();
jobSchedule.jobGroup = iJobSchedule.getJobGroup();
jobSchedule.jobName = iJobSchedule.getJobName();
jobSchedule.name = iJobSchedule.getName();
jobSchedule.nextFireTime = iJobSchedule.getNextFireTime();
jobSchedule.previousFireTime = iJobSchedule.getPreviousFireTime();
jobSchedule.triggerGroup = iJobSchedule.getTriggerGroup();
jobSchedule.triggerName = iJobSchedule.getTriggerName();
jobSchedule.triggerState = iJobSchedule.getTriggerState();
jobSchedules.add(jobSchedule);
}
return jobSchedules;
}
public void deleteJob(String jobName, String jobGroup) {
SchedulerHelper.deleteJob(getPentahoSession(), jobName, jobGroup);
}
public void runJob(String jobName, String jobGroup) {
SchedulerHelper.runJob(getPentahoSession(), jobName, jobGroup);
}
public void resumeJob(String jobName, String jobGroup) {
SchedulerHelper.resumeJob(getPentahoSession(), jobName, jobGroup);
}
public void suspendJob(String jobName, String jobGroup) {
SchedulerHelper.suspendJob(getPentahoSession(), jobName, jobGroup);
}
// public void createCronJob(String solutionName, String path, String
// actionName, String cronExpression) throws SimpleMessageException {
// if ("true".equalsIgnoreCase(PentahoSystem.getSystemSetting("kiosk-mode", "false"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// throw new SimpleMessageException(ServerMessages.getString("featureDisabled")); //$NON-NLS-1$
// }
// try {
// SchedulerHelper.createCronJob(getPentahoSession(), solutionName, path,
// actionName, cronExpression);
// } catch (Exception e) {
// throw new SimpleMessageException(e.getMessage());
// }
// }
public void createCronJob(String solutionName, String path, String actionName, String triggerName, String triggerGroup, String description,
String cronExpression) throws SimpleMessageException {
if (!hasAccess(solutionName, path, actionName, ISolutionRepository.ACTION_SUBSCRIBE)) {
throw new SimpleMessageException(ServerMessages.getInstance().getString("noSchedulePermission")); //$NON-NLS-1$
}
if ("true".equalsIgnoreCase(PentahoSystem.getSystemSetting("kiosk-mode", "false"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
throw new SimpleMessageException(ServerMessages.getInstance().getString("featureDisabled")); //$NON-NLS-1$
}
try {
IBackgroundExecution backgroundExecutionHandler = PentahoSystem.get(IBackgroundExecution.class, getPentahoSession());
SimpleParameterProvider parameterProvider = new SimpleParameterProvider();
parameterProvider.setParameter(StandardSettings.SOLUTION, solutionName);
parameterProvider.setParameter(StandardSettings.PATH, path);
parameterProvider.setParameter(StandardSettings.ACTION, actionName);
parameterProvider.setParameter(StandardSettings.CRON_STRING, cronExpression);
parameterProvider.setParameter(StandardSettings.SCHEDULE_NAME, triggerName);
parameterProvider.setParameter(StandardSettings.SCHEDULE_GROUP_NAME, getPentahoSession().getName());
parameterProvider.setParameter(StandardSettings.DESCRIPTION, triggerGroup + DESC_SEPERATOR + description);
backgroundExecutionHandler.backgroundExecuteAction(getPentahoSession(), parameterProvider);
} catch (Exception e) {
throw new SimpleMessageException(e.getMessage());
} finally {
PentahoSystem.systemExitPoint(); // Since we're creating something an
// hibernate might throw an exception on
// the onAfterResponseSerialized() method
// of this
// class
// we need to do it before hand to see if we're going to error out.
}
}
public void createSimpleTriggerJob(String triggerName, String triggerGroup, String description, Date startDate, Date endDate, int repeatCount,
int repeatInterval, String solutionName, String path, String actionName) throws SimpleMessageException {
if (!hasAccess(solutionName, path, actionName, ISolutionRepository.ACTION_SUBSCRIBE)) {
throw new SimpleMessageException(ServerMessages.getInstance().getString("noSchedulePermission")); //$NON-NLS-1$
}
if ("true".equalsIgnoreCase(PentahoSystem.getSystemSetting("kiosk-mode", "false"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
throw new SimpleMessageException(ServerMessages.getInstance().getString("featureDisabled")); //$NON-NLS-1$
}
try {
IBackgroundExecution backgroundExecutionHandler = PentahoSystem.get(IBackgroundExecution.class, getPentahoSession());
SimpleParameterProvider parameterProvider = new SimpleParameterProvider();
parameterProvider.setParameter(StandardSettings.SOLUTION, solutionName);
parameterProvider.setParameter(StandardSettings.PATH, path);
parameterProvider.setParameter(StandardSettings.ACTION, actionName);
parameterProvider.setParameter(StandardSettings.REPEAT_COUNT, Integer.toString(repeatCount));
parameterProvider.setParameter(StandardSettings.REPEAT_TIME_MILLISECS, Integer.toString(repeatInterval));
parameterProvider.setParameter(StandardSettings.START_DATE_TIME, startDate);
parameterProvider.setParameter(StandardSettings.END_DATE_TIME, endDate);
parameterProvider.setParameter(StandardSettings.SCHEDULE_NAME, triggerName);
parameterProvider.setParameter(StandardSettings.SCHEDULE_GROUP_NAME, getPentahoSession().getName());
parameterProvider.setParameter(StandardSettings.DESCRIPTION, triggerGroup + DESC_SEPERATOR + description);
backgroundExecutionHandler.backgroundExecuteAction(getPentahoSession(), parameterProvider);
} catch (Exception e) {
throw new SimpleMessageException(e.getMessage());
} finally {
PentahoSystem.systemExitPoint(); // Since we're creating something an
// hibernate might throw an exception on
// the onAfterResponseSerialized() method
// of this
// class
// we need to do it before hand to see if we're going to error out.
}
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
public ArrayList<String> getAllRoles() {
IUserDetailsRoleListService userDetailsRoleListService = PentahoSystem.get(IUserDetailsRoleListService.class);
return (ArrayList<String>) userDetailsRoleListService.getAllRoles();
}
@SuppressWarnings("unchecked")//$NON-NLS-1$
public ArrayList<String> getAllUsers() {
IUserDetailsRoleListService userDetailsRoleListService = PentahoSystem.get(IUserDetailsRoleListService.class);
return (ArrayList<String>) userDetailsRoleListService.getAllUsers();
}
public SolutionFileInfo getSolutionFileInfo(String solutionName, String path, String fileName) {
if (fileName == null || path == null || solutionName == null) {
throw new IllegalArgumentException("getSolutionFileInfo called with null parameters"); //$NON-NLS-1$
}
SolutionFileInfo solutionFileInfo = new SolutionFileInfo();
ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, getPentahoSession());
String fullPath = ActionInfo.buildSolutionPath(solutionName, path, fileName);
ISolutionFile solutionFile = repository.getSolutionFile(fullPath, ISolutionRepository.ACTION_EXECUTE);
solutionFileInfo.solution = solutionName;
solutionFileInfo.path = path;
solutionFileInfo.name = fileName;
// Get Localized name
if (!solutionFile.isDirectory()) {
solutionFileInfo.localizedName = repository.getLocalizedFileProperty(solutionFile, "title", ISolutionRepository.ACTION_EXECUTE); //$NON-NLS-1$
}
if (StringUtils.isEmpty(solutionFileInfo.localizedName)) {
solutionFileInfo.localizedName = repository.getLocalizedFileProperty(solutionFile, "name", ISolutionRepository.ACTION_EXECUTE); //$NON-NLS-1$
}
// Find file Type, if plugin, also get the title
int lastDot = -1;
if (solutionFile.isDirectory()) {
solutionFileInfo.type = SolutionFileInfo.Type.FOLDER;
} else if ((lastDot = fileName.lastIndexOf('.')) > -1 && !fileName.startsWith(".")) { //$NON-NLS-1$
String extension = fileName.substring(lastDot + 1);
// Check to see if its a plug-in
boolean isPlugin = false;
IPluginManager pluginManager = PentahoSystem.get(IPluginManager.class, getPentahoSession()); //$NON-NLS-1$
if (pluginManager != null) {
Set<String> types = pluginManager.getContentTypes();
isPlugin = types != null && types.contains(extension);
}
if (isPlugin) {
// Get the reported type from the plug-in manager
IContentGeneratorInfo info = pluginManager.getDefaultContentGeneratorInfoForType(extension, getPentahoSession());
solutionFileInfo.type = SolutionFileInfo.Type.PLUGIN;
solutionFileInfo.pluginTypeName = info.getDescription();
// get the title for the plugin file
InputStream inputStream = null;
try {
inputStream = repository.getResourceInputStream(solutionFile.getFullPath(), true, ISolutionRepository.ACTION_EXECUTE);
} catch (FileNotFoundException e) {
logger.warn(e.getMessage(), e);
// proceed to get the file info from the plugin manager. getFileInfo
// will return a failsafe fileInfo when something goes wrong.
}
IFileInfo fileInfo = pluginManager.getFileInfo(extension, getPentahoSession(), solutionFile, inputStream);
solutionFileInfo.localizedName = fileInfo.getTitle();
} else if (fileName.endsWith("waqr.xaction")) { //$NON-NLS-1$
solutionFileInfo.type = SolutionFileInfo.Type.REPORT;
} else if (fileName.endsWith("analysisview.xaction")) { //$NON-NLS-1$
solutionFileInfo.type = SolutionFileInfo.Type.ANALYSIS_VIEW;
} else if (fileName.endsWith(".url")) { //$NON-NLS-1$
solutionFileInfo.type = SolutionFileInfo.Type.URL;
} else {
solutionFileInfo.type = SolutionFileInfo.Type.XACTION;
}
}
if (solutionFile.getData() == null) {
solutionFileInfo.size = 0;
} else {
solutionFileInfo.size = solutionFile.getData().length;
}
solutionFileInfo.lastModifiedDate = new Date(solutionFile.getLastModified());
solutionFileInfo.isDirectory = solutionFile.isDirectory();
if (!solutionFile.isDirectory()) {
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
ISubscribeContent subscribeContent = subscriptionRepository.getContentByActionReference(solutionName + path + "/" + fileName); //$NON-NLS-1$
solutionFileInfo.isSubscribable = (subscribeContent != null) && (subscribeContent.getSchedules() != null && subscribeContent.getSchedules().size() > 0);
} else {
solutionFileInfo.isSubscribable = false;
}
solutionFileInfo.canEffectiveUserManage = isAdministrator() || repository.hasAccess(solutionFile, PentahoAclEntry.PERM_UPDATE_PERMS);
solutionFileInfo.supportsAccessControls = repository.supportsAccessControls();
if (solutionFileInfo.canEffectiveUserManage && solutionFileInfo.supportsAccessControls) {
ArrayList<RolePermission> rolePermissions = new ArrayList<RolePermission>();
ArrayList<UserPermission> userPermissions = new ArrayList<UserPermission>();
if (solutionFile instanceof IAclSolutionFile) {
Map<IPermissionRecipient, IPermissionMask> filePermissions = repository.getEffectivePermissions((solutionFile));
for (Map.Entry<IPermissionRecipient, IPermissionMask> filePerm : filePermissions.entrySet()) {
IPermissionRecipient permRecipient = filePerm.getKey();
if (permRecipient instanceof SimpleRole) {
// entry belongs to a role
rolePermissions.add(new RolePermission(permRecipient.getName(), filePerm.getValue().getMask()));
} else {
// entry belongs to a user
userPermissions.add(new UserPermission(permRecipient.getName(), filePerm.getValue().getMask()));
}
}
}
solutionFileInfo.userPermissions = userPermissions;
solutionFileInfo.rolePermissions = rolePermissions;
}
return solutionFileInfo;
}
public boolean hasAccess(String solutionName, String path, String fileName, int actionOperation) {
ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, getPentahoSession());
String fullPath = ActionInfo.buildSolutionPath(solutionName, path, fileName);
ISolutionFile solutionFile = repository.getSolutionFile(fullPath, actionOperation);
return solutionFile != null;
}
public void setSolutionFileInfo(SolutionFileInfo fileInfo) throws SimpleMessageException {
if ("true".equalsIgnoreCase(PentahoSystem.getSystemSetting("kiosk-mode", "false"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
throw new SimpleMessageException(ServerMessages.getInstance().getString("featureDisabled")); //$NON-NLS-1$
}
try {
ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, getPentahoSession());
if (repository.supportsAccessControls()) {
String fullPath = ActionInfo.buildSolutionPath(fileInfo.solution, fileInfo.path, fileInfo.name);
ISolutionFile solutionFile = repository.getSolutionFile(fullPath, ISolutionRepository.ACTION_SHARE);
Map<IPermissionRecipient, IPermissionMask> origAcl = repository.getEffectivePermissions((solutionFile));
Map<IPermissionRecipient, IPermissionMask> acl = new HashMap<IPermissionRecipient, IPermissionMask>();
for (UserPermission userPermission : fileInfo.userPermissions) {
acl.put(new SimpleUser(userPermission.name), new SimplePermissionMask(userPermission.mask));
}
for (RolePermission rolePermission : fileInfo.rolePermissions) {
acl.put(new SimpleRole(rolePermission.name), new SimplePermissionMask(rolePermission.mask));
}
// only set the permissions if the user made a change to the effective
// acls (otherwise, keep inheriting);
// this will avoid creating access control entries in the database when
// they are the same as the ACEs
// that would be inherited!
if (!origAcl.equals(acl)) {
repository.setPermissions(solutionFile, acl);
repository.resetRepository();
}
if (!solutionFile.isDirectory()) {
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
String actionRef = fileInfo.solution + fileInfo.path + "/" + fileInfo.name; //$NON-NLS-1$
ISubscribeContent subscribeContent = subscriptionRepository.getContentByActionReference(actionRef);
if (fileInfo.isSubscribable && subscribeContent == null) {
// make this actionRef subscribable
subscriptionRepository.addContent(actionRef, ""); //$NON-NLS-1$
} else if (!fileInfo.isSubscribable && subscribeContent != null) {
// remove this actionRef from the subscribable list
subscriptionRepository.deleteSubscribeContent(subscribeContent);
}
}
}
} catch (Exception e) {
// e.printStackTrace();
throw new SimpleMessageException(e.getMessage());
} finally {
}
}
public boolean doesSolutionRepositorySupportPermissions() {
ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, getPentahoSession());
return repository.supportsAccessControls();
}
public HashMap<String, String> getMantleSettings() {
HashMap<String, String> settings = new HashMap<String, String>();
// read properties file
Properties props = new Properties();
try {
props.load(getClass().getResourceAsStream("/org/pentaho/mantle/server/MantleSettings.properties")); //$NON-NLS-1$
Enumeration keys = props.keys();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = (String) props.getProperty(key);
settings.put(key, value);
}
settings.put("login-show-users-list", PentahoSystem.getSystemSetting("login-show-users-list", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
settings.put("documentation-url", PentahoSystem.getSystemSetting("documentation-url", "")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// Check for override of New Analysis View via pentaho.xml
// Poked in via pentaho.xml entries
// <new-analysis-view>
// <command-url>http://www.google.com</command-url>
// <command-title>Marc Analysis View</command-title>
// </new-analysis-view>
// <new-report>
// <command-url>http://www.yahoo.com</command-url>
// <command-title>Marc New Report</command-title>
// </new-report>
//
String overrideNewAnalysisViewCommmand = PentahoSystem.getSystemSetting("new-analysis-view/command-url", null); //$NON-NLS-1$
String overrideNewAnalysisViewTitle = PentahoSystem.getSystemSetting("new-analysis-view/command-title", null); //$NON-NLS-1$
if ((overrideNewAnalysisViewCommmand != null) && (overrideNewAnalysisViewTitle != null)) {
settings.put("new-analysis-view-command-url", overrideNewAnalysisViewCommmand); //$NON-NLS-1$
settings.put("new-analysis-view-command-title", overrideNewAnalysisViewTitle); //$NON-NLS-1$
}
String overrideNewReportCommmand = PentahoSystem.getSystemSetting("new-report/command-url", null); //$NON-NLS-1$
String overrideNewReportTitle = PentahoSystem.getSystemSetting("new-report/command-title", null); //$NON-NLS-1$
if ((overrideNewReportCommmand != null) && (overrideNewReportTitle != null)) {
settings.put("new-report-command-url", overrideNewReportCommmand); //$NON-NLS-1$
settings.put("new-report-command-title", overrideNewReportTitle); //$NON-NLS-1$
}
// see if we have any plugin settings
IPluginManager pluginManager = PentahoSystem.get(IPluginManager.class, getPentahoSession()); //$NON-NLS-1$
if (pluginManager != null) {
// get the menu customizations for the plugins, if any
List<IMenuCustomization> customs = (List<IMenuCustomization>)pluginManager.getMenuCustomizations();
int fileIdx = 0;
int fileNewIdx = 0;
int fileManageIdx = 0;
int viewIdx = 0;
int toolsIdx = 0;
int toolsRefreshIdx = 0;
int aboutIdx = 0;
int overrideIdx = 0;
// process each customization
for (IMenuCustomization custom : customs) {
// we only support appending children to the first level sub-menus
if (custom.getCustomizationType() == CustomizationType.LAST_CHILD) {
String anchor = custom.getAnchorId();
// do we have any additions to the file menu?
// TODO: support file->new
if ("file-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("fileMenuTitle" + fileIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("fileMenuCommand" + fileIdx, custom.getCommand()); //$NON-NLS-1$
fileIdx++;
} else if ("file-new-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("file-newMenuTitle" + fileNewIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("file-newMenuCommand" + fileNewIdx, custom.getCommand()); //$NON-NLS-1$
fileNewIdx++;
} else if ("file-manage-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("file-manageMenuTitle" + fileManageIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("file-manageMenuCommand" + fileManageIdx, custom.getCommand()); //$NON-NLS-1$
fileManageIdx++;
}
// do we have any additions to the view menu?
else if ("view-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("viewMenuTitle" + viewIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("viewMenuCommand" + viewIdx, custom.getCommand()); //$NON-NLS-1$
viewIdx++;
}
// do we have any additions to the tools menu?
else if ("tools-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("toolsMenuTitle" + toolsIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("toolsMenuCommand" + toolsIdx, custom.getCommand()); //$NON-NLS-1$
toolsIdx++;
}
// do we have any additions to the refresh menu?
else if ("tools-refresh-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("tools-refreshMenuTitle" + toolsRefreshIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("tools-refreshMenuCommand" + toolsRefreshIdx, custom.getCommand()); //$NON-NLS-1$
toolsRefreshIdx++;
}
// do we have any additions to the about menu?
else if ("about-submenu".equals(anchor)) { //$NON-NLS-1$
settings.put("helpMenuTitle" + aboutIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("helpMenuCommand" + aboutIdx, custom.getCommand()); //$NON-NLS-1$
aboutIdx++;
}
} else if (custom.getCustomizationType() == CustomizationType.REPLACE) {
// Support replace of new analysis view and new report only
//
// Example of overriding via plugin.xml
// <menu-item id="waqr_menu_item"
// anchor="file-new-submenu-waqr_menu_item"
// label="New WAQR"
// command="http://www.amazon.com"
// type="MENU_ITEM"
// how="REPLACE"/>
// <menu-item id="new_analysis_view_menu_item"
// anchor="file-new-submenu-new_analysis_view_menu_item"
// label="New Analysis"
// command="http://www.dogpile.com"
// type="MENU_ITEM"
// how="REPLACE"/>
//
String anchor = custom.getAnchorId();
String anchorStart = "file-new-submenu-"; //$NON-NLS-1$
if (anchor.startsWith(anchorStart)) {
// Anchor needs to be in two parts
// file-new-submenu and the submenu being replaced
// e.g. file-new-submenu-waqr_menu_item
String overrideMenuItem = anchor.substring(anchorStart.length());
settings.put("file-newMenuOverrideTitle" + overrideIdx, custom.getLabel()); //$NON-NLS-1$
settings.put("file-newMenuOverrideCommand" + overrideIdx, custom.getCommand()); //$NON-NLS-1$
settings.put("file-newMenuOverrideMenuItem" + overrideIdx, overrideMenuItem); //$NON-NLS-1$
overrideIdx++;
}
}
}
// load content types from IPluginSettings
int i = 0;
for (String contentType : pluginManager.getContentTypes()) {
IContentInfo info = pluginManager.getContentInfoFromExtension(contentType, getPentahoSession());
if (info != null) {
settings.put("plugin-content-type-" + i, "." + contentType); //$NON-NLS-1$ //$NON-NLS-2$
settings.put("plugin-content-type-icon-" + i, info.getIconUrl()); //$NON-NLS-1$
int j = 0;
for (IPluginOperation operation : info.getOperations()) {
settings.put("plugin-content-type-" + i + "-command-" + j, operation.getId()); //$NON-NLS-1$
settings.put("plugin-content-type-" + i + "-command-url-" + j, operation.getCommand()); //$NON-NLS-1$
j++;
}
i++;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return settings;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.mantle.client.service.MantleService#isSubscriptionContent(java .lang.String)
*/
public Boolean isSubscriptionContent(String actionRef) {
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
return new Boolean(subscriptionRepository.getContentByActionReference(actionRef) != null
&& subscriptionRepository.getContentByActionReference(actionRef).getSchedules().size() > 0);
}
/*
* (non-Javadoc)
*
* @seeorg.pentaho.mantle.client.service.MantleService# getAvailableSubscriptionSchedules()
*/
public ArrayList<SubscriptionSchedule> getAvailableSubscriptionSchedules(String actionRef) {
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
ISubscribeContent subscribeContent = subscriptionRepository.getContentByActionReference(actionRef);
List<ISchedule> appliedList = subscribeContent == null ? new ArrayList<ISchedule>() : subscribeContent.getSchedules();
List<ISchedule> availableList = subscriptionRepository.getSchedules();
ArrayList<SubscriptionSchedule> unusedScheduleList = new ArrayList<SubscriptionSchedule>();
for (ISchedule schedule : availableList) {
if (!appliedList.contains(schedule)) {
SubscriptionSchedule subSchedule = new SubscriptionSchedule();
subSchedule.id = schedule.getId();
subSchedule.title = schedule.getTitle();
subSchedule.scheduleReference = schedule.getScheduleReference();
subSchedule.description = schedule.getDescription();
subSchedule.cronString = schedule.getCronString();
subSchedule.group = schedule.getGroup();
subSchedule.lastTrigger = schedule.getLastTrigger();
unusedScheduleList.add(subSchedule);
}
}
return unusedScheduleList;
}
/**
* Runs and archives the given public schedule.
*
* @param publicScheduleName
* The public scedule to be run.
* @return message The message that was returned from the API after running and archiving the given public schedule.
*/
public String runAndArchivePublicSchedule(String publicScheduleName) throws SimpleMessageException {
final IPentahoSession userSession = getPentahoSession();
HttpSessionParameterProvider sessionParameters = new HttpSessionParameterProvider(userSession);
String response = null;
try {
response = SubscriptionHelper.createSubscriptionArchive(publicScheduleName, userSession, null, sessionParameters);
} catch (BackgroundExecutionException bex) {
response = bex.getLocalizedMessage();
throw new SimpleMessageException(Messages.getInstance().getErrorString("ViewAction.ViewAction.ERROR_UNABLE_TO_CREATE_SUBSCRIPTION_ARCHIVE")); //$NON-NLS-1$
}
return response;
}
/**
* Delete the contents under the public schedule and then delete the public schedule
*
* @param publicScheduleName
* The public schedule name for the given content id
* @param contentItemList
* The list of content items belonging to the given public schedule to be deleted
* @return Error message if error occurred else success message
*/
public String deletePublicScheduleAndContents(String publicScheduleName, ArrayList<String> contentItemList) {
/*
* Iterate through all the content items and delete them
*/
if (contentItemList != null) {
Iterator<String> iter = contentItemList.iterator();
if (iter != null) {
while (iter.hasNext()) {
deleteSubscriptionArchive(publicScheduleName, iter.next());
}
}
}
/*
* Once all the content items are deleted, go ahead and delete the actual public schedule
*/
final String result = SubscriptionHelper.deleteSubscription(publicScheduleName, getPentahoSession());
return result;
}
/**
* Delete the given content item for the given public schedule.
*
* @param publicScheduleName
* The public schedule name for the given content id
* @param contentId
* The content item id to be deleted
* @return Error message if error occurred else success message
*/
public String deleteSubscriptionArchive(String publicScheduleName, String contentId) {
final IPentahoSession session = getPentahoSession();
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
ISubscription subscription = subscriptionRepository.getSubscription(publicScheduleName, session);
if (subscription == null) {
// TODO surface an error
return Messages.getInstance().getString("SubscriptionHelper.USER_SUBSCRIPTION_DOES_NOT_EXIST"); //$NON-NLS-1$
}
IContentItem contentItem = subscriptionRepository.getContentItem(publicScheduleName, session);
if (contentItem == null) {
// TODO surface an error
return Messages.getInstance().getString("SubscriptionHelper.USER_CONTENT_ITEM_DOES_NOT_EXIST"); //$NON-NLS-1$
}
contentItem.removeVersion(contentId);
return Messages.getInstance().getString("SubscriptionHelper.USER_ARCHIVE_DELETED"); //$NON-NLS-1$
}
/**
* This method provides the content for the My Subscription section in the Workspace.
*
* @return List<SubscriptionBean> List of subscriptions and their related information contained within the object.
*/
public ArrayList<SubscriptionBean> getSubscriptionsForMyWorkspace() {
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
final String currentUser = getPentahoSession().getName();
final List<ISubscription> userSubscriptionList = subscriptionRepository.getUserSubscriptions(currentUser);
final ArrayList<SubscriptionBean> opSubscrList = new ArrayList<SubscriptionBean>();
Iterator<ISubscription> subscrIter = userSubscriptionList.iterator();
while (subscrIter.hasNext()) {
final ISubscription currentSubscr = subscrIter.next();
final ActionInfo actionInfo = ActionInfo.parseActionString(currentSubscr.getContent().getActionReference());
final String actionSeqTitle = getSolutionFileInfo(actionInfo.getSolutionName(), actionInfo.getPath(), actionInfo.getActionName()).getLocalizedName();
Schedule schedule = null;
final Iterator schedIterator = currentSubscr.getSchedules().iterator();
// Get the first schedule and get out of the loop
// The code is below to avoid null pointer exceptions and get a schedule
// only if it exists.
if (schedIterator != null) {
while (schedIterator.hasNext()) {
schedule = (Schedule) schedIterator.next();
break;
}
}
final SubscriptionBean subscriptionBean = new SubscriptionBean();
subscriptionBean.setId(currentSubscr.getId());
subscriptionBean.setName(currentSubscr.getTitle());
subscriptionBean.setXactionName(actionSeqTitle);
if (!actionInfo.getActionName().endsWith(".")) {
int lastDot = actionInfo.getActionName().lastIndexOf('.');
String type = actionInfo.getActionName().substring(lastDot + 1);
// not very generic :(
// we need plugin.xml 'properties' for this sort of need
if (type.equals("prpt")) {
IPluginManager pluginManager = PentahoSystem.get(IPluginManager.class, getPentahoSession()); //$NON-NLS-1$
// with this information, a content generator can perform a lookup of
// all the information it will
// need to build a new parameter form for the content requested to be
// edited
String baseUrl = PentahoSystem.getApplicationContext().getBaseUrl();
if (baseUrl.endsWith("/") == false) {
baseUrl += "/";
}
String generatorId = pluginManager.getContentGeneratorIdForType(type, getPentahoSession());
String pluginUrl = baseUrl + "content/" + generatorId + "/reportviewer/report.html?subscribe=true&subscription-id=" + currentSubscr.getId();
subscriptionBean.setPluginUrl(pluginUrl);
}
}
if (schedule != null) {
subscriptionBean.setScheduleDate(schedule.getTitle());
}
// We have static dashes here because thats the way data is being
// displayed currently in 1.7
subscriptionBean.setSize("---"); //$NON-NLS-1$
subscriptionBean.setType("---"); //$NON-NLS-1$
subscriptionBean.setContent(getContentItems(subscriptionRepository, (Subscription) currentSubscr));
opSubscrList.add(subscriptionBean);
}
return opSubscrList;
}
/**
* Helper method that returns action sequence title for the given subscription.
*
* @param currentSubscr
* Current subscription
* @return Title of the action sequence attached to the subscription.
*/
private String getActionSequenceTitle(final Subscription currentSubscr) {
final String actionSeqPath = currentSubscr.getContent().getActionReference();
final ActionInfo actionInfo = ActionInfo.parseActionString(actionSeqPath);
ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, getPentahoSession());
final IActionSequence action = repository.getActionSequence(actionInfo.getSolutionName(), actionInfo.getPath(), actionInfo.getActionName(), repository
.getLoggingLevel(), ISolutionRepository.ACTION_EXECUTE);
return action.getTitle();
}
/**
* This is a helper method that gets the content item information
*
* @param subscriptionRepository
* @param currentSubscr
* @return List of String arrays where the array consists of formatted date of the content, file type and size, file id, name and OS path.
*/
private ArrayList<String[]> getContentItems(final ISubscriptionRepository subscriptionRepository, final Subscription currentSubscr) {
final List<ContentItemFile> contentItemFileList = (List<ContentItemFile>) subscriptionRepository.getSubscriptionArchives(currentSubscr.getId(),
getPentahoSession());
ArrayList<String[]> archiveList = null;
if (contentItemFileList != null) {
archiveList = new ArrayList<String[]>();
for (ContentItemFile contentItemFile : contentItemFileList) {
final Date fileItemDate = contentItemFile.getFileDateTime();
final SimpleDateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy h:mm a"); //$NON-NLS-1$
final String formattedDateStr = dateFormat.format(fileItemDate);
final String fileType = contentItemFile.getParent().getMimeType();
final String fileSize = String.valueOf(contentItemFile.getFileSize());
final String[] tempArchiveArr = new String[6];
tempArchiveArr[0] = formattedDateStr;
tempArchiveArr[1] = fileType;
tempArchiveArr[2] = fileSize;
tempArchiveArr[3] = contentItemFile.getId();
tempArchiveArr[4] = contentItemFile.getOsFileName();
tempArchiveArr[5] = contentItemFile.getOsPath();
archiveList.add(tempArchiveArr);
}
}
return archiveList;
}
public String deleteArchive(String subscrName, String fileId) {
final String result = SubscriptionHelper.deleteSubscriptionArchive(subscrName, fileId, getPentahoSession());
return result;
}
// public String viewArchive(String subscrName, String fileId) {
// final String result = SubscriptionHelper.getArchived(subscrName, fileId,
// getPentahoSession());
// return result;
// }
public ArrayList<SubscriptionSchedule> getAppliedSubscriptionSchedules(String actionRef) {
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
ISubscribeContent subscribeContent = subscriptionRepository.getContentByActionReference(actionRef);
List<ISchedule> appliedList = subscribeContent == null ? new ArrayList<ISchedule>() : subscribeContent.getSchedules();
ArrayList<SubscriptionSchedule> appliedScheduleList = new ArrayList<SubscriptionSchedule>();
for (ISchedule schedule : appliedList) {
SubscriptionSchedule subSchedule = new SubscriptionSchedule();
subSchedule.id = schedule.getId();
subSchedule.title = schedule.getTitle();
subSchedule.scheduleReference = schedule.getScheduleReference();
subSchedule.description = schedule.getDescription();
subSchedule.cronString = schedule.getCronString();
subSchedule.group = schedule.getGroup();
subSchedule.lastTrigger = schedule.getLastTrigger();
appliedScheduleList.add(subSchedule);
}
return appliedScheduleList;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.mantle.client.service.MantleService#setSubscriptions(java.lang .String, boolean, java.util.List)
*/
public void setSubscriptions(String actionRef, boolean enabled, ArrayList<SubscriptionSchedule> currentSchedules) {
if ("true".equalsIgnoreCase(PentahoSystem.getSystemSetting("kiosk-mode", "false"))) { //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
throw new RuntimeException(ServerMessages.getInstance().getString("featureDisabled")); //$NON-NLS-1$
}
ISubscriptionRepository subscriptionRepository = PentahoSystem.get(ISubscriptionRepository.class, getPentahoSession());
ISubscribeContent subscribeContent = subscriptionRepository.getContentByActionReference(actionRef);
if (enabled) {
if (subscribeContent == null) {
subscribeContent = subscriptionRepository.addContent(actionRef, ""); //$NON-NLS-1$
}
subscribeContent.clearsSchedules();
ArrayList<ISchedule> updatedSchedules = new ArrayList<ISchedule>();
List<ISchedule> availableSchedules = subscriptionRepository.getSchedules();
for (SubscriptionSchedule currentSchedule : currentSchedules) {
for (ISchedule availableSchedule : availableSchedules) {
if (currentSchedule.id.equals(availableSchedule.getId())) {
updatedSchedules.add(availableSchedule);
}
}
}
subscribeContent.setSchedules(updatedSchedules);
} else {
if (subscribeContent != null) {
subscribeContent.clearsSchedules();
}
}
}
/**
* Gets the mondrian catalogs and populates a hash map with schema name as the key and list of cube names as strings.
*
* @return HashMap The hashmap has schema name as keys and a list of cube names as values
*/
public HashMap<String, ArrayList<String>> getMondrianCatalogs() {
HashMap<String, ArrayList<String>> catalogCubeHashMap = new HashMap<String, ArrayList<String>>();
List<MondrianCatalog> catalogs = MondrianCatalogHelper.getInstance().listCatalogs(getPentahoSession(), true);
for (MondrianCatalog cat : catalogs) {
ArrayList<String> cubes = new ArrayList<String>();
catalogCubeHashMap.put(cat.getName(), cubes);
for (MondrianCube cube : cat.getSchema().getCubes()) {
cubes.add(cube.getName());
}
}
return catalogCubeHashMap;
}
/*
* (non-Javadoc)
*
* @see org.pentaho.mantle.client.service.MantleService#getSubscriptionState(java .lang.String)
*/
public SubscriptionState getSubscriptionState(String actionRef) {
SubscriptionState state = new SubscriptionState();
state.subscriptionsEnabled = isSubscriptionContent(actionRef);
state.availableSchedules = getAvailableSubscriptionSchedules(actionRef);
state.appliedSchedules = getAppliedSubscriptionSchedules(actionRef);
return state;
}
public ArrayList<IUserSetting> getUserSettings() {
try {
IUserSettingService settingsService = PentahoSystem.get(IUserSettingService.class, getPentahoSession());
ArrayList<IUserSetting> settings = (ArrayList<IUserSetting>)settingsService.getUserSettings();
return settings;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public IUserSetting getUserSetting(String settingName) throws SimpleMessageException {
try {
IUserSettingService settingsService = PentahoSystem.get(IUserSettingService.class, getPentahoSession());
IUserSetting setting = settingsService.getUserSetting(settingName, null);
return setting;
} catch (Exception e) {
throw new SimpleMessageException(e.getMessage());
}
}
public void setLocaleOverride(String locale) {
getThreadLocalRequest().getSession().setAttribute("locale_override", locale);
if (!StringUtils.isEmpty(locale)) {
LocaleHelper.setLocaleOverride(new Locale(locale));
}
}
public void setUserSetting(String settingName, String settingValue) throws SimpleMessageException {
try {
IUserSettingService settingsService = PentahoSystem.get(IUserSettingService.class, getPentahoSession());
settingsService.setUserSetting(settingName, settingValue);
} catch (Exception e) {
throw new SimpleMessageException(e.getMessage());
}
}
public void setShowNavigator(boolean showNavigator) {
IUserSettingService settingsService = PentahoSystem.get(IUserSettingService.class, getPentahoSession());
settingsService.setUserSetting(IMantleUserSettingsConstants.MANTLE_SHOW_NAVIGATOR, "" + showNavigator); //$NON-NLS-1$
}
public void setShowLocalizedFileNames(boolean showLocalizedFileNames) {
IUserSettingService settingsService = PentahoSystem.get(IUserSettingService.class, getPentahoSession());
settingsService.setUserSetting(IMantleUserSettingsConstants.MANTLE_SHOW_LOCALIZED_FILENAMES, "" + showLocalizedFileNames); //$NON-NLS-1$
}
public void setShowHiddenFiles(boolean showHiddenFiles) {
IUserSettingService settingsService = PentahoSystem.get(IUserSettingService.class, getPentahoSession());
settingsService.setUserSetting(IMantleUserSettingsConstants.MANTLE_SHOW_HIDDEN_FILES, "" + showHiddenFiles); //$NON-NLS-1$
}
public boolean repositorySupportsACLS() {
ISolutionRepository repository = PentahoSystem.get(ISolutionRepository.class, getPentahoSession());
return repository.supportsAccessControls();
}
public String getVersion() {
VersionInfo versionInfo = VersionHelper.getVersionInfo(PentahoSystem.class);
return versionInfo.getVersionNumber();
}
public ArrayList<MantleXulOverlay> getOverlays() {
IPluginManager pluginManager = PentahoSystem.get(IPluginManager.class, getPentahoSession()); //$NON-NLS-1$
List<XulOverlay> overlays = pluginManager.getOverlays();
ArrayList<MantleXulOverlay> result = new ArrayList<MantleXulOverlay>();
for (XulOverlay overlay : overlays) {
MantleXulOverlay tempOverlay = new MantleXulOverlay(overlay.getId(), overlay.getOverlayUri(), overlay.getSource(), overlay.getResourceBundleUri());
result.add(tempOverlay);
}
if (pluginManager != null) {
return result;
} else {
return null;
}
}
}