package org.springframework.roo.converters; import static org.springframework.roo.converters.JavaPackageConverter.TOP_LEVEL_PACKAGE_SYMBOL; import static org.springframework.roo.project.LogicalPath.MODULE_PATH_SEPARATOR; import java.util.logging.Logger; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; import org.apache.felix.scr.annotations.Component; import org.apache.felix.scr.annotations.Reference; import org.apache.felix.scr.annotations.Service; import org.osgi.framework.BundleContext; import org.osgi.service.component.ComponentContext; import org.springframework.roo.classpath.TypeLocationService; import org.springframework.roo.model.JavaPackage; import org.springframework.roo.model.JavaType; import org.springframework.roo.project.ProjectOperations; import org.springframework.roo.project.maven.Pom; import org.springframework.roo.shell.CommandListener; import org.springframework.roo.shell.ParseResult; import org.springframework.roo.shell.Shell; import org.springframework.roo.support.logging.HandlerUtils; import org.springframework.roo.support.util.AnsiEscapeCode; /** * Records the last Java package and type used. * * @author Ben Alex * @since 1.0 */ @Component @Service public class LastUsedImpl implements LastUsed, CommandListener { private static final Logger LOGGER = HandlerUtils.getLogger(LastUsedImpl.class); // ------------ OSGi component attributes ---------------- private BundleContext context; protected void deactivate(final ComponentContext cContext) { if (shell != null) { shell.removeListener(this); } } // Verified fields private JavaPackage topLevelPackage; private JavaPackage javaPackage; private JavaType javaType; private Pom module; // Not Verified fields private JavaPackage topLevelPackageNotVerified; private JavaPackage javaPackageNotVerified; private JavaType javaTypeNotVerified; private Pom moduleNotVerified; private boolean isVerified; @Reference private ProjectOperations projectOperations; @Reference private Shell shell; @Reference private TypeLocationService typeLocationService; private boolean listenerRegistered; public JavaPackage getJavaPackage() { return javaPackage; } public JavaType getJavaType() { return javaType; } public Pom getModule() { return module; } public JavaPackage getTopLevelPackage() { return topLevelPackage; } public JavaPackage getJavaPackageNotVerified() { return javaPackageNotVerified; } public JavaType getJavaTypeNotVerified() { return javaTypeNotVerified; } public JavaPackage getTopLevelPackageNotVerified() { return topLevelPackageNotVerified; } public boolean isVerified() { return isVerified; } public void setPackage(final JavaPackage javaPackage) { Validate.notNull(javaPackage, "JavaPackage required"); if (javaPackage.getFullyQualifiedPackageName().startsWith("java.")) { return; } javaType = null; module = null; this.javaPackage = javaPackage; setPromptPath(javaPackage.getFullyQualifiedPackageName()); } public void setPackage(final JavaPackage javaPackage, final Pom module) { Validate.notNull(javaPackage, "JavaPackage required"); if (javaPackage.getFullyQualifiedPackageName().startsWith("java.")) { return; } javaType = javaTypeNotVerified = null; this.module = moduleNotVerified = module; this.javaPackage = this.javaPackageNotVerified = javaPackage; setPromptPath(javaPackage.getFullyQualifiedPackageName()); } private void setPromptPath(final String fullyQualifiedName) { if (topLevelPackage == null) { return; } String moduleName = ""; if (module != null && StringUtils.isNotBlank(module.getModuleName())) { moduleName = AnsiEscapeCode.decorate(module.getModuleName() + MODULE_PATH_SEPARATOR, AnsiEscapeCode.FG_CYAN); } topLevelPackage = new JavaPackage(typeLocationService.getTopLevelPackageForModule(projectOperations .getFocusedModule())); final String path = moduleName + fullyQualifiedName.replace(topLevelPackage.getFullyQualifiedPackageName(), TOP_LEVEL_PACKAGE_SYMBOL); shell.setPromptPath(path, StringUtils.isNotBlank(moduleName)); } public void setTopLevelPackage(final JavaPackage topLevelPackage) { this.topLevelPackage = topLevelPackage; } public void setType(final JavaType javaType) { Validate.notNull(javaType, "JavaType required"); if (javaType.getPackage().getFullyQualifiedPackageName().startsWith("java.")) { return; } module = null; this.javaType = javaType; javaPackage = javaType.getPackage(); setPromptPath(javaType.getFullyQualifiedTypeName()); } public void setTypeNotVerified(JavaType javaType) { Validate.notNull(javaType, "JavaType required"); if (javaType.getPackage().getFullyQualifiedPackageName().startsWith("java.")) { return; } registerListener(); this.javaTypeNotVerified = javaType; javaPackageNotVerified = javaType.getPackage(); this.isVerified = false; module = null; } private void registerListener() { if (listenerRegistered) { return; } shell.addListerner(this); listenerRegistered = true; } public void setType(final JavaType javaType, final Pom module) { if (javaType == null) { Validate.notNull(module, "ERROR: javaType and module cannot be both null"); javaPackage = projectOperations.getTopLevelPackage(module.getModuleName()); } else { if (javaType.getPackage().getFullyQualifiedPackageName().startsWith("java.")) { return; } javaPackage = javaType.getPackage(); } this.module = module; this.javaType = javaType; this.isVerified = true; setPromptPath(javaType.getFullyQualifiedTypeName()); } public void setTypeNotVerified(JavaType javaType, Pom module) { if (javaType == null) { Validate.notNull(module, "ERROR: javaType and module cannot be both null"); javaPackageNotVerified = projectOperations.getTopLevelPackage(module.getModuleName()); } else { if (javaType.getPackage().getFullyQualifiedPackageName().startsWith("java.")) { return; } javaPackageNotVerified = javaType.getPackage(); } registerListener(); this.moduleNotVerified = module; this.javaTypeNotVerified = javaType; this.isVerified = false; } /** * CommandListener methods */ @Override public void onCommandSuccess() { // If is not verified but finish success, set last used if (!isVerified) { setType(javaTypeNotVerified, moduleNotVerified); } } @Override public void onCommandFails() { this.moduleNotVerified = null; this.javaTypeNotVerified = null; javaPackageNotVerified = null; this.isVerified = false; } @Override public void onCommandBegin(ParseResult parseResult) { // TODO Auto-generated method stub } }