package org.insightech.er.editor.view.action.dbimport;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.jface.dialogs.IDialogConstants;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.ui.IEditorPart;
import org.eclipse.ui.IFileEditorInput;
import org.eclipse.ui.PlatformUI;
import org.insightech.er.Activator;
import org.insightech.er.ImageKey;
import org.insightech.er.ResourceString;
import org.insightech.er.editor.ERDiagramEditor;
import org.insightech.er.editor.model.AbstractModel;
import org.insightech.er.editor.model.ERDiagram;
import org.insightech.er.editor.model.dbimport.DBObject;
import org.insightech.er.editor.model.dbimport.DBObjectSet;
import org.insightech.er.editor.model.diagram_contents.DiagramContents;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeElement;
import org.insightech.er.editor.model.diagram_contents.element.node.NodeSet;
import org.insightech.er.editor.model.diagram_contents.element.node.note.Note;
import org.insightech.er.editor.model.diagram_contents.element.node.table.ERTable;
import org.insightech.er.editor.model.diagram_contents.element.node.table.TableView;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.Column;
import org.insightech.er.editor.model.diagram_contents.element.node.table.column.NormalColumn;
import org.insightech.er.editor.model.diagram_contents.element.node.view.View;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.UniqueWord;
import org.insightech.er.editor.model.diagram_contents.not_element.dictionary.Word;
import org.insightech.er.editor.model.diagram_contents.not_element.group.ColumnGroup;
import org.insightech.er.editor.model.diagram_contents.not_element.group.GroupSet;
import org.insightech.er.editor.model.diagram_contents.not_element.sequence.Sequence;
import org.insightech.er.editor.model.diagram_contents.not_element.sequence.SequenceSet;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.Tablespace;
import org.insightech.er.editor.model.diagram_contents.not_element.tablespace.TablespaceSet;
import org.insightech.er.editor.model.diagram_contents.not_element.trigger.Trigger;
import org.insightech.er.editor.model.diagram_contents.not_element.trigger.TriggerSet;
import org.insightech.er.editor.model.edit.CopyManager;
import org.insightech.er.editor.persistent.Persistent;
import org.insightech.er.editor.view.dialog.dbimport.AbstractSelectImportedObjectDialog;
import org.insightech.er.editor.view.dialog.dbimport.SelectImportedObjectFromFileDialog;
public class ImportFromFileAction extends AbstractImportAction {
public static final String ID = ImportFromFileAction.class.getName();
private ERDiagram loadedDiagram;
public ImportFromFileAction(ERDiagramEditor editor) {
super(ID, ResourceString.getResourceString("action.title.import.file"),
editor);
this.setImageDescriptor(Activator.getImageDescriptor(ImageKey.TABLE));
}
protected DBObjectSet preImport() throws Exception {
String fileName = this.getLoadFilePath(this.getEditorPart());
if (fileName == null) {
return null;
}
Persistent persistent = Persistent.getInstance();
Path path = new Path(fileName);
InputStream in = null;
try {
IFile file = ResourcesPlugin.getWorkspace().getRoot()
.getFileForLocation(path);
if (file == null || !file.exists()) {
File realFile = path.toFile();
if (realFile == null || !realFile.exists()) {
Activator.showErrorDialog("error.import.file");
return null;
}
in = new FileInputStream(realFile);
} else {
if (!file.isSynchronized(IResource.DEPTH_ONE)) {
file.refreshLocal(IResource.DEPTH_ONE,
new NullProgressMonitor());
}
in = file.getContents();
}
this.loadedDiagram = persistent.load(in);
} finally {
in.close();
}
return this.getAllObjects(loadedDiagram);
}
protected AbstractSelectImportedObjectDialog createSelectImportedObjectDialog(
DBObjectSet dbObjectSet) {
ERDiagram diagram = this.getDiagram();
return new SelectImportedObjectFromFileDialog(PlatformUI.getWorkbench()
.getActiveWorkbenchWindow().getShell(), diagram, dbObjectSet);
}
protected String getLoadFilePath(IEditorPart editorPart) {
IFile file = ((IFileEditorInput) editorPart.getEditorInput()).getFile();
FileDialog fileDialog = new FileDialog(editorPart.getEditorSite()
.getShell(), SWT.OPEN);
IProject project = file.getProject();
fileDialog.setFilterPath(project.getLocation().toString());
String[] filterExtensions = this.getFilterExtensions();
fileDialog.setFilterExtensions(filterExtensions);
return fileDialog.open();
}
protected String[] getFilterExtensions() {
return new String[] { "*.erm" };
}
private DBObjectSet getAllObjects(ERDiagram loadedDiagram) {
DBObjectSet dbObjects = new DBObjectSet();
for (ERTable table : loadedDiagram.getDiagramContents().getContents()
.getTableSet()) {
DBObject dbObject = new DBObject(table.getTableViewProperties()
.getSchema(), table.getName(), DBObject.TYPE_TABLE);
dbObject.setModel(table);
dbObjects.add(dbObject);
}
for (View view : loadedDiagram.getDiagramContents().getContents()
.getViewSet()) {
DBObject dbObject = new DBObject(view.getTableViewProperties()
.getSchema(), view.getName(), DBObject.TYPE_VIEW);
dbObject.setModel(view);
dbObjects.add(dbObject);
}
// for (Note note : loadedDiagram.getDiagramContents().getContents()
// .getNoteSet()) {
// DBObject dbObject = new DBObject(null, note.getName(),
// DBObject.TYPE_NOTE);
// dbObject.setModel(note);
// dbObjects.add(dbObject);
// }
for (Sequence sequence : loadedDiagram.getDiagramContents()
.getSequenceSet()) {
DBObject dbObject = new DBObject(sequence.getSchema(), sequence
.getName(), DBObject.TYPE_SEQUENCE);
dbObject.setModel(sequence);
dbObjects.add(dbObject);
}
for (Trigger trigger : loadedDiagram.getDiagramContents()
.getTriggerSet()) {
DBObject dbObject = new DBObject(trigger.getSchema(), trigger
.getName(), DBObject.TYPE_TRIGGER);
dbObject.setModel(trigger);
dbObjects.add(dbObject);
}
for (Tablespace tablespace : loadedDiagram.getDiagramContents()
.getTablespaceSet()) {
DBObject dbObject = new DBObject(null, tablespace.getName(),
DBObject.TYPE_TABLESPACE);
dbObject.setModel(tablespace);
dbObjects.add(dbObject);
}
for (ColumnGroup columnGroup : loadedDiagram.getDiagramContents()
.getGroups()) {
DBObject dbObject = new DBObject(null, columnGroup.getName(),
DBObject.TYPE_GROUP);
dbObject.setModel(columnGroup);
dbObjects.add(dbObject);
}
return dbObjects;
}
protected void loadData(List<DBObject> selectedObjectList,
boolean useCommentAsLogicalName, boolean mergeWord,
boolean mergeGroup) {
Set<AbstractModel> selectedSets = new HashSet<AbstractModel>();
for (DBObject dbObject : selectedObjectList) {
selectedSets.add(dbObject.getModel());
}
DiagramContents contents = loadedDiagram.getDiagramContents();
GroupSet columnGroupSet = contents.getGroups();
for (Iterator<ColumnGroup> iter = columnGroupSet.iterator(); iter
.hasNext();) {
ColumnGroup columnGroup = iter.next();
if (!selectedSets.contains(columnGroup)) {
iter.remove();
}
}
this.importedColumnGroups = columnGroupSet.getGroupList();
SequenceSet sequenceSet = contents.getSequenceSet();
for (Iterator<Sequence> iter = sequenceSet.iterator(); iter.hasNext();) {
Sequence sequence = iter.next();
if (!selectedSets.contains(sequence)) {
iter.remove();
}
}
this.importedSequences = sequenceSet.getSequenceList();
TriggerSet triggerSet = contents.getTriggerSet();
for (Iterator<Trigger> iter = triggerSet.iterator(); iter.hasNext();) {
Trigger trigger = iter.next();
if (!selectedSets.contains(trigger)) {
iter.remove();
}
}
this.importedTriggers = triggerSet.getTriggerList();
TablespaceSet tablespaceSet = contents.getTablespaceSet();
for (Iterator<Tablespace> iter = tablespaceSet.iterator(); iter
.hasNext();) {
Tablespace tablespace = iter.next();
if (!selectedSets.contains(tablespace)) {
iter.remove();
}
}
this.importedTablespaces = tablespaceSet.getTablespaceList();
NodeSet nodeSet = contents.getContents();
List<NodeElement> nodeElementList = nodeSet.getNodeElementList();
for (Iterator<NodeElement> iter = nodeElementList.iterator(); iter
.hasNext();) {
NodeElement nodeElement = iter.next();
if (!selectedSets.contains(nodeElement)) {
iter.remove();
}
}
NodeSet selectedNodeSet = new NodeSet();
Map<UniqueWord, Word> dictionary = new HashMap<UniqueWord, Word>();
if (mergeWord) {
for (Word word : this.getDiagram().getDiagramContents()
.getDictionary().getWordList()) {
dictionary.put(new UniqueWord(word), word);
}
}
for (NodeElement nodeElement : nodeElementList) {
if (mergeWord) {
if (nodeElement instanceof TableView) {
TableView tableView = (TableView) nodeElement;
for (NormalColumn normalColumn : tableView
.getNormalColumns()) {
Word word = normalColumn.getWord();
if (word != null) {
UniqueWord uniqueWord = new UniqueWord(word);
Word replaceWord = dictionary.get(uniqueWord);
if (replaceWord != null) {
normalColumn.setWord(replaceWord);
}
}
}
}
}
selectedNodeSet.addNodeElement(nodeElement);
}
for (NodeElement nodeElement : selectedNodeSet) {
if (nodeElement instanceof TableView) {
TableView tableView = (TableView) nodeElement;
for (Iterator<Column> iter = tableView.getColumns().iterator(); iter
.hasNext();) {
Column column = iter.next();
if (column instanceof ColumnGroup) {
if (!this.importedColumnGroups.contains(column)) {
iter.remove();
}
}
}
}
}
if (mergeGroup) {
Map<String, ColumnGroup> groupMap = new HashMap<String, ColumnGroup>();
for (ColumnGroup columnGroup : this.getDiagram()
.getDiagramContents().getGroups()) {
groupMap.put(columnGroup.getGroupName(), columnGroup);
}
for (Iterator<ColumnGroup> iter = this.importedColumnGroups
.iterator(); iter.hasNext();) {
ColumnGroup columnGroup = iter.next();
ColumnGroup replaceColumnGroup = groupMap.get(columnGroup
.getGroupName());
if (replaceColumnGroup != null) {
iter.remove();
for (NodeElement nodeElement : selectedNodeSet) {
if (nodeElement instanceof TableView) {
TableView tableView = (TableView) nodeElement;
tableView.replaceColumnGroup(columnGroup,
replaceColumnGroup);
}
}
}
}
}
CopyManager copyManager = new CopyManager();
NodeSet copyList = copyManager.copyNodeElementList(selectedNodeSet);
this.importedNodeElements = copyList.getNodeElementList();
}
/**
* {@inheritDoc}
*/
@Override
public void execute(Event event) throws Exception {
DBObjectSet dbObjectSet = this.preImport();
if (dbObjectSet != null) {
AbstractSelectImportedObjectDialog importDialog = this
.createSelectImportedObjectDialog(dbObjectSet);
int result = importDialog.open();
if (result == IDialogConstants.OK_ID) {
this.loadData(importDialog.getSelectedDbObjects(), importDialog
.isUseCommentAsLogicalName(), importDialog
.isMergeWord(), importDialog.isMergeGroup());
this.showData();
} else if (result == IDialogConstants.BACK_ID) {
this.execute(event);
}
}
}
}