Prüfen ob eine Datei im Projektordner existiert

maestr0

Bekanntes Mitglied
Hallo,

ich habe einen extension-Point...
Java:
<plugin>
   <extension point="org.eclipse.debug.ui.launchShortcuts">
      <shortcut id="org.pit.testID"
                class="org.pit.ModuleAction"
                label="Build..."
                modes="run,debug">
         <contextualLaunch>
           <contextLabel label="Build..." mode="run"/>
           <contextLabel label="Build..." mode="debug"/>
           <enablement>
              <count value="1"/>
              <iterate>
                 <or>
                    <adapt type="org.eclipse.core.resources.IFile">
                       <test property="org.eclipse.core.resources.name" value="test.xml"/>
                    </adapt>
					<instanceof value="org.eclipse.core.resources.IFolder"/>
                 </or>
              </iterate>
           </enablement>
       </contextualLaunch>
     </shortcut>
     </extension>
</plugin>

Dieser funktioniert auch soweit.
Der Extension Point wird im Moment in 2 Fällen angezeigt:
1. Wenn ein Rechtsklick auf eine Datei mit dem Namen "test.xml" gemacht wird.
2. Wenn ein Rechtsklick auf irgendeinen Projekt-Ordner gemacht wird.

Den zweiten Fall möchte ich nun ausbessern,in dem der Extension Point nur aktiviert wird,wenn in dem Projekt-Ordner eine Datei mit dem Namen "test.xml" existiert.

Hier wurde das Problem von jemand anderem beschrieben,jedoch habe ich mir den PropertyTester angeschaut,bin aber trotzdem nicht ganz schlau daraus geworden.
Eclipse Community Forums: Eclipse Platform launchshortcut enablement specification
Habt ihr eine Lösung parat?
 
Hast du das hier gelesen?
Help - Eclipse SDK

Sieht für mich recht simpel aus. Eine Extension "org.eclipse.core.expressions.propertyTesters" anlegen, die befüllen, eine entsprechende Klasse referenzieren und dann diesen Property Tester verwenden. Hab es nicht ausprobiert, aber kurz angeschaut, scheint recht easy zu gehen.
 
Ja habe ich,aber habe gedacht,dass man auch ohne das implementieren einer neuen Klasse auskommt.
Aber nun gut,bleibt mir wohl nix anderes übrig.
 
Das könnte eventuell auch klappen, ich wüsste jetzt aber nicht wie. Ist ja nun keine standardmäßige Anforderung, die du hast. Dafür kannst du ja mit der Implementierung der Klasse auf alles prüfen worauf du Lust hast. 🙂
 
Habe nun ein bisschen rumexperimentiert,aber komme zu keinem besseren Ergebnis,irgendwie ignoriert er meine test() Methode einfach.

plugin.xml:
Java:
<iterate>
                 <or>
                    <adapt type="org.eclipse.core.resources.IFile">
                       <test property="org.eclipse.core.resources.name" value="test.xml"/>
                    </adapt>
                         <adapt type="org.eclipse.core.resources.IFolder">
                        <test property="org.pit.testers.containsFile"/>
                    </adapt>  
                 </or>
              </iterate>

<extension point="org.eclipse.core.expressions.propertyTesters">
    <propertyTester
      id="org.pit.FileTester"
      type="org.eclipse.core.resources.IFolder"
      namespace="org.pit.testers"
      properties="containsFile"
      class="org.pit.FilePropertyTester">
    </propertyTester>
  </extension>



Java-Klasse:

Java:
public class FilePropertyTester extends PropertyTester
{
   public static final String PROPERTY_CONTAINS_FILE = "containsFile";

   public FilePropertyTester()
   {
      // TODO Auto-generated constructor stub
   }

   @Override
   public boolean test(Object receiver, String property, Object[] args, Object expectedValue)
   {
      if (PROPERTY_CONTAINS_FILE.equals(property))
      {
         File folder = new File(((Folder) receiver).getLocation().toOSString());
         File[] elementList = folder.listFiles();
         List<String> fileList = new ArrayList<String>();

         for (File file : elementList)
         {
            fileList.add(file.getName());
         }

         if (fileList.contains("test.xml"))
         {
            return true;
         }
      }

      return false;

   }

}
 
Erstmal eine Frage - meinst du mit "Projekt-Ordner" ein Projekt oder einen Ordner? Wenn du ein Projekt meinst, dann solltest du IProject statt IFolder verwenden.

Ansonsten erstmal keine Ahnung woran das liegt, hab es mit deinem Code versucht, aber das von dir beschriebene Problem auch gehabt. Kenne mich in der Ecke aber zu wenig aus, hab auch nicht wirklich hinbekommen eine gescheite Bedingung fürs "enablement" aufzubauen, hab sowas da noch nie gemacht.
 
Also ich mein ein Ordner innerhalb eine Projektes.
Trotzdem danke für deine Mühe 🙂 Dann werde ich morgen mal weiter rumprobieren 😉
 
Das war ja wieder klar 🙂 Es lag an einer beschi***** Zeile 😉 forcePluginActivation="true"
Die Lösung
Java:
<adapt type="org.eclipse.core.resources.IFolder">
                       <test 
                      forcePluginActivation="true"
                       property="org.pit.testers.containsFile"> 
                       </test>
                    </adapt>

Hier zu finden Issue 397 - counterclockwise - File context menu misses "Run As > Clojure Application (preload file)" - Counterclockwise is an Eclipse plugin helping developers write Clojure code - Google Project Hosting
 
Ha, sehr cool, funktioniert tatsächlich. 🙂

Aber ein Verbesserungsvorschlag. In deinem FilePropertyTester prüfst du direkt
Code:
if (fileList.contains("test.xml"))
. Wieso nimmst du hier nicht
Code:
expectedValue
? Dann steht in der plugin.xml entsprechend das hier:

Code:
                    <adapt type="org.eclipse.core.resources.IFolder">
                    	<test
                             forcePluginActivation="true"
                             property="org.pit.testers.containsFile"
                             value="test.xml"> 
                       </test>
                    </adapt>

Damit kannst du diesen Tester immer wieder verwenden, wenn du prüfen willst, ob eine bestimmte Datei im Ordner vorhanden ist. Nicht nur eine "test.xml". 🙂
 

Neue Themen


Zurück
Oben