/**
* Դ�������ƣ�MergeProjectAction.java
* �������Ȩ���������ӹɷ�����˾ ��Ȩ����
* ϵͳ���ƣ�JRES Studio
* ģ�����ƣ�com.hundsun.ares.studio.jres.database.ui
* ����˵����$desc
* ����ĵ���
* ���ߣ�
*/
package com.hundsun.ares.studio.jres.database.ui.actions;
import java.net.URI;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.layout.GridDataFactory;
import org.eclipse.jface.layout.GridLayoutFactory;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.DirectoryDialog;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.IObjectActionDelegate;
import org.eclipse.ui.IWorkbenchPart;
import org.eclipse.ui.IWorkbenchWindow;
import org.eclipse.ui.IWorkbenchWindowActionDelegate;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.dialogs.ListSelectionDialog;
import com.hundsun.ares.studio.core.ARESCore;
import com.hundsun.ares.studio.core.ARESModelException;
import com.hundsun.ares.studio.core.IARESModule;
import com.hundsun.ares.studio.core.IARESProject;
import com.hundsun.ares.studio.core.IARESResource;
import com.hundsun.ares.studio.internal.core.ARESProject;
import com.hundsun.ares.studio.jres.database.pdm.PDMSubSystemMerge;
import com.hundsun.ares.studio.jres.database.ui.model.MergePojo;
import com.hundsun.ares.studio.jres.database.utils.FileUtils;
import com.hundsun.ares.studio.jres.metadata.constant.IMetadataResType;
import com.hundsun.ares.studio.jres.model.metadata.BusinessDataType;
import com.hundsun.ares.studio.jres.model.metadata.BusinessDataTypeList;
import com.hundsun.ares.studio.jres.model.metadata.StandardField;
import com.hundsun.ares.studio.jres.model.metadata.StandardFieldList;
import com.hundsun.ares.studio.ui.ARESElementLabelProvider;
import com.hundsun.ares.studio.ui.ARESElementSorter;
/**
* @author yanwj06282
*
*/
public class MergeProjectAction implements IObjectActionDelegate,
IWorkbenchWindowActionDelegate{
String newProName;
String targetDir;
IProject[] projects;
public static final String FILE_NAME = "\\���ֶκϲ������¼.xls";
@Override
public void run(IAction action) {
final ListSelectionDialog dialog = new ListSelectionDialog(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), projects, new ArrayContentProvider(), new ARESElementLabelProvider(), "ѡ����Ҫ�ϲ�����Ŀ") {
protected Control createDialogArea(Composite parent) {
final Control ctrl = super.createDialogArea(parent);
final Composite com = new Composite((Composite) ctrl, SWT.NONE);
GridLayoutFactory.fillDefaults().numColumns(4).applyTo(com);
Label proLabel = new Label(com, SWT.NONE);
proLabel.setText("Ŀ�깤����:");
final Combo combo = new Combo(com, SWT.READ_ONLY);
final List<String> pros = new ArrayList<String>();
IProject[] enablepros = getEnableProjects();
projects = getEnableProjects();
for(IProject pro : enablepros){
pros.add(pro.getName());
}
combo.setItems(pros.toArray(new String[0]));
if (pros.size() > 0) {
newProName = pros.get(0);
combo.setText(pros.get(0));
getViewer().setInput(getProject());
}
combo.addSelectionListener(new SelectionListener() {
@Override
public void widgetSelected(SelectionEvent e) {
newProName = combo.getText();
getViewer().setInput(getProject());
}
@Override
public void widgetDefaultSelected(SelectionEvent e) {
newProName = combo.getText();
}
});
Label targetLabel = new Label(com, SWT.NONE);
targetLabel.setText("���ֶκϲ������¼���Ŀ¼:");
final Text targetText = new Text(com, SWT.BORDER);
if (enablepros.length > 0) {
targetDir = enablepros[0].getLocation().toOSString() + FILE_NAME;
targetText.setText(targetDir);
}
Button targetButton = new Button(com,SWT.NORMAL);
targetButton.setText("ѡ��");
targetButton.addSelectionListener(new SelectionAdapter(){
@Override
public void widgetSelected(SelectionEvent e) {
DirectoryDialog dialog = new DirectoryDialog(com.getShell());
String select = dialog.open();
if (StringUtils.isNotBlank(select)) {
targetDir = select + FILE_NAME;
targetText.setText(targetDir);
}
}
});
targetText.addModifyListener(new ModifyListener() {
@Override
public void modifyText(ModifyEvent e) {
targetDir = targetText.getText();
}
});
GridDataFactory.fillDefaults().applyTo(com);
GridDataFactory.swtDefaults().applyTo(proLabel);
GridDataFactory.swtDefaults().span(4, 1).applyTo(targetLabel);
GridDataFactory.fillDefaults().span(3, 1).applyTo(combo);;
GridDataFactory.fillDefaults().span(3, 1).grab(true, false).applyTo(targetText);
GridDataFactory.swtDefaults().applyTo(targetButton);
Dialog.applyDialogFont((Composite) ctrl);
getViewer().setSorter(new ARESElementSorter());
return (Composite) ctrl;
}
};
dialog.setTitle("�ϲ���ϵͳ");
if (dialog.open() == Dialog.OK) {
Job job = new Job("�ϲ���ϵͳ") {
@Override
protected IStatus run(IProgressMonitor monitor) {
monitor.beginTask("��ʼ������", dialog.getResult().length + 1);
Map<String ,MergePojo> pojoMap = new HashMap<String, MergePojo>();
IProject project = merge(dialog.getResult() , newProName ,pojoMap ,monitor);
IARESProject aresproject = ARESCore.create(project);
PDMSubSystemMerge subSystemMerge = new PDMSubSystemMerge();
StringBuffer errorMsg = new StringBuffer();
try {
subSystemMerge.subSystemMerge(pojoMap, aresproject,targetDir, monitor, errorMsg);
} catch (Exception e) {
e.printStackTrace();
}
monitor.done();
return Status.OK_STATUS;
}
};
job.setUser(true);
job.schedule();
}
}
private IProject[] getProject(){
List<IProject> ps = new ArrayList<IProject>();
for(IProject p : getEnableProjects()){
if (!StringUtils.equals(p.getName(), getNewProName())) {
ps.add(p);
}
}
return ps.toArray(new IProject[0]);
}
/**
* ��ȡ�ϲ������ܹ�����
*
* @return the newProName
*/
public String getNewProName() {
return newProName;
}
/**
* ��ȡ�����ļ�����·��
*
* @return the targetDir
*/
public String getTargetDir() {
return targetDir;
}
/**
* �ϲ�����
*
* @param objs
* @param newProName
* @param stdFieldMap
* @param busTypeMap
*/
private IProject merge(final Object[] objs ,final String newProName ,Map<String ,MergePojo> pojoMap ,IProgressMonitor monitor){
IProject newPro = null;
//����һ���¹���
{
newPro = ResourcesPlugin.getWorkspace().getRoot().getProject(newProName);
}
List<StandardField> stds = new ArrayList<StandardField>();
List<BusinessDataType> bts = new ArrayList<BusinessDataType>();
for(Object obj : objs){
if (obj instanceof IProject) {
monitor.subTask("�ϲ��ӹ��̣�" +((IProject) obj).getName());
//�������ݿ�ı��ֶ�
MergePojo pojo = new MergePojo();
IARESProject project = ARESCore.create((IProject)obj);
pojo.setProject(project);
pojoMap.put(((IProject) obj).getName(), pojo);
try {
IARESResource stdRes = project.findResource(IMetadataResType.StdField, IMetadataResType.StdField);
IARESResource busTypeRes = project.findResource(IMetadataResType.BizType, IMetadataResType.BizType);
//���ֶ�
if (stdRes != null) {
monitor.subTask("������ֶΡ�����");
StandardFieldList stdList = stdRes.getInfo(StandardFieldList.class);
if (stdList != null) {
pojo.getStdFields().addAll(stdList.getItems());
stds.addAll(stdList.getItems());
}
}
//ҵ����������
if (busTypeRes != null) {
monitor.subTask("����ҵ���������͡�����");
BusinessDataTypeList busTypeList = busTypeRes.getInfo(BusinessDataTypeList.class);
if (busTypeList != null) {
pojo.getBusTypes().addAll(busTypeList.getItems());
bts.addAll(busTypeList.getItems());
}
}
//��ϵͳ
monitor.subTask("������ϵͳ������");
for(IARESModule subsys : project.getModuleRoot("database").getModules()){
String moduleName = subsys.getElementName();
if (StringUtils.isNotBlank(moduleName) && StringUtils.indexOf(moduleName, ".") == -1) {
pojo.getSubSyses().add(subsys.getElementName());
}
}
//����������Դ��������
monitor.subTask("�ϲ����ݿ������");
String oldPath = ((IProject) obj).getFolder("database").getLocationURI().getPath();
String newPath = newPro.getFolder("database").getLocationURI().getPath();
if (!StringUtils.equals(oldPath, newPath)) {
FileUtils.copyFolder(oldPath, newPath);
}
} catch (ARESModelException e) {
e.printStackTrace();
}
monitor.worked(1);
}
}
//��������ֶ�ˢ��
try {
monitor.subTask("ˢ�¡�����");
newPro.refreshLocal(IResource.DEPTH_INFINITE, new NullProgressMonitor());
monitor.worked(1);
} catch (CoreException e1) {
e1.printStackTrace();
}
return newPro;
}
private IProject[] getEnableProjects(){
List<IProject> pros = new ArrayList<IProject>();
IProject[] iprojects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
for(IProject p : iprojects){
if ( p.isOpen() && ARESProject.hasARESNature(p)) {
pros.add(p);
}
}
return pros.toArray(new IProject[0]);
}
public static void createAndOpenProject(IProject project, boolean useDefaultLocation, URI locationURI, IProgressMonitor monitor) {
try {
monitor.beginTask("��������", 10);
if (useDefaultLocation) {
// ����ֱ���ڹ��������ڴ���
project.create(new SubProgressMonitor(monitor, 6));
} else {
IProjectDescription desc = project.getWorkspace().newProjectDescription(project.getName());
desc.setLocationURI(locationURI);
project.create(desc, new SubProgressMonitor(monitor, 6));
}
project.open(new SubProgressMonitor(monitor, 2));
project.setDefaultCharset("UTF-8", new SubProgressMonitor(monitor, 2));
} catch (CoreException e) {
e.printStackTrace();
} finally {
monitor.done();
}
}
@Override
public void selectionChanged(IAction action, ISelection selection) {
}
@Override
public void dispose() {
}
@Override
public void init(IWorkbenchWindow window) {
}
@Override
public void setActivePart(IAction action, IWorkbenchPart targetPart) {
}
class MergeProjectProvider implements ITreeContentProvider{
@Override
public void dispose() {
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
}
@Override
public Object[] getElements(Object inputElement) {
return null;
}
@Override
public Object[] getChildren(Object parentElement) {
return null;
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
return false;
}
}
}