/*
* (c) Copyright 2010-2011 AgileBirds
*
* This file is part of OpenFlexo.
*
* OpenFlexo is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* OpenFlexo is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with OpenFlexo. If not, see <http://www.gnu.org/licenses/>.
*
*/
package org.openflexo.foundation.view;
/*
* FlexoWorkflow.java
* Project WorkflowEditor
*
* Created by benoit on Mar 3, 2004
*/
import java.io.File;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.openflexo.foundation.Inspectors;
import org.openflexo.foundation.ontology.dm.SLShemaCreated;
import org.openflexo.foundation.rm.FlexoOEShemaLibraryResource;
import org.openflexo.foundation.rm.FlexoProject;
import org.openflexo.foundation.rm.FlexoResource;
import org.openflexo.foundation.rm.FlexoXMLStorageResource;
import org.openflexo.foundation.rm.InvalidFileNameException;
import org.openflexo.foundation.rm.ProjectRestructuration;
import org.openflexo.foundation.rm.SaveResourceException;
import org.openflexo.foundation.rm.XMLStorageResourceData;
import org.openflexo.foundation.utils.FlexoProjectFile;
import org.openflexo.foundation.xml.VEShemaLibraryBuilder;
import org.openflexo.inspector.InspectableObject;
import org.openflexo.xmlcode.XMLMapping;
/**
* A FlexoComponentLibrary is an object referencing all components used in the project
*
* @author benoit,sylvain
*/
public class ViewLibrary extends ViewLibraryObject implements XMLStorageResourceData, InspectableObject {
private static final Logger logger = Logger.getLogger(ViewLibrary.class.getPackage().getName());
private FlexoOEShemaLibraryResource _resource;
private String name;
private ViewFolder _rootFolder;
/**
* Create a new FlexoComponentLibrary.
*/
public ViewLibrary(VEShemaLibraryBuilder builder) {
this(builder.getProject());
builder.shemaLibrary = this;
_resource = builder.resource;
initializeDeserialization(builder);
}
/**
* Create a new FlexoComponentLibrary.
*/
public ViewLibrary(FlexoProject project) {
super(project);
}
@Override
public FlexoOEShemaLibraryResource getFlexoResource() {
return _resource;
}
@Override
public FlexoXMLStorageResource getFlexoXMLFileResource() {
return _resource;
}
/**
* Creates and returns a newly created shema library
*
* @return a newly created shema library
*/
public static ViewLibrary createNewShemaLibrary(FlexoProject project) {
ViewLibrary newLibrary = new ViewLibrary(project);
if (logger.isLoggable(Level.INFO)) {
logger.info("createNewShemaLibrary(), project=" + project + " " + newLibrary);
}
File compFile = ProjectRestructuration.getExpectedShemaLibFile(project);
FlexoProjectFile shemaLibFile = new FlexoProjectFile(compFile, project);
FlexoOEShemaLibraryResource slRes;
try {
slRes = new FlexoOEShemaLibraryResource(project, newLibrary, shemaLibFile);
} catch (InvalidFileNameException e2) {
e2.printStackTrace();
shemaLibFile = new FlexoProjectFile("ShemaLibrary");
shemaLibFile.setProject(project);
try {
slRes = new FlexoOEShemaLibraryResource(project, newLibrary, shemaLibFile);
} catch (InvalidFileNameException e) {
if (logger.isLoggable(Level.SEVERE)) {
logger.severe("Could not create shema library.");
}
e.printStackTrace();
return null;
}
}
try {
slRes.saveResourceData();
project.registerResource(slRes);
} catch (Exception e1) {
// Warns about the exception
if (logger.isLoggable(Level.WARNING)) {
logger.warning("Exception raised: " + e1.getClass().getName() + ". See console for details.");
}
e1.printStackTrace();
}
try {
ViewFolder.createNewRootFolder(newLibrary);
} catch (Exception e) {
e.printStackTrace();
}
return newLibrary;
}
@Override
public ViewLibrary getShemaLibrary() {
return this;
}
@Override
public void setFlexoResource(FlexoResource resource) {
_resource = (FlexoOEShemaLibraryResource) resource;
}
@Override
public String getName() {
return name;
}
@Override
public void setName(String aName) {
name = aName;
}
/**
* Save this object using ResourceManager scheme Additionnaly save all known processes related to this workflow
*
* Overrides
*
* @see org.openflexo.foundation.rm.FlexoResourceData#save()
* @see org.openflexo.foundation.rm.FlexoResourceData#save()
*/
@Override
public void save() throws SaveResourceException {
_resource.saveResourceData();
}
/**
* Return an enumeration of all folders, by recursively explore the tree
*
* @return an Enumeration of FlexoComponentFolder elements
*/
public Enumeration<ViewFolder> allFolders() {
Vector<ViewFolder> temp = new Vector<ViewFolder>();
addFolders(temp, getRootFolder());
return temp.elements();
}
/**
* Return number of folders
*/
public int allFoldersCount() {
Vector<ViewFolder> temp = new Vector<ViewFolder>();
addFolders(temp, getRootFolder());
return temp.size();
}
private void addFolders(List<ViewFolder> temp, ViewFolder folder) {
temp.add(folder);
for (Enumeration<ViewFolder> e = folder.getSubFolders().elements(); e.hasMoreElements();) {
ViewFolder currentFolder = e.nextElement();
addFolders(temp, currentFolder);
}
}
public ViewFolder getFolderWithName(String folderName) {
for (Enumeration<ViewFolder> e = allFolders(); e.hasMoreElements();) {
ViewFolder folder = e.nextElement();
if (folder.getName().equals(folderName)) {
return folder;
}
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("Could not find folder named " + folderName);
}
return null;
}
// ==========================================================================
// ============================= Instance methods
// ===========================
// ==========================================================================
public void setRootFolder(ViewFolder rootFolder) {
_rootFolder = rootFolder;
_rootFolder.setShemaLibrary(this);
}
public ViewFolder getRootFolder() {
if (_rootFolder == null) {
if (!isDeserializing()) {
if (logger.isLoggable(Level.WARNING)) {
logger.warning("No root folder defined for component library");
}
setRootFolder(ViewFolder.createNewRootFolder(this));
}
}
return _rootFolder;
}
public boolean hasRootFolder() {
return _rootFolder != null;
}
// =============================================================
// ===================== Accessors =============================
// =============================================================
public List<ViewFolder> getAllFolderList() {
List<ViewFolder> answer = new ArrayList<ViewFolder>();
addFolder(answer, getRootFolder());
return answer;
}
private void addFolder(List<ViewFolder> answer, ViewFolder rootFolder) {
answer.add(rootFolder);
for (Enumeration<ViewFolder> en = rootFolder.getSortedSubFolders(); en.hasMoreElements();) {
addFolder(answer, en.nextElement());
}
}
public Vector<ViewDefinition> getAllShemaList() {
Vector<ViewDefinition> answer = new Vector<ViewDefinition>();
answer.addAll(getRootFolder().getAllShemas());
return answer;
}
public File getFile() {
return _resource.getResourceFile().getFile();
}
public List<View> getViewsForViewPointWithURI(String vpURI) {
List<View> views = new ArrayList<View>();
for (ViewDefinition vd : getAllShemaList()) {
if (vd.getViewPoint() != null && vd.getViewPoint().getURI().equals(vpURI)) {
views.add(vd.getShema());
}
}
return views;
}
// ==========================================================================
// ========================= XML Serialization ============================
// ==========================================================================
@Override
public XMLMapping getXMLMapping() {
return getProject().getXmlMappings().getShemaLibraryMapping();
}
/**
* @param value
* @return
*/
public void delete(ViewDefinition def) {
boolean b = _rootFolder.delete(def);
if (logger.isLoggable(Level.INFO)) {
logger.info("Shema removal " + (b ? "succeed" : "failed"));
}
}
public boolean isValidForANewShemaName(String value) {
if (value == null) {
return false;
}
if (_rootFolder != null) {
return _rootFolder.isValidForANewShemaName(value);
}
return true;
}
public ViewDefinition getShemaNamed(String value) {
if (value == null) {
return null;
}
if (_rootFolder != null) {
return _rootFolder.getShemaNamed(value);
}
if (logger.isLoggable(Level.INFO)) {
logger.info("Cannot find a component named : " + value);
}
return null;
}
public Vector<ViewDefinition> retrieveAllShemas() {
Vector<ViewDefinition> returned = new Vector<ViewDefinition>();
if (getRootFolder() != null) {
appendAllShemas(getRootFolder(), returned);
}
return returned;
}
private void appendAllShemas(ViewFolder folder, Vector<ViewDefinition> v) {
for (ViewDefinition s : folder.getShemas()) {
v.add(s);
}
for (ViewFolder f : folder.getSubFolders()) {
appendAllShemas(f, v);
}
}
@Override
public String getFullyQualifiedName() {
return getProject().getFullyQualifiedName() + "." + "ShemaLibrary";
}
/**
* @param definition
*/
public void handleNewShemaCreated(ViewDefinition definition) {
setChanged();
notifyObservers(new SLShemaCreated(definition));
}
/**
* Overrides getClassNameKey
*
* @see org.openflexo.foundation.FlexoModelObject#getClassNameKey()
*/
@Override
public String getClassNameKey() {
return "shema_library";
}
/**
* Overrides getInspectorName
*
* @see org.openflexo.inspector.InspectableObject#getInspectorName()
*/
@Override
public String getInspectorName() {
return Inspectors.VE.OE_SHEMA_LIBRARY_INSPECTOR;
}
}