/******************************************************************************* * Copyright (c) 2011 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.cdi.seam.solder.core; import java.util.HashMap; import java.util.List; import java.util.Map; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.SourceRange; import org.jboss.tools.cdi.core.extension.AbstractDefinitionContextExtension; import org.jboss.tools.cdi.core.extension.ICDIExtension; import org.jboss.tools.cdi.core.extension.IDefinitionContextExtension; import org.jboss.tools.cdi.core.extension.feature.IBuildParticipantFeature; import org.jboss.tools.cdi.internal.core.impl.AnnotationDeclaration; import org.jboss.tools.cdi.internal.core.impl.CDIProject; import org.jboss.tools.cdi.internal.core.impl.ClassBean; import org.jboss.tools.cdi.internal.core.impl.definition.TypeDefinition; import org.jboss.tools.cdi.internal.core.scanner.FileSet; import org.jboss.tools.cdi.seam.solder.core.definition.InterfaceDefinition; import org.jboss.tools.common.java.impl.AnnotationLiteral; import org.jboss.tools.common.model.XModelObject; /** * * @author Viacheslav Kabanovich * */ public class CDISeamSolderLoggerExtension implements ICDIExtension, IBuildParticipantFeature { LoggerDefinitionContext context = new LoggerDefinitionContext(); protected Version getVersion() { return Version.instance; } public IDefinitionContextExtension getContext() { return context; } public void beginVisiting() { } public void visitJar(IPath path, IPackageFragmentRoot root, XModelObject beansXML) { } public void visit(IFile file, IPath src, IPath webinf) { } public void buildDefinitions() { } public void buildDefinitions(FileSet fileSet) { LoggerDefinitionContext workingCopy = (LoggerDefinitionContext)context.getWorkingCopy(); Map<IPath, List<IType>> is = fileSet.getInterfaces(); for (IPath path: is.keySet()) { for (IType t: is.get(path)) { InterfaceDefinition i = new InterfaceDefinition(t, workingCopy); if(i.isAnnotationPresent(getVersion().getMessageLoggerAnnotationTypeName())) { TypeDefinition d = new TypeDefinition(); d.setType(t, workingCopy.getRootContext(), 0); d.setBeanConstructor(true); workingCopy.addMessageLogger(path, d); } else if(i.isAnnotationPresent(getVersion().getMessageBundleAnnotationTypeName())) { TypeDefinition d = new TypeDefinition(); d.setType(t, workingCopy.getRootContext(), 0); d.setBeanConstructor(true); workingCopy.addMessageBundle(path, d); AnnotationDeclaration ad = d.getAnnotation(getVersion().getMessageBundleAnnotationTypeName()); if(ad.getMemberValue("projectCode") != null && ad.getMemberValue("projectCode").toString().length() > 0) { String text = d.getContent(); int st = ad.getStartPosition(); int le = ad.getLength(); String source = text.substring(st, st + le); AnnotationLiteral l = new AnnotationLiteral(d.getResource(), source, new SourceRange(st, le), null, ad.getType()); d.removeAnnotation(ad); d.addAnnotation(l, workingCopy.getRootContext()); } } } } } public void buildBeans(CDIProject target) { CDIProject p = target; Map<String, TypeDefinition> loggers = context.getMessageLoggers(); for (TypeDefinition d: loggers.values()) { ClassBean b = new ClassBean(); b.setDefinition(d); b.setParent(p); p.addBean(b); } Map<String, TypeDefinition> bundles = context.getMessageBundles(); for (TypeDefinition d: bundles.values()) { ClassBean b = new ClassBean(); b.setDefinition(d); b.setParent(p); p.addBean(b); } } class LoggerDefinitionContext extends AbstractDefinitionContextExtension { Map<String, TypeDefinition> messageLoggers = new HashMap<String, TypeDefinition>(); Map<String, TypeDefinition> messageBundles = new HashMap<String, TypeDefinition>(); protected LoggerDefinitionContext copy(boolean clean) { LoggerDefinitionContext copy = new LoggerDefinitionContext(); copy.root = root; if(!clean) { for (String qn: messageLoggers.keySet()) { TypeDefinition d = messageLoggers.get(qn); if(d.exists()) { copy.messageLoggers.put(qn, d); } } for (String qn: messageBundles.keySet()) { TypeDefinition d = messageBundles.get(qn); if(d.exists()) { copy.messageBundles.put(qn, d); } } } return copy; } @Override protected void doApplyWorkingCopy() { messageLoggers = ((LoggerDefinitionContext)workingCopy).messageLoggers; messageBundles = ((LoggerDefinitionContext)workingCopy).messageBundles; } @Override public void clean() { messageLoggers.clear(); messageBundles.clear(); } @Override public void clean(IPath path) { } @Override public void clean(String typeName) { messageLoggers.remove(typeName); messageBundles.remove(typeName); } public void addMessageLogger(IPath path, TypeDefinition def) { String typeName = def.getType().getFullyQualifiedName(); messageLoggers.put(typeName, def); root.addType(path, typeName); } public void addMessageBundle(IPath path, TypeDefinition def) { String typeName = def.getType().getFullyQualifiedName(); messageBundles.put(typeName, def); root.addType(path, typeName); } public Map<String, TypeDefinition> getMessageLoggers() { return messageLoggers; } public Map<String, TypeDefinition> getMessageBundles() { return messageBundles; } } }