2013-09-24 11 views
5

Próbuję zaimplementować sprawdzanie poprawności w środowisku Eclipse. Moja praca ma wiele małych projektów służących dostosowaniu naszego produktu do różnych klientów. Ponieważ jest mnóstwo programistów, staramy się znaleźć sposób na egzekwowanie różnych standardów i najlepszych praktyk.Narzędzie do sprawdzania poprawności implementacji w środowisku Eclipse

Na przykład, mamy wiele konfiguracji XML, które chcemy sprawdzić. Wbudowane sprawdzania poprawności zapewniają, że pliki są dobrze sformułowane i stosują się do schematu, ale chcielibyśmy dodać walidacje, takie jak sprawdzenie, czy klasa Java, do której odwołuje się XML, faktycznie istnieje w ścieżce klasy. Innym przykładem jest sprawdzanie, czy klasa Java implementująca określony interfejs nie ma żadnych zmiennych obiektowych (tzn. Kod musi działać tylko na parametrach, a nie na stanie).

Wygląda na to, że istnieją dwa sposoby na sprawdzenie poprawności. Pierwszy to budowniczy, który dodaje znaczniki. Druga polega na samodzielnym sprawdzaniu poprawności. Jednak tak naprawdę nie budujemy niczego i nie znalazłem żadnych przydatnych tutoriali ani przykładów na temat sprawdzania poprawności (nie pomaga to, że help.eclipse.org jest obecnie przenoszony i jest niedostępny).

Po kliknięciu prawym przyciskiem myszy projektu testowego i wybraniu "sprawdzania poprawności" pojawia się komunikat informujący o błędzie podczas sprawdzania poprawności, a moja wiadomość testowa nie jest wyświetlana w widoku problemu. Jednak nie ma błędów w dzienniku Eclipse. Host Eclipse nic nie pokazuje w konsoli. Brak wyjątków rejestrowanych w dowolnym miejscu i brak wiadomości. Projekt ma wymagany charakter niestandardowy.

Podążałem za these instructions, ale nie ma kodu ani w pełni działającego przykładu, a Google nie był na tyle uprzejmy, aby wypełnić puste pola. W połączeniu z witryną pomocy Eclipse jest teraz niedostępna, nie mam pojęcia, jak postępować.

plugin.xml:

<plugin> 
    <extension name="My Validator" point="org.eclipse.wst.validation.validator" 
      id="com.mycompany.pluginname.validator.MyValidator"> 
    <validator> 
     <projectNature id="com.mycompany.pluginname.nature.MyNature"/> 
     <helper class="org.eclipse.wst.validation.internal.operations.WorkbenchContext"/> 
     <markerId markerIdValue="com.mycompany.pluginname.validator.DefaultMarker"/> 
     <run class="com.mycompany.pluginname.validation.validator.MyValidator"/> 
     <runStrategy project="true"/> 
    </validator> 
    </extension> 
    <extension point="org.eclipse.core.resources.markers" name="My Validator" 
      id="com.mycompany.pluginname.validator.DefaultMarker"> 
    <super type="org.eclipse.core.resources.problemmarker"/> 
    <persistent value="true"/> 
    <attribute name="owner"/> 
    <attribute name="validationSeverity"/> 
    <attribute name="targetObject"/> 
    <attribute name="groupName"/> 
    <attribute name="messageId"/> 
    </extension> 
</plugin> 

kod Validator:

package com.mycompany.pluginname.validation.validator; 

import org.eclipse.core.resources.IProject; 
import org.eclipse.wst.validation.internal.core.Message; 
import org.eclipse.wst.validation.internal.core.ValidationException; 
import org.eclipse.wst.validation.internal.operations.IWorkbenchContext; 
import org.eclipse.wst.validation.internal.provisional.core.*; 

import com.mycompany.pluginname.validation.plugin.ValidationPlugin; 

@SuppressWarnings("restriction") 
public class MyValidator 
    implements IValidator { 

    @Override 
    public void cleanup(IReporter argReporter) { 
    argReporter.removeAllMessages(this); 
    } 

    @Override 
    public void validate(IValidationContext argContext, IReporter argReporter) 
     throws ValidationException { 
    String bundle = ValidationPlugin.getDefault().getTranslationsBundleName(); 
    IProject prj = ((IWorkbenchContext) argContext).getProject(); 
    String[] attributes = 
     new String[] {"owner", "validationSeverity", "targetObject", "groupName", "messageId"}; 
    IMessage msg = new Message(bundle, IMessage.HIGH_SEVERITY, "test", attributes, prj); 
    argReporter.addMessage(this, msg); 
    } 

} 

Uważam też, że to dziwne, że dodanie walidacji wymagałoby przy użyciu ograniczonych pakietów i interfejsów. Wydaje się również dziwne, że chce on raczej uzyskać wersję IMessage niż IMarker.

Spojrzałem na Eclipse plugin with custom validation, który wydaje się być zorientowany wokół tworzenia nowego edytora, w którym chcę sprawdzać pliki niezależnie od używanego edytora (w rzeczywistości nie chcę tworzyć edytora).

Edytuj: Zaktualizowałem do korzystania ze struktury V2, ale nic nie pojawia się w widoku problemu. Co ja robię źle? Czy jest gdzieś poradnik, który wyjaśnia, jak to działa? I był w stanie zorientować się, co następuje, ale oczywiście to nie jest poprawne:

public ValidationResult validate(ValidationEvent argEvent, ValidationState argState, 
     IProgressMonitor argMonitor) { 
    final IResource resource = argEvent.getResource(); 
    final ValidationResult result = new ValidationResult(); 
    try { 
     List<String> contents = Resources.readFile((IFile) resource); 
     for (int i = 0; i < contents.size(); ++i) { 
     int offset = contents.get(i).indexOf("bad_string"); 
     if (offset >= 0) { 
      result.add(ValidatorMessage.create("Found bad string", resource)); 
      result.incrementError(1); 
     } 
     } 
    } 
    catch (Exception ex) { 
     result.add(ValidatorMessage.create(ex.getMessage(), resource)); 
    } 
    return result; 
    } 

Przyznaję to stab w ciemności: dokumentacja nie jest bardzo opisowy i nie znalazłem żadnych tutoriali na ten V2 walidator . Och, mam filtr na tym walidatorze, więc otrzymuje tylko określone pliki XML, dlatego nie ma sprawdzania danych wejściowych.

Ponadto, ponieważ sam jestem pedantem, używam pętli old-style for, ponieważ oczekuję wyświetlenia numeru linii z błędem dla użytkownika. Ale oczywiście nie jestem jeszcze na miejscu.

Kolejna edycja: tutaj jest działający kod. Jedynym problemem jest to, że falowanie nie znajduje się w poprawnej linii, ponieważ przesunięcie jest od początku pliku, a nie linii.Ale to działa:

public ValidationResult validate(ValidationEvent argEvent, ValidationState argState, 
     IProgressMonitor argMonitor) { 
    final IResource resource = argEvent.getResource(); 
    final ValidationResult result = new ValidationResult(); 
    try { 
     List<String> contents = Resources.readFile((IFile) resource); 
     int location = 0; 
     for (int i = 0; i < contents.size(); ++i) { 
     int offset = contents.get(i).indexOf(CONSTANT); 
     if (offset >= 0) { 
      ValidatorMessage vm = ValidatorMessage.create("Message", resource); 
      vm.setAttribute(IMarker.SEVERITY, IMarker.SEVERITY_ERROR); 
      vm.setAttribute(IMarker.SOURCE_ID, IMarker.PROBLEM); 
      vm.setAttribute(IMarker.LINE_NUMBER, i + 1); 
      vm.setAttribute(IMarker.CHAR_START, location + offset); 
      vm.setAttribute(IMarker.CHAR_END, location + offset + CONSTANT.length()); 
      result.add(vm); 
     } 
     // TODO: account for different line endings. 
     location += (line.length() + 2); 
     } 
    } 
    catch (Exception ex) { 
     ValidationPlugin.getDefault().warn(ex); 
     result.add(ValidatorMessage.create(ex.toString(), resource)); 
    } 
    return result; 
    } 

plugin.xml:

<extension name="My Validator" point="org.eclipse.wst.validation.validatorV2" 
      id="com.company.plugin.validation.validator.MyValidator"> 
    <validator class="com.company.plugin.validation.validator.MyValidator"> 
     <include> 
     <rules> 
      <file type="file" name="FileName.xml"/> 
     </rules> 
     </include> 
    </validator> 
    </extension> 

faktycznie znalazłem innego SO pytanie wzdłuż tych linii, które potwierdzają to, co znalazłem: Setting IMarker.CHAR_START and IMarker.CHAR_END attributes for IMarkers Annotations

Odpowiedz

5

westchnienie że dokument jest bardzo przeterminowany. Powinieneś użyć punktu rozszerzenia org.eclipse.wst.validation.validatorV2, rozszerzając nowszą klasę org.eclipse.wst.validation.AbstractValidator.

+0

Edytowałem pytanie z zaktualizowanym kodem na podstawie Twojej odpowiedzi. Myślę, że jestem bliżej, ale nadal nie działa. –

+0

Czy przełączyłeś się również na nowszy punkt rozszerzenia? Czy wyczyścić konfigurację po uruchomieniu, aby ją przetestować? – nitind

+0

Użyłem nowszego punktu rozszerzenia, ale niczego nie usunąłem. Jednak jest to trafienie w mój punkt przerwania i przechodzenie przez metodę validate(). Znalazłem przykład dla PHP: http://en.sourceforge.jp/users/atlanto/pf/eclipse/wiki/ExtendingPDT%2FValidator i wygląda na to, że ten przykład dodaje znaczniki, więc zamierzam przyjrzeć się tworzeniu XML dokument i dodawanie do niego znaczników. –

Powiązane problemy