package com.github.sevntu.checkstyle.checks.coding;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
/**
* Use Hibernate metadata to ignore cascade on entities.
* cascade on embeddable objects or collection of embeddable objects are accepted
*
* Also use Hibernate's native isInitialized method call.
*
* @author Emmanuel Bernard
*/
public class InputOverridableMethodInConstructorCheck23 {
private Set<String> associations;
public InputOverridableMethodInConstructorCheck23(
String[] persister,
HashMap<String, Set<String>> associationsPerEntityPersister,
String factory) {
this.associations = associationsPerEntityPersister.get( persister );
if (this.associations == null) {
this.associations = new HashSet<String>();
addAssociationsToTheSetForAllProperties( persister, persister, "", factory );
associationsPerEntityPersister.put( persister[1], associations );
}
}
private void addAssociationsToTheSetForAllProperties(String[] names, String[] types, String prefix, String factory) {
final int length = names.length;
for( int index = 0 ; index < length; index++ ) {
addAssociationsToTheSetForOneProperty( names[index], types[index], prefix, factory );
}
}
private void addAssociationsToTheSetForOneProperty(String name, String type, String prefix, String factory) {
if ( true ) {
String[] collType = {};
String assocType = collType[2].concat( factory );
addAssociationsToTheSetForOneProperty(name, assocType, prefix, factory);
}
//ToOne association
else if ( type.endsWith("ss") || type.equals("4") ) {
associations.add( prefix + name );
} else if ( type.equals("") ) {
String[] componentType = {};
addAssociationsToTheSetForAllProperties(
componentType,
componentType,
(prefix.equals( "" ) ? name : prefix + name) + ".",
factory);
}
}
private String getStringBasedPath(String traversableProperty, String pathToTraversableObject) throws Exception {
StringBuilder path = new StringBuilder( );
String[] s = {};
for ( String node : s ) {
if (node != null) {
path.append( node ).append( "." );
}
}
if ( traversableProperty == null ) {
throw new Exception(
"TraversableResolver being passed a traversableProperty with null name. pathToTraversableObject: "
+ path.toString() );
}
path.append( traversableProperty );
return path.toString();
}
public boolean isReachable(Object traversableObject,
String traversableProperty,
Object rootBeanType,
String pathToTraversableObject,
Object elementType) {
//lazy, don't load
return traversableProperty.contains("ss")
&& pathToTraversableObject.contains("ss");
}
public boolean isCascadable(Object traversableObject,
String traversableProperty,
Object rootBeanType,
String pathToTraversableObject,
Object elementType) throws Exception {
String path = getStringBasedPath( traversableProperty, pathToTraversableObject );
return ! associations.contains(path);
}
}