/** * Copyright 2010 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.drools.factmodel; /* * Copyright 2008 JBoss Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import java.io.IOException; import java.io.ObjectInput; import java.io.ObjectOutput; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import org.drools.definition.type.FactField; import org.drools.definition.type.FactType; /** * Declares a class to be dynamically created * * @author etirelli */ public class ClassDefinition implements FactType { private String className; private String superClass; private String[] interfaces; private transient Class< ? > definedClass; private Map<String, FieldDefinition> fields = new LinkedHashMap<String, FieldDefinition>(); public ClassDefinition() { this( null, null, null ); } public ClassDefinition(String className) { this( className, null, null ); } public ClassDefinition(String className, String superClass) { this( className, superClass, null ); } public ClassDefinition(String className, String[] interfaces) { this( className, null, interfaces ); } public ClassDefinition(String className, String superClass, String[] interfaces) { this.setClassName( className ); this.setSuperClass( superClass ); this.setInterfaces( interfaces ); } public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException { this.className = (String) in.readObject(); this.superClass = (String) in.readObject(); this.interfaces = (String[]) in.readObject(); this.fields = (Map<String, FieldDefinition>) in.readObject(); } public void writeExternal(ObjectOutput out) throws IOException { out.writeObject( this.className ); out.writeObject( this.superClass ); out.writeObject( this.interfaces ); out.writeObject( this.fields ); } /** * @return Returns the name. */ public final String getClassName() { return this.className; } /** * @param name The name to set. */ public final void setClassName(final String className) { this.className = className; } /** * @return Returns the className. */ public final Class< ? > getDefinedClass() { return definedClass; } /** * @param className The class to set. */ public void setDefinedClass(final Class< ? > definedClass) { this.definedClass = definedClass; } /** * Adds a field definition to this class * @param attr */ public final void addField(FieldDefinition attr) { this.fields.put( attr.getName(), attr ); } /** * @return Returns an unmodifiable collection of field definitions */ public final Collection<FieldDefinition> getFieldsDefinitions() { return Collections.unmodifiableCollection( this.fields.values() ); } /** * Returns the field definition object for the given field name * * @param fieldName * @return */ public final FieldDefinition getField(final String fieldName) { return this.fields.get( fieldName ); } /** * @return Returns the interfaces. */ public final String[] getInterfaces() { return interfaces; } /** * @param interfaces The interfaces to set. */ public final void setInterfaces(String[] interfaces) { this.interfaces = (interfaces != null) ? interfaces : new String[0]; } /** * @return Returns the superClass. */ public final String getSuperClass() { return superClass; } /** * @param superClass The superClass to set. */ public final void setSuperClass(final String superClass) { this.superClass = (superClass != null) ? superClass : "java.lang.Object"; } public String getName() { return getClassName(); } public Object newInstance() throws InstantiationException, IllegalAccessException { return this.definedClass.newInstance(); } public Class< ? > getFactClass() { return getDefinedClass(); } public List<FactField> getFields() { return new ArrayList<FactField>( fields.values() ); } public Object get(Object bean, String field) { return this.getField( field ).getFieldAccessor().getValue( bean ); } public void set(Object bean, String field, Object value) { this.getField( field ).getFieldAccessor().setValue( bean, value ); } public Map<String, Object> getAsMap(Object bean) { Map<String, Object> m = new HashMap<String, Object>( fields.size() ); for ( Iterator<Map.Entry<String, FieldDefinition>> iterator = this.fields.entrySet().iterator(); iterator.hasNext(); ) { Map.Entry<String, FieldDefinition> ent = iterator.next(); Object val = ent.getValue().getFieldAccessor().getValue( bean ); m.put( ent.getKey(), val ); } return m; } public void setFromMap(Object bean, Map<String, Object> data) { for ( Iterator<Map.Entry<String, Object>> iterator = data.entrySet().iterator(); iterator.hasNext(); ) { Map.Entry<String, Object> ent = iterator.next(); set( bean, ent.getKey(), ent.getValue() ); } } }