/////////////////////////////////////////////////////////////////////////////
//
// Project ProjectForge Community Edition
// www.projectforge.org
//
// Copyright (C) 2001-2014 Kai Reinhard (k.reinhard@micromata.de)
//
// ProjectForge is dual-licensed.
//
// This community edition is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as published
// by the Free Software Foundation; version 3 of the License.
//
// This community edition is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
// Public License for more details.
//
// You should have received a copy of the GNU General Public License along
// with this program; if not, see http://www.gnu.org/licenses/.
//
/////////////////////////////////////////////////////////////////////////////
package org.projectforge.web.address;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import net.fortuna.ical4j.model.ValidationException;
import net.fortuna.ical4j.vcard.Group;
import net.fortuna.ical4j.vcard.Parameter;
import net.fortuna.ical4j.vcard.Property;
import net.fortuna.ical4j.vcard.Property.Id;
import org.apache.commons.lang.StringUtils;
/**
* Handle vCard item entries.<br />
* {@link net.fortuna.ical4j.vcard} is not possible to handle item elements.
*
* @author Maximilian Lauterbach (m.lauterbach@micromata.de)
*
*/
public class VCardItemElementHandler
{
private final ArrayList<Property> itemList;
public VCardItemElementHandler(final FileInputStream fis){
final DataInputStream in = new DataInputStream(fis);
final BufferedReader br = new BufferedReader(new InputStreamReader(in));
itemList = new ArrayList<Property>();
//Read File Line By Line
try {
String strLine;
while ((strLine = br.readLine()) != null) {
// looking for a item entry
if (strLine.startsWith("item") && !strLine.contains("X-AB")) {
// dissect the line by char
final String str[] = StringUtils.splitByCharacterType(strLine);
/*
* ignore "item" + "number" + "." (example: "item2.") cause is not needed.
* at index = 3 is the GroupId
*/
final int n = 3;
// set Property.Id
final Id id = getItemId(str[n]);
final ArrayList<Parameter> param = new ArrayList<Parameter>();
boolean startSignFound = false;
String valueCache = "";
for (int i = n; i < str.length; i++){
// looking for parameters
if (str[i].equals("WORK") || str[i].equals("HOME")){
param.add(getParameter(str[i]));
}
/*
* looking for start sign.
* usually ":" but sometimes addresses starts with ":;;"
*/
if (str[i].equals(":;;") || str[i].equals(":") || str[i].equals(":;") && !startSignFound){
startSignFound = true;
} else
if (startSignFound) {
// terminate unwanted signs.
if(str[i].equals(";") || str[i].equals(";;") || str[i].equals(".;"))
valueCache = valueCache + ";";
else
valueCache = valueCache + str[i];
}
}
final String finalValue = valueCache;
// set property with group at index = 3
@SuppressWarnings("serial")
final Property property = new Property(new Group(str[n]), id, param) {
@Override
public void validate() throws ValidationException
{
}
@Override
public String getValue()
{
return finalValue;
}
};
itemList.add(property);
}
}
// for (final Property p : itemList){
// System.out.println("propterty val: " + p.getValue() + " ;;; id: " + p.getId() + " ;;; parameter: " + p.getParameters(Parameter.Id.TYPE));
// }
in.close();
} catch (final IOException ex) {
// log.fatal("Exception encountered " + ex, ex);
}
}
/**
* Get list of "item" elements as {@link net.fortuna.ical4j.vcard.Property}
*
* @return ArrayList<Property>
*/
public ArrayList<Property> getItemList(){
return itemList;
}
/**
* @param parameter
* @return
*/
@SuppressWarnings("serial")
private Parameter getParameter(final String param)
{
return new Parameter(Parameter.Id.TYPE) {
@Override
public String getValue()
{
return param;
}
};
}
/**
* @param string
* @return
*/
private Id getItemId(final String string)
{
Id found = null;
for (final Id id : Id.values())
if(id.toString().equals(string)){
found = id;
break;
}
return found;
}
}