	private void doProperty(Tag tag) {
		String name = null;
		try {
			name = tag.getAttribute(ATTR_NAME);
			if (name == null) {
				IllegalArgumentException e = new IllegalArgumentException("The 'property' tag must have 'name' attribute set at line " + tag.getLine());
				Activator.log.error("[SCR] " + e.getMessage(), e);
				throw e;
			}
			String type = tag.getAttribute(ATTR_TYPE);
			int mtType;
			if (type == null || "String".equals(type)) {
				mtType = AttributeDefinition.STRING;
			} else if ("Boolean".equals(type)) {
				mtType = AttributeDefinition.BOOLEAN;
			} else if ("Integer".equals(type)) {
				mtType = AttributeDefinition.INTEGER;
			} else if ("Long".equals(type)) {
				mtType = AttributeDefinition.LONG;
			} else if ("Char".equals(type)) {
				mtType = AttributeDefinition.CHARACTER;
			} else if ("Double".equals(type)) {
				mtType = AttributeDefinition.DOUBLE;
			} else if ("Float".equals(type)) {
				mtType = AttributeDefinition.FLOAT;
			} else if ("Byte".equals(type)) {
				mtType = AttributeDefinition.BYTE;
			} else if ("Short".equals(type)) {
				mtType = AttributeDefinition.SHORT;
			} else {
				IllegalArgumentException e = new IllegalArgumentException("Illegal property type '" + type + "' on line " + tag.getLine());
				Activator.log.error("[SCR] " + e.getMessage(), e);
				throw e;
			}
			String value = tag.getAttribute(ATTR_VALUE);
			Object _value;
			if (value != null) {
				_value = makeObject(value, mtType);
			} else {
				value = tag.getContent();
				if (value == null) {
					IllegalArgumentException e = new IllegalArgumentException("The 'property' tag must have body content if 'value' attribute is not specified!");
					Activator.log.error("[SCR] " + e.getMessage(), e);
					throw e;
				}
				StringTokenizer tok = new StringTokenizer(value, "\n\r");
				Vector el = new Vector(10);
				while (tok.hasMoreTokens()) {
					String next = tok.nextToken().trim();
					if (next.length() > 0) {
						el.addElement(next);
					}
				}
				if (el.size() == 0) {
					IllegalArgumentException e = new IllegalArgumentException("The 'property' tag must have body content if 'value' attribute is not specified!");
					Activator.log.error("[SCR] " + e.getMessage(), e);
					throw e;
				}
				String[] values = new String[el.size()];
				el.copyInto(values);
				_value = makeArr(values, mtType);
			}
			if (currentComponent.properties == null) {
				currentComponent.properties = new Properties();
			}
			currentComponent.properties.put(name, _value);
		} catch (Throwable e) {
			Activator.log.error("[SCR - DeclarationParser.doProperty()] Error while processing property " + name, e);
		}
	}

	private void doProperty(Tag tag) {
		String name = null;
		try {
			name = tag.getAttribute(ATTR_NAME);
			if (name == null) {
				IllegalArgumentException e = new IllegalArgumentException("The 'property' tag must have 'name' attribute set at line " + tag.getLine());
				Activator.log.error("[SCR] " + e.getMessage(), e);
				throw e;
			}
			String type = tag.getAttribute(ATTR_TYPE);
			int mtType;
			if (type == null || "String".equals(type)) {
				mtType = AttributeDefinition.STRING;
			} else if ("Boolean".equals(type)) {
				mtType = AttributeDefinition.BOOLEAN;
			} else if ("Integer".equals(type)) {
				mtType = AttributeDefinition.INTEGER;
			} else if ("Long".equals(type)) {
				mtType = AttributeDefinition.LONG;
			} else if ("Char".equals(type) || "Character".equals(type)) {
				mtType = AttributeDefinition.CHARACTER;
			} else if ("Double".equals(type)) {
				mtType = AttributeDefinition.DOUBLE;
			} else if ("Float".equals(type)) {
				mtType = AttributeDefinition.FLOAT;
			} else if ("Byte".equals(type)) {
				mtType = AttributeDefinition.BYTE;
			} else if ("Short".equals(type)) {
				mtType = AttributeDefinition.SHORT;
			} else {
				IllegalArgumentException e = new IllegalArgumentException("Illegal property type '" + type + "' on line " + tag.getLine());
				Activator.log.error("[SCR] " + e.getMessage(), e);
				throw e;
			}
			String value = tag.getAttribute(ATTR_VALUE);
			Object _value;
			if (value != null) {
				_value = makeObject(value, mtType);
			} else {
				value = tag.getContent();
				if (value == null) {
					IllegalArgumentException e = new IllegalArgumentException("The 'property' tag must have body content if 'value' attribute is not specified!");
					Activator.log.error("[SCR] " + e.getMessage(), e);
					throw e;
				}
				StringTokenizer tok = new StringTokenizer(value, "\n\r");
				Vector el = new Vector(10);
				while (tok.hasMoreTokens()) {
					String next = tok.nextToken().trim();
					if (next.length() > 0) {
						el.addElement(next);
					}
				}
				if (el.size() == 0) {
					IllegalArgumentException e = new IllegalArgumentException("The 'property' tag must have body content if 'value' attribute is not specified!");
					Activator.log.error("[SCR] " + e.getMessage(), e);
					throw e;
				}
				String[] values = new String[el.size()];
				el.copyInto(values);
				_value = makeArr(values, mtType);
			}
			if (currentComponent.properties == null) {
				currentComponent.properties = new Properties();
			}
			currentComponent.properties.put(name, _value);
		} catch (Throwable e) {
			Activator.log.error("[SCR - DeclarationParser.doProperty()] Error while processing property " + name, e);
		}
	}
