/*******************************************************************************
* Copyright (c) 2007 Exadel, Inc. and 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:
* Exadel, Inc. and Red Hat, Inc. - initial API and implementation
******************************************************************************/
package org.jboss.tools.common.meta.impl;
import java.util.*;
import org.w3c.dom.*;
import org.jboss.tools.common.model.XModelObjectConstants;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.icons.*;
import org.jboss.tools.common.meta.*;
import org.jboss.tools.common.meta.action.*;
import org.jboss.tools.common.meta.action.impl.*;
import org.jboss.tools.common.meta.constraint.XAttributeConstraint;
import org.jboss.tools.common.meta.constraint.impl.XAttributeConstraintAList;
import org.jboss.tools.common.model.icons.impl.*;
import org.jboss.tools.common.model.loaders.EntityRecognizer;
import org.jboss.tools.common.model.loaders.impl.ModelEntityRecognizer;
public class XModelMetaDataImpl implements XModelMetaData, XMetaDataConstants {
private static XModelMetaDataImpl instance = null;
private static boolean loaded = false;
boolean reportLoadingTime = false;
private HashMap<String,XModelEntity> entities = new HashMap<String,XModelEntity>(50);
private XIconListImpl icons = new XIconListImpl();
private HashMap<String,XMappingImpl> mappings = new HashMap<String,XMappingImpl>();
private XActionListImpl actions = new XActionListImpl();
private XExtensions extensions = new XExtensions();
private XParentsImpl parents = new XParentsImpl();
private ModelEntityRecognizer recognizer;
static Object lock = new Object();
public static XModelMetaData getInstance() {
if(loaded) return instance;
synchronized (lock) {
if(instance != null) return instance;
instance = new XModelMetaDataImpl();
loaded = true;
}
return instance;
}
private XModelMetaDataImpl() {
long t = System.currentTimeMillis();
XMetaDataLoader.loadMetaModel(this);
instance = this;
//uses cached elements
parents.init(this);
XModelEntityImpl r = (XModelEntityImpl)getEntity(XModelObjectConstants.ROOT_OBJECT);
r.validateChildren();
//Resolve XML now, or late resolving may not be thread safe.
XModelEntity[] es = this.entities.values().toArray(new XModelEntity[0]);
for (int i = 0; i < es.length; i++) ((XModelEntityImpl)es[i]).validate();
// makeStatistics(es);
if(reportLoadingTime) {
long dt = - t + (t = System.currentTimeMillis());
ModelPlugin.getPluginLog().logInfo("Meta model loaded in " + dt + " ms"); //$NON-NLS-1$ //$NON-NLS-2$
}
recognizer = new ModelEntityRecognizer(this);
}
public EntityRecognizer getEntityRecognizer() {
return recognizer;
}
private void makeStatistics(XModelEntity[] es) {
Set<String> attNames = new HashSet<String>();
Set<String> listValues = new HashSet<String>();
Set<String> actionMenuNames = new HashSet<String>();
int attrCount = 0;
for (int i = 0; i < es.length; i++) {
XAttribute[] as = es[i].getAttributes();
for (int j = 0; j < as.length; j++) {
if(!as[j].isVisible()) continue;
attrCount++;
attNames.add(as[j].getName());
XAttributeConstraint c = as[j].getConstraint();
if(c instanceof XAttributeConstraintAList) {
String[] values = ((XAttributeConstraintAList)c).getValues();
for (int k = 0; k < values.length; k++)
listValues.add(values[k]);
}
}
XActionList al = es[i].getActionList();
makeActionList(al, actionMenuNames);
}
}
private void makeActionList(XActionList list, Set<String> actionMenuNames) {
XActionItem[] is = list.getActionItems();
for (int i = 0; i < is.length; i++) {
actionMenuNames.add(is[i].getName());
if(is[i] instanceof XActionList) {
makeActionList((XActionList)is[i], actionMenuNames);
}
}
}
public XIconList getIconList() {
return icons;
}
public String[] entities() {
return entities.keySet().toArray(new String[0]);
}
public XModelEntity getEntity(String entityname) {
XModelEntityImpl entity = (XModelEntityImpl)entities.get(entityname);
if(entity != null) entity.validate();
return entity;
}
public XExtensions getExtensions() {
return extensions;
}
public XModelEntity createEntity(Element element, String module) {
XModelEntityImpl entity = new XModelEntityImpl();
entity.setModule(module);
entity.setElement(element);
entities.put(entity.getName(), entity);
return entity;
}
public XMapping getMapping(String name) {
return mappings.get(name);
}
public void createIconList(Element element) {
icons.load(element);
}
public void loadMappings(Element element) {
Element[] es = XMetaDataLoader.getChildrenElements(element, MAPPING);
for (int i = 0; i < es.length; i++) {
String n = es[i].getAttribute(NAME);
XMappingImpl m = mappings.get(n);
if(m == null) {
m = new XMappingImpl();
mappings.put(n, m);
}
m.load(es[i]);
}
}
public XActionList getGlobalActions() {
return actions;
}
public void loadGlobalActions(Element element) {
if(actions.getActionItems() == null) {
actions.load(element);
} else {
XActionListImpl a = new XActionListImpl();
a.load(element);
actions.merge(a);
}
}
private HashMap<String,String> loadedmodules = new HashMap<String,String>();
public HashMap<String,String> getLoadedModules() {
return loadedmodules;
}
/**
* package local
* @return
*/
Map<String,XModelEntity> getEntities() {
return entities;
}
public XParents getParentInfo() {
return parents;
}
}