package org.springframework.roo.classpath; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.Map; import java.util.Set; import org.apache.commons.lang3.StringUtils; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Service; import org.springframework.roo.classpath.details.ItdTypeDetails; import org.springframework.roo.classpath.details.MemberHoldingTypeDetails; import org.springframework.roo.model.JavaType; /** * Implementation of {@link ItdDiscoveryService}. * * @author James Tyrrell * @since 1.2.0 */ @Component @Service public class ItdDiscoveryServiceImpl implements ItdDiscoveryService { private final Map<String, Set<String>> changeMap = new HashMap<String, Set<String>>(); private final Map<String, String> itdIdToTypeMap = new HashMap<String, String>(); private final Map<String, Map<String, MemberHoldingTypeDetails>> typeMap = new HashMap<String, Map<String, MemberHoldingTypeDetails>>(); public void addItdTypeDetails(final ItdTypeDetails itdTypeDetails) { if (itdTypeDetails == null || itdTypeDetails.getGovernor() == null) { return; } if (typeMap.get(itdTypeDetails.getGovernor().getName().getFullyQualifiedTypeName()) == null) { typeMap.put(itdTypeDetails.getGovernor().getName().getFullyQualifiedTypeName(), new HashMap<String, MemberHoldingTypeDetails>()); } itdIdToTypeMap.put(itdTypeDetails.getDeclaredByMetadataId(), itdTypeDetails.getGovernor() .getName().getFullyQualifiedTypeName()); typeMap.get(itdTypeDetails.getGovernor().getName().getFullyQualifiedTypeName()).put( itdTypeDetails.getDeclaredByMetadataId(), itdTypeDetails); updateChanges(itdTypeDetails.getGovernor().getName(), false); } public boolean haveItdsChanged(final String requestingClass, final JavaType javaType) { Set<String> changesSinceLastRequest = changeMap.get(requestingClass); if (changesSinceLastRequest == null) { changesSinceLastRequest = new LinkedHashSet<String>(typeMap.keySet()); changeMap.put(requestingClass, changesSinceLastRequest); } for (final String changedId : changesSinceLastRequest) { if (changedId.equals(javaType.getFullyQualifiedTypeName())) { changesSinceLastRequest.remove(changedId); return true; } } return false; } public void removeItdTypeDetails(final String itdTypeDetailsId) { if (StringUtils.isBlank(itdTypeDetailsId)) { return; } final String type = itdIdToTypeMap.get(itdTypeDetailsId); if (type != null) { final Map<String, MemberHoldingTypeDetails> typeDetailsHashMap = typeMap.get(type); if (typeDetailsHashMap != null) { typeDetailsHashMap.remove(itdTypeDetailsId); } updateChanges(new JavaType(type), true); } } private void updateChanges(final JavaType javaType, final boolean remove) { for (final String requestingClass : changeMap.keySet()) { if (remove) { changeMap.get(requestingClass).remove(javaType.getFullyQualifiedTypeName()); } else { changeMap.get(requestingClass).add(javaType.getFullyQualifiedTypeName()); } } } }