code: public void writeProperty(String propertyName, ICalParameters parameters, ICalDataType dataType, JCalValue value) throws IOException {
  		if (stack.isEmpty()) {
  			throw new IllegalStateException(Messages.INSTANCE.getExceptionMessage(2));
  		}
  		if (componentEnded) {
  			throw new IllegalStateException(Messages.INSTANCE.getExceptionMessage(3));
  		}
  
  		generator.setCurrentValue(JCalPrettyPrinter.PROPERTY_VALUE);
  
  		generator.writeStartArray();
  
  		//write the property name
  		generator.writeString(propertyName);
  
  		//write parameters
  		generator.writeStartObject();
  		for (Map.Entry<String, List<String>> entry : parameters) {
  			String name = entry.getKey().toLowerCase();
  			List<String> values = entry.getValue();
  			if (values.isEmpty()) {
  				continue;
  			}
  
  			if (values.size() == 1) {
  				generator.writeStringField(name, values.get(0));
  			} else {
  				generator.writeArrayFieldStart(name);
  				for (String paramValue : values) {
  					generator.writeString(paramValue);
  				}
  				generator.writeEndArray();
  			}
  		}
  		generator.writeEndObject();
  
  		//write data type
  		generator.writeString((dataType == null) ? "unknown" : dataType.getName().toLowerCase());
  
  		//write value
  		for (JsonValue jsonValue : value.getValues()) {
  			writeValue(jsonValue);
  		}
  
  		generator.writeEndArray();
  
  		generator.setCurrentValue(null);
  	}
docs: Writes a property to the current component.
  @param propertyName the property name (e.g. "version")
  @param parameters the parameters
  @param dataType the property's data type (e.g. "text")
  @param value the property value
  @throws IllegalStateException if there are no open components (
  {@link #writeStartComponent(String)} must be called first) or if the last
  method called was {@link #writeEndComponent()}.
  @throws IOException if there's an I/O problem