1 11 12 package org.eclipse.debug.ui.actions; 13 14 import java.io.FileInputStream ; 15 import java.io.FileNotFoundException ; 16 import java.io.InputStreamReader ; 17 import java.io.UnsupportedEncodingException ; 18 import java.lang.reflect.InvocationTargetException ; 19 import com.ibm.icu.text.MessageFormat; 20 import java.util.ArrayList ; 21 22 import org.eclipse.core.resources.IMarker; 23 import org.eclipse.core.resources.IResource; 24 import org.eclipse.core.resources.IWorkspaceRoot; 25 import org.eclipse.core.resources.IWorkspaceRunnable; 26 import org.eclipse.core.resources.ResourcesPlugin; 27 import org.eclipse.core.runtime.CoreException; 28 import org.eclipse.core.runtime.IAdaptable; 29 import org.eclipse.core.runtime.IProgressMonitor; 30 import org.eclipse.core.runtime.IStatus; 31 import org.eclipse.core.runtime.Status; 32 import org.eclipse.debug.core.DebugPlugin; 33 import org.eclipse.debug.core.model.IBreakpoint; 34 import org.eclipse.debug.internal.core.BreakpointManager; 35 import org.eclipse.debug.internal.ui.IInternalDebugUIConstants; 36 import org.eclipse.debug.internal.ui.importexport.breakpoints.IImportExportConstants; 37 import org.eclipse.debug.internal.ui.importexport.breakpoints.ImportExportMessages; 38 import org.eclipse.debug.ui.IDebugUIConstants; 39 import org.eclipse.jface.operation.IRunnableWithProgress; 40 import org.eclipse.ui.IMemento; 41 import org.eclipse.ui.IWorkingSet; 42 import org.eclipse.ui.IWorkingSetManager; 43 import org.eclipse.ui.PlatformUI; 44 import org.eclipse.ui.XMLMemento; 45 46 53 public class ImportBreakpointsOperation implements IRunnableWithProgress { 54 55 private boolean fOverwriteAll = false; 56 57 private String fFileName = null; 58 59 private boolean fCreateWorkingSets = false; 60 61 private ArrayList fAdded = new ArrayList (); 62 63 private BreakpointManager fManager = (BreakpointManager) DebugPlugin.getDefault().getBreakpointManager(); 64 65 76 public ImportBreakpointsOperation(String fileName, boolean overwrite, boolean createWorkingSets) { 77 fFileName = fileName; 78 fOverwriteAll = overwrite; 79 fCreateWorkingSets = createWorkingSets; 80 } 81 82 85 public void run(final IProgressMonitor monitor) throws InvocationTargetException { 86 IWorkspaceRunnable wr = new IWorkspaceRunnable() { 87 public void run(IProgressMonitor wmonitor) throws CoreException { 88 try { 89 XMLMemento memento = XMLMemento.createReadRoot(new InputStreamReader (new FileInputStream (fFileName), "UTF-8")); IMemento[] nodes = memento.getChildren(IImportExportConstants.IE_NODE_BREAKPOINT); 91 IWorkspaceRoot workspace = ResourcesPlugin.getWorkspace().getRoot(); 92 IMemento node = null; 93 monitor.beginTask(ImportExportMessages.ImportOperation_0, nodes.length); 94 for(int i = 0; i < nodes.length; i++) { 95 if(!monitor.isCanceled()) { 96 node = nodes[i].getChild(IImportExportConstants.IE_NODE_RESOURCE); 97 IResource resource = workspace.findMember(node.getString(IImportExportConstants.IE_NODE_PATH)); 98 if(resource != null) { 100 node = nodes[i].getChild(IImportExportConstants.IE_NODE_MARKER); 103 IMarker marker = findGeneralMarker(resource, node.getString(IMarker.LINE_NUMBER), 104 node.getString(IImportExportConstants.IE_NODE_TYPE), 105 node.getInteger(IImportExportConstants.CHARSTART)); 106 if(marker == null) { 107 marker = resource.createMarker(node.getString(IImportExportConstants.IE_NODE_TYPE)); 108 restoreBreakpoint(marker, nodes[i]); 109 } 110 else { 111 if(fOverwriteAll) { 112 marker.setAttributes(null); 113 restoreBreakpoint(marker, nodes[i]); 114 } 115 } 116 } 117 monitor.worked(i+1); 118 } else { 119 return; 120 } 121 } 122 fManager.addBreakpoints((IBreakpoint[])fAdded.toArray(new IBreakpoint[fAdded.size()])); 123 } 124 catch(FileNotFoundException e) { 125 throw new CoreException(new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, 126 MessageFormat.format(ImportExportMessages.ImportBreakpointsOperation_0, new String []{fFileName}), e)); 127 } 128 catch (UnsupportedEncodingException e) { 129 throw new CoreException(new Status(IStatus.ERROR, IDebugUIConstants.PLUGIN_ID, IDebugUIConstants.INTERNAL_ERROR, 130 MessageFormat.format(ImportExportMessages.ImportBreakpointsOperation_1, new String []{fFileName}), e)); 131 } 132 } 133 }; 134 try { 135 ResourcesPlugin.getWorkspace().run(wr, monitor); 136 } catch(CoreException e) { 137 throw new InvocationTargetException (e); 138 } 139 } 140 141 146 private void restoreBreakpoint(IMarker marker, IMemento node) throws CoreException { 147 IMemento[] childnodes = null; 148 IMemento child = null; 149 child = node.getChild(IImportExportConstants.IE_NODE_MARKER); 151 marker.setAttribute(IMarker.LINE_NUMBER, child.getInteger(IMarker.LINE_NUMBER)); 152 marker.setAttribute(IImportExportConstants.IE_NODE_TYPE, child.getString(IImportExportConstants.IE_NODE_TYPE)); 153 marker.setAttribute(IImportExportConstants.CHARSTART, child.getString(IImportExportConstants.CHARSTART)); 154 childnodes = child.getChildren(IImportExportConstants.IE_NODE_ATTRIB); 155 String workingsets = ""; for (int j = 0; j < childnodes.length; j++) { 157 String name = childnodes[j].getString(IImportExportConstants.IE_NODE_NAME), 159 value = childnodes[j].getString(IImportExportConstants.IE_NODE_VALUE); 160 if (value != null & name != null) { 161 if (name.equals(IInternalDebugUIConstants.WORKING_SET_NAME)) { 162 workingsets = value; 163 } 164 try { 165 marker.setAttribute(name, Integer.valueOf(value)); 166 } catch (NumberFormatException e) { 167 if (value.equalsIgnoreCase("false") || value.equalsIgnoreCase("true")) { marker.setAttribute(name, Boolean.valueOf(value)); 169 } 170 else { 171 marker.setAttribute(name, value); 172 } 173 } 174 } 175 } 176 IBreakpoint breakpoint = fManager.createBreakpoint(marker); 178 breakpoint.setEnabled(Boolean.valueOf(node.getString(IImportExportConstants.IE_BP_ENABLED)).booleanValue()); 179 breakpoint.setPersisted(Boolean.valueOf(node.getString(IImportExportConstants.IE_BP_PERSISTANT)).booleanValue()); 180 breakpoint.setRegistered(Boolean.valueOf(node.getString(IImportExportConstants.IE_BP_REGISTERED)).booleanValue()); 181 fAdded.add(breakpoint); 183 if (fCreateWorkingSets) { 184 String [] names = workingsets.split("\\" + IImportExportConstants.DELIMITER); for (int m = 1; m < names.length; m++) { 186 createWorkingSet(names[m], breakpoint); 187 } 188 } 189 } 190 191 195 private void createWorkingSet(String setname, IAdaptable element) { 196 IWorkingSetManager wsmanager = PlatformUI.getWorkbench().getWorkingSetManager(); 197 IWorkingSet set = wsmanager.getWorkingSet(setname); 198 if (set == null) { 199 set = wsmanager.createWorkingSet(setname, new IAdaptable[] {}); 200 set.setId(IDebugUIConstants.BREAKPOINT_WORKINGSET_ID); 201 wsmanager.addWorkingSet(set); 202 } 203 if (!setContainsBreakpoint(set, (IBreakpoint) element)) { 204 IAdaptable[] elements = set.getElements(); 205 IAdaptable[] newElements = new IAdaptable[elements.length + 1]; 206 newElements[newElements.length - 1] = element; 207 System.arraycopy(elements, 0, newElements, 0, elements.length); 208 set.setElements(newElements); 209 } 210 } 211 212 218 private boolean setContainsBreakpoint(IWorkingSet set, IBreakpoint breakpoint) { 219 IAdaptable[] elements = set.getElements(); 220 for (int i = 0; i < elements.length; i++) { 221 if (elements[i].equals(breakpoint)) { 222 return true; 223 } 224 } 225 return false; 226 } 227 228 238 private IMarker findGeneralMarker(IResource resource, String line, String type, Integer charstart) throws CoreException { 239 IMarker[] markers = resource.findMarkers(null, false, IResource.DEPTH_ZERO); 240 if (type != null) { 241 for (int i = 0; i < markers.length; i++) { 242 Object localline = markers[i].getAttribute(IMarker.LINE_NUMBER); 243 String localtype = markers[i].getType(); 244 if (type.equals(localtype)) { 245 if (localline != null & line != null) { 246 if (line.equals(localline.toString())) { 247 Integer markerCharstart = (Integer ) markers[i].getAttribute(IImportExportConstants.CHARSTART); 248 if (charstart == null) { 249 if (markerCharstart == null) { 250 return markers[i]; 251 } 252 } else if (charstart.equals(markerCharstart)) { 253 return markers[i]; 254 } 255 } 256 } else { 257 return markers[i]; 258 } 259 } 260 } 261 } 262 return null; 263 } 264 } 265 | Popular Tags |