[jboss-cvs] jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/wizards ...

Robert Stryker rawblem at gmail.com
Thu Jul 27 02:34:00 EDT 2006


  User: rawb    
  Date: 06/07/27 02:34:00

  Added:       as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/wizards 
                        ServerCloneWizard.java
  Log:
  Implemented xpath editor in properties view. Other changes made to fascilitate this implementation (added to DescriptorModel, etc). Also fixed bugs, re-added classpath to server configuration so user can customize.
  
  Revision  Changes    Path
  1.1      date: 2006/07/27 06:34:00;  author: rawb;  state: Exp;jbosside/as/plugins/org.jboss.ide.eclipse.as.ui/jbossui/org/jboss/ide/eclipse/as/ui/wizards/ServerCloneWizard.java
  
  Index: ServerCloneWizard.java
  ===================================================================
  package org.jboss.ide.eclipse.as.ui.wizards;
  
  import java.io.File;
  import java.util.ArrayList;
  import java.util.Arrays;
  
  import org.eclipse.jface.viewers.CheckboxTreeViewer;
  import org.eclipse.jface.viewers.ITreeContentProvider;
  import org.eclipse.jface.viewers.LabelProvider;
  import org.eclipse.jface.viewers.Viewer;
  import org.eclipse.jface.wizard.IWizardContainer;
  import org.eclipse.jface.wizard.Wizard;
  import org.eclipse.jface.wizard.WizardPage;
  import org.eclipse.swt.SWT;
  import org.eclipse.swt.events.ModifyEvent;
  import org.eclipse.swt.events.ModifyListener;
  import org.eclipse.swt.events.SelectionEvent;
  import org.eclipse.swt.events.TreeEvent;
  import org.eclipse.swt.graphics.Image;
  import org.eclipse.swt.layout.FormAttachment;
  import org.eclipse.swt.layout.FormData;
  import org.eclipse.swt.layout.FormLayout;
  import org.eclipse.swt.widgets.Composite;
  import org.eclipse.swt.widgets.Item;
  import org.eclipse.swt.widgets.Label;
  import org.eclipse.swt.widgets.Text;
  import org.eclipse.swt.widgets.Tree;
  import org.eclipse.swt.widgets.TreeItem;
  import org.eclipse.swt.widgets.Widget;
  import org.jboss.ide.eclipse.as.core.JBossServerCore;
  import org.jboss.ide.eclipse.as.core.server.JBossServer;
  import org.jboss.ide.eclipse.as.core.server.ServerAttributeHelper;
  import org.jboss.ide.eclipse.as.core.util.ASDebug;
  
  public class ServerCloneWizard extends Wizard {
  
  	private JBossServer server;
  	private ServerAttributeHelper helper;
  	private Page1 page1;
  	private ArrayList minimalList;
  	private File[] selectedFiles;
  	private String name, config;
  	
  	public ServerCloneWizard(JBossServer server) {
  		this.server = server;
  		helper = new ServerAttributeHelper(server, server.getServer().createWorkingCopy());
  		page1 = new Page1();
  		addPage(page1);
  		minimalList = new ArrayList();
  		minimalList.addAll(Arrays.asList(server.getAttributeHelper().getMinimalConfig()));
  	}
  		
      public void setContainer(IWizardContainer wizardContainer) {
      	super.setContainer(wizardContainer);
      	setWindowTitle("Clone Server" + server.getServer().getName());
      }
  
  
  	public boolean performFinish() {
  		selectedFiles = page1.viewerToFileArray();
  		return true;
  	}
  
  	public File[] getSelectedFiles() {
  		return selectedFiles;
  	}
  
  
  
  	public String getConfig() {
  		return config;
  	}
  
  	public String getName() {
  		return name;
  	}
  	
  	class Page1 extends WizardPage {
  
  		private Text serverNameText, configNameText;
  		private Tree fileTree;
  		private FileTreeCheckboxViewer fileTreeViewer;
  		private Label requiredCheckedLabel;
  		
  		protected Page1() {
  			super("Files");
  		}
  
  		public boolean isPageComplete() {
  			if( !isServerNameValid(serverNameText.getText()) && serverNameText.getText().length() != 0) {
  				setErrorMessage("Server Name \"" + serverNameText.getText() + "\" already in use.");
  				return false;
  			} 
  			if( serverNameText.getText().length() == 0 ) {
  				//setErrorMessage("Server Name may not be empty.");
  				setErrorMessage(null);
  				return false;
  			}
  			
  			if( !isConfigNameValid(configNameText.getText()) && configNameText.getText().length() != 0) {
  				setErrorMessage("Configuration \"" + configNameText.getText() + "\" already exists");
  				return false;
  			}
  			if( configNameText.getText().length() == 0 ) {
  				//setErrorMessage("Configuration name may not be empty.");
  				setErrorMessage(null);
  				return false;
  			}
  			
  			setErrorMessage(null);
  			return true;
  		}
  		
  		public void createControl(Composite parent) {
  			Composite c = new Composite(parent, SWT.NONE);
  			c.setLayout(new FormLayout());
  			
  			addNameFields(c);
  			addCheckBoxViewer(c);
  			addBottomLabels(c);
  			
  			setTitle("Create a new Server Configuration");
  			setDescription("Create a new server configuration directory containing the selected files. \nA new server object will be added to the list of JBoss Servers.");
  			setControl(c);
  		}
  		
  		private void addNameFields(Composite c) {
  			
  			// create the widgets
  			Label serverNameLabel, configNameLabel;
  			serverNameLabel = new Label(c, SWT.NONE);
  			configNameLabel = new Label(c, SWT.NONE);
  			serverNameText = new Text(c, SWT.BORDER);
  			configNameText = new Text(c, SWT.BORDER);
  			
  			// set the texts
  			serverNameLabel.setText("New Server Name: ");
  			configNameLabel.setText("New Configuration Name: ");
  			
  			
  			// lay them OUT
  			FormData serverNameLabelData = new FormData();
  			FormData serverNameTextData = new FormData();
  			FormData configNameLabelData = new FormData();
  			FormData configNameTextData = new FormData();
  			
  			serverNameLabelData.left = new FormAttachment(0,5);
  			serverNameLabelData.top = new FormAttachment(0,6);
  			configNameLabelData.left = new FormAttachment(0,5);
  			configNameLabelData.top = new FormAttachment(serverNameText, 6);
  			serverNameTextData.top = new FormAttachment(0,4);
  			serverNameTextData.left = new FormAttachment(40, 5);
  			serverNameTextData.right = new FormAttachment(100, -5);
  			configNameTextData.left = new FormAttachment(40, 5);
  			configNameTextData.top = new FormAttachment(serverNameText, 5);
  			configNameTextData.right = new FormAttachment(100, -5);
  			
  			
  			serverNameLabel.setLayoutData(serverNameLabelData);
  			serverNameText.setLayoutData(serverNameTextData);
  			configNameLabel.setLayoutData(configNameLabelData);
  			configNameText.setLayoutData(configNameTextData);
  			
  			// Add some text listeners
  			serverNameText.addModifyListener(new ModifyListener() {
  				public void modifyText(ModifyEvent e) {
  					name = serverNameText.getText();
  					getContainer().updateButtons();
  				} 
  			} );
  			
  			configNameText.addModifyListener(new ModifyListener() {
  				public void modifyText(ModifyEvent e) {
  					config = configNameText.getText();
  					getContainer().updateButtons();
  				} 
  			});
  		}
  		
  		protected boolean isServerNameValid(String name) {
  			if( name == null || name.equals("")) return false;
  			JBossServer[] servers = JBossServerCore.getAllJBossServers();
  			for( int i = 0; i < servers.length; i++ ) {
  				if( servers[i].getServer().getName().equals(name)) {
  					return false;
  				}
  			}
  			return true;
  		}
  		protected boolean isConfigNameValid(String name) {
  			if( name == null || name.equals("")) return false;
  			String homeDir = server.getAttributeHelper().getServerHome();
  			String[] configNames = getConfigNames(homeDir);
  			for( int i = 0; i < configNames.length; i++ ) {
  				if( configNames[i].equals(name)) {
  					return false;
  				}
  			}
  			return true;
  		}
  		
  		
  		protected void addCheckBoxViewer(Composite c) {
  			fileTree = new Tree(c, SWT.CHECK | SWT.BORDER);
  			fileTreeViewer = new FileTreeCheckboxViewer(fileTree);
  			fileTreeViewer.setContentProvider(new ITreeContentProvider() {
  
  				public Object[] getChildren(Object parentElement) {
  					if( parentElement instanceof File ) {
  						return ((File)parentElement).listFiles();
  					}
  					return new Object[0];
  				}
  
  				public Object getParent(Object element) {
  					return null;
  				}
  
  				public boolean hasChildren(Object element) {
  					Object[] children = getChildren(element);
  					if( children == null || children.length == 0 ) return false;
  					return true;
  				}
  
  				public Object[] getElements(Object inputElement) {
  					String configHome = helper.getConfigurationPath();
  					File configDir = new File(configHome);
  					return configDir.listFiles();
  				}
  
  				public void dispose() {
  				}
  
  				public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
  				} 
  				
  			});
  			fileTreeViewer.setLabelProvider(new LabelProvider() {
  					public String getText(Object o) {
  						if( o instanceof File ) {
  							return ((File)o).getName();
  						}
  						return "";
  					}
  					public Image getImage(Object o) {
  						return null;
  					}
  			});
  			
  			
  			FormData treeData = new FormData();
  			treeData.left = new FormAttachment(0,5);
  			treeData.top = new FormAttachment(configNameText, 10);
  			treeData.right = new FormAttachment(100, -5);
  			treeData.bottom = new FormAttachment(100, -20);
  			fileTree.setLayoutData(treeData);
  			fileTreeViewer.setInput(server);
  			fileTreeViewer.setAllChecked(true);
  		}
  		
  		protected void addBottomLabels(Composite c) {
  			requiredCheckedLabel = new Label(c, SWT.NONE);
  			requiredCheckedLabel.setText("Files required for a successful minimal configuration cannot be unchecked.");
  			FormData data = new FormData();
  			data.left = new FormAttachment(0,5);
  			data.top = new FormAttachment(fileTreeViewer.getTree(), 5);
  			requiredCheckedLabel.setLayoutData(data);
  		}
  		
  		
  		public String[] getConfigNames(String serverHome) {
  			ArrayList configList = new ArrayList();
  			File serverDirectory = new File(serverHome + File.separator + "server");
  			
  			if (serverDirectory.exists()) {
  				File types[] = serverDirectory.listFiles();
  				for (int i = 0; i < types.length; i++) {
  					File serviceDescriptor = new File(
  						types[i].getAbsolutePath() + File.separator +
  						"conf" + File.separator + "jboss-service.xml");
  					
  					if (types[i].isDirectory() && serviceDescriptor.exists()) {
  						configList.add(types[i].getName());
  					}
  				}
  			}
  
  			String[] asStrings = new String[configList.size()];
  			configList.toArray(asStrings);
  			return asStrings;
  		}
  		
  
  		public File[] viewerToFileArray() {
  			return fileTreeViewer.toFileArray();
  		}
  		
  	}
  
  
  	
  	protected class FileTreeCheckboxViewer extends CheckboxTreeViewer {
  	    public FileTreeCheckboxViewer(Tree tree) {
  			super(tree);
  		}
  
  		protected void createTreeItem(Widget parent, Object element, int index) {
  	    	// super 
  	        Item item = newItem(parent, SWT.NULL, index);
  	        updateItem(item, element);
  	        updatePlus(item, element);
  
  	        if( parent instanceof TreeItem ) {
  	        	boolean checked = getChecked(((TreeItem)parent).getData());
  	        	boolean grayed = getGrayed(((TreeItem)parent).getData());
  	        	((TreeItem)item).setChecked(checked);
  	        	((TreeItem)item).setGrayed(!checked || grayed);
  	        }
  	    }
  	    
  	    protected void handleTreeExpand(TreeEvent event) {
  	    	super.handleTreeExpand(event);
  	    	if( event.item instanceof TreeItem ) {
  	    		Object expanded = ((TreeItem)event.item).getData();
  	    		if( getGrayed(expanded) || !getChecked(expanded)) {
  	    			TreeItem[] items = ((TreeItem)event.item).getItems();
  	    			for( int i = 0; i < items.length; i++ ) {
  	    				setGrayRecurse(items[i], true);
  	    			}
  	    		}
  	    	}
  	    }
  	    
  	    protected void handleSelect(SelectionEvent event) { 
  	    	//super.handleSelect(event);
  	    	TreeItem item = ((TreeItem)event.item);
  
  	    	if( !childrenAreLoaded(item)) {
  	    		if( isRequired(item)) {
  	    			item.setChecked(true);
  	    		}
  	    		return;
  	    	}
  	    	
  	    	// three states:  checked -> required,   checked -> full, unchecked -> whatever (gray)
  	    	
  	    	// get current state
  	    	boolean beforeChecked = !item.getChecked(); // status before it was clicked
  	    	boolean found = false;
  	    	TreeItem[] kids = item.getItems();
  	    	for( int i = 0; i < kids.length; i++ ) {
  	    		if( kids[i].getChecked() && !isRequired(kids[i])) 
  	    			found = true;
  	    	}
  	    	
  	    	
  	    	
  	    	if( beforeChecked && found ) {
  	    		// it was checked and minimal++ was found. Set to minimal
  	    		item.setChecked(true);
  	    		setRequiredCheckedRecurse(item);
  	    	} else if( beforeChecked && !found ) {
  	    		// it was checked, and minimal was found. Set to unchecked ONLY IF NOT REQUIRED
  	    		if( isRequired(item)) {
  	    			item.setChecked(true);
  		    		setCheckedRecurse(item, true);
  		    		setGrayRecurse(item, false);
  	    		} else {
  		    		item.setChecked(false);
  		    		setGrayRecurse(item, true);
  	    		}
  	    	} else {
  	    		// it was not checked.
  	    		item.setChecked(true);
  	    		setCheckedRecurse(item, true);
  	    		setGrayRecurse(item, false);
  	    	}
  
  	    	getContainer().updateButtons();
  
  	    }
  	    
  	    private boolean isRequired(TreeItem item) {
  	    	if( item.getData() == null ) { 
  	    		ASDebug.p("Null", this); 
  	    		return false; 
  	    	}
  	    	return isRequired((File)item.getData());
  	    }
  	    
  	    private boolean isRequired(File file) {
  	    	String path = file.getAbsolutePath();
  	    	String configPath = server.getAttributeHelper().getConfigurationPath();
      		String remainder = path.substring(configPath.length()+1);
      		if(minimalList.contains(remainder)) {
      			return true;
      		}
      		return false;
  	    }
  	    private void setGrayRecurse(TreeItem item, boolean grayed) {
  	    	TreeItem[] items = item.getItems();
  	    	for( int i = 0; i < items.length; i++ ) {
  	    		items[i].setGrayed(grayed);
      			setGrayRecurse(items[i], grayed);
  	    	}
  	    }
  	    private void setCheckedRecurse(TreeItem item, boolean checked) {
  	    	TreeItem[] items = item.getItems();
  	    	for( int i = 0; i < items.length; i++ ) {
  	    		items[i].setChecked(checked);
      			setCheckedRecurse(items[i], checked);
  	    	}
  	    }
  	    private void setRequiredCheckedRecurse(TreeItem item) {
  	    	TreeItem[] items = item.getItems();
  	    	for( int i = 0; i < items.length; i++ ) {
  	    		if( isRequired(items[i])) {
  	    			items[i].setChecked(true);
  	    			setRequiredCheckedRecurse(items[i]);
  	    		} else {
  	    			items[i].setChecked(false);
  	    			setCheckedRecurse(items[i], false);
  	    		}
  	    	}
  	    }
  	    
  	    public File[] toFileArray() {
  	    	ArrayList list = new ArrayList();
  	    	Tree t = (Tree)getControl();
  	    	TreeItem[] items = t.getItems();
  	    	for( int i = 0; i < items.length; i++ ) {
  	    		if( getChecked(items[i].getData())) {
  	    			File f = (File)items[i].getData();
  	    			list.add(f);
  	    			if( childrenAreLoaded(items[i])) {
  	    				addCheckedChildrenToList(list, items[i]);
  	    			} else {
  	    				// needs fixing.
  	    				addAllChildrenToList(list, items[i].getData());
  	    			}
  	    		}
  	    	}
  	    	File ret[] = new File[list.size()];
  	    	list.toArray(ret);
  	    	return ret;
  	    }
  	    
  	    public void addCheckedChildrenToList(ArrayList list, TreeItem item) {
  	    	Item[] items = getChildren(item);
  	    	
  	    	// for this directory, are ONLY required checked?
  	    	boolean onlyRequired = true;
  	    	for( int i = 0; i < items.length; i++ ) {
  	    		if( ((TreeItem)items[i]).getChecked() && !isRequired((TreeItem)items[i])) 
  	    			onlyRequired = false;
  	    	}
  
  	    	
  	    	for( int i = 0; i < items.length; i++ ) {
  		    	if( items[i] instanceof TreeItem ) {
  		    		if( getChecked(items[i].getData())) {
  		    			File f = (File)items[i].getData();
  		    			list.add(f);
  		    			if( childrenAreLoaded((TreeItem)items[i])) {
  		    				addCheckedChildrenToList(list, (TreeItem)items[i]);
  		    			} else {
  		    				// If things other than the required are selected, load all children
  		    				if( !onlyRequired ) { 
  		    					addAllChildrenToList(list, ((TreeItem)items[i]).getData());
  		    				} else {
  		    					addAllRequiredChildrenToList(list, ((TreeItem)items[i]).getData());
  		    				}
  		    			}
  		    		} else {
  		    			//ASDebug.p("NON CHECKED ITEM *** " + items[i].getData(), this);
  		    		}
  
  		    	}
  	    	}
  	    }
  	    
  	    
  	    private void addAllRequiredChildrenToList(ArrayList list, Object item) {
  	    	if( item != null && item instanceof File && ((File)item).isDirectory()) {
  	    		File[] files = ((File)item).listFiles();
  	    		for( int i = 0; i < files.length; i++ ) {
  	    			if( isRequired(files[i])) {
  	    				list.add(files[i]);
  	    				addAllRequiredChildrenToList(list, files[i]);
  	    			}
  	    		}
  	    	}
  	    }
  	    
  	    private void addAllChildrenToList(ArrayList list, Object item) {
  	    	if( item != null && item instanceof File && ((File)item).isDirectory()) {
  	    		File[] files = ((File)item).listFiles();
  	    		for( int i = 0; i < files.length; i++ ) {
  	    			list.add(files[i]);
  	    			addAllChildrenToList(list, files[i]);
  	    		}
  	    	}
  	    }
  	    
  	    
  	    private boolean childrenAreLoaded(TreeItem item) {
  	        final Item[] tis = getChildren(item);
  	        if (tis != null && tis.length > 0) {
  	            Object data = tis[0].getData();
  	            if (data != null) {
  					return true; // children already there!
  				}
  	        }
  	        return false;
  	    }
  	}
  
  
  	
  }
  
  
  



More information about the jboss-cvs-commits mailing list