# ical4j Parser



## fStein (24. Feb 2011)

Hallo Leutz
Ich habe folgendes Problem: Ich versuche ein Programm zu bauen, dass mir zwischen zwei Daten alle tage und die Arbeitstage ausgibt. was ich nun schon hinbekommen habe ist ein Programm, welches die Differenz zwischen den Daten ausgibt und man per check-box an klicken kann an welchen tagen der Woche man arbeitet. nun sollte dieses Programm aber natürlich noch Feiertage einbeziehen am schönsten per Drop box für alle verschiedenen Bundesländer. nun habe ich eine ical Datei gefunden mit den Feiertagen bis 2015. das ist ja auch super nur verstehe ich nicht, wie ich jetzt diesen Parser verwenden kann. im Grunde brauche ich ja nur, dass er mir zu einem datum sagt per boolean. ist Feiertag oder ist nicht. und mit der Doku komm ich ehrlich gesagt nicht so zurecht.
Wäre cool, wenn mir jemand hier helfen könnt. 
Liebe Grüße
FStein


----------



## MarderFahrer (25. Feb 2011)

Ist eigentlich recht einfach. Den Kalendar einlesen, die Komponenten holen und dann darüber iterieren, um die Datums von den Feiertagen zu finden.
Ein schnelles Beispiel mit den Feiertagen von Australien aus den Samples:

```
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Iterator;

import net.fortuna.ical4j.data.CalendarBuilder;
import net.fortuna.ical4j.data.ParserException;
import net.fortuna.ical4j.model.Calendar;
import net.fortuna.ical4j.model.Component;
import net.fortuna.ical4j.model.ComponentList;
import net.fortuna.ical4j.model.Property;
import net.fortuna.ical4j.model.PropertyList;

public class Test {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		FileInputStream fin;

		try {
			fin = new FileInputStream("Australian32Holidays.ics");

			CalendarBuilder builder = new CalendarBuilder();

			Calendar calendar = builder.build(fin);

			ComponentList liste = calendar.getComponents();
			Iterator<Component> itr = liste.iterator();

			while (itr.hasNext()) {
				Component component = itr.next();

				Property pro = component.getProperty("DTSTART");
				if (pro != null) {
					System.out.println("Feiertag beginnt am: " + pro.getValue());
				}

			}
		} catch (FileNotFoundException e1) {
			e1.printStackTrace();
		} catch (IOException e2) {
			e2.printStackTrace();
		} catch (ParserException e3) {
			e3.printStackTrace();
		}

	}

}
```

BTW, ich hab keine Ahnung warum in der Datei nur 11 Events drin sind wenn Sie "Australian32Holidays" heißt. Aber was solls. Ausgabe davon ist dann:

```
Feiertag beginnt am: 20020126
Feiertag beginnt am: 20020329
Feiertag beginnt am: 20020401
Feiertag beginnt am: 20020425
Feiertag beginnt am: 20020610
Feiertag beginnt am: 20021225
Feiertag beginnt am: 20021226
Feiertag beginnt am: 20030418
Feiertag beginnt am: 20030421
Feiertag beginnt am: 20030609
Feiertag beginnt am: 20020101
```

Jetzt musst du also nur noch dein Datum auf dieses Format bringen oder umgekehr, um zu vergleichen ob an der Tag mit in die Rechnung muss oder nicht.


----------



## fStein (2. Mrz 2011)

cool echt vielen dank, das hilft mir enorm weiter.
Lg
FStein


----------



## fStein (2. Mrz 2011)

Ich habe jetzt den Code mal in nem test system laufenlassen um besser zu verstehen, wass er tut, leide bekomme ich folgende fehlermeldung:

```
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
	at net.fortuna.ical4j.util.Configurator.<clinit>(Configurator.java:51)
	at net.fortuna.ical4j.data.CalendarParserFactory.<clinit>(CalendarParserFactory.java:62)
	at net.fortuna.ical4j.data.CalendarBuilder.<init>(CalendarBuilder.java:123)
	at fStein.ICALtest.Test.main(Test.java:30)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
	at java.net.URLClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 4 more
```
 kann mir einer sagen warum. alle klassen, die ich benutze habe ich doch eingebunden. er zeigt mir auch nicht, dass noch irgendwelche imports fehlen. funktionieren die .net imports einfach nicht?


----------



## HoaX (2. Mrz 2011)

ical4j hat eben Abhängigkeiten, u.A. zu Apache Commons Logging, wie man der Meldung entnehmen kann. Die nötigen Libs liegen doch alle im Zip mit drinnen?!


----------



## fStein (2. Mrz 2011)

ich habe jetzt nochmal alles neu aufgesetzt und die zip datei neu eingebunden. keine ahnung, was beim ersten mal schief ging, aber ejtzt geht es soweit bis auf diese importierung hier

```
02.03.2011 09:57:17 net.fortuna.ical4j.util.Configurator <clinit>
INFO: ical4j.properties not found.
```
das heißt doch wenn ich nicht völlig fgalsch liege, dass die angegebene lib sich nicht in der zip datei befindet. wo bekomm ich denn jetzt angegeben lib her?


----------



## HoaX (2. Mrz 2011)

Das ist keine Fehlermeldung sondern eine Logausgabe mit Loglevel INFO. Mittels der log4j.properties-Datei kannst du den Logger konfigurieren. Schau dazu einfach mal auf die Webseite zu log4j oder google, da gibts massig Beispiele, ist relativ einfach und nützlich.


----------



## fStein (2. Mrz 2011)

Ok vielen dank, das ist also kein bug sondern ein feauture^^.
dann test ich mal etwas rum und meld mich nochmal wenns tut


----------

