private RequirementElement parseReqElementInfo(List<String> factors) {
		/*
		 * this part is exclusively for requirement elements 0)notation,element;
		 * 1)id,51670; 2)shape,Hexagon; 3)name,Calculate price;
		 * 4)layer,Business; 5)thickness, 1.0; 6)double stroke; 7)size:
		 * 117.945899963379 43.817626953125; 8)no fill; 9)0.0 corner radius 10)
		 * stroke pattern: 0 11) origin: 87.234039306641 1084.06665039062 
		 * 12) owner: xx 13) Canvas, Model
		 */
		//TODO: pre-process all numbers fields, don't know why so far...
		factors.set(5, factors.get(5).replaceAll(",", "."));
		factors.set(7, factors.get(7).replaceAll(",", "."));
		factors.set(9, factors.get(9).replaceAll(",", "."));
		factors.set(11, factors.get(11).replaceAll(",", "."));
		
		
		RequirementElement new_elem;
		//security goals
		if (factors.get(3).startsWith("(S)") & factors.get(2).equals("Cloud")) {
			new_elem = new SecurityGoal();
			new_elem.setId(factors.get(1));
			new_elem.setType(InfoEnum.RequirementElementType.SECURITY_GOAL.name());

			String sg_name = factors.get(3);
			// remove"(S)" at the first beginning
			sg_name = sg_name.replaceAll("\\(S\\)", "");

			new_elem.setName(sg_name.trim());
			new_elem.setLayer(factors.get(4));
			// get value for security-specific attributes
			if (Float.valueOf(factors.get(5)) > 1) {
				((SecurityGoal) new_elem).setCriticality(true);
				;
			} else {
				((SecurityGoal) new_elem).setCriticality(false);
				;
			}
			//this value can be useful in the following analysis 
			new_elem.owner_text=factors.get(12);
			((SecurityGoal) new_elem).extractInfoFromName();
		}
		//actors
		else if (checkCircle(factors.get(7))) {
			new_elem = new Actor();
			new_elem.setId(factors.get(1));
			new_elem.setName(factors.get(3));
			new_elem.setLayer(factors.get(4));
			new_elem.setType(InfoEnum.RequirementElementType.ACTOR.name());
		}
		//all others
		else {
			new_elem = new RequirementElement();
			new_elem.setId(factors.get(1));
			if (factors.get(3).startsWith("(S)") & factors.get(2).equals("Hexagon")) {
				new_elem.setType(InfoEnum.RequirementElementType.SECURITY_MECHANISM.name());
			} else if (factors.get(3).equals("empty") & factors.get(2).equals("Circle") & factors.get(10).equals("0")) {
				new_elem.setType(InfoEnum.RequirementElementType.MIDDLE_POINT.name());
				// new_elem.setRemark(InfoEnum.ElementRemark.REFINEUM.name());
			} else if (factors.get(3).equals("empty") & factors.get(2).equals("Circle") & factors.get(10).equals("1")) {
				new_elem.setType(InfoEnum.RequirementElementType.ACTOR_BOUNDARY.name());
				new_elem.setRemark(InfoEnum.ElementRemark.BOUNDARY.name());
			} else if (factors.get(2).equals("AndGate")
					|| (factors.get(2).equals("Rectangle") & factors.get(9).equals("0.0"))) {//Why rectangle?
				new_elem.setType(InfoEnum.RequirementElementType.LABEL.name());
			} else {
				new_elem.setType(InfoEnum.req_elem_type_map.get(factors.get(2)));
			}

			if (factors.get(3).startsWith("(S)")) {
				String sm_name = factors.get(3);
				// remove"(S)" at the first beginning
				sm_name = sm_name.replaceAll("\\(S\\)", "");
				new_elem.setName(sm_name.trim());
			} else {
				new_elem.setName(factors.get(3));
			}
			new_elem.setLayer(factors.get(4));
		}

		// The layout related information is applicable for all types of elements
		String[] temp = factors.get(7).split(" ");
		new_elem.width = Double.parseDouble(temp[0]);
		new_elem.height = Double.parseDouble(temp[1]);
		String[] temp2 = factors.get(11).split(" ");
		new_elem.origin_x = Double.parseDouble(temp2[0]);
		new_elem.origin_y = Double.parseDouble(temp2[1]);

		return new_elem;
	}