/*
* Copyright (C) 2011 Marius Giepz
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
*
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
package org.saiku.adhoc.model;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.metadata.model.Domain;
import org.pentaho.metadata.model.LogicalModel;
import org.saiku.adhoc.exceptions.SaikuAdhocException;
import org.saiku.adhoc.messages.Messages;
import org.saiku.adhoc.model.builder.CdaBuilder;
import org.saiku.adhoc.model.master.SaikuColumn;
import org.saiku.adhoc.model.master.SaikuGroup;
import org.saiku.adhoc.model.master.SaikuMasterModel;
import org.saiku.adhoc.model.master.SaikuParameter;
import org.saiku.adhoc.providers.ICdaProvider;
import org.saiku.adhoc.providers.IMetadataProvider;
import org.saiku.adhoc.providers.IPrptProvider;
import org.saiku.adhoc.service.SaikuProperties;
import pt.webdetails.cda.settings.CdaSettings;
/**
* This object is a singleton and holds all models. Models are stored under
* their respective session-id
*
* It is also responsible of setting up a session
*
* @author mgie
*
*/
public class WorkspaceSessionHolder {
private Map<String, SaikuMasterModel> models = new HashMap<String, SaikuMasterModel>();
private ICdaProvider cdaProvider;
private IPrptProvider prptProvider;
private IMetadataProvider metadataProvider;
protected Log log = LogFactory.getLog(WorkspaceSessionHolder.class);
public void setMetadataProvider(IMetadataProvider metadataProvider) {
this.metadataProvider = metadataProvider;
}
public void setPrptProvider(IPrptProvider prptProvider) {
this.prptProvider = prptProvider;
}
public void setCdaProvider(ICdaProvider cdaProvider) {
this.cdaProvider = cdaProvider;
}
public void initSession(SaikuMasterModel masterModel, String sessionId) {
if (masterModel.getReportTemplate() == null) {
String name = SaikuProperties.defaultPrptTemplate;
//TODO: make it a constant;
String path = null;
String solution = null;
masterModel.setReportTemplate(prptProvider.getTemplate(path, solution, name));
}
models.put(sessionId, masterModel);
}
public Map<String, SaikuMasterModel> getModels() {
return models;
}
public SaikuMasterModel getModel(String sessionId) {
return models.get(sessionId);
}
public String logModel(String sessionId) {
StringBuffer string = new StringBuffer();
final SaikuMasterModel smm = models.get(sessionId);
string.append("\nMASTER-MODEL\nCOLUMNS:\n");
final List<SaikuColumn> columns = smm.getColumns();
for (SaikuColumn saikuColumn : columns) {
string.append(saikuColumn.toString() + "\n");
}
final List<SaikuGroup> groups = smm.getGroups();
string.append("GROUPS:\n");
for (SaikuGroup saikuGroup : groups) {
string.append(saikuGroup.toString() + "\n");
}
string.append("FILTERS:\n");
final List<SaikuParameter> parameters = smm.getParameters();
for (SaikuParameter saikuParameter : parameters) {
string.append(saikuParameter.toString() + "\n");
}
return string.toString();
}
public void storeCda(String sessionId) throws SaikuAdhocException {
SaikuMasterModel model = this.getModel(sessionId);
String action = sessionId + ".cda";
if (!model.isCdaDirty()) {
return;
}
try {
final Domain domain = metadataProvider.getDomain(model.getDomainId());
final LogicalModel logicalModel = metadataProvider.getLogicalModel(model.getDomainId(),model.getLogicalModelId());
final CdaBuilder cdaBuilder = new CdaBuilder();
CdaSettings cdaSettings = cdaBuilder.build(model, domain, logicalModel);
if(log.isDebugEnabled()){
log.debug(logModel(sessionId));
log.debug(cdaSettings.asXML());
}
cdaProvider.addDatasource(cdaProvider.getSolution(), cdaProvider.getPath(), action, cdaSettings.asXML());
model.setCdaDirty(false);
} catch (Exception e) {
e.printStackTrace();
throw new SaikuAdhocException(
Messages.getErrorString("Repository.ERROR_0001_COULD_NOT_PUBLISH_FILE")
);
}
}
}