/*******************************************************************************
* Copyright 2012 University of Southern California
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 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 License for the specific language governing permissions and
* limitations under the License.
*
* This code was developed by the Information Integration Group as part
* of the Karma project at the Information Sciences Institute of the
* University of Southern California. For more information, publications,
* and related projects, please see: http://www.isi.edu/integration
******************************************************************************/
package edu.isi.karma.webserver;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import edu.isi.karma.config.ModelingConfigurationRegistry;
import edu.isi.karma.config.UIConfiguration;
import edu.isi.karma.config.UIConfigurationRegistry;
import edu.isi.karma.controller.command.alignment.R2RMLAlignmentFileSaver;
import edu.isi.karma.controller.command.selection.SuperSelectionManager;
import edu.isi.karma.controller.history.CommandHistory;
import edu.isi.karma.controller.update.AbstractUpdate;
import edu.isi.karma.controller.update.UpdateContainer;
import edu.isi.karma.controller.update.WorksheetListUpdate;
import edu.isi.karma.controller.update.WorksheetUpdateFactory;
import edu.isi.karma.er.helper.PythonRepository;
import edu.isi.karma.er.helper.PythonRepositoryRegistry;
import edu.isi.karma.metadata.AvroMetadata;
import edu.isi.karma.metadata.CSVMetadata;
import edu.isi.karma.metadata.GraphVizMetadata;
import edu.isi.karma.metadata.JSONMetadata;
import edu.isi.karma.metadata.JSONModelsMetadata;
import edu.isi.karma.metadata.KMLPublishedMetadata;
import edu.isi.karma.metadata.KarmaMetadataManager;
import edu.isi.karma.metadata.ModelLearnerMetadata;
import edu.isi.karma.metadata.NumericSemanticTypeModelMetadata;
import edu.isi.karma.metadata.OntologyMetadata;
import edu.isi.karma.metadata.PythonTransformationMetadata;
import edu.isi.karma.metadata.R2RMLMetadata;
import edu.isi.karma.metadata.R2RMLPublishedMetadata;
import edu.isi.karma.metadata.RDFMetadata;
import edu.isi.karma.metadata.ReportMetadata;
import edu.isi.karma.metadata.SemanticTypeModelMetadata;
import edu.isi.karma.metadata.TextualSemanticTypeModelMetadata;
import edu.isi.karma.metadata.UserConfigMetadata;
import edu.isi.karma.metadata.UserPreferencesMetadata;
import edu.isi.karma.metadata.UserUploadedMetadata;
import edu.isi.karma.rep.Worksheet;
import edu.isi.karma.rep.Workspace;
import edu.isi.karma.rep.WorkspaceManager;
import edu.isi.karma.rep.metadata.Tag;
import edu.isi.karma.rep.metadata.TagsContainer.Color;
import edu.isi.karma.rep.metadata.TagsContainer.TagName;
import edu.isi.karma.view.VWorkspace;
import edu.isi.karma.view.VWorkspaceRegistry;
import edu.isi.karma.webserver.ServletContextParameterMap.ContextParameter;
public class KarmaServlet extends HttpServlet {
private enum Arguments {
hasPreferenceId, workspacePreferencesId, karmaHome
}
private static final long serialVersionUID = 1L;
private static Logger logger = LoggerFactory.getLogger(KarmaServlet.class);
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
UpdateContainer updateContainer = new UpdateContainer();
String karmaHomeDir = request.getParameter(Arguments.karmaHome.name());
ContextParametersRegistry contextParametersRegistry = ContextParametersRegistry.getInstance();
ServletContextParameterMap contextParameters = contextParametersRegistry.getContextParameters(karmaHomeDir);
try
{
ServerStart.initContextParameters(this.getServletContext(), contextParameters);
}
catch(Exception e)
{
logger.error("Unable to initalize parameters using servlet context", e);
}
KarmaMetadataManager metadataManager = null;
try {
metadataManager = new KarmaMetadataManager(contextParameters);
metadataManager.register(new UserUploadedMetadata(contextParameters), updateContainer);
metadataManager.register(new UserPreferencesMetadata(contextParameters), updateContainer);
metadataManager.register(new UserConfigMetadata(contextParameters), updateContainer);
} catch (KarmaException e) {
logger.error("Unable to complete Karma set up: ", e);
}
/* Check if any workspace id is set in cookies. */
boolean hasWorkspaceCookieId = false;
String hasPrefId = request.getParameter(Arguments.hasPreferenceId.name());
if(hasPrefId != null && hasPrefId.equals("true"))
hasWorkspaceCookieId = true;
Workspace workspace = null;
VWorkspace vwsp = null;
/* If set, pick the right preferences and CRF Model file */
if(hasWorkspaceCookieId) {
String cachedWorkspaceId = request.getParameter(Arguments.workspacePreferencesId.name());
workspace = WorkspaceManager.getInstance().createWorkspaceWithPreferencesId(cachedWorkspaceId, contextParameters.getId());
vwsp = new VWorkspace(workspace, cachedWorkspaceId);
} else {
workspace = WorkspaceManager.getInstance().createWorkspace(contextParameters.getId());
vwsp = new VWorkspace(workspace);
}
WorkspaceKarmaHomeRegistry.getInstance().register(workspace.getId(), contextParameters.getKarmaHome());
WorkspaceRegistry.getInstance().register(new ExecutionController(workspace));
VWorkspaceRegistry.getInstance().registerVWorkspace(workspace.getId(), vwsp);
logger.info("Start Metadata Setup");
try {
metadataManager.register(new TextualSemanticTypeModelMetadata(contextParameters), updateContainer);
metadataManager.register(new NumericSemanticTypeModelMetadata(contextParameters), updateContainer);
metadataManager.register(new SemanticTypeModelMetadata(contextParameters), updateContainer);
metadataManager.register(new OntologyMetadata(contextParameters), updateContainer);
metadataManager.register(new JSONModelsMetadata(contextParameters), updateContainer);
metadataManager.register(new PythonTransformationMetadata(contextParameters), updateContainer);
metadataManager.register(new GraphVizMetadata(contextParameters), updateContainer);
metadataManager.register(new ModelLearnerMetadata(contextParameters), updateContainer);
metadataManager.register(new R2RMLMetadata(contextParameters), updateContainer);
metadataManager.register(new R2RMLPublishedMetadata(contextParameters), updateContainer);
metadataManager.register(new RDFMetadata(contextParameters), updateContainer);
metadataManager.register(new CSVMetadata(contextParameters), updateContainer);
metadataManager.register(new JSONMetadata(contextParameters), updateContainer);
metadataManager.register(new ReportMetadata(contextParameters), updateContainer);
metadataManager.register(new AvroMetadata(contextParameters), updateContainer);
metadataManager.register(new KMLPublishedMetadata(contextParameters), updateContainer);
PythonRepository pythonRepository = new PythonRepository(true, contextParameters.getParameterValue(ContextParameter.USER_PYTHON_SCRIPTS_DIRECTORY));
PythonRepositoryRegistry.getInstance().register(pythonRepository);
String port = String.valueOf(request.getServerPort());
String protocol = request.getProtocol();
if(protocol != null) {
protocol = protocol.split("/")[0];
String host = protocol.toLowerCase() + "://" + request.getServerName();
//Set JETTY_PORT and HOST
contextParameters.setParameterValue(ServletContextParameterMap.ContextParameter.JETTY_PORT, port);
logger.info("JETTY_PORT initilized to " + port);
contextParameters.setParameterValue(ServletContextParameterMap.ContextParameter.JETTY_HOST, host);
logger.info("JETTY_HOST initilized to " + host);
// also set PUBLIC_RDF_ADDRESS
contextParameters.setParameterValue(ServletContextParameterMap.ContextParameter.PUBLIC_RDF_ADDRESS, host + ":" + port + "/RDF/");
// also set CLEANING_SERVICE_URL
String cleaningServiceUrl = host + ":" + port
+ contextParameters.getParameterValue(ServletContextParameterMap.ContextParameter.CLEANING_SERVICE_URL);
logger.info("CLEANING SERVICE initialized to " + cleaningServiceUrl);
contextParameters.setParameterValue(ServletContextParameterMap.ContextParameter.CLEANING_SERVICE_URL, cleaningServiceUrl);
//and the CLUSTER_SERVICE url
String clusterServiceUrl =host + ":" + port
+ contextParameters.getParameterValue(ServletContextParameterMap.ContextParameter.CLUSTER_SERVICE_URL);
logger.info("CLUSTER SERVICE initialized to " + clusterServiceUrl);
contextParameters.setParameterValue(ServletContextParameterMap.ContextParameter.CLUSTER_SERVICE_URL, clusterServiceUrl);
}
} catch (KarmaException e) {
logger.error("Unable to complete Karma set up: ", e);
}
metadataManager.setup(workspace, updateContainer);
CommandHistory.setIsHistoryEnabled(true);
CommandHistory.setHistorySaver(workspace.getId(), new R2RMLAlignmentFileSaver(workspace));
// Initialize the Outlier tag
Tag outlierTag = new Tag(TagName.Outlier, Color.Red);
workspace.getTagsContainer().addTag(outlierTag);
// updating cache is already done in OntologyMetadata setup
// workspace.getOntologyManager().updateCache();
// Put all created worksheet models in the view.
updateContainer.add(new WorksheetListUpdate());
for (Worksheet w : vwsp.getWorkspace().getWorksheets()) {
updateContainer.append(WorksheetUpdateFactory.createWorksheetHierarchicalUpdates(w.getId(), SuperSelectionManager.DEFAULT_SELECTION, workspace.getContextId()));
}
updateContainer.add(new AbstractUpdate() {
@Override
public void generateJson(String prefix, PrintWriter pw,
VWorkspace vWorkspace) {
//1. Load all configurations
UIConfiguration uiConfiguration = UIConfigurationRegistry.getInstance().getUIConfiguration(vWorkspace.getWorkspace().getContextId());
uiConfiguration.loadConfig();
ModelingConfigurationRegistry.getInstance().register(vWorkspace.getWorkspace().getContextId());
//2 Return all settings related updates
pw.println("{");
pw.println("\"updateType\": \"UISettings\", ");
pw.println("\"settings\": {");
pw.println(" \"googleEarthEnabled\" : " + uiConfiguration.isGoogleEarthEnabled() + ",");
pw.println(" \"maxLoadedClasses\" : " + uiConfiguration.getMaxClassesToLoad() + ",");
pw.println(" \"maxLoadedProperties\" : " + uiConfiguration.getMaxPropertiesToLoad());
pw.println(" }");
pw.println("}");
}
});
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
updateContainer.applyUpdates(vwsp);
updateContainer.generateJson("", pw, vwsp);
response.setContentType("application/json");
response.setStatus(HttpServletResponse.SC_OK);
response.getWriter().println(sw.toString());
}
}