/*
* $Id $
*
* [05-Apr-2004]
*
* Copyright (c) 2004, Ben Fortuna
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* o Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* o Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* o Neither the name of Ben Fortuna nor the names of any other contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package net.fortuna.ical4j.model;
import java.net.URISyntaxException;
import java.util.HashMap;
import java.util.Map;
import net.fortuna.ical4j.model.parameter.AltRep;
import net.fortuna.ical4j.model.parameter.Cn;
import net.fortuna.ical4j.model.parameter.CuType;
import net.fortuna.ical4j.model.parameter.DelegatedFrom;
import net.fortuna.ical4j.model.parameter.DelegatedTo;
import net.fortuna.ical4j.model.parameter.Dir;
import net.fortuna.ical4j.model.parameter.Encoding;
import net.fortuna.ical4j.model.parameter.FbType;
import net.fortuna.ical4j.model.parameter.FmtType;
import net.fortuna.ical4j.model.parameter.Language;
import net.fortuna.ical4j.model.parameter.Member;
import net.fortuna.ical4j.model.parameter.PartStat;
import net.fortuna.ical4j.model.parameter.Range;
import net.fortuna.ical4j.model.parameter.RelType;
import net.fortuna.ical4j.model.parameter.Related;
import net.fortuna.ical4j.model.parameter.Role;
import net.fortuna.ical4j.model.parameter.Rsvp;
import net.fortuna.ical4j.model.parameter.SentBy;
import net.fortuna.ical4j.model.parameter.TzId;
import net.fortuna.ical4j.model.parameter.Value;
import net.fortuna.ical4j.model.parameter.XParameter;
/**
* A factory for creating iCalendar parameters.
*
* @author Ben Fortuna
*/
public final class ParameterFactoryImpl implements ParameterFactory {
private static ParameterFactoryImpl instance = new ParameterFactoryImpl();
private Map factories;
/**
* Constructor made private to prevent instantiation.
*/
private ParameterFactoryImpl() {
factories = new HashMap();
factories.put(Parameter.ALTREP, createAltRepFactory());
factories.put(Parameter.CN, createCnFactory());
factories.put(Parameter.CUTYPE, createCuTypeFactory());
factories.put(Parameter.DELEGATED_FROM, createDelegatedFromFactory());
factories.put(Parameter.DELEGATED_TO, createDelegatedToFactory());
factories.put(Parameter.DIR, createDirFactory());
factories.put(Parameter.ENCODING, createEncodingFactory());
factories.put(Parameter.FMTTYPE, createFmtTypeFactory());
factories.put(Parameter.FBTYPE, createFbTypeFactory());
factories.put(Parameter.LANGUAGE, createLanguageFactory());
factories.put(Parameter.MEMBER, createMemberFactory());
factories.put(Parameter.PARTSTAT, createPartStatFactory());
factories.put(Parameter.RANGE, createRangeFactory());
factories.put(Parameter.RELATED, createRelatedFactory());
factories.put(Parameter.RELTYPE, createRelTypeFactory());
factories.put(Parameter.ROLE, createRoleFactory());
factories.put(Parameter.RSVP, createRsvpFactory());
factories.put(Parameter.SENT_BY, createSentByFactory());
factories.put(Parameter.TZID, createTzIdFactory());
factories.put(Parameter.VALUE, createValueFactory());
}
/**
* @return
*/
private ParameterFactory createAltRepFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value) throws URISyntaxException {
return new AltRep(value);
}
};
}
/**
* @return
*/
private ParameterFactory createCnFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new Cn(value);
}
};
}
/**
* @return
*/
private ParameterFactory createCuTypeFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
CuType parameter = new CuType(value);
if (CuType.INDIVIDUAL.equals(parameter)) {
return CuType.INDIVIDUAL;
}
else if (CuType.GROUP.equals(parameter)) {
return CuType.GROUP;
}
else if (CuType.RESOURCE.equals(parameter)) {
return CuType.RESOURCE;
}
else if (CuType.ROOM.equals(parameter)) {
return CuType.ROOM;
}
else if (CuType.UNKNOWN.equals(parameter)) {
return CuType.UNKNOWN;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createDelegatedFromFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new DelegatedFrom(value);
}
};
}
/**
* @return
*/
private ParameterFactory createDelegatedToFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new DelegatedTo(value);
}
};
}
/**
* @return
*/
private ParameterFactory createDirFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new Dir(value);
}
};
}
/**
* @return
*/
private ParameterFactory createEncodingFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
Encoding parameter = new Encoding(value);
if (Encoding.EIGHT_BIT.equals(parameter)) {
return Encoding.EIGHT_BIT;
}
else if (Encoding.BASE64.equals(parameter)) {
return Encoding.BASE64;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createFmtTypeFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new FmtType(value);
}
};
}
/**
* @return
*/
private ParameterFactory createFbTypeFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
FbType parameter = new FbType(value);
if (FbType.FREE.equals(parameter)) {
return FbType.FREE;
}
else if (FbType.BUSY.equals(parameter)) {
return FbType.BUSY;
}
else if (FbType.BUSY_TENTATIVE.equals(parameter)) {
return FbType.BUSY_TENTATIVE;
}
else if (FbType.BUSY_UNAVAILABLE.equals(parameter)) {
return FbType.BUSY_UNAVAILABLE;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createLanguageFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new Language(value);
}
};
}
/**
* @return
*/
private ParameterFactory createMemberFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new Member(value);
}
};
}
/**
* @return
*/
private ParameterFactory createPartStatFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
PartStat parameter = new PartStat(value);
if (PartStat.NEEDS_ACTION.equals(parameter)) {
return PartStat.NEEDS_ACTION;
}
else if (PartStat.ACCEPTED.equals(parameter)) {
return PartStat.ACCEPTED;
}
else if (PartStat.DECLINED.equals(parameter)) {
return PartStat.DECLINED;
}
else if (PartStat.TENTATIVE.equals(parameter)) {
return PartStat.TENTATIVE;
}
else if (PartStat.DELEGATED.equals(parameter)) {
return PartStat.DELEGATED;
}
else if (PartStat.COMPLETED.equals(parameter)) {
return PartStat.COMPLETED;
}
else if (PartStat.IN_PROCESS.equals(parameter)) {
return PartStat.IN_PROCESS;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createRangeFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
Range parameter = new Range(value);
if (Range.THISANDFUTURE.equals(parameter)) {
return Range.THISANDFUTURE;
}
else if (Range.THISANDPRIOR.equals(parameter)) {
return Range.THISANDPRIOR;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createRelatedFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
Related parameter = new Related(value);
if (Related.START.equals(parameter)) {
return Related.START;
}
else if (Related.END.equals(parameter)) {
return Related.END;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createRelTypeFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
RelType parameter = new RelType(value);
if (RelType.PARENT.equals(parameter)) {
return RelType.PARENT;
}
else if (RelType.CHILD.equals(parameter)) {
return RelType.CHILD;
}
if (RelType.SIBLING.equals(parameter)) {
return RelType.SIBLING;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createRoleFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
Role parameter = new Role(value);
if (Role.CHAIR.equals(parameter)) {
return Role.CHAIR;
}
else if (Role.REQ_PARTICIPANT.equals(parameter)) {
return Role.REQ_PARTICIPANT;
}
else if (Role.OPT_PARTICIPANT.equals(parameter)) {
return Role.OPT_PARTICIPANT;
}
else if (Role.NON_PARTICIPANT.equals(parameter)) {
return Role.NON_PARTICIPANT;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createRsvpFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
Rsvp parameter = new Rsvp(value);
if (Rsvp.TRUE.equals(parameter)) {
return Rsvp.TRUE;
}
else if (Rsvp.FALSE.equals(parameter)) {
return Rsvp.FALSE;
}
return parameter;
}
};
}
/**
* @return
*/
private ParameterFactory createSentByFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new SentBy(value);
}
};
}
/**
* @return
*/
private ParameterFactory createTzIdFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
return new TzId(value);
}
};
}
/**
* @return
*/
private ParameterFactory createValueFactory() {
return new ParameterFactory() {
/* (non-Javadoc)
* @see net.fortuna.ical4j.model.ParameterFactory#createParameter(java.lang.String, java.lang.String)
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
Value parameter = new Value(value);
if (Value.BINARY.equals(parameter)) {
return Value.BINARY;
}
else if (Value.BOOLEAN.equals(parameter)) {
return Value.BOOLEAN;
}
else if (Value.CAL_ADDRESS.equals(parameter)) {
return Value.CAL_ADDRESS;
}
else if (Value.DATE.equals(parameter)) {
return Value.DATE;
}
else if (Value.DATE_TIME.equals(parameter)) {
return Value.DATE_TIME;
}
else if (Value.DURATION.equals(parameter)) {
return Value.DURATION;
}
else if (Value.FLOAT.equals(parameter)) {
return Value.FLOAT;
}
else if (Value.INTEGER.equals(parameter)) {
return Value.INTEGER;
}
else if (Value.PERIOD.equals(parameter)) {
return Value.PERIOD;
}
else if (Value.RECUR.equals(parameter)) {
return Value.RECUR;
}
else if (Value.TEXT.equals(parameter)) {
return Value.TEXT;
}
else if (Value.TIME.equals(parameter)) {
return Value.TIME;
}
else if (Value.URI.equals(parameter)) {
return Value.URI;
}
else if (Value.UTC_OFFSET.equals(parameter)) {
return Value.UTC_OFFSET;
}
return parameter;
}
};
}
/**
* @return Returns the instance.
*/
public static ParameterFactoryImpl getInstance() {
return instance;
}
/**
* Creates a parameter.
*
* @param name
* name of the parameter
* @param value
* a parameter value
* @return a component
* @throws URISyntaxException thrown when the specified string
* is not a valid representation of a URI for selected parameters
*/
public Parameter createParameter(final String name, final String value)
throws URISyntaxException {
ParameterFactory factory = (ParameterFactory) factories.get(name);
if (factory != null) {
return factory.createParameter(name, value);
}
else if (isExperimentalName(name)) {
return new XParameter(name, value);
}
else {
throw new IllegalArgumentException("Invalid parameter name: " + name);
}
}
/**
* @param name
* @return
*/
private boolean isExperimentalName(final String name) {
return name.startsWith(Parameter.EXPERIMENTAL_PREFIX)
&& name.length() > Parameter.EXPERIMENTAL_PREFIX.length();
}
}