001: /*
002: * Copyright 20062-007 Luca Garulli (luca.garulli@assetdata.it)
003: *
004: * Licensed under the Apache License, Version 2.0 (the "License");
005: * you may not use this file except in compliance with the License.
006: * You may obtain a copy of the License at
007: *
008: * http://www.apache.org/licenses/LICENSE-2.0
009: *
010: * Unless required by applicable law or agreed to in writing, software
011: * distributed under the License is distributed on an "AS IS" BASIS,
012: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013: * See the License for the specific language governing permissions and
014: * limitations under the License.
015: */
016:
017: package org.romaframework.core.util;
018:
019: import java.io.Serializable;
020: import java.util.HashMap;
021: import java.util.Map;
022:
023: import org.apache.commons.logging.Log;
024: import org.apache.commons.logging.LogFactory;
025:
026: /**
027: * Dynamic Bean. Acts in two ways:
028: * <li> Dynamic mode, you can get/set attributes without define them before. It
029: * works like an HashMap.</li>
030: * <li> Static mode, you had to define the attributes before to get/set them.</li>
031: *
032: * @author Luca Garulli (luca.garulli@assetdata.it)
033: */
034: public class DynaBean implements Cloneable, Serializable {
035:
036: private Map<String, Object> properties;
037: private boolean staticMode;
038: private static Log log = LogFactory.getLog(DynaBean.class);
039:
040: public DynaBean() {
041: this (true);
042: }
043:
044: public DynaBean(boolean iStaticMode) {
045: staticMode = iStaticMode;
046: properties = new HashMap<String, Object>();
047: }
048:
049: /**
050: * Define a new attribute with the default value
051: *
052: * @param iName
053: * Attribute name
054: * @param iDefaultValue
055: * Default attribute value
056: */
057: public void defineAttribute(String iName, Object iDefaultValue) {
058: if (staticMode && properties.containsKey(iName))
059: throw new DynaBeanException("Attribute " + iName
060: + " is already defined for object "
061: + getClass().getSimpleName());
062: properties.put(iName, iDefaultValue);
063: }
064:
065: public void setAttribute(String iName, Object iNewValue) {
066: checkIfExists(iName);
067: Object oldValue = properties.get(iName);
068:
069: if (iNewValue == null && oldValue == null)
070: // NO CHANGES
071: return;
072: if (iNewValue != null && oldValue != null)
073: if (iNewValue.equals(oldValue))
074: // NO CHANGES
075: return;
076:
077: properties.put(iName, iNewValue);
078:
079: if (log.isDebugEnabled())
080: log.debug("[DynaBean.setAttribute] " + iName + " = "
081: + iNewValue);
082: }
083:
084: public Object getAttribute(String iName) {
085: checkIfExists(iName);
086: return properties.get(iName);
087: }
088:
089: private void checkIfExists(String iName) {
090: if (staticMode && !properties.containsKey(iName)) {
091: String msg = "Attribute " + iName
092: + " not defined for object "
093: + getClass().getSimpleName();
094: log.error("[DynaBean.checkIfExists] Error: " + msg);
095: throw new DynaBeanException(msg);
096: }
097: }
098:
099: @Override
100: public Object clone() throws CloneNotSupportedException {
101: DynaBean cloned = new DynaBean(staticMode);
102: // COPY ALL PROPERTIES
103: for (Map.Entry<String, Object> prop : properties.entrySet()) {
104: cloned.defineAttribute(prop.getKey(), prop.getValue());
105: }
106: return cloned;
107: }
108:
109: public Map<String, Object> getAttributes() {
110: return properties;
111: }
112: }
|