/*******************************************************************************
* Copyright (c) 2007 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.seam.internal.core.scanner.xml;
import java.util.HashMap;
import java.util.Map;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelException;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.jst.web.model.helpers.InnerModelHelper;
import org.jboss.tools.jst.web.model.project.ext.store.XMLValueInfo;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.internal.core.SeamPropertiesDeclaration;
import org.jboss.tools.seam.internal.core.SeamProperty;
import org.jboss.tools.seam.internal.core.SeamValueString;
import org.jboss.tools.seam.internal.core.scanner.IFileScanner;
import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations;
import org.jboss.tools.seam.internal.core.scanner.ScannerException;
public class PropertiesScanner implements IFileScanner {
public PropertiesScanner() {}
/**
* Returns true if file is probable component source -
* has components.xml name or *.component.xml mask.
* @param resource
* @return
*/
public boolean isRelevant(IFile resource) {
return resource.getName().equals("seam.properties");
}
/**
* This method should be called only if isRelevant returns true;
* Makes simple check if this java file contains annotation Name.
* @param resource
* @return
*/
public boolean isLikelyComponentSource(IFile f) {
return f.isSynchronized(IFile.DEPTH_ZERO) && f.exists() && f.getName().equals("seam.properties");
}
/**
* Returns list of components
* @param f
* @return
* @throws ScannerException
*/
public LoadedDeclarations parse(IFile f, ISeamProject sp) throws ScannerException {
XModel model = InnerModelHelper.createXModel(f.getProject());
XModelObject o = EclipseResourceUtil.getObjectByResource(model, f);
return parse(o, f.getFullPath());
}
public LoadedDeclarations parse(XModelObject o, IPath source) {
LoadedDeclarations ds = null;
if(o != null) {
if(o.getParent() instanceof FolderImpl) {
IFile f = ResourcesPlugin.getWorkspace().getRoot().getFile(source);
if(f != null && f.exists()) {
try {
((FolderImpl)o.getParent()).updateChildFile(o, f.getLocation().toFile());
} catch (XModelException e) {
ModelPlugin.getPluginLog().logError(e);
}
}
}
ds = new LoadedDeclarations();
XModelObject[] properties = o.getChildren();
Map<String, SeamPropertiesDeclaration> ds1 = new HashMap<String, SeamPropertiesDeclaration>();
for (int i = 0; i < properties.length; i++) {
String name = properties[i].getAttributeValue("name"); //$NON-NLS-1$
int q = name.lastIndexOf('.');
if(q < 0) continue;
String componentName = name.substring(0, q);
String propertyName = name.substring(q + 1);
SeamPropertiesDeclaration d = ds1.get(componentName);
if(d == null) {
d = new SeamPropertiesDeclaration();
d.setId(properties[i]);
d.setSourcePath(source);
d.setName(componentName);
ds1.put(componentName, d);
}
SeamProperty p = new SeamProperty();
p.setId(properties[i]);
p.setName(new XMLValueInfo(properties[i], "name")); //$NON-NLS-1$
p.setName(propertyName);
SeamValueString v = new SeamValueString();
v.setValue(new XMLValueInfo(properties[i], "value")); //$NON-NLS-1$
p.setValue(v);
d.addProperty(p);
}
ds.getComponents().addAll(ds1.values());
}
return ds;
}
}