/******************************************************************************* * Copyright (c) 2004 Ferenc Hechler - ferenc_hechler@users.sourceforge.net * * This file is part of the Fat Jar Eclipse Plug-In * * The Fat Jar Eclipse Plug-In is free software; * you can redistribute it and/or modify it under the terms of the GNU * General Public License as published by the Free Software Foundation; * either version 2 of the License, or (at your option) any later version. * * The Fat Jar Eclipse Plug-In is distributed * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with the Fat Jar Eclipse Plug-In; * if not, write to the Free Software Foundation, Inc., * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * *******************************************************************************/ package net.sf.fjep.fatjar.wizards.export; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Properties; import java.util.Vector; import net.sf.fjep.fatjar.popup.actions.BuildFatJar; import net.sf.fjep.fatjar.popup.actions.FJTree; import net.sf.fjep.fatjar.preferences.FatJarPreferencePage; import org.eclipse.core.internal.resources.Folder; import org.eclipse.core.internal.resources.Project; 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.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IStatus; import org.eclipse.jface.dialogs.IDialogPage; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.viewers.CheckStateChangedEvent; import org.eclipse.jface.viewers.CheckboxTreeViewer; import org.eclipse.jface.viewers.ICheckStateListener; import org.eclipse.jface.viewers.ILabelProvider; import org.eclipse.jface.viewers.ISelectionChangedListener; import org.eclipse.jface.viewers.ITreeContentProvider; import org.eclipse.jface.viewers.ITreeViewerListener; import org.eclipse.jface.viewers.SelectionChangedEvent; import org.eclipse.jface.viewers.TreeExpansionEvent; import org.eclipse.jface.viewers.Viewer; import org.eclipse.jface.viewers.ViewerFilter; import org.eclipse.jface.wizard.WizardPage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Label; import org.eclipse.swt.widgets.Shell; import org.eclipse.swt.widgets.Tree; import org.eclipse.ui.dialogs.ElementTreeSelectionDialog; import org.eclipse.ui.dialogs.SaveAsDialog; import org.eclipse.ui.model.WorkbenchContentProvider; import org.eclipse.ui.model.WorkbenchLabelProvider; import org.eclipse.ui.views.navigator.ResourceComparator; import org.osgi.framework.Bundle; import thahn.java.agui.ide.eclipse.wizard.AguiPlugin; /** * The "New" wizard page allows setting the container for * the new file as well as the file name. The page * will only accept file name without the extension OR * with the extension that matches the expected one (mpe). */ public class FilesSelectPage extends WizardPage { private CheckboxTreeViewer fileTree = null; private JProjectConfiguration jproject = null; private FJTree rootTree = null; private FJExpWizard fjew = null; public FilesSelectPage(FJExpWizard fjew) { super("wizardPage"); System.out.println("ctor FilesSelectPage"); this.fjew = fjew; setTitle("Select files for Fat Jar"); setDescription("define includes / excludes"); } public class FileSelectTreeContentProvider implements ITreeContentProvider { public Object[] getChildren(Object element) { FJTree tree = (FJTree)element; return tree.getChildren(); } public Object[] getElements(Object element) { FJTree tree = (FJTree)element; return tree.getChildren(); } public boolean hasChildren(Object element) { FJTree tree = (FJTree)element; return tree.hasChildren(); } public Object getParent(Object element) { FJTree tree = (FJTree)element; return tree.getParent(); } public void dispose() {} public void inputChanged(Viewer viewer, Object old_input, Object new_input) {} } /** * @see IDialogPage#createControl(Composite) */ public void createControl(Composite parent) { try { GridData gd; Label label; Composite comp = new Composite(parent, SWT.NULL); GridLayout layout = new GridLayout(); comp.setLayout(layout); layout.numColumns = 3; layout.verticalSpacing = 9; label = new Label(comp, SWT.NULL); label.setText("NEW-File-List:"); // Tree tree = new Tree(comp, SWT.BORDER | SWT.FULL_SELECTION | SWT.MULTI | SWT.CHECK | SWT.V_SCROLL ); gd = new GridData(GridData.FILL_BOTH); gd.heightHint = tree.getItemHeight() * 10; tree.setLayoutData(gd); fileTree = new CheckboxTreeViewer(tree); FileSelectTreeContentProvider cp = new FileSelectTreeContentProvider(); fileTree.setContentProvider(cp); fileTree.addSelectionChangedListener(new ISelectionChangedListener() { public void selectionChanged(SelectionChangedEvent event) { dialogSelectionChanged(event); } }); fileTree.addCheckStateListener(new ICheckStateListener() { public void checkStateChanged(CheckStateChangedEvent event) { dialogCheckChanged(event); } }); fileTree.addTreeListener(new ITreeViewerListener() { public void treeCollapsed(TreeExpansionEvent event) {} public void treeExpanded(TreeExpansionEvent event) { dialogTreeExpanded(event); } }); // // Button addDir = new Button(comp, SWT.PUSH); addDir.setText("Add Dir..."); addDir.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleAddDirButton(); } }); Button saveAsButton = new Button(comp, SWT.PUSH); gd = new GridData(); gd.horizontalAlignment = GridData.CENTER; gd.horizontalSpan = 2; saveAsButton.setLayoutData(gd); saveAsButton.setText("Save Settings..."); saveAsButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleSaveSettings(); } }); // Button exportAntButton = new Button(comp, SWT.PUSH); gd = new GridData(); gd.horizontalAlignment = GridData.CENTER; gd.horizontalSpan = 1; exportAntButton.setLayoutData(gd); exportAntButton.setText("Export ANT..."); exportAntButton.addSelectionListener(new SelectionAdapter() { public void widgetSelected(SelectionEvent e) { handleExportANT(); } }); initialize(); fileTree.setCheckedElements(rootTree.getChildren()); dialogChanged(); setControl(comp); } catch (Exception e) { e.printStackTrace(); } } private void handleAddDirButton() { String includeDir = selectWorkspaceDir(); if (includeDir != null) { addProjectInclude(includeDir); } } private void handleSaveSettings() { SaveAsDialog dialog = new SaveAsDialog(getShell()); String name = BuildFatJar.absPropertiesFilename; if (name == null) { name = "settings.fatjar"; } int pos = name.lastIndexOf(File.separatorChar); if (pos != -1) { name = name.substring(pos+1); } IProject project = jproject.getJproject().getProject(); IFile iFile = project.getFile(name); dialog.setOriginalFile(iFile); // dialog.setOriginalName(name); dialog.setTitle("Save FatJar Settings"); //$NON-NLS-1$ if (dialog.open() == SaveAsDialog.OK) { IPath saveFile= dialog.getResult(); if (saveFile != null) { String path = saveFile.toString(); String projectName = jproject.getJproject().getElementName(); if (!path.startsWith("/" + projectName + "/")) { MessageDialog.openInformation(getShell(), "Fat Jar Save Settings", "settings must be stored in project " + projectName); } else { if (!"fatjar".equals(saveFile.getFileExtension())) saveFile = saveFile.addFileExtension("fatjar"); BuildProperties buildProps = fjew.getBuildProperties(); if (buildProps != null) { saveConfig(saveFile, buildProps.toProperties()); } } } } } private void saveConfig(IPath saveFile, Properties props) { boolean ok = true; try { String prjFilename = saveFile.toString().replace('/', File.separatorChar).replace('\\', File.separatorChar); String propertiesFile = BuildFatJar.absProjectPath(jproject.getJproject().getProject().getWorkspace().getRoot(), prjFilename); File f = new File(propertiesFile); if (f.exists() && f.canRead()) { // check for changes try { InputStream in = new FileInputStream(f); Properties oldProps = new Properties(); oldProps.load(in); in.close(); if (oldProps.equals(props)) { ok = false; } } catch (Exception ignore) {} // allow check out of properties if readonly if (ok) { String projectDir = BuildFatJar.getProjectDir(jproject.getJproject()); if (propertiesFile.startsWith(projectDir)) { String relFile = propertiesFile.substring(projectDir.length()+1); IFile editFile = jproject.getJproject().getProject().getFile(relFile); if (editFile != null) { IStatus status = AguiPlugin.askFileWriteAccess(editFile); ok = (status != null) && !status.isOK(); if (ok) { Shell shell = new Shell(); MessageDialog.openInformation(shell, "Fat Jar Plug-In Warning", "could not save current settings: " + status.toString()); } } } } } if (ok) { OutputStream out = new FileOutputStream(f); props.store(out, "Fat Jar Configuration File"); out.flush(); out.close(); jproject.setPropertiesFilename(propertiesFile); try { jproject.getJproject().getProject().refreshLocal(IResource.DEPTH_ONE, null); } catch (CoreException e) { e.printStackTrace(); } } } catch (FileNotFoundException e) { e.printStackTrace(); MessageDialog.openInformation(getShell(), "Fat Jar Save Settings", "path='" + saveFile.toString() + "': msg='"+ e.getMessage() + "'"); } catch (IOException e) { e.printStackTrace(); MessageDialog.openInformation(getShell(), "Fat Jar Save Settings", "path='" + saveFile.toString() + "': msg='"+ e.getMessage() + "'"); } } private void handleExportANT() { SaveAsDialog dialog = new SaveAsDialog(getShell()); String name = "build.xml"; IProject project = jproject.getJproject().getProject(); IFile iFile = project.getFile(name); dialog.setOriginalFile(iFile); // dialog.setOriginalName(name); dialog.setTitle("Export ANT build file"); //$NON-NLS-1$ if (dialog.open() == SaveAsDialog.OK) { IPath saveFile= dialog.getResult(); if (saveFile != null) { String path = saveFile.toString(); String projectName = jproject.getJproject().getElementName(); if (!"xml".equals(saveFile.getFileExtension())) saveFile = saveFile.addFileExtension("xml"); boolean ok = true; IFile buildFile = project.getWorkspace().getRoot().getFile(saveFile); if (buildFile != null) { IStatus status = AguiPlugin.askFileWriteAccess(buildFile); if ((status != null) && !status.isOK()) { ok = false; Shell shell = new Shell(); MessageDialog.openError(shell, "Fat Jar Plug-In Error", "Export ANT, write access denied: " + status.toString()); } } if (ok) { SourceInfo[] sourceInfo = getANTBuildInfo(); exportANTBuild(saveFile, sourceInfo); } } } } private void exportANTBuild(IPath saveFile, SourceInfo[] sourceInfo) { try { String antScript = buildANTScript(sourceInfo); String prjFilename = saveFile.toString().replace('/', File.separatorChar).replace('\\', File.separatorChar); String buildFile = BuildFatJar.absProjectPath(jproject.getJproject().getProject().getWorkspace().getRoot(), prjFilename); File f = new File(buildFile); OutputStream out = new FileOutputStream(f); out.write(antScript.getBytes()); out.flush(); out.close(); try { jproject.getJproject().getProject().refreshLocal(IResource.DEPTH_ONE, null); } catch (CoreException e) { e.printStackTrace(); } } catch (FileNotFoundException e) { e.printStackTrace(); MessageDialog.openInformation(getShell(), "Fat Jar Export ANT", "path=" + saveFile.toString() + e.getMessage()); } catch (IOException e) { e.printStackTrace(); MessageDialog.openInformation(getShell(), "Fat Jar Export ANT", "path=" + saveFile.toString() + e.getMessage()); } } /** * build ANT script from sourceInfo * @param sourceInfos * @return */ private String buildANTScript(SourceInfo[] sourceInfos) { StringBuffer script = new StringBuffer(); script.append("<?xml version=\"1.0\"?>\r\n"); String fatjarPath = "?"; String output = fjew.configPage.getJarname().replace('\\', '/'); String outputName = output.substring(output.lastIndexOf('/')+1); AguiPlugin pi = AguiPlugin.getDefault(); Bundle bundle = pi.getBundle(); if (bundle != null) { String location = bundle.getLocation(); if (location != null) fatjarPath = location.replaceFirst("update[@][/]?", "") + "fatjar.jar"; } script.append("<project name=\"FatJar "+ outputName + " (experimental)\" default=\"main\" basedir=\".\">\r\n"); script.append(" <!-- this file was created by Fat-Jar Eclipse Plug-in -->\r\n"); script.append(" <!-- the ANT-Export is in a very early stage, so this -->\r\n"); script.append(" <!-- is only experimental, ANT 1.6 or above is -->\r\n"); script.append(" <!-- required, feedback is always welcome: -->\r\n"); script.append(" <!-- http://sourceforge.net/projects/fjep -->\r\n"); script.append(" <!-- uncomment the following lines if using ANT outside Eclipse -->\r\n"); script.append(" <!--\r\n"); script.append(" <property name=\"fjepPath\" value=\"" + fatjarPath + "\"/>\r\n"); script.append(" <taskdef name=\"fatjar.build\" classname=\"net.sf.fjep.anttask.FJBuildTask\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" <typedef name=\"fatjar.manifest\" classname=\"net.sf.fjep.anttask.FJManifestType\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" <typedef name=\"fatjar.exclude\" classname=\"net.sf.fjep.anttask.FJExcludeType\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" <typedef name=\"fatjar.jarsource\" classname=\"net.sf.fjep.anttask.FJJarSourceType\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" <typedef name=\"fatjar.filesource\" classname=\"net.sf.fjep.anttask.FJFileSourceType\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" <typedef name=\"fatjar.autojar\" classname=\"net.sf.fjep.anttask.FJAutoJarType\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" <typedef name=\"fatjar.class\" classname=\"net.sf.fjep.anttask.FJClassType\" classpath=\"${fjepPath}\"/>\r\n"); script.append(" -->\r\n"); script.append(" <!-- uncomment the above lines to use ANT outside of Eclipse -->\r\n"); script.append(" <target name=\"main\">\r\n"); String attribs = ""; boolean oneJar = fjew.configPage.getOneJar(); if (oneJar) { attribs += " onejar=\"true\""; } IPreferenceStore store = AguiPlugin.getDefault().getPreferenceStore(); boolean escapeUCase = store.getBoolean(FatJarPreferencePage.P_ESCAPEUPPERCASE); if (escapeUCase) { attribs += " escapeUCase=\"true\""; } attribs += " output=\"" + outputName + "\""; script.append(" <fatjar.build" + attribs + ">\r\n"); // create manifest data String manifestFile = fjew.configPage.getManifestfile(); String manifestClasspath = fjew.configPage.getManifestclasspath(); String manifestMainclass = fjew.configPage.getManifestmainclass(); String manifestArguments = fjew.configPage.getManifestarguments(); String manifestVMArguments = fjew.configPage.getManifestvmarguments(); boolean manifestMergeall = fjew.configPage.getManifestmergeall(); boolean manifestRemovesigners = fjew.configPage.getManifestremovesigners(); boolean autojarEnable = fjew.autoJarPage.getAutojarEnable(); String autojarVisitClasses = fjew.autoJarPage.getAutojarVisitClasses(); boolean autojarSearchClassForName = fjew.autoJarPage.getAutojarClassForName(); attribs = ""; if (!manifestMergeall) { attribs += " mergemanifests=\"false\""; } if (!manifestRemovesigners) { attribs += " removesigners=\"false\""; } if ((manifestFile != null) && (!manifestFile.trim().equals("")) && (!manifestFile.trim().equals("<createnew>"))) { attribs += " manifestfile=\"" + manifestFile + "\""; } else { if ((manifestMainclass != null) && (!manifestMainclass.trim().equals(""))) { attribs += " mainclass=\"" + manifestMainclass + "\""; } if ((manifestArguments != null) && (!manifestArguments.trim().equals(""))) { attribs += " arguments=\"" + manifestArguments + "\""; } if ((manifestVMArguments != null) && (!manifestVMArguments.trim().equals(""))) { attribs += " vmarguments=\"" + manifestVMArguments + "\""; } if ((manifestClasspath != null) && (!manifestClasspath.trim().equals(""))) { attribs += " classpath=\"" + manifestClasspath + "\""; } } script.append(" <fatjar.manifest" + attribs + "/>\r\n"); if (autojarEnable) { attribs = ""; if (autojarSearchClassForName) { attribs += " searchclassforname=\"true\""; } script.append(" <fatjar.autojar" + attribs + ">\r\n"); String[] classnames = autojarVisitClasses.split("\\s+"); for (int i = 0; i < classnames.length; i++) { if (!classnames[i].trim().equals("")) { script.append(" <fatjar.class classname=\"" + classnames[i] + "\"/>\r\n"); } } script.append(" </fatjar.autojar>\r\n"); } for (int i = 0; i < sourceInfos.length; i++) { SourceInfo info = sourceInfos[i]; if (info.isJar) { script.append(" <fatjar.jarsource file=\"" + info.absPath + "\" relpath=\"" + info.relPath + "\"/>\r\n"); } else { if (info.excludes.size() == 0) { script.append(" <fatjar.filesource path=\"" + info.absPath + "\" relpath=\"" + info.relPath + "\"/>\r\n"); } else { script.append(" <fatjar.filesource path=\"" + info.absPath + "\" relpath=\"" + info.relPath + "\">\r\n"); for (int j = 0; j < info.excludes.size(); j++) { String exclude = (String) info.excludes.get(j); script.append(" <fatjar.exclude relpath=\"" + exclude + "\"/>\r\n"); } script.append(" </fatjar.filesource>\r\n"); } } } script.append(" </fatjar.build>\r\n"); script.append(" </target>\r\n"); script.append("</project>\r\n"); /* <?xml version="1.0"?> <project name="FatJar anttest.jar" default="main" basedir="."> <taskdef name="fatjar.build" classname="net.sf.fjep.anttask.FJBuildTask"/> <typedef name="fatjar.exclude" classname="net.sf.fjep.anttask.FJExcludeType"/> <typedef name="fatjar.filesource" classname="net.sf.fjep.anttask.FJFileSourceType"/> <typedef name="fatjar.jarsource" classname="net.sf.fjep.anttask.FJJarSourceType"/> <target name="main"> <fatjar.build output="anttest.jar"> <fatjar.filesource path="u:/opt/eclipse301/workspace/fjanttasks/classes" relpath=""> <fatjar.exclude relpath="net/sf/fjep/anttask/DemoTask.class"/> </fatjar.filesource> <fatjar.jarsource file="u:/opt/eclipse301/workspace/fjanttasks/anttestx.jar" relpath="fromjar"> <fatjar.exclude relpath="fromjar/net/sf/fjep/anttask/DTParam.class"/> </fatjar.jarsource> </fatjar.build> </target> </project> */ return script.toString(); } /** * @param projectDir */ private void addProjectInclude(String projectDir) { int pos = projectDir.indexOf(File.separatorChar, 1); if (pos == -1) { projectDir += File.separator + "."; pos = projectDir.indexOf(File.separatorChar, 1); } if (pos != -1) { String project = projectDir.substring(1, pos); String relPath = projectDir.substring(pos + 1); String displayName = "Include from project '" + project + "': " + relPath; String absPath = BuildFatJar.absProjectPath(ResourcesPlugin.getWorkspace().getRoot(), projectDir); if (absPath != null) { rootTree.addChild(FJTree.NT_ADD_DIR, displayName, new File(absPath), FJTree.CS_UNCHECKED); fileTree.refresh(rootTree); } } } private String selectWorkspaceDir() { String result = null; ILabelProvider lp= new WorkbenchLabelProvider(); ITreeContentProvider cp= new WorkbenchContentProvider(); ElementTreeSelectionDialog dialog= new ElementTreeSelectionDialog( getShell(), lp, cp); dialog.setValidator(null); dialog.setAllowMultiple(false); dialog.setTitle("Select base directory to add"); //$NON-NLS-1$ dialog.setMessage("msg?"); //$NON-NLS-1$ ViewerFilter filter = new ViewerFilter() { public boolean select(Viewer viewer, Object parentElement, Object element) { boolean ok = (element instanceof Folder) || (element instanceof Project); return ok; } }; dialog.addFilter(filter); dialog.setInput(ResourcesPlugin.getWorkspace().getRoot()); dialog.setComparator(new ResourceComparator(ResourceComparator.NAME)); if (dialog.open() == ElementTreeSelectionDialog.OK) { Object[] elements= dialog.getResult(); if (elements.length == 1) { result = ((IResource)elements[0]).getFullPath().toOSString(); } } return result; } private void initialize() { if (jproject == null) { setDescription("no project selected"); rootTree = new FJTree(null, FJTree.NT_ROOT, "empty", null, FJTree.CS_CHECKED); } else { setDescription("Files for project " + jproject.getName()); rootTree = BuildFJ.buildTree(jproject); } fileTree.setInput(rootTree); fileTree.setCheckedElements(rootTree.getReadChildren()); } private void dialogSelectionChanged(SelectionChangedEvent event) { dialogChanged(); } private void recursiveCheckChildren(FJTree parent, boolean checked) { FJTree[] children = parent.getReadChildren(); for (int i=0; i<children.length; i++) { FJTree child = children[i]; if ( (checked && (child.getCheckState()!=FJTree.CS_CHECKED)) || (!checked && (child.getCheckState()!=FJTree.CS_UNCHECKED)) ){ child.setChecked(checked); fileTree.setChecked(child, checked); fileTree.setGrayed(child, false); recursiveCheckChildren(child, checked); } } } private void recursiveGrayParents(FJTree child) { FJTree parent = (FJTree)child.getParent(); if (parent != null) { parent.setGrayChecked(); fileTree.setGrayChecked(parent, true); recursiveGrayParents(parent); } } private void dialogCheckChanged(CheckStateChangedEvent event) { FJTree element = (FJTree)event.getElement(); if (element != null) { boolean checked = event.getChecked(); if (!checked && (element.getCheckState() == FJTree.CS_GRAYED)) { fileTree.setGrayed(element, false); fileTree.setChecked(element, true); checked = true; } if ( ( checked && (element.getCheckState() != FJTree.CS_CHECKED)) || (!checked && (element.getCheckState() != FJTree.CS_UNCHECKED))){ element.setChecked(checked); recursiveCheckChildren(element, checked); recursiveGrayParents(element); } } dialogChanged(); } private void dialogTreeExpanded(TreeExpansionEvent event) { FJTree parent = (FJTree)event.getElement(); if (parent != null) { Object[] children = parent.getChildren(); for (int i=0; i<children.length; i++) { FJTree child = (FJTree)children[i]; int checkState = child.getCheckState(); if (checkState == FJTree.CS_CHECKED) { fileTree.setChecked(child, true); fileTree.setGrayed(child, false); } else if (checkState == FJTree.CS_UNCHECKED) fileTree.setChecked(child, false); else if (checkState == FJTree.CS_GRAYED) fileTree.setGrayChecked(child, true); } } dialogChanged(); } private void dialogChanged() { updateStatus(null); } private void updateStatus(String message) { setErrorMessage(message); setPageComplete(message == null); } public void setJProject(JProjectConfiguration jproject, BuildProperties props) { if (this.jproject != jproject) { this.jproject = jproject; initialize(); setExcludes(props.getExcludeInfo()); setIncludes(props.getIncludeInfo()); dialogChanged(); } } private void setExcludes(BuildProperties.AbstractFileInfo[] excludeInfo) { for (int i=0; i<excludeInfo.length; i++) { String[] segments = excludeInfo[i].getSegments(); FJTree element = findBaseElement(segments[0]); for (int j=1; j<segments.length; j++) { if (element == null) break; element = findChild(element, segments[j]); } if (element != null) { element.setChecked(false); fileTree.setChecked(element, false); fileTree.setGrayed(element, false); recursiveCheckChildren(element, false); recursiveGrayParents(element); } } } private void setIncludes(BuildProperties.AbstractFileInfo[] includeInfo) { for (int i=0; i<includeInfo.length; i++) { String[] segments = includeInfo[i].getSegments(); FJTree element = findBaseElement(segments[0]); if (element == null) { addIncludeDir(segments[0]); element = findBaseElement(segments[0]); } for (int j=1; j<segments.length; j++) { if (element == null) break; element = findChild(element, segments[j]); } if (element != null) { element.setChecked(true); fileTree.setChecked(element, true); fileTree.setGrayed(element, false); recursiveCheckChildren(element, true); recursiveGrayParents(element); } } } /** * @param string */ private void addIncludeDir(String incDir) { String projectDir = incDir.replaceFirst("[<]inc[|](.*)[>]", "/$1"); if (!projectDir.equals(incDir)) { addProjectInclude(projectDir.replace('/', File.separatorChar)); } } private FJTree findChild(FJTree parent, String name) { FJTree result = null; if (parent != null) { Object[] children = parent.getChildren(); for (int i=0; i< children.length; i++) { if (children[i].toString().equals(name)) { result = (FJTree) children[i]; break; } } } return result; } private FJTree findBaseElement(String name) { String displayName = name; if (name.startsWith("<po|")) displayName = name.replaceFirst("[<]po[|](.*)[>]", "Project '$1' output"); else if (name.startsWith("<cl|")) displayName = name.replaceFirst("[<]cl[|](.*)[>]", "Classes '$1'"); else if (name.startsWith("<jar|")) displayName = name.replaceFirst("[<]jar[|](.*)[>]", "$1"); else if (name.startsWith("<inc|")) displayName = name.replaceFirst("[<]inc[|]([^/]*)/(.*)[>]", "Include from project '$1': $2"); return findChild(rootTree, displayName); } public String[][] getAllUnchecked() { Vector result = new Vector(); FJTree[] children = rootTree.getReadChildren(); for (int i=0; i<children.length; i++) { if (!children[i].isType(FJTree.NT_ADD_DIR)) recursiveGetAllUnchecked(children[i], result); } return (String[][]) result.toArray(new String[result.size()][]); } private void recursiveGetAllUnchecked(FJTree node, Vector unchecked) { if (node.getCheckState() == FJTree.CS_UNCHECKED) { String[] display_abspath = {node.getDisplayPath(), node.getAbsPath()}; unchecked.add(display_abspath); } else if (node.getCheckState() != FJTree.CS_CHECKED) { FJTree[] children = node.getReadChildren(); for (int i=0; i<children.length; i++) recursiveGetAllUnchecked(children[i], unchecked); } } public String[][] getAllChecked() { Vector result = new Vector(); FJTree[] children = rootTree.getReadChildren(); for (int i=0; i<children.length; i++) { if (children[i].isType(FJTree.NT_ADD_DIR)) recursiveGetAllChecked(children[i], result, children[i].getAbsPath()); } return (String[][]) result.toArray(new String[result.size()][]); } private void recursiveGetAllChecked(FJTree node, Vector checked, String rootAbsPath) { if (node.getCheckState() == FJTree.CS_CHECKED) { String[] display_abspath; int len = rootAbsPath.length()+1; String nodeAbsPath = node.getAbsPath(); if (nodeAbsPath.equals(rootAbsPath)) { display_abspath = new String[]{node.getDisplayPath(), rootAbsPath + "|"}; } else { display_abspath = new String[]{node.getDisplayPath(), rootAbsPath + "|" + node.getAbsPath().substring(len)}; } checked.add(display_abspath); } else if (node.getCheckState() != FJTree.CS_UNCHECKED) { FJTree[] children = node.getReadChildren(); for (int i=0; i<children.length; i++) recursiveGetAllChecked(children[i], checked, rootAbsPath); } } public class SourceInfo { public boolean isJar; public String absPath; public String relPath; public ArrayList excludes; public SourceInfo(boolean isJar, String absPath, String relPath) { this.isJar = isJar; this.absPath = absPath; this.relPath = relPath; excludes = new ArrayList(); } } public SourceInfo[] getANTBuildInfo() { Vector result = new Vector(); FJTree[] children = rootTree.getReadChildren(); for (int i=0; i<children.length; i++) { FJTree fjTree = children[i]; SourceInfo sourceInfo = null; // handle additional dirs (includes) if (fjTree.isType(FJTree.NT_ADD_DIR)) { Vector checked = new Vector(); recursiveGetAllChecked(fjTree, checked, ""); for (int j = 0; j < checked.size(); j++) { String[] display_abspath = (String[])checked.get(j); String include = display_abspath[0]; include = include.replaceFirst("[<]inc[|][^>]+[>]", ""); include = include.replaceAll("[~]", ""); System.out.println("include=" + include); String absPath = fjTree.getAbsPath() + "/" + include; absPath = absPath.replace('/', File.separatorChar); sourceInfo = new SourceInfo(false, absPath, include); result.add(sourceInfo); } } // handle classes entry else if (fjTree.isType(FJTree.NT_CLASSES)) { if (fjTree.getCheckState() != FJTree.CS_UNCHECKED) { sourceInfo = new SourceInfo(false, fjTree.getAbsPath(), ""); Vector unchecked = new Vector(); recursiveGetAllUnchecked(fjTree, unchecked); for (int j = 0; j < unchecked.size(); j++) { String[] display_abspath = (String[])unchecked.get(j); String exclude = display_abspath[0]; exclude = exclude.replaceFirst("[<]cl[|][^>]+[>]", ""); exclude = exclude.replaceAll("[~]", ""); System.out.println("exclude=" + exclude); sourceInfo.excludes.add(exclude); } result.add(sourceInfo); } } // handle jar entry else if (fjTree.isType(FJTree.NT_JAR)) { if (fjTree.getCheckState() != FJTree.CS_UNCHECKED) { sourceInfo = new SourceInfo(true, fjTree.getAbsPath(), ""); result.add(sourceInfo); } } // handle project output entry else if (fjTree.isType(FJTree.NT_PROJECT_OUTPUT)) { if (fjTree.getCheckState() != FJTree.CS_UNCHECKED) { sourceInfo = new SourceInfo(false, fjTree.getAbsPath(), ""); Vector unchecked = new Vector(); recursiveGetAllUnchecked(fjTree, unchecked); for (int j = 0; j < unchecked.size(); j++) { String[] display_abspath = (String[])unchecked.get(j); String exclude = display_abspath[0]; exclude = exclude.replaceFirst("[<]po[|][^>]+[>]", ""); exclude = exclude.replaceAll("[~]", ""); System.out.println("exclude=" + exclude); sourceInfo.excludes.add(exclude); } result.add(sourceInfo); } } } return (SourceInfo[]) result.toArray(new SourceInfo[result.size()]); } /** * @param buildProperties */ public void updateBuildProperties(BuildProperties buildProps) { buildProps.setExcludeInfo(getAllUnchecked()); buildProps.setIncludeInfo(getAllChecked()); } }