# Prüfen ob eine Datei im Projektordner existiert



## maestr0 (14. Aug 2012)

Hallo,

ich habe einen extension-Point...

```
<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?


----------



## Gonzo17 (14. Aug 2012)

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.


----------



## maestr0 (14. Aug 2012)

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.


----------



## Gonzo17 (14. Aug 2012)

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.


----------



## maestr0 (14. Aug 2012)

Habe nun ein bisschen rumexperimentiert,aber komme zu keinem besseren Ergebnis,irgendwie ignoriert er meine test() Methode einfach.

plugin.xml:

```
<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:


```
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;

   }

}
```


----------



## Gonzo17 (14. Aug 2012)

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.


----------



## maestr0 (14. Aug 2012)

Also ich mein ein Ordner innerhalb eine Projektes.
Trotzdem danke für deine Mühe  Dann werde ich morgen mal weiter rumprobieren


----------



## maestr0 (15. Aug 2012)

Das war ja wieder klar  Es lag an einer beschi***** Zeile  *forcePluginActivation="true"*
Die Lösung 
	
	
	
	





```
<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


----------



## Gonzo17 (16. Aug 2012)

Ha, sehr cool, funktioniert tatsächlich. 

Aber ein Verbesserungsvorschlag. In deinem FilePropertyTester prüfst du direkt 
	
	
	
	





```
if (fileList.contains("test.xml"))
```
. Wieso nimmst du hier nicht 
	
	
	
	





```
expectedValue
```
? Dann steht in der plugin.xml entsprechend das hier:


```
<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".


----------



## maestr0 (16. Aug 2012)

Danke werde ich verbessern!


----------

