/**
* 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.facttemplates;
import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import java.util.Arrays;
import org.drools.rule.Package;
public class FactTemplateImpl
implements
FactTemplate {
private static int hashCode(final Object[] array) {
final int PRIME = 31;
if ( array == null ) {
return 0;
}
int result = 1;
for ( int index = 0; index < array.length; index++ ) {
result = PRIME * result + (array[index] == null ? 0 : array[index].hashCode());
}
return result;
}
private FieldTemplate[] fields;
private Package pkg;
private String name;
public FactTemplateImpl() {
}
public FactTemplateImpl(final Package pkg,
final String name,
final FieldTemplate[] fields) {
this.pkg = pkg;
this.name = name;
this.fields = fields;
this.pkg.addFactTemplate( this );
}
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
pkg = (Package)in.readObject();
name = (String)in.readObject();
fields = (FieldTemplate[])in.readObject();
}
public void writeExternal(ObjectOutput out) throws IOException {
out.writeObject(pkg);
out.writeObject(name);
out.writeObject(fields);
}
public Package getPackage() {
return this.pkg;
}
/**
* the template name is an alias for an object
* @param name
*/
public String getName() {
return this.name;
}
/**
* Return the number of slots in the deftemplate
* @return
*/
public int getNumberOfFields() {
return this.fields.length;
}
/**
* Return all the slots
* @return
*/
public FieldTemplate[] getAllFieldTemplates() {
return this.fields;
}
/**
* A convienance method for finding the slot matching
* the String name.
* @param name
* @return
*/
public FieldTemplate getFieldTemplate(final String name) {
for ( int idx = 0; idx < this.fields.length; idx++ ) {
if ( this.fields[idx].getName().equals( name ) ) {
return this.fields[idx];
}
}
return null;
}
/**
* get the Slot at the given pattern id
* @param id
* @return
*/
public FieldTemplate getFieldTemplate(final int index) {
return this.fields[index];
}
/**
* Look up the pattern index of the slot
* @param name
* @return
*/
public int getFieldTemplateIndex(final String name) {
for ( int index = 0; index < this.fields.length; index++ ) {
if ( this.fields[index].getName().equals( name ) ) {
return index;
}
}
return -1;
}
/**
* Method takes a list of Slots and creates a deffact from it.
* @param data
* @param id
* @return
*/
public Fact createFact(final long id) {
return new FactImpl( this,
id );
}
/**
* Method will return a string format with the int type code
* for the slot type
*/
public String toString() {
final StringBuilder buf = new StringBuilder();
buf.append( "(" + this.name + " " );
// for (int idx=0; idx < this.slots.length; idx++){
// buf.append("(" + this.slots[idx].getName() +
// " (type " + ConversionUtils.getTypeName(
// this.slots[idx].getValueType()) +
// ") ) ");
// }
// if (this.clazz != null){
// buf.append("[" + this.clazz.getClassObject().getName() + "] ");
// }
buf.append( ")" );
return buf.toString();
}
public int hashCode() {
final int PRIME = 31;
int result = 1;
result = PRIME * result + FactTemplateImpl.hashCode( this.fields );
result = PRIME * result + this.name.hashCode();
result = PRIME * result + this.pkg.hashCode();
return result;
}
public boolean equals(final Object object) {
if ( this == object ) {
return true;
}
if ( object == null || getClass() != object.getClass() ) {
return false;
}
final FactTemplateImpl other = (FactTemplateImpl) object;
if ( !Arrays.equals( this.fields,
other.fields ) ) {
return false;
}
return this.pkg.equals( other.pkg ) && this.name.equals( other.name );
}
}