All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.pure4j.model.ProjectModelImpl Maven / Gradle / Ivy

Go to download

Parses Byte-code to check the purity semantics defined using pure4j-core annotations

The newest version!
package org.pure4j.model;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeSet;

public class ProjectModelImpl implements ProjectModel {

	private Map finality = new HashMap(100);
	private Map> calls = new HashMap>(100);
	private Map> calledBy = new HashMap>(100);
	private Map> annotatedClasses = new HashMap>(100);
	private Map> annotatedMembers = new HashMap>(100);
	private Map> subclasses = new HashMap>(100);
	private Map> dependsOnClasses = new HashMap>(100);
	private Map> dependedOnClasses = new HashMap>(100);
	private Map> dependsOnPackages = new HashMap>(100);
	private Map> dependedOnPackages = new HashMap>(100);
	private Map> packageContents = new HashMap>(100);
	private Map> annotationReferences = new HashMap>(100);
	private Map opcodes = new HashMap(100);
	private Set declaredMethods = new HashSet(1000);
	private Map> declaredMethodsByClass = new HashMap>(100);
	
	public void addDeclaredMethod(String className, MemberHandle mh) {
		declaredMethods.add(mh);
		checkSetAdd(className, mh, declaredMethodsByClass);
	}

	private LinkedHashSet classes = new LinkedHashSet(100);

	public List getCalls(MemberHandle m) {
		return checkListGet(calls.get(m));
	}

	public Set getCalledBy(MemberHandle m) {
		return checkSetGet(calledBy.get(m));
	} 

	public Set getClassesWithAnnotation(String annotationName) {
		return checkSetGet(annotatedClasses.get(annotationName));
	}

	public Set getMembersWithAnnotation(String annotationName) {
		return checkSetGet(annotatedMembers.get(annotationName));
	}

	public Set getSubclasses(String className) {
		return checkSetGet(subclasses.get(className));
	}

	public void addSubclass(String superName, String name) {
		checkSetAdd(superName, name, subclasses);
	}

	private  Set checkSetGet(Set in) {
		if (in == null) {
			return Collections.emptySet();
		}

		return in;
	}
	
	private  List checkListGet(List in) {
		if (in == null) {
			return Collections.emptyList();
		}

		return in;
	}

	private  void checkSetAdd(A keyName, B value, Map> theMap) {
		Set item = theMap.get(keyName);
		if (item == null) {
			item = new TreeSet();
			theMap.put(keyName, item);
		}
		item.add(value);
	}
	
	private  void checkListAdd(A keyName, B value, Map> theMap) {
		List item = theMap.get(keyName);
		if (item == null) {
			item = new LinkedList();
			theMap.put(keyName, item);
		}
		item.add(value);
	}

	public void addClassAnnotation(String desc, String className) {
		checkSetAdd(desc, className, annotatedClasses);
	}

	public void addMemberAnnotation(String desc, MemberHandle mh) {
		checkSetAdd(desc, mh, annotatedMembers);
	}

	public void addCalls(MemberHandle desc, MemberHandle mh) {
		if (!desc.equals(mh)) {
			checkListAdd(desc, mh, calls);
			checkSetAdd(mh, desc, calledBy);
		}
	}

	public void addClassDependency(String from, String on) {
		if (!from.equals(on)) {
			checkSetAdd(from, on, dependsOnClasses);
			checkSetAdd(on, from, dependedOnClasses);
		}
	}

	public void addPackageDependency(PackageHandle from, PackageHandle on) {
		if (!from.equals(on)) {
			checkSetAdd(from, on, dependsOnPackages);
			checkSetAdd(on, from, dependedOnPackages);
		}
	}

	public void addPackageClass(String packageName, String cl) {
		checkSetAdd(packageName, cl, packageContents);
	}

	public void addClass(String name) {
		classes.add(name);
	}

	public Set getClassesInPackage(String packageName) {
		return checkSetGet(packageContents.get(packageName));
	}

	public boolean withinModel(String className) {
		return classes.contains(className);
	}

	public int getClassCount() {
		return classes.size();
	}

	public Set getDependedOnClasses(String className) {
		return checkSetGet(dependedOnClasses.get(className));
	}

	public Set getDependsOnClasses(String className) {
		return checkSetGet(dependsOnClasses.get(className));
	}
	
	public Set getDependedOnPackages(PackageHandle packageName) {
		return checkSetGet(dependedOnPackages.get(packageName));
	}

	public Set getDependsOnPackages(PackageHandle packageName) {
		return checkSetGet(dependsOnPackages.get(packageName));
	}

	public Set getAnnotationReferences(String className) {
		return checkSetGet(annotationReferences.get(className));
	}

	public void addAnnotationReference(String referredClass, AnnotationHandle by) {
		checkSetAdd(referredClass, by, annotationReferences);
	}

	public boolean packageWithinModel(String packageName) {
		return packageContents.containsKey(packageName);
	}

	public Set getAllClasses() {
		return classes;
	}
	
	public void setFinal(Object thing, boolean finality) {
		this.finality.put(thing, finality);
	}

	@Override
	public CallInfo getOpcodes(MemberHandle ch) {
		CallInfo out = opcodes.get(ch);
		return (out == null) ? CallInfo.NO_CALL : out;
	}

	public void setOpcodes(MemberHandle ch, CallInfo o) {
		opcodes.put(ch, o);
	}

	@Override
	public Set getAllDeclaredMethods() {
		return declaredMethods;
	}

	@Override
	public Set getDeclaredMethods(String className) {
		return checkSetGet(declaredMethodsByClass.get(className));
	}

}