/******************************************************************************* * 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.core.international; import java.util.HashSet; import java.util.Set; import org.eclipse.core.resources.IFile; import org.eclipse.core.runtime.IPath; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.jboss.tools.cdi.core.CDICoreNature; import org.jboss.tools.cdi.core.extension.ICDIExtension; import org.jboss.tools.cdi.core.extension.feature.IBuildParticipant2Feature; import org.jboss.tools.cdi.core.extension.feature.IBuildParticipantFeature; import org.jboss.tools.cdi.internal.core.impl.CDIProject; import org.jboss.tools.cdi.internal.core.scanner.FileSet; import org.jboss.tools.cdi.seam.core.international.impl.BundleModel; import org.jboss.tools.cdi.seam.core.international.scanner.BundleFileSet; import org.jboss.tools.common.model.XModelObject; import org.jboss.tools.common.model.util.EclipseResourceUtil; /** * * @author Viacheslav Kabanlvich * */ public class CDISeamInternationalExtension implements ICDIExtension, IBuildParticipant2Feature { CDISeamInternationalDefinitionContext context = new CDISeamInternationalDefinitionContext(); BundleFileSet fileSet = new BundleFileSet(); BundleModel model = new BundleModel(); public static CDISeamInternationalExtension getExtension(CDICoreNature project) { Set<ICDIExtension> es = project.getExtensionManager().getExtensions(IBuildParticipantFeature.class); for (ICDIExtension ext: es) { if(ext instanceof CDISeamInternationalExtension) return (CDISeamInternationalExtension)ext; } return null; } public BundleModel getBundleModel() { return model; } public CDISeamInternationalDefinitionContext getContext() { return context; } public void beginVisiting() { fileSet = new BundleFileSet(); } public void visit(IFile file, IPath src, IPath webinf) { IPath path = file.getFullPath(); if(src != null && src.isPrefixOf(path)) { addBundle(file, fileSet); } } private void addBundle(IFile f, BundleFileSet fileSet) { if(f.getName().endsWith(".properties")) { XModelObject b = getObject(f); if(b != null) { fileSet.setBundle(f.getFullPath(), b); } } } private XModelObject getObject(IFile f) { XModelObject o = EclipseResourceUtil.getObjectByResource(f); if(o == null) { o = EclipseResourceUtil.createObjectForResource(f); } return o; } @Override public void visitJar(IPath path, IPackageFragmentRoot root, XModelObject beansXML) { } @Override public void buildDefinitions() { ((CDISeamInternationalDefinitionContext)context.getWorkingCopy()).addDefinitions(fileSet); } @Override public void buildDefinitions(FileSet fileSet) { } @Override public void buildBeans(CDIProject target) { model.rebuild(context.getAllBundles()); } @Override public void visitJar(IPath path, XModelObject fs) { Set<XModelObject> objects = collectXModelBundleObjects(fs, null); fileSet.setBundles(path, objects); } private Set<XModelObject> collectXModelBundleObjects(XModelObject o, Set<XModelObject> objects) { if(objects == null) { objects = new HashSet<XModelObject>(); } if (o == null) return objects; String path = o.getPath(); if (path == null || "META-INF".equalsIgnoreCase(o.getAttributeValue("name"))) return objects; if (path.endsWith(".properties")) { objects.add(o); } if (o.getFileType() > XModelObject.FILE && o.hasChildren()) { XModelObject[] children = o.getChildren(); if (children != null) { for (XModelObject c : children) { collectXModelBundleObjects(c, objects); } } } return objects; } }