/******************************************************************************* * 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.util.HashMap; import javax.servlet.http.HttpServletRequest; import org.json.JSONArray; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import edu.isi.karma.controller.command.CloseWorkspaceCommand; import edu.isi.karma.controller.command.CloseWorkspaceCommandFactory; import edu.isi.karma.controller.command.Command; import edu.isi.karma.controller.command.CommandException; import edu.isi.karma.controller.command.CommandFactory; import edu.isi.karma.controller.command.CommandWithPreview; import edu.isi.karma.controller.command.FetchGraphsFromTripleStoreCommand; import edu.isi.karma.controller.command.FetchGraphsFromTripleStoreCommandFactory; import edu.isi.karma.controller.command.FetchPreferencesCommand; import edu.isi.karma.controller.command.FetchPreferencesCommandFactory; import edu.isi.karma.controller.command.GetUniqueGraphUrlCommand; import edu.isi.karma.controller.command.GetUniqueGraphUrlCommandFactory; import edu.isi.karma.controller.command.JSONInputCommandFactory; import edu.isi.karma.controller.command.ResetKarmaCommand; import edu.isi.karma.controller.command.ResetKarmaCommandFactory; import edu.isi.karma.controller.command.TestSPARQLEndPointCommand; import edu.isi.karma.controller.command.TestSPARQLEndPointCommandFactory; import edu.isi.karma.controller.command.UndoRedoCommand; import edu.isi.karma.controller.command.UndoRedoCommandFactory; import edu.isi.karma.controller.command.alignment.AddUserLinkToAlignmentCommand; import edu.isi.karma.controller.command.alignment.AddUserLinkToAlignmentCommandFactory; import edu.isi.karma.controller.command.alignment.ApplyModelFromTripleStoreCommand; import edu.isi.karma.controller.command.alignment.ApplyModelFromTripleStoreCommandFactory; import edu.isi.karma.controller.command.alignment.ChangeInternalNodeLinksCommand; import edu.isi.karma.controller.command.alignment.ChangeInternalNodeLinksCommandFactory; import edu.isi.karma.controller.command.alignment.CreateNewModelCommand; import edu.isi.karma.controller.command.alignment.CreateNewModelCommandFactory; import edu.isi.karma.controller.command.alignment.FetchExistingModelsForWorksheetCommand; import edu.isi.karma.controller.command.alignment.FetchExistingModelsForWorksheetCommandFactory; import edu.isi.karma.controller.command.alignment.FetchR2RMLModelsCommand; import edu.isi.karma.controller.command.alignment.FetchR2RMLModelsCommandFactory; import edu.isi.karma.controller.command.alignment.GenerateR2RMLModelCommand; import edu.isi.karma.controller.command.alignment.GenerateR2RMLModelCommandFactory; import edu.isi.karma.controller.command.alignment.GetAlternativeLinksCommand; import edu.isi.karma.controller.command.alignment.GetAlternativeLinksCommandFactory; import edu.isi.karma.controller.command.alignment.GetCurrentLinksOfInternalNodeCommand; import edu.isi.karma.controller.command.alignment.GetCurrentLinksOfInternalNodeCommandFactory; import edu.isi.karma.controller.command.alignment.GetDataPropertiesForClassCommand; import edu.isi.karma.controller.command.alignment.GetDataPropertiesForClassCommandFactory; import edu.isi.karma.controller.command.alignment.GetDataPropertyHierarchyCommand; import edu.isi.karma.controller.command.alignment.GetDataPropertyHierarchyCommandFactory; import edu.isi.karma.controller.command.alignment.GetDomainsForDataPropertyCommand; import edu.isi.karma.controller.command.alignment.GetDomainsForDataPropertyCommandFactory; import edu.isi.karma.controller.command.alignment.GetInternalNodesListOfAlignmentCommand; import edu.isi.karma.controller.command.alignment.GetInternalNodesListOfAlignmentCommandFactory; import edu.isi.karma.controller.command.alignment.GetLinksOfAlignmentCommand; import edu.isi.karma.controller.command.alignment.GetLinksOfAlignmentCommandFactory; import edu.isi.karma.controller.command.alignment.GetOntologyClassHierarchyCommand; import edu.isi.karma.controller.command.alignment.GetOntologyClassHierarchyCommandFactory; import edu.isi.karma.controller.command.alignment.GetPropertiesAndClassesList; import edu.isi.karma.controller.command.alignment.GetPropertiesAndClassesListCommandFactory; import edu.isi.karma.controller.command.alignment.InvokeDataMiningServiceCommand; import edu.isi.karma.controller.command.alignment.InvokeDataMiningServiceCommandFactory; import edu.isi.karma.controller.command.alignment.SetMetaPropertyCommand; import edu.isi.karma.controller.command.alignment.SetMetaPropertyCommandFactory; import edu.isi.karma.controller.command.alignment.SetSemanticTypeCommand; import edu.isi.karma.controller.command.alignment.SetSemanticTypeCommandFactory; import edu.isi.karma.controller.command.alignment.ShowAutoModelCommand; import edu.isi.karma.controller.command.alignment.ShowAutoModelCommandFactory; import edu.isi.karma.controller.command.alignment.ShowModelCommand; import edu.isi.karma.controller.command.alignment.ShowModelCommandFactory; import edu.isi.karma.controller.command.alignment.UnassignSemanticTypeCommand; import edu.isi.karma.controller.command.alignment.UnassignSemanticTypeCommandFactory; import edu.isi.karma.controller.command.cleaning.FetchTransformingDataCommand; import edu.isi.karma.controller.command.cleaning.FetchTransformingDataFactory; import edu.isi.karma.controller.command.cleaning.GenerateCleaningRulesCommand; import edu.isi.karma.controller.command.cleaning.GenerateCleaningRulesCommandFactory; import edu.isi.karma.controller.command.cleaning.InvokeCleaningServiceCommand; import edu.isi.karma.controller.command.cleaning.InvokeCleaningServiceCommandFactory; import edu.isi.karma.controller.command.cleaning.SubmitCleaningCommand; import edu.isi.karma.controller.command.cleaning.SubmitCleaningCommandFactory; import edu.isi.karma.controller.command.importdata.ImportCSVFileCommand; import edu.isi.karma.controller.command.importdata.ImportCSVFileCommandFactory; import edu.isi.karma.controller.command.importdata.ImportDatabaseTableCommand; import edu.isi.karma.controller.command.importdata.ImportDatabaseTableCommandFactory; import edu.isi.karma.controller.command.importdata.ImportExcelFileCommand; import edu.isi.karma.controller.command.importdata.ImportExcelFileCommandFactory; import edu.isi.karma.controller.command.importdata.ImportJSONFileCommand; import edu.isi.karma.controller.command.importdata.ImportJSONFileCommandFactory; import edu.isi.karma.controller.command.importdata.ImportOntologyCommand; import edu.isi.karma.controller.command.importdata.ImportOntologyCommandFactory; import edu.isi.karma.controller.command.importdata.ImportServiceCommand; import edu.isi.karma.controller.command.importdata.ImportServiceCommandFactory; import edu.isi.karma.controller.command.importdata.ImportUnionResultCommand; import edu.isi.karma.controller.command.importdata.ImportUnionResultCommandFactory; import edu.isi.karma.controller.command.importdata.ImportXMLFileCommand; import edu.isi.karma.controller.command.importdata.ImportXMLFileCommandFactory; import edu.isi.karma.controller.command.publish.PublishCSVCommand; import edu.isi.karma.controller.command.publish.PublishCSVCommandFactory; import edu.isi.karma.controller.command.publish.PublishDatabaseCommand; import edu.isi.karma.controller.command.publish.PublishDatabaseCommandFactory; import edu.isi.karma.controller.command.publish.PublishKMLLayerCommand; import edu.isi.karma.controller.command.publish.PublishKMLLayerCommandFactory; import edu.isi.karma.controller.command.publish.PublishMDBCommand; import edu.isi.karma.controller.command.publish.PublishMDBCommandFactory; import edu.isi.karma.controller.command.publish.PublishRDFCellCommand; import edu.isi.karma.controller.command.publish.PublishRDFCellCommandFactory; import edu.isi.karma.controller.command.publish.PublishRDFCommand; import edu.isi.karma.controller.command.publish.PublishRDFCommandFactory; import edu.isi.karma.controller.command.publish.PublishSpatialDataCommand; import edu.isi.karma.controller.command.publish.PublishSpatialDataCommandFactory; import edu.isi.karma.controller.command.publish.PublishWorksheetHistoryCommand; import edu.isi.karma.controller.command.publish.PublishWorksheetHistoryCommandFactory; import edu.isi.karma.controller.command.reconciliation.InvokeRubenReconciliationService; import edu.isi.karma.controller.command.reconciliation.InvokeRubenReconciliationServiceFactory; import edu.isi.karma.controller.command.service.InvokeServiceCommand; import edu.isi.karma.controller.command.service.InvokeServiceCommandFactory; import edu.isi.karma.controller.command.service.PopulateCommand; import edu.isi.karma.controller.command.service.PopulateCommandFactory; import edu.isi.karma.controller.command.service.PublishModelCommand; import edu.isi.karma.controller.command.service.PublishModelCommandFactory; import edu.isi.karma.controller.command.transformation.PreviewPythonTransformationResultsCommand; import edu.isi.karma.controller.command.transformation.PreviewPythonTransformationResultsCommandFactory; import edu.isi.karma.controller.command.transformation.SubmitPythonTransformationCommand; import edu.isi.karma.controller.command.transformation.SubmitPythonTransformationCommandFactory; import edu.isi.karma.controller.command.worksheet.AddColumnCommand; import edu.isi.karma.controller.command.worksheet.AddColumnCommandFactory; import edu.isi.karma.controller.command.worksheet.ApplyHistoryFromR2RMLModelCommand; import edu.isi.karma.controller.command.worksheet.ApplyHistoryFromR2RMLModelCommandFactory; import edu.isi.karma.controller.command.worksheet.ApplyWorksheetHistoryCommand; import edu.isi.karma.controller.command.worksheet.ApplyWorksheetHistoryCommandFactory; import edu.isi.karma.controller.command.worksheet.EditCellCommand; import edu.isi.karma.controller.command.worksheet.EditCellCommandFactory; import edu.isi.karma.controller.command.worksheet.FetchExistingWorksheetPropertiesCommand; import edu.isi.karma.controller.command.worksheet.FetchExistingWorksheetPropertiesCommandFactory; import edu.isi.karma.controller.command.worksheet.MultipleValueEditColumnCommand; import edu.isi.karma.controller.command.worksheet.MultipleValueEditColumnCommandFactory; import edu.isi.karma.controller.command.worksheet.RenameColumnCommand; import edu.isi.karma.controller.command.worksheet.RenameColumnCommandFactory; import edu.isi.karma.controller.command.worksheet.SetWorksheetPropertiesCommand; import edu.isi.karma.controller.command.worksheet.SetWorksheetPropertiesCommandFactory; import edu.isi.karma.controller.command.worksheet.SplitByCommaCommand; import edu.isi.karma.controller.command.worksheet.SplitByCommaCommandFactory; import edu.isi.karma.controller.command.worksheet.TablePagerCommand; import edu.isi.karma.controller.command.worksheet.TablePagerCommandFactory; import edu.isi.karma.controller.command.worksheet.TablePagerResizeCommand; import edu.isi.karma.controller.command.worksheet.TablePagerResizeCommandFactory; import edu.isi.karma.controller.update.UpdateContainer; import edu.isi.karma.view.VWorkspace; /** * There is one ExecutionManager per user. In the HttpServlet implementation we * need a map from users to ExecutionManager, using the VWorkspace ID to * dispatch to the right one. * * @author szekely * */ public class ExecutionController { private static Logger logger = LoggerFactory .getLogger(ExecutionController.class); private final HashMap<String, CommandFactory> commandFactoryMap = new HashMap<String, CommandFactory>(); private final VWorkspace vWorkspace; public ExecutionController(VWorkspace vWorkspace) { this.vWorkspace = vWorkspace; initializeCommandFactoryMap(); } private void initializeCommandFactoryMap() { // TODO: there must be a way to do this using Reflection with all // subclasses of CommandFactory. commandFactoryMap.put(EditCellCommand.class.getSimpleName(), new EditCellCommandFactory()); commandFactoryMap.put(UndoRedoCommand.class.getSimpleName(), new UndoRedoCommandFactory()); commandFactoryMap.put(TablePagerCommand.class.getSimpleName(), new TablePagerCommandFactory()); commandFactoryMap.put(TablePagerResizeCommand.class.getSimpleName(), new TablePagerResizeCommandFactory()); commandFactoryMap.put(ImportJSONFileCommand.class.getSimpleName(), new ImportJSONFileCommandFactory()); commandFactoryMap.put(ImportCSVFileCommand.class.getSimpleName(), new ImportCSVFileCommandFactory()); commandFactoryMap.put(ImportDatabaseTableCommand.class.getSimpleName(), new ImportDatabaseTableCommandFactory()); commandFactoryMap.put(ImportXMLFileCommand.class.getSimpleName(), new ImportXMLFileCommandFactory()); commandFactoryMap.put(GetOntologyClassHierarchyCommand.class.getSimpleName(), new GetOntologyClassHierarchyCommandFactory()); commandFactoryMap.put(GetDataPropertyHierarchyCommand.class.getSimpleName(), new GetDataPropertyHierarchyCommandFactory()); commandFactoryMap.put(SetSemanticTypeCommand.class.getSimpleName(), new SetSemanticTypeCommandFactory()); commandFactoryMap.put(ImportOntologyCommand.class.getSimpleName(), new ImportOntologyCommandFactory()); commandFactoryMap.put(GetDomainsForDataPropertyCommand.class.getSimpleName(), new GetDomainsForDataPropertyCommandFactory()); commandFactoryMap.put(GetDataPropertiesForClassCommand.class.getSimpleName(), new GetDataPropertiesForClassCommandFactory()); commandFactoryMap.put(GetAlternativeLinksCommand.class.getSimpleName(), new GetAlternativeLinksCommandFactory()); commandFactoryMap.put(AddUserLinkToAlignmentCommand.class.getSimpleName(), new AddUserLinkToAlignmentCommandFactory()); commandFactoryMap.put(UnassignSemanticTypeCommand.class.getSimpleName(), new UnassignSemanticTypeCommandFactory()); commandFactoryMap.put(ShowModelCommand.class.getSimpleName(), new ShowModelCommandFactory()); commandFactoryMap.put(ShowAutoModelCommand.class.getSimpleName(), new ShowAutoModelCommandFactory()); commandFactoryMap.put(SplitByCommaCommand.class.getSimpleName(), new SplitByCommaCommandFactory()); commandFactoryMap.put(CloseWorkspaceCommand.class.getSimpleName(), new CloseWorkspaceCommandFactory()); commandFactoryMap.put(PublishKMLLayerCommand.class.getSimpleName(), new PublishKMLLayerCommandFactory()); commandFactoryMap.put(ImportExcelFileCommand.class.getSimpleName(), new ImportExcelFileCommandFactory()); commandFactoryMap.put(ImportServiceCommand.class.getSimpleName(), new ImportServiceCommandFactory()); commandFactoryMap.put(PublishRDFCommand.class.getSimpleName(), new PublishRDFCommandFactory()); commandFactoryMap.put(PublishDatabaseCommand.class.getSimpleName(), new PublishDatabaseCommandFactory()); commandFactoryMap.put(AddColumnCommand.class.getSimpleName(), new AddColumnCommandFactory()); commandFactoryMap.put(PublishRDFCellCommand.class.getSimpleName(), new PublishRDFCellCommandFactory()); commandFactoryMap.put(FetchPreferencesCommand.class.getSimpleName(), new FetchPreferencesCommandFactory()); commandFactoryMap.put(GenerateCleaningRulesCommand.class.getSimpleName(), new GenerateCleaningRulesCommandFactory()); commandFactoryMap.put(InvokeServiceCommand.class.getSimpleName(), new InvokeServiceCommandFactory()); commandFactoryMap.put(GetPropertiesAndClassesList.class.getSimpleName(), new GetPropertiesAndClassesListCommandFactory()); commandFactoryMap.put(PublishModelCommand.class.getSimpleName(), new PublishModelCommandFactory()); commandFactoryMap.put(PopulateCommand.class.getSimpleName(), new PopulateCommandFactory()); commandFactoryMap.put(PublishWorksheetHistoryCommand.class.getSimpleName(), new PublishWorksheetHistoryCommandFactory()); commandFactoryMap.put(ApplyWorksheetHistoryCommand.class.getSimpleName(), new ApplyWorksheetHistoryCommandFactory()); commandFactoryMap.put(PublishCSVCommand.class.getSimpleName(), new PublishCSVCommandFactory()); commandFactoryMap.put(SetMetaPropertyCommand.class.getSimpleName(), new SetMetaPropertyCommandFactory()); commandFactoryMap.put(ResetKarmaCommand.class.getSimpleName(), new ResetKarmaCommandFactory()); commandFactoryMap.put(FetchTransformingDataCommand.class.getSimpleName(), new FetchTransformingDataFactory()); commandFactoryMap.put(ImportUnionResultCommand.class.getSimpleName(), new ImportUnionResultCommandFactory()); commandFactoryMap.put(MultipleValueEditColumnCommand.class.getSimpleName(), new MultipleValueEditColumnCommandFactory()); commandFactoryMap.put(SubmitCleaningCommand.class.getSimpleName(), new SubmitCleaningCommandFactory()); commandFactoryMap.put(RenameColumnCommand.class.getSimpleName(), new RenameColumnCommandFactory()); commandFactoryMap.put(PublishMDBCommand.class.getSimpleName(), new PublishMDBCommandFactory()); commandFactoryMap.put(PublishSpatialDataCommand.class.getSimpleName(), new PublishSpatialDataCommandFactory()); commandFactoryMap.put(PreviewPythonTransformationResultsCommand.class.getSimpleName(), new PreviewPythonTransformationResultsCommandFactory()); commandFactoryMap.put(SubmitPythonTransformationCommand.class.getSimpleName(), new SubmitPythonTransformationCommandFactory()); commandFactoryMap.put(GenerateR2RMLModelCommand.class.getSimpleName(), new GenerateR2RMLModelCommandFactory()); commandFactoryMap.put(ApplyHistoryFromR2RMLModelCommand.class.getSimpleName(), new ApplyHistoryFromR2RMLModelCommandFactory()); commandFactoryMap.put(GetCurrentLinksOfInternalNodeCommand.class.getSimpleName(), new GetCurrentLinksOfInternalNodeCommandFactory()); commandFactoryMap.put(GetInternalNodesListOfAlignmentCommand.class.getSimpleName(), new GetInternalNodesListOfAlignmentCommandFactory()); commandFactoryMap.put(GetLinksOfAlignmentCommand.class.getSimpleName(), new GetLinksOfAlignmentCommandFactory()); commandFactoryMap.put(ChangeInternalNodeLinksCommand.class.getSimpleName(), new ChangeInternalNodeLinksCommandFactory()); commandFactoryMap.put(InvokeCleaningServiceCommand.class.getSimpleName(), new InvokeCleaningServiceCommandFactory()); commandFactoryMap.put(SetWorksheetPropertiesCommand.class.getSimpleName(), new SetWorksheetPropertiesCommandFactory()); commandFactoryMap.put(FetchExistingWorksheetPropertiesCommand.class.getSimpleName(), new FetchExistingWorksheetPropertiesCommandFactory()); commandFactoryMap.put(FetchR2RMLModelsCommand.class.getSimpleName(), new FetchR2RMLModelsCommandFactory()); commandFactoryMap.put(FetchExistingModelsForWorksheetCommand.class.getSimpleName(), new FetchExistingModelsForWorksheetCommandFactory()); commandFactoryMap.put(ApplyModelFromTripleStoreCommand.class.getSimpleName(), new ApplyModelFromTripleStoreCommandFactory()); commandFactoryMap.put(CreateNewModelCommand.class.getSimpleName(), new CreateNewModelCommandFactory()); commandFactoryMap.put(InvokeDataMiningServiceCommand.class.getSimpleName(), new InvokeDataMiningServiceCommandFactory()); commandFactoryMap.put(InvokeRubenReconciliationService.class.getSimpleName(), new InvokeRubenReconciliationServiceFactory()); commandFactoryMap.put(FetchGraphsFromTripleStoreCommand.class.getSimpleName(), new FetchGraphsFromTripleStoreCommandFactory()); commandFactoryMap.put(GetUniqueGraphUrlCommand.class.getSimpleName(), new GetUniqueGraphUrlCommandFactory()); commandFactoryMap.put(TestSPARQLEndPointCommand.class.getSimpleName(), new TestSPARQLEndPointCommandFactory()); } public VWorkspace getvWorkspace() { return vWorkspace; } public HashMap<String, CommandFactory> getCommandFactoryMap() { return commandFactoryMap; } public Command getCommand(HttpServletRequest request) { CommandFactory cf = commandFactoryMap.get(request.getParameter("command")); if (cf != null) { if (cf instanceof JSONInputCommandFactory) { try { JSONInputCommandFactory scf = (JSONInputCommandFactory)cf; return scf.createCommand(new JSONArray(request.getParameter("newInfo")), vWorkspace); } catch (Exception e) { e.printStackTrace(); return null; } } else return cf.createCommand(request, vWorkspace); } else { logger.error("Command " + request.getParameter("command") + " not found!"); return null; } } public String invokeCommand(Command command) { synchronized (this) { try { UpdateContainer updateContainer = null; vWorkspace.getWorkspace().getCommandHistory().setCurrentCommand(command); if(command instanceof CommandWithPreview){ updateContainer = ((CommandWithPreview)command).showPreview(vWorkspace); } else { updateContainer = vWorkspace.getWorkspace().getCommandHistory().doCommand(command, vWorkspace); } String responseJson = updateContainer.generateJson(vWorkspace); //logger.info(responseJson); return responseJson; } catch (CommandException e) { logger.error( "Error occured with command " + command.toString(), e); return ""; // TODO probably need a return that indicates an // error. } } } }