package parser.ServletParser.library;

import java.io.*;
/** 이 클래스는 특정 데이타 멤버에 대한 정보를 관리한다.
 */
public final
class AttributeInfoNode extends Object implements Serializable
{
	/** 버전 제어를 위한 시리얼 넘버이다.
	 */
	public static final long serialVersionUID = 7341857486924461013L;
	/** 데이터 멤버의 이름이며 키로 사용될 수 있다.
	 */
    private String _name;
	/** 스트링인 경우의 값(evaluation 용)
	 */
	private String _strValue;
	/** 데이터 멤버의 타입이다.
	 */
    private String _type;
 	/** 멤버의 가시성을 나타낸다.
	 */
	private String _visibility;
	/** 데이터 멤버의 초기값이다.
	 */
	private String _defaultValue;
	/** UML 스타일의 스트링이다.
	 */
	private String _umlString;
	/** UML 스타일의 스트링이다.
	 */
	private String _javaString;
	/** modifier 스트링을 저장한다.
	 */
    private String _modifierString;
	/** 생성자이다.
	 */
    public AttributeInfoNode(String name) {
		_name = new String(name);
		_strValue = "";
		_type = "";
		_visibility = "";
		_defaultValue = "";
		_umlString = "";
		_modifierString = "";
		_javaString = "";
    }
	/** 데이터 멤버 _name에 대한 write access 함수이다.
	 */
	public void setName(String val) {
		_name = new String(val);
	}
	/** 데이터 멤버 _name에 대한 read access 함수이다.
	 */
	public String getName() {
		return _name;
	}
	/** 데이터 멤버 _name에 대한 read access 함수이다.
	 */
	public String getAttributeName() {
		return getName();
	}
	/** 데이터 멤버 _strValue에 대한 write access 함수이다.
	 */
	public void setStrValue(String val) {
		_strValue = new String(val);
	}
	/** 데이터 멤버 _strValue에 대한 read access 함수이다.
	 */
	public String getStrValue() {
		return _strValue;
	}
	/** 데이터 멤버 _type에 대한 write access 함수이다.
	 */
	public void setType(String val) {
		_type = new String(val);
	}
	/** 데이터 멤버 _type에 대한 read access 함수이다.
	 */
	public String getType() {
		return _type;
	}
	/** 데이터 멤버 _type에 대한 read access 함수이다.
	 */
	public String getAttributeType() {
		return getType();
	}
	/** 데이터 멤버 _visibility에 대한 write access 함수이다.
	 */
	public void setVisibility(String modifierString) {
		if (modifierString == null) {
			_visibility = "+";
		} else if (modifierString.length() > 0) {
			char vis = modifierString.charAt(0);
			if (vis == '+') {
				_visibility = "+";
			} else if (vis == '#') {
				_visibility = "#";
			} else if (vis == '-') {
				_visibility = "-";
			}
		}
	}
	/** 데이터 멤버 _visibility에 대한 read access 함수이다.
	 */
	public String getVisibility() {
		return _visibility;
	}
	/** 데이터 멤버 _visibility에 대한 read access 함수이다. ("","public","private","protected")
	 */
	public String getAccessSpecifier() {
		if (_visibility != null && _visibility.length() > 0) {
			if (_visibility.equals("+")) {
				return new String("public"); 
			} else if (_visibility.equals("#")) {
				return new String("protected"); 
			} else if (_visibility.equals("-")) {
				return new String("private"); 
			}
		}
		return new String(""); // default visibility
	}
	/** 데이터 멤버 _defaultValue에 대한 write access 함수이다.
	 */
	public void setDefaultValue(String val) {
		if (val == null) {
			_defaultValue = "";
		} else {
			_defaultValue = new String(val);
			/*
			if (_type.equals("String") ||
				_type.equals("java.lang.String")) {
				_strValue = new String(val);
			}
			// 반드시 스트링 타입이 아니더라도 연결될 때 스트링이 될 수 있기 때문에 ...
			*/
			_strValue = new String(val);
		}
	}
	/** 데이터 멤버 _defaultValue에 대한 read access 함수이다.
	 */
	public String getDefaultValue() {
		return _defaultValue;
	}
	/** UML 스타일의 스트링을 만드는 함수이다.
	 */
	public void makeUMLString() {
		_umlString = new String("");
		if (_visibility != null && _visibility.length() > 0) {
			_umlString = _umlString + _visibility;
		}
		_umlString = _umlString + _name;
		if (_type != null && _type.length() > 0) {
			_umlString = _umlString + ":" + _type;
		}
		if (_defaultValue != null && _defaultValue.length() > 0) {
			_umlString = _umlString + "=" + _defaultValue;
		}
		// modifier에 대한 처리 필요함: ETRI와 연락후에 ...
		// ...
		makeJavaString();
	}
	/** 데이터 멤버 _umlString에 대한 read access 함수이다.
	 */
	public String getUMLString() {
		return _umlString;
	}
	/** Java 스타일의 스트링을 만드는 함수이다.
	 */
	public void makeJavaString() {
		_javaString = new String("");
		if (_visibility != null && _visibility.length() > 0) {
			if (_visibility.equals("+")) {
				_javaString = "public ";
			} else if (_visibility.equals("#")) {
				_javaString = "protected ";
			} else if (_visibility.equals("-")) {
				_javaString = "private ";
			}
		}
		if (_modifierString != null && _modifierString.length() > 0) {
			_javaString = _javaString + _modifierString + " ";
		}
		if (_type != null && _type.length() > 0) {
			_javaString = _javaString + _type + " ";
		}
		_javaString = _javaString + _name;
		if (_defaultValue != null && _defaultValue.length() > 0) {
			_javaString = _javaString + " = " + _defaultValue;
		}
	}
	/** 데이터 멤버 _javaString에 대한 read access 함수이다.
	 */
	public String getJavaString() {
		return _javaString;
	}
	/** 데이터 멤버 _modifierString에 대한 write access 함수이다.
	 */
	public void setModifierString(String val) {
		if (val == null) {
			_modifierString = "";
		} else if (val.length() <= 1) {
			_modifierString = "";
		} else if (val.length() > 1) {
			char vis = val.charAt(0);
			if (vis == '+' || vis == '#' || vis == '-') {
				_modifierString = new String(val.substring(2));
			} else {
				_modifierString = new String(val);
			}
		}
	}
	/** 데이터 멤버 _modifierString에 대한 read access 함수이다.
	 */
	public String getModifierString() {
		return _modifierString;
	}
	/** 이 데이터 멤버가 배열형인가를 확인하는 함수이다.
	 */
	public boolean isArrayType() {
		if (_name.endsWith("[]") ||
			_type.endsWith("[]")) {
			return true;
		}
		return false;
	}
	/** 멤버가 정적인가를 확인하는 함수이다.
	 */
	public boolean isStaticFinal() {
		if (_modifierString.indexOf("static") >= 0 && _modifierString.indexOf("final") >= 0) return true;
		return false;
	}
}
