/* * JBoss, Home of Professional Open Source. * * See the LEGAL.txt file distributed with this work for information regarding copyright ownership and licensing. * * See the AUTHORS.txt file distributed with this work for a full listing of individual contributors. */ package org.teiid.designer.core.workspace; import java.util.ArrayList; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.teiid.core.designer.util.CoreArgCheck; import org.teiid.designer.core.ModelerCore; /** * ModelFolderImpl * * @since 8.0 */ public class ModelFolderImpl extends OpenableImpl implements ModelFolder { // ############################################################################################################################ // # Variables # // ############################################################################################################################ /** * The platform project this <code>ModelProject</code> is based on * * @since 4.0 */ protected IFolder ifolder; /** * The platform project this <code>ModelProject</code> is based on * * @since 4.0 */ protected IPath path; // ############################################################################################################################ // # Constructors # // ############################################################################################################################ /** * Construct an instance of ModelProjectImpl. * * @since 4.0 */ public ModelFolderImpl( final IFolder folder, final ModelWorkspaceItem parent ) { super(MODEL_FOLDER, parent, folder.getName()); ifolder = folder; } /** * @see org.teiid.designer.core.workspace.ModelProject#getNonModelingResources() * @since 4.0 */ @Override public Object[] getNonModelingResources() throws ModelWorkspaceException { return ((ModelFolderInfo)getItemInfo()).getNonModelResources(this); } /** * @see org.teiid.designer.core.workspace.ModelWorkspaceItem#getPath() * @since 4.0 */ @Override public IPath getPath() { if (this.path == null) { return this.getFolder().getFullPath(); } return this.path; } /** * @see org.teiid.designer.core.workspace.ModelWorkspaceItem#getPath() * @since 4.0 */ public void setPath( IPath path ) { this.path = path; } /** * @see org.teiid.designer.core.workspace.ModelProject#getProject() * @since 4.0 */ @Override public IFolder getFolder() { return ifolder; } /** * @see org.teiid.designer.core.workspace.ModelWorkspaceItem#getResource() * @since 4.0 */ @Override public IResource getResource() { return this.getFolder(); } /** * @see org.teiid.designer.core.workspace.ModelWorkspaceItem#getUnderlyingResource() */ @Override public IResource getUnderlyingResource() { return getResource(); } /** * @see org.teiid.designer.core.workspace.Openable * @since 4.0 */ @Override protected boolean generateInfos( final OpenableModelWorkspaceItemInfo info, final IProgressMonitor pm, final IResource underlyingResource ) throws ModelWorkspaceException { boolean validInfo = false; try { // put the info now, because computing the roots requires it ModelWorkspaceManager.getModelWorkspaceManager().putInfo(this, info); // compute the pkg fragment roots updateFolderContents(); // only valid if reaches here validInfo = true; } finally { if (!validInfo) { ModelWorkspaceManager.getModelWorkspaceManager().removeInfo(this); } } return validInfo; } /** * Convenience method that returns the specific type of info for a ModelProject. */ protected ModelFolderInfo getModelFolderInfo() throws ModelWorkspaceException { return (ModelFolderInfo)getItemInfo(); } /** * Reset the collection of package fragment roots (local ones) - only if opened. Need to check *all* package fragment roots in * order to reset NameLookup * * @since 4.0 */ public void updateFolderContents() throws ModelWorkspaceException { if (this.isOpen()) { boolean failed = false; try { ModelFolderInfo info = getModelFolderInfo(); info.setNonModelResources(null); info.setChildren(computeModelFolderChildren()); } catch (ModelWorkspaceException e) { failed = true; throw e; } catch (RuntimeException e) { failed = true; throw e; } finally { if (failed) { try { close(); // could not do better } catch (ModelWorkspaceException ex) { } } } } } public ModelWorkspaceItem[] computeModelFolderChildren() { final ArrayList accumulatedModelResources = new ArrayList(); computeModelFolderResources(this.getFolder(), accumulatedModelResources); final ModelWorkspaceItem[] results = new ModelWorkspaceItem[accumulatedModelResources.size()]; accumulatedModelResources.toArray(results); return results; } public void computeModelFolderResources( final IContainer container, final ArrayList accumulatedModelResources ) { if (container.exists()) { try { // Iterate through the container's immediate children and add them final IResource[] children = container.members(); for (int i = 0; i < children.length; ++i) { final IResource child = children[i]; if (IResource.FILE == child.getType()) { // If the resource is a model file, then add it to the accumulated list if (ModelUtil.isModelFile(child)) { final ModelResource mdlResource = ModelFolderImpl.this.createModelResource((IFile)child); accumulatedModelResources.add(mdlResource); // If the IFile extension does not match the set of well-known model file extensions with // a case-sensitive check but does match when the check is case-insensitive then error (defect 17709) } else if (!ModelFileUtil.isModelFileExtension(child.getFileExtension(), true) && ModelFileUtil.isModelFileExtension(child.getFileExtension(), false)) { final String actualFileName = child.getName(); final String actualExtension = child.getFileExtension(); final int endIndex = actualFileName.length() - actualExtension.length(); final String expectedFileName = actualFileName.substring(0, endIndex) + actualExtension.toLowerCase(); final Object[] params = new Object[] {actualFileName, expectedFileName}; final String msg = ModelerCore.Util.getString("ModelerCore.file_extension_not_correct_case_please_rename_file", params); //$NON-NLS-1$ ModelerCore.Util.log(IStatus.ERROR, msg); } } else if (IResource.FOLDER == child.getType()) { final ModelFolder mdlFolder = ModelFolderImpl.this.createModelFolder((IFolder)child); accumulatedModelResources.add(mdlFolder); } } } catch (CoreException e) { ModelerCore.Util.log(IStatus.ERROR, e, ModelerCore.Util.getString("ModelFolderImpl.Error_while_computing_ModelWorkspaceItem_instances_for_ModelFolder", this)); //$NON-NLS-1$ } } } /* (non-Javadoc) * @see org.teiid.designer.core.workspace.OpenableImpl#createItemInfo() */ @Override protected OpenableModelWorkspaceItemInfo createItemInfo() { return new ModelFolderInfo(); } /** * Used by the {@link #computeModelResources(IContainer, ArrayList)} method. * * @param resource * @return */ protected ModelResource createModelResource( final IFile resource ) { return new ModelResourceImpl(this, resource.getName()); } /** * Used by the {@link #computeModelResources(IContainer, ArrayList)} method. * * @param resource * @return */ protected ModelFolder createModelFolder( final IFolder folder ) { return new ModelFolderImpl(folder, this); } /** * Return the {@link ModelResource model resource} for the specified resource and contained by this project. * <p> * This method returns the same result as {@link #getChildren()}. * </p> * * @return the {@link ModelWorkspaceItem} instance contained by this project item that represents the suppplied resource; may * be null if the supplied resource doesn't represent a model or a folder * @throws ModelWorkspaceException */ @Override public ModelWorkspaceItem getModelWorkspaceItem( IResource resource ) throws ModelWorkspaceException { CoreArgCheck.isNotNull(resource); final ModelWorkspaceItem[] children = getChildren(); for (int i = 0; i < children.length; i++) { final ModelWorkspaceItem child = children[i]; final IResource thatResource = child.getCorrespondingResource(); if (resource.equals(thatResource)) { return child; } } return null; } }