Java tutorial
/******************************************************************************* * Copyright (c) 2015 UNIT Information Technologies R&D Ltd All rights reserved. This program and * the accompanying materials are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: Ferhat Erata - initial API and implementation H. Emre Kirmizi - initial API and * implementation Serhat Celik - initial API and implementation U. Anil Ozturk - initial API and * implementation *******************************************************************************/ package eu.modelwriter.marker.internal; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Scanner; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; 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.emf.common.util.EList; import org.eclipse.emf.common.util.URI; import org.eclipse.emf.ecore.EClass; import org.eclipse.emf.ecore.EModelElement; import org.eclipse.emf.ecore.ENamedElement; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.eclipse.emf.ecore.EStructuralFeature; import org.eclipse.emf.ecore.presentation.EcoreEditor; import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl; import org.eclipse.emf.ecore.util.EcoreUtil; import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl; import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IInitializer; import org.eclipse.jdt.core.IMethod; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextSelection; import org.eclipse.jface.text.TextSelection; import org.eclipse.jface.viewers.IElementComparer; import org.eclipse.jface.viewers.ISelection; import org.eclipse.jface.viewers.ITreeSelection; import org.eclipse.jface.viewers.TreePath; import org.eclipse.jface.viewers.TreeSelection; import org.eclipse.ui.IEditorPart; import org.eclipse.ui.IEditorReference; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.IViewPart; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPage; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.PartInitException; import org.eclipse.ui.PlatformUI; import org.eclipse.ui.navigator.resources.ProjectExplorer; import org.eclipse.ui.part.MultiPageEditorPart; import org.eclipse.ui.texteditor.IDocumentProvider; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.MarkerUtilities; import eu.modelwriter.marker.MarkerActivator; import eu.modelwriter.marker.xml.EventMemento; import eu.modelwriter.traceability.core.persistence.DocumentRoot; @SuppressWarnings("restriction") public class MarkerFactory { public static final String TARGETVIEW_REF = "eu.modelwriter.marker.command.targetviewrefresh"; public static final String SOURCEVIEW_REF = "eu.modelwriter.marker.command.sourceviewrefresh"; public static final String MASTERVIEW_REF = "eu.modelwriter.marker.command.masterviewrefresh"; public static final String ECORE_DECORATOR = "eu.modelwriter.model.decorators.decorator.ecore.red"; public static final String FILE_DECORATOR = "eu.modelwriter.writer.markers.filedecorator"; // Marker ID public static final String MARKER_MARKING = "eu.modelwriter.marker.marking"; public static final String MARKER_MAPPING = "eu.modelwriter.marker.mapping"; /** * Creates a Ecore Marker from tree selection * * @param selection * @param file * @param res * @param editor * @return */ private static IMarker createEcoreMarker(final ITreeSelection selection, final IFile file, final IResource res, final IEditorPart editor) { IMarker marker = null; final ENamedElement element = (ENamedElement) selection.getFirstElement(); final String selectedText = element.getName(); final URI uri = EcoreUtil.getURI(element); System.out.println(uri); final String[] uriSplits = uri.toString().split("/"); final List<String> uriSplitsList = Arrays.asList(uriSplits); int indexOfStream = uriSplitsList.indexOf("") + 1; final XMLInputFactory factory = XMLInputFactory.newInstance(); try { final XMLStreamReader streamReader = factory .createXMLStreamReader(new FileReader(res.getLocation().toFile())); EventMemento memento = null; EventMemento current = null; @SuppressWarnings("unused") String elementName = null; while (streamReader.hasNext()) { if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { final String name = streamReader.getAttributeValue(null, "name"); if (name != null && name.equals(uriSplitsList.get(indexOfStream))) { indexOfStream++; if (uriSplitsList.size() == indexOfStream) { elementName = streamReader.getName().toString(); break; } } } memento = new EventMemento(streamReader); streamReader.next(); current = new EventMemento(streamReader); } // JFace Text Document object is created to get character offsets from line numbers. final int[] offsetStartEnd = MarkerFactory.getStartEndOffsetFromXML(streamReader, file, memento, current); final int start = offsetStartEnd[0]; final int end = offsetStartEnd[1]; // Create Marker final HashMap<String, Object> map = new HashMap<>(); MarkerUtilities.setLineNumber(map, current.getLineNumber()); MarkerUtilities.setMessage(map, "Marker Type : non-type"); MarkerUtilities.setCharStart(map, start); MarkerUtilities.setCharEnd(map, end); map.put(IMarker.TEXT, selectedText); map.put(IMarker.LOCATION, current.getLineNumber()); map.put(IMarker.SOURCE_ID, MarkerFactory.generateId()); map.put(MarkUtilities.URI, uri.toString()); map.put(MarkUtilities.RELATIVE_URI, EcoreUtil.getRelativeURIFragmentPath(EcoreUtil.getRootContainer(element), element)); marker = file.createMarker(MarkerFactory.MARKER_MARKING); if (marker.exists()) { try { marker.setAttributes(map); } catch (final CoreException e) { // You need to handle the case where the marker no longer exists e.printStackTrace(); } } AnnotationFactory.addAnnotation(marker, AnnotationFactory.ANNOTATION_MARKING); } catch (final XMLStreamException e) { e.printStackTrace(); } catch (final FileNotFoundException e) { e.printStackTrace(); } catch (final CoreException e1) { e1.printStackTrace(); } return marker; } /** * Gets eobject and its xmi file, and returns created marker * * @param eObject which marker will be created for * @param iFile xmi file * @param type marker type * @return */ public static IMarker createInstanceMarker(final EObject eObject, final IFile iFile, final String type) { IMarker marker = null; if (!(eObject instanceof EModelElement)) { final URI uri = EcoreUtil.getURI(eObject); final String[] fragments = uri.fragment().split("/"); final ArrayList<Object> pieces = new ArrayList<>(); try { for (int i = 0; i < fragments.length; i++) { if (fragments[i].isEmpty()) { continue; } final int dot = fragments[i].lastIndexOf("."); if (dot == -1) { pieces.add(fragments[i].substring(1, fragments[i].length())); pieces.add("0"); } else { pieces.add(fragments[i].substring(1, dot)); pieces.add(fragments[i].substring(dot + 1, fragments[i].length())); } } } catch (final Exception e) { // e.printStackTrace(); } File file = null; final IPath location = iFile.getLocation(); if (location != null) { file = location.toFile(); } try { final XMLInputFactory factory = XMLInputFactory.newInstance(); final XMLStreamReader streamReader = factory.createXMLStreamReader(new FileReader(file)); EventMemento memento = null; EventMemento current = null; int count = 0; int elementCount = 0; String name = null; String startElementName = null; int startElementCount = 0; while (streamReader.hasNext()) { if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { if (pieces.isEmpty()) { break; } name = streamReader.getLocalName().toString(); startElementName = (String) pieces.get(count); boolean same = true; if (startElementName.contains("[")) { for (int j = 0; j < streamReader.getAttributeCount(); j++) { final String attributeName = streamReader.getAttributeName(j).getLocalPart(); final String attributeValue = streamReader.getAttributeValue(j); final String attributeString = attributeName + "=\'" + attributeValue + "\'"; if (!attributeName.equals("type") && !startElementName.contains(attributeString)) { same = false; } } startElementName = startElementName.substring(0, startElementName.indexOf('[')); } startElementCount = Integer.parseInt((String) pieces.get(count + 1)); if (name.equals(startElementName) && same) { if (elementCount == startElementCount && pieces.size() - 2 == count) { break; } if (elementCount != startElementCount) { elementCount++; } else if (pieces.size() - 2 != count) { count += 2; elementCount = 0; } } } memento = new EventMemento(streamReader); streamReader.next(); current = new EventMemento(streamReader); } // JFace Text Document object is created to get character offsets from line numbers. final int[] offsetStartEnd = MarkerFactory.getStartEndOffsetFromXML(streamReader, iFile, memento, current); final int start = offsetStartEnd[0]; final int end = offsetStartEnd[1]; if (MarkerFactory.findMarkerWithAbsolutePosition(iFile, start, end) != null) { // final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), // "Mark Information", null, "In these area, there is already a marker", // MessageDialog.WARNING, new String[] {"OK"}, 0); // dialog.open(); return null; } final String text = MarkerFactory.instanceToString(eObject); final HashMap<String, Object> map = new HashMap<>(); MarkerUtilities.setLineNumber(map, current.getLineNumber()); MarkerUtilities.setMessage(map, "Marker Type : " + type); MarkerUtilities.setCharStart(map, start); MarkerUtilities.setCharEnd(map, end); map.put(IMarker.TEXT, text); map.put(IMarker.LOCATION, current.getLineNumber()); map.put(IMarker.SOURCE_ID, MarkerFactory.generateId()); map.put(MarkUtilities.MARKER_TYPE, type); map.put(MarkUtilities.URI, uri.toString()); map.put(MarkUtilities.RELATIVE_URI, EcoreUtil.getRelativeURIFragmentPath(EcoreUtil.getRootContainer(eObject), eObject)); marker = iFile.createMarker(MarkerFactory.MARKER_MARKING); if (marker.exists()) { try { marker.setAttributes(map); } catch (final CoreException e) { // You need to handle the case where the marker no longer exists e.printStackTrace(); } } AnnotationFactory.addAnnotation(marker, AnnotationFactory.ANNOTATION_MARKING); } catch (final XMLStreamException e) { e.printStackTrace(); } catch (final FileNotFoundException e) { e.printStackTrace(); } catch (final CoreException e1) { e1.printStackTrace(); } } return marker; } /** * Creates an Instance Marker from tree selection * * @param selection * @param file * @param res * @param editor * @return */ private static IMarker createInstanceMarker(final ITreeSelection selection, final IFile file, final IResource res, final IEditorPart editor) { IMarker marker = null; final EObject element = (EObject) selection.getFirstElement(); if (!(element instanceof EModelElement)) { final URI uri = EcoreUtil.getURI(element); final String[] uriSplits = uri.toString().split("/"); final List<String> uriSplitsList = Arrays.asList(uriSplits); final int indexOfStream = uriSplitsList.indexOf("") + 1; final ArrayList<Object> pieces = new ArrayList<>(); try { for (int i = indexOfStream; i < uriSplits.length; i++) { int dot = 0; dot = uriSplits[i].lastIndexOf("."); pieces.add(uriSplits[i].substring(1, dot)); pieces.add(uriSplits[i].substring(dot + 1, uriSplits[i].length())); } } catch (final Exception e) { // e.printStackTrace(); } try { final XMLInputFactory factory = XMLInputFactory.newInstance(); final XMLStreamReader streamReader = factory .createXMLStreamReader(new FileReader(res.getLocation().toFile())); EventMemento memento = null; EventMemento current = null; int count = 0; int elementCount = 0; String name = null; String startElementName = null; int startElementCount = 0; while (streamReader.hasNext()) { if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { if (pieces.isEmpty()) { break; } name = streamReader.getLocalName().toString(); startElementName = (String) pieces.get(count); startElementCount = Integer.parseInt((String) pieces.get(count + 1)); if (name.equals(startElementName)) { if (elementCount == startElementCount && pieces.size() - 2 == count) { break; } if (elementCount != startElementCount) { elementCount++; } else if (pieces.size() - 2 != count) { count += 2; elementCount = 0; } } } memento = new EventMemento(streamReader); streamReader.next(); current = new EventMemento(streamReader); } // JFace Text Document object is created to get character offsets from line numbers. final int[] offsetStartEnd = MarkerFactory.getStartEndOffsetFromXML(streamReader, file, memento, current); final int start = offsetStartEnd[0]; final int end = offsetStartEnd[1]; if (MarkerFactory.findMarkerWithAbsolutePosition(file, start, end) != null) { // final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), // "Mark Information", null, "In these area, there is already a marker", // MessageDialog.WARNING, new String[] {"OK"}, 0); // dialog.open(); return null; } final String text = MarkerFactory.instanceToString(element); final HashMap<String, Object> map = new HashMap<>(); MarkerUtilities.setLineNumber(map, current.getLineNumber()); MarkerUtilities.setMessage(map, "Marker Type : non-type"); MarkerUtilities.setCharStart(map, start); MarkerUtilities.setCharEnd(map, end); map.put(IMarker.TEXT, text); map.put(IMarker.LOCATION, current.getLineNumber()); map.put(IMarker.SOURCE_ID, MarkerFactory.generateId()); map.put(MarkUtilities.URI, uri.toString()); map.put(MarkUtilities.RELATIVE_URI, EcoreUtil.getRelativeURIFragmentPath(EcoreUtil.getRootContainer(element), element)); marker = file.createMarker(MarkerFactory.MARKER_MARKING); if (marker.exists()) { try { marker.setAttributes(map); } catch (final CoreException e) { // You need to handle the case where the marker no longer exists e.printStackTrace(); } } AnnotationFactory.addAnnotation(marker, AnnotationFactory.ANNOTATION_MARKING); } catch (final XMLStreamException e) { e.printStackTrace(); } catch (final FileNotFoundException e) { e.printStackTrace(); } catch (final CoreException e1) { e1.printStackTrace(); } } return marker; } /** * Creates a Marker from TextSelection */ public static IMarker createMarker(final IResource resource, final ITextSelection selection) { try { IMarker createdMarker = null; if (selection != null && !selection.getText().isEmpty()) { if (MarkerFactory.findMarkerWithAbsolutePosition(resource, selection.getOffset(), selection.getOffset() + selection.getLength()) != null) { final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), "Mark Information", null, "In these area, there is already a marker", MessageDialog.WARNING, new String[] { "OK" }, 0); dialog.open(); return null; } final int start = selection.getOffset(); final int end = selection.getOffset() + selection.getLength(); final HashMap<String, Object> map = new HashMap<>(); MarkerUtilities.setLineNumber(map, selection.getStartLine()); MarkerUtilities.setMessage(map, "Marker Type : non-type"); MarkerUtilities.setCharStart(map, start); MarkerUtilities.setCharEnd(map, end); map.put(IMarker.TEXT, selection.getText()); map.put(IMarker.LOCATION, selection.getStartLine()); map.put(IMarker.SOURCE_ID, MarkerFactory.generateId()); map.put(MarkUtilities.MARKER_TYPE, null); MarkerUtilities.createMarker(resource, map, MarkerFactory.MARKER_MARKING); createdMarker = MarkerFactory.findMarkerWithAbsolutePosition(resource, start, end); } else { final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), "Mark Information", null, "Please perform a valid selection", MessageDialog.WARNING, new String[] { "OK" }, 0); dialog.open(); } return createdMarker; } catch (final CoreException e) { e.printStackTrace(); } return null; } /** * Creates a Marker from TreeSelection */ @SuppressWarnings({ "resource" }) public static IMarker createMarker(final IResource res, final ITreeSelection selection) { if (selection == null) { final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), "Mark Information", null, "Please perform a valid selection", MessageDialog.WARNING, new String[] { "OK" }, 0); dialog.open(); return null; } else if (MarkerFactory.findMarkerByTreeSelection(selection, res) != null) { final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), "Mark Information", null, "In these area, there is already a marker", MessageDialog.WARNING, new String[] { "OK" }, 0); dialog.open(); return null; } // Fetch IResource final IWorkbench workbench = PlatformUI.getWorkbench(); final IWorkbenchWindow window = workbench.getActiveWorkbenchWindow(); final IWorkbenchPage page = window.getActivePage(); final IEditorPart editor = page.getActiveEditor(); final IFileEditorInput input = (IFileEditorInput) editor.getEditorInput(); final IFile file = input.getFile(); IMarker marker = null; if (MarkerActivator.getEditor() instanceof EcoreEditor && selection.getFirstElement() instanceof ENamedElement && ((ENamedElement) selection.getFirstElement()).getName() != null && !((ENamedElement) selection.getFirstElement()).getName().isEmpty()) { marker = MarkerFactory.createEcoreMarker(selection, file, res, editor); } else if (editor instanceof EcoreEditor && selection.getFirstElement() != null) { marker = MarkerFactory.createInstanceMarker(selection, file, res, editor); } else if (editor instanceof CompilationUnitEditor) { final Object element = selection.getFirstElement(); String content = null; try { content = new Scanner(file.getContents()).useDelimiter("\\Z").next(); } catch (final CoreException e1) { e1.printStackTrace(); } int startOffset = 0; int length = 0; if (element instanceof IField) { final IField field = (IField) element; try { final ISourceRange nameRange = field.getNameRange(); final int nameStartOffset = nameRange.getOffset(); final int nameEndOffset = nameStartOffset + nameRange.getLength(); final ISourceRange sourceRange = field.getSourceRange(); startOffset = field.getJavadocRange().getOffset() + field.getJavadocRange().getLength() + 1; if (nameEndOffset + 1 == sourceRange.getOffset() + sourceRange.getLength()) { length = sourceRange.getOffset() + sourceRange.getLength() - startOffset; } else { final int indexOfAssignment = content.indexOf("=", nameEndOffset); length = indexOfAssignment - startOffset; } } catch (final JavaModelException e) { e.printStackTrace(); } } else if (element instanceof IInitializer) { final IInitializer initializer = (IInitializer) element; try { final ISourceRange sourceRange = initializer.getSourceRange(); startOffset = initializer.getJavadocRange().getOffset() + initializer.getJavadocRange().getLength() + 1; length = sourceRange.getLength(); } catch (final JavaModelException e) { e.printStackTrace(); } } else if (element instanceof IMethod) { final IMethod method = (IMethod) element; try { final ISourceRange nameRange = method.getNameRange(); final int nameStartOffset = nameRange.getOffset(); final int nameEndOffset = nameStartOffset + nameRange.getLength(); final ISourceRange sourceRange = method.getSourceRange(); startOffset = method.getJavadocRange().getOffset() + method.getJavadocRange().getLength() + 1; if (content.toCharArray()[sourceRange.getOffset() + sourceRange.getLength() - 1] == '}') { final int indexOfParanthesis = content.indexOf("{", nameEndOffset); length = indexOfParanthesis - startOffset; } else if (content.toCharArray()[sourceRange.getOffset() + sourceRange.getLength() - 1] == ';') { length = sourceRange.getLength(); } } catch (final JavaModelException e) { e.printStackTrace(); } } else if (element instanceof IType) { final IType type = (IType) element; try { final ISourceRange nameRange = type.getNameRange(); final int nameStartOffset = nameRange.getOffset(); final int nameEndOffset = nameStartOffset + nameRange.getLength(); final int indexOfParanthesis = content.indexOf("{", nameEndOffset); startOffset = type.getJavadocRange().getOffset() + type.getJavadocRange().getLength() + 1; length = indexOfParanthesis - startOffset; } catch (final JavaModelException e) { e.printStackTrace(); } } final IDocument document = new Document(content); final TextSelection textSelection = new TextSelection(document, startOffset, length); return MarkerFactory.createMarker(file, textSelection); } else { final MessageDialog dialog = new MessageDialog(MarkerActivator.getShell(), "Mark Information", null, "Please perform a valid selection", MessageDialog.WARNING, new String[] { "OK" }, 0); dialog.open(); } return marker; } /** * Creates a ReqIf Marker from tree selection * * @param selection * @param file * @param res * @param editor * @return */ // private static IMarker createReqIfMarker(final ITreeSelection selection, final IFile file, // final IResource res, final IEditorPart editor) { // // IMarker marker = null; // // final Identifiable element = (Identifiable) selection.getFirstElement(); // final URI uri = EcoreUtil.getURI(element); // // final String attributeValue = MarkerFactory.reqIfToString(element); // // final String identifier = element.getIdentifier(); // if (identifier != null && !identifier.isEmpty()) { // final XMLInputFactory factory = XMLInputFactory.newInstance(); // try { // final XMLStreamReader streamReader = // factory.createXMLStreamReader(new FileReader(res.getLocation().toFile())); // // EventMemento memento = null; // EventMemento current = null; // while (streamReader.hasNext()) { // if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { // final String name = streamReader.getAttributeValue(null, "IDENTIFIER"); // if (name != null && name.equals(identifier)) { // break; // } // } // memento = new EventMemento(streamReader); // streamReader.next(); // current = new EventMemento(streamReader); // } // streamReader.close(); // // // JFace Text Document object is created to get character offsets from line numbers. // final int[] offsetStartEnd = // MarkerFactory.getStartEndOffsetFromXML(streamReader, file, memento, current); // final int start = offsetStartEnd[0]; // final int end = offsetStartEnd[1]; // // String text = null; // if (element.isSetIdentifier()) { // text = element.getIdentifier(); // } // if (text == null) { // text = element.toString(); // } // // final HashMap<String, Object> map = new HashMap<>(); // MarkerUtilities.setLineNumber(map, current.getLineNumber()); // MarkerUtilities.setMessage(map, "Marker Type : non-type"); // MarkerUtilities.setCharStart(map, start); // MarkerUtilities.setCharEnd(map, end); // map.put(IMarker.TEXT, attributeValue); // map.put(IMarker.LOCATION, current.getLineNumber()); // map.put(IMarker.SOURCE_ID, MarkerFactory.generateId()); // map.put(MarkUtilities.URI, uri.toString()); // marker = file.createMarker(MarkerFactory.MARKER_MARKING); // if (marker.exists()) { // try { // marker.setAttributes(map); // } catch (final CoreException e) { // // You need to handle the case where the marker no longer exists // e.printStackTrace(); // } // } // // AnnotationFactory.addAnnotation(marker, AnnotationFactory.ANNOTATION_MARKING); // // } catch (final XMLStreamException e) { // e.printStackTrace(); // } catch (final FileNotFoundException e) { // e.printStackTrace(); // } catch (final CoreException e1) { // e1.printStackTrace(); // } // } // return marker; // } /** * Find a marker for given offset on given resource * * @param resource * @param offset * @return */ public static IMarker findMarkerByOffset(final IResource resource, final int offset) { final IMarker marker = null; final List<IMarker> mList = MarkerFactory.findMarkers(resource); int start; int end; for (final IMarker iMarker : mList) { start = MarkUtilities.getStart(iMarker); end = MarkUtilities.getEnd(iMarker); if (offset <= end && offset >= start) { return iMarker; } } return marker; } /** * Find a marker by its source id on resource * * @param resource * @param id * @return */ public static IMarker findMarkerBySourceId(final IResource resource, final String id) { final IMarker marker = null; final List<IMarker> mList = MarkerFactory.findMarkers(resource); for (final IMarker iMarker : mList) { if (id.equals(MarkUtilities.getSourceId(iMarker))) { return iMarker; } } return marker; } @SuppressWarnings("resource") public static IMarker findMarkerByOutlineTreeSelection(final ITreeSelection treeSelection, final IFile file) { final Object element = treeSelection.getFirstElement(); String content = null; try { content = new Scanner(file.getContents()).useDelimiter("\\Z").next(); } catch (final CoreException e1) { e1.printStackTrace(); } int startOffset = 0; if (element instanceof IField) { final IField field = (IField) element; try { final ISourceRange nameRange = field.getNameRange(); final int nameStartOffset = nameRange.getOffset(); final int nameEndOffset = nameStartOffset + nameRange.getLength(); final ISourceRange sourceRange = field.getSourceRange(); if (nameEndOffset + 1 == sourceRange.getOffset() + sourceRange.getLength()) { startOffset = sourceRange.getOffset(); } else { startOffset = sourceRange.getOffset(); } } catch (final JavaModelException e) { e.printStackTrace(); } } else if (element instanceof IInitializer) { final IInitializer initializer = (IInitializer) element; try { final ISourceRange sourceRange = initializer.getSourceRange(); startOffset = sourceRange.getOffset(); } catch (final JavaModelException e) { e.printStackTrace(); } } else if (element instanceof IMethod) { final IMethod method = (IMethod) element; try { final ISourceRange sourceRange = method.getSourceRange(); if (content.toCharArray()[sourceRange.getOffset() + sourceRange.getLength() - 1] == '}') { startOffset = sourceRange.getOffset(); } else if (content.toCharArray()[sourceRange.getOffset() + sourceRange.getLength() - 1] == ';') { startOffset = sourceRange.getOffset(); } } catch (final JavaModelException e) { e.printStackTrace(); } } else if (element instanceof IType) { final IType type = (IType) element; try { final ISourceRange sourceRange = type.getSourceRange(); startOffset = sourceRange.getOffset(); } catch (final JavaModelException e) { e.printStackTrace(); } } return MarkerFactory.findMarkerByOffset(file, startOffset); } /** * Finds a marker for given selection on the tree * * @param treeSelection * @param resource * @return */ public static IMarker findMarkerByTreeSelection(final ITreeSelection treeSelection, final IResource resource) { final Object o = treeSelection.getFirstElement(); if (o != null && o instanceof EObject) { final String uri = EcoreUtil.getURI((EObject) o).toString(); final List<IMarker> markers = MarkerFactory.findMarkers(resource); for (final IMarker iMarker : markers) { if (uri.equals(MarkUtilities.getUri(iMarker))) { return iMarker; } } } return null; } /** * @param resource * @param xpath * @return */ public static IMarker findMarkerByXpath(final IResource resource, final String xpath) { final IMarker marker = null; if (xpath == null || xpath.isEmpty()) { return null; } final List<IMarker> mList = MarkerFactory.findMarkers(resource); for (final IMarker iMarker : mList) { if (xpath.equals(MarkUtilities.getXpath(iMarker))) { return iMarker; } } return marker; } /** * Returns a list of markers that are linked to the resource or any sub resource of the resource * * @param resource * @return */ public static List<IMarker> findMarkers(final IResource resource) { try { if (resource == null) { return new ArrayList<>(); } return Arrays .asList(resource.findMarkers(MarkerFactory.MARKER_MARKING, true, IResource.DEPTH_INFINITE)); } catch (final CoreException e) { return new ArrayList<>(); } } /** * Returns a list of a resources markers * * @param resource * @return */ public static ArrayList<IMarker> findMarkersAsArrayList(final IResource resource) { try { if (resource == null) { return new ArrayList<>(); } final ArrayList<IMarker> myMarkerList = new ArrayList<>(); IMarker[] list; list = resource.findMarkers(MarkerFactory.MARKER_MARKING, true, IResource.DEPTH_INFINITE); for (final IMarker iMarker : list) { myMarkerList.add(iMarker); } return myMarkerList; } catch (final CoreException e) { e.printStackTrace(); } return new ArrayList<>(); } /** * Find group of markers which means all of them are depended each other by same group * * @param resource * @param groupId * @return List of markers which have got same group */ public static List<IMarker> findMarkersByGroupId(final IResource resource, final String groupId) { final List<IMarker> groupMarkers = new ArrayList<>(); final List<IMarker> markerList = MarkerFactory.findMarkers(resource); for (final IMarker iMarker : markerList) { if (MarkUtilities.getGroupId(iMarker) != null && groupId.equals(MarkUtilities.getGroupId(iMarker))) { groupMarkers.add(iMarker); } } return groupMarkers; } /** * @param resource * @param uri * @return */ public static IMarker findMarkersByUri(final IResource resource, final String uri) { final List<IMarker> markerList = MarkerFactory.findMarkers(resource); for (final IMarker iMarker : markerList) { if (uri.equals(MarkUtilities.getUri(iMarker))) { return iMarker; } } return null; } /** * @param resource * @param selection * @returns list of markers which are found by selection */ public static ArrayList<IMarker> findMarkersInSelection(final IResource resource, final ITextSelection selection) { final ArrayList<IMarker> markerListInArea = new ArrayList<>(); final ArrayList<IMarker> markerList = MarkerFactory.findMarkersAsArrayList(resource); if (markerList.isEmpty()) { return null; } final int textStart = selection.getOffset(); final int textEnd = textStart + selection.getLength(); for (final IMarker iMarker : markerList) { final int markerStart = MarkUtilities.getStart(iMarker); final int markerEnd = MarkUtilities.getEnd(iMarker); if (textStart >= markerStart && textStart <= markerEnd || textEnd >= markerStart && textEnd <= markerEnd || markerStart >= textStart && markerStart <= textEnd || markerEnd >= textStart && markerEnd <= textEnd) { markerListInArea.add(iMarker); } } return markerListInArea; } /** * @param resource * @param textStart * @param textEnd * @return */ public static IMarker findMarkerWithAbsolutePosition(final IResource resource, final int textStart, final int textEnd) { final IMarker marker = null; final ArrayList<IMarker> markerList = MarkerFactory.findMarkersAsArrayList(resource); if (markerList.isEmpty()) { return null; } for (final IMarker iMarker : markerList) { final int markerStart = MarkUtilities.getStart(iMarker); final int markerEnd = MarkUtilities.getEnd(iMarker); if (textStart == markerStart && textEnd == markerEnd) { return iMarker; } } return marker; } /** * @param iResource * @return list of untyped markers for given resource */ public static ArrayList<IMarker> findUntypedMarkers(final IResource iResource) { ArrayList<IMarker> listOfMarkers = new ArrayList<>(); listOfMarkers = MarkerFactory.findMarkersAsArrayList(iResource); final Iterator<IMarker> iter = listOfMarkers.iterator(); while (iter.hasNext()) { final IMarker iMarker = iter.next(); if (MarkUtilities.getType(iMarker) != null) { iter.remove(); } } return listOfMarkers; } public static String generateId() { final String base = "0000"; final DocumentRoot documentRoot = MarkerUpdater.getDocumentRoot(); int nextId = documentRoot.getAlloy().getRepository().getNextId(); String id = base + nextId; id = id.substring(id.length() - 5); documentRoot.getAlloy().getRepository().setNextId(++nextId); MarkerUpdater.writeDocumentRoot(documentRoot); return id; } public static String generateId(final DocumentRoot documentRoot) { final String base = "0000"; int nextId = documentRoot.getAlloy().getRepository().getNextId(); String id = base + nextId; id = id.substring(id.length() - 5); documentRoot.getAlloy().getRepository().setNextId(++nextId); MarkerUpdater.writeDocumentRoot(documentRoot); return id; } /** * @returns the document content */ public static String getCurrentEditorContent() { return MarkerFactory.getDocument().get(); } /** * @returns the document for current editor */ public static IDocument getDocument() { MultiPageEditorPart mpepEditor; ITextEditor iteEditor; if (MarkerActivator.getEditor() instanceof MultiPageEditorPart) { mpepEditor = (MultiPageEditorPart) MarkerActivator.getEditor(); final IEditorPart[] editors = mpepEditor.findEditors(mpepEditor.getEditorInput()); iteEditor = (ITextEditor) editors[0]; } else { iteEditor = (ITextEditor) MarkerActivator.getEditor(); } final IDocumentProvider idp = iteEditor.getDocumentProvider(); return idp.getDocument(iteEditor.getEditorInput()); } /** * Note: it compares marker's resource file name and open editors' file name. * * @param marker * @return if marker's editor is open, return editor, else return null */ public static IEditorPart getOpenEditorOfMarker(final IMarker marker) { final IWorkbenchWindow[] windows = PlatformUI.getWorkbench().getWorkbenchWindows(); for (final IWorkbenchWindow iWorkbenchWindow : windows) { final IWorkbenchPage[] pages = iWorkbenchWindow.getPages(); for (final IWorkbenchPage iWorkbenchPage : pages) { final IEditorReference[] editors = iWorkbenchPage.getEditorReferences(); for (final IEditorReference iEditorReference : editors) { try { if (iEditorReference instanceof IFileEditorInput) { final IFileEditorInput input = (IFileEditorInput) iEditorReference.getEditorInput(); final IFile file = input.getFile(); // TODO Caused by: java.lang.NullPointerException when delete marker on ecore editor. if (file.getFullPath().equals(marker.getResource().getFullPath())) { return iEditorReference.getEditor(false); } } } catch (final PartInitException e) { e.printStackTrace(); } } } } return null; } /** * @param selections * @return */ public static String getQualifiedName(final ITreeSelection selections) { final TreePath[] paths = selections.getPaths(); // Consider only not empty and single selection if (selections.isEmpty() || selections.size() > 1) { return null; } final TreePath path = paths[0]; IElementComparer comparer = null; if (selections instanceof TreeSelection) { comparer = ((TreeSelection) selections).getElementComparer(); } System.out.println(path.hashCode(comparer)); for (int i = 1; i < path.getSegmentCount(); i++) { if (path.getSegment(i) instanceof ResourceFactoryImpl) { final EcoreResourceFactoryImpl eResourceFactory = (EcoreResourceFactoryImpl) path.getSegment(i); System.out.println(eResourceFactory.getClass().getName() + ": " + eResourceFactory.toString()); } else if (path.getSegment(i) instanceof ENamedElement) { final ENamedElement namedElement = (ENamedElement) path.getSegment(i); System.out.println(namedElement.getClass().getName() + ": " + namedElement.getName()); } else { System.out.println("?"); } } return null; } /** * @returns current selection */ public static ISelection getSelection() { return MarkerActivator.getActiveWorkbenchWindow().getSelectionService().getSelection(); } /** * Returns character offsets from line numbers from JFace Text Document object. */ private static int[] getStartEndOffsetFromXML(final XMLStreamReader streamReader, final IFile file, final EventMemento memento, final EventMemento current) { final int[] offsetStartEnd = new int[2]; try { String charsetName = streamReader.getCharacterEncodingScheme(); if (charsetName == null) { charsetName = "UTF-8"; } final Scanner scanner = new Scanner(file.getContents(), charsetName); final IDocument document = new Document(scanner.useDelimiter("\\A").next()); scanner.close(); int start = 0; int end = 0; final IRegion startRegion = document.getLineInformation(memento.getLineNumber() - 1); start = startRegion.getOffset() + memento.getColumnNumber() - 2; final IRegion endRegion = document.getLineInformation(current.getLineNumber()); end = endRegion.getOffset() - 1; offsetStartEnd[0] = start; offsetStartEnd[1] = end; } catch (final BadLocationException e1) { // e1.printStackTrace(); System.out.println(e1.toString() + " --> in MarkerFactory's getStartEndOffsetFromXML function"); } catch (final CoreException e) { e.printStackTrace(); } return offsetStartEnd; } /** * Returns the text of element which given from Instance */ public static String instanceToString(final EObject element) { final EClass clazz = element.eClass(); String text = clazz.getName() + " "; final EList<EStructuralFeature> structuralFeatures = clazz.getEStructuralFeatures(); for (final EStructuralFeature eStructuralFeature : structuralFeatures) { if (!(eStructuralFeature instanceof EReference)) { text += eStructuralFeature.getName() + " = " + element.eGet(eStructuralFeature) + " "; } } return text == null ? "" : text; } /** * This method refresh Project Explorer View when the actions (Mark/Mark All/Delete/Delete All) * have been completed. * */ public static void refreshProjectExp() { try { ResourcesPlugin.getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null); final IViewPart viewPart = PlatformUI.getWorkbench().getWorkbenchWindows()[0].getActivePage() .findView("org.eclipse.ui.navigator.ProjectExplorer"); if (viewPart == null) { return; } ((ProjectExplorer) viewPart).getCommonViewer().refresh(); } catch (final CoreException e) { e.printStackTrace(); } } /** * Returns the text of element which given from Reqif */ // public static String reqIfToString(final Identifiable element) { // AttributeValueString attribute = null; // String attributeValue = null; // if (element instanceof SpecHierarchy) { // final SpecHierarchy specHierarchy = (SpecHierarchy) element; // final Iterator<AttributeValue> iter = specHierarchy.getObject().getValues().iterator(); // while (iter.hasNext()) { // final Object next = iter.next(); // if (next instanceof AttributeValueString) { // attribute = (AttributeValueString) next; // attributeValue = attribute.getTheValue(); // break; // } // } // } else { // final TreeIterator<EObject> iter = element.eAllContents(); // // while (iter.hasNext()) { // final EObject next = iter.next(); // if (next instanceof AttributeValueString) { // attribute = (AttributeValueString) next; // attributeValue = attribute.getTheValue(); // break; // } // } // } // return attributeValue; // } /** * For the given marker this method updates its XML location * * @param marker * @param res */ public static void updateMarkerfromXMLForInstance(final IMarker marker, final IResource res) { try { final String[] uriSplits = MarkUtilities.getUri(marker).split("/"); final List<String> uriSplitsList = Arrays.asList(uriSplits); final int indexOfStream = uriSplitsList.indexOf("") + 1; final ArrayList<Object> pieces = new ArrayList<>(); for (int i = indexOfStream; i < uriSplits.length; i++) { int dot = 0; dot = uriSplits[i].lastIndexOf("."); pieces.add(uriSplits[i].substring(1, dot)); pieces.add(uriSplits[i].substring(dot + 1, uriSplits[i].length())); } final XMLInputFactory factory = XMLInputFactory.newInstance(); final XMLStreamReader streamReader = factory .createXMLStreamReader(new FileReader(res.getLocation().toFile())); EventMemento memento = null; EventMemento current = null; int count = 0; int elementCount = 0; String name = null; String startElementName = null; int startElementCount = 0; while (streamReader.hasNext()) { if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { name = streamReader.getLocalName().toString(); startElementName = (String) pieces.get(count); startElementCount = Integer.parseInt((String) pieces.get(count + 1)); if (name.equals(startElementName)) { if (elementCount == startElementCount && pieces.size() - 2 == count) { break; } if (elementCount != startElementCount) { elementCount++; } else if (pieces.size() - 2 != count) { count += 2; elementCount = 0; } } } memento = new EventMemento(streamReader); streamReader.next(); current = new EventMemento(streamReader); } final IFile file = (IFile) res; // JFace Text Document object is created to get character offsets from line numbers. final int[] offsetStartEnd = MarkerFactory.getStartEndOffsetFromXML(streamReader, file, memento, current); final int start = offsetStartEnd[0]; final int end = offsetStartEnd[1]; MarkUtilities.setStart(marker, start); MarkUtilities.setEnd(marker, end); MarkUtilities.setLinenumber(marker, current.getLineNumber()); } catch (final XMLStreamException e) { e.printStackTrace(); } catch (final FileNotFoundException e) { e.printStackTrace(); } } /** * For the given marker this method updates its XML location * * @param marker * @param res */ public static void updateMarkerfromXMLForModel(final IMarker marker, final IResource res) { try { final String[] uriSplits = MarkUtilities.getUri(marker).split("/"); final List<String> uriSplitsList = Arrays.asList(uriSplits); int indexOfStream = uriSplitsList.indexOf("") + 1; final XMLInputFactory factory = XMLInputFactory.newInstance(); final XMLStreamReader streamReader = factory .createXMLStreamReader(new FileReader(res.getLocation().toFile())); EventMemento memento = null; EventMemento current = null; while (streamReader.hasNext()) { if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { final String name = streamReader.getAttributeValue(null, "name"); if (name != null && name.equals(uriSplitsList.get(indexOfStream))) { indexOfStream++; if (uriSplitsList.size() == indexOfStream) { break; } } } memento = new EventMemento(streamReader); streamReader.next(); current = new EventMemento(streamReader); } final IFile file = (IFile) res; // JFace Text Document object is created to get character offsets from line numbers. final int[] offsetStartEnd = MarkerFactory.getStartEndOffsetFromXML(streamReader, file, memento, current); final int start = offsetStartEnd[0]; final int end = offsetStartEnd[1]; // Create Marker MarkUtilities.setStart(marker, start); MarkUtilities.setEnd(marker, end); MarkUtilities.setLinenumber(marker, current.getLineNumber()); } catch (final XMLStreamException e) { e.printStackTrace(); } catch (final FileNotFoundException e) { e.printStackTrace(); } } /** * For the given marker this method updates its XML location * * @param marker * @param res */ public static void updateMarkerfromXMLForReqIf(final IMarker marker, final IResource res) { final XMLInputFactory factory = XMLInputFactory.newInstance(); try { final String uri = MarkUtilities.getUri(marker); final String identifier = uri.substring(uri.lastIndexOf("#") + 1, uri.length()); final XMLStreamReader streamReader = factory .createXMLStreamReader(new FileReader(res.getLocation().toFile())); EventMemento memento = null; EventMemento current = null; while (streamReader.hasNext()) { if (streamReader.getEventType() == XMLStreamConstants.START_ELEMENT) { final String name = streamReader.getAttributeValue(null, "IDENTIFIER"); if (name != null && name.equals(identifier)) { break; } } memento = new EventMemento(streamReader); streamReader.next(); current = new EventMemento(streamReader); } streamReader.close(); final IFile file = (IFile) res; // JFace Text Document object is created to get character offsets from line numbers. final int[] offsetStartEnd = MarkerFactory.getStartEndOffsetFromXML(streamReader, file, memento, current); final int start = offsetStartEnd[0]; final int end = offsetStartEnd[1]; MarkUtilities.setStart(marker, start); MarkUtilities.setEnd(marker, end); MarkUtilities.setLinenumber(marker, current.getLineNumber()); } catch (final XMLStreamException e) { e.printStackTrace(); } catch (final FileNotFoundException e) { e.printStackTrace(); } } }