/***************************************************
*
* cismet GmbH, Saarbruecken, Germany
*
* ... and it just works.
*
****************************************************/
package de.cismet.cids.custom.switchon.utils;
import Sirius.navigator.connection.SessionManager;
import Sirius.navigator.exception.ConnectionException;
import Sirius.server.middleware.types.MetaClass;
import Sirius.server.middleware.types.MetaObject;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import de.cismet.cids.dynamics.CidsBean;
import de.cismet.cids.navigator.utils.ClassCacheMultiple;
import de.cismet.commons.concurrency.CismetExecutors;
/**
* DOCUMENT ME!
*
* @author Gilles Baatz
* @author Pascal Dihé
* @version $Revision$, $Date$
*/
public class TagUtils {
//~ Static fields/initializers ---------------------------------------------
private static final org.apache.log4j.Logger LOG = org.apache.log4j.Logger.getLogger(TagUtils.class);
private static final ExecutorService executor = CismetExecutors.newCachedThreadPool();
//~ Methods ----------------------------------------------------------------
/**
* Returns the description of tag. The tag can be a MetaObject or a CidsBean.
*
* @param tag DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static String getDescriptionOfTag(final Object tag) {
CidsBean tagBean = null;
if (tag instanceof MetaObject) {
tagBean = ((MetaObject)tag).getBean();
} else if (tag instanceof CidsBean) {
tagBean = (CidsBean)tag;
}
String description;
if (tagBean != null) {
description = (String)tagBean.getProperty("description");
} else {
description = "No description available.";
}
return description;
}
/**
* Fetches a future of a tag by its name, if no tag is available or something goes wrong, then null will be
* returned.
*
* @param name DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Future<CidsBean> fetchFutureTagByName(final String name) {
final Future<CidsBean> futureTag = executor.submit(new Callable<CidsBean>() {
@Override
public CidsBean call() throws Exception {
return fetchTagByName(name);
}
});
return futureTag;
}
/**
* DOCUMENT ME!
*
* @param tagName DOCUMENT ME!
* @param taggroupName DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static Future<CidsBean> fetchFutureTagByNameAndTaggroup(final String tagName, final String taggroupName) {
final Future<CidsBean> futureTag = executor.submit(new Callable<CidsBean>() {
@Override
public CidsBean call() throws Exception {
return fetchTagByNameAndTaggroup(tagName, taggroupName);
}
});
return futureTag;
}
/**
* Fetches a tag by its name, if no tag is available or something goes wrong, then null will be returned.
*
* @param name DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static CidsBean fetchTagByName(final String name) {
try {
final MetaClass MB_MC = ClassCacheMultiple.getMetaClass("SWITCHON", "tag");
String query = "SELECT " + MB_MC.getID() + ", " + MB_MC.getPrimaryKey() + " ";
query += "FROM " + MB_MC.getTableName();
query += " WHERE name ilike '" + name + "' limit 1";
final MetaObject[] metaObjects = SessionManager.getProxy()
.getMetaObjectByQuery(SessionManager.getSession().getUser(), query, "SWITCHON");
if ((metaObjects != null) && (metaObjects.length == 1)) {
return metaObjects[0].getBean();
} else {
return null;
}
} catch (ConnectionException ex) {
LOG.error(ex, ex);
return null;
}
}
/**
* DOCUMENT ME!
*
* @param tagName DOCUMENT ME!
* @param taggroupName DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static CidsBean fetchTagByNameAndTaggroup(final String tagName, final String taggroupName) {
try {
final MetaClass tagClass = ClassCacheMultiple.getMetaClass("SWITCHON", "tag");
final MetaClass taggroupClass = ClassCacheMultiple.getMetaClass("SWITCHON", "taggroup");
if (taggroupClass != null) {
String query = "SELECT " + tagClass.getID() + ", " + tagClass.getPrimaryKey() + " ";
query += "FROM " + tagClass.getTableName();
query += " WHERE " + tagClass.getTableName() + ".name ilike '" + tagName + "' AND ";
query += " tag.taggroup = (";
query += "SELECT " + taggroupClass.getPrimaryKey() + " ";
query += "FROM " + taggroupClass.getTableName();
query += " WHERE " + taggroupClass.getTableName() + ".name ilike '" + taggroupName + "' limit 1)";
query += " limit 1";
if (LOG.isDebugEnabled()) {
LOG.debug("retrieving tag '" + tagName + "' for taggroup'" + taggroupName + "' with query: \n"
+ query);
}
final MetaObject[] metaObjects = SessionManager.getProxy()
.getMetaObjectByQuery(SessionManager.getSession().getUser(), query, "SWITCHON");
if ((metaObjects != null) && (metaObjects.length == 1)) {
return metaObjects[0].getBean();
} else {
LOG.warn("could not find tag '" + tagName + "' for taggroup'" + taggroupName + "'");
return null;
}
} else {
LOG.error("taggroup '" + taggroupName + "' for tag '" + tagName + "' not found!");
return null;
}
} catch (ConnectionException ex) {
LOG.error(ex, ex);
return null;
}
}
/**
* Iterates through a list of tags and returns the first tag whose taggroup equals the taggroup in the parameter.
*
* @param tags DOCUMENT ME!
* @param taggroup DOCUMENT ME!
*
* @return DOCUMENT ME!
*/
public static CidsBean returnFirstOccurrenceOfTaggroup(final List<CidsBean> tags, final String taggroup) {
for (final CidsBean tag : tags) {
final CidsBean taggroupBean = (CidsBean)tag.getProperty("taggroup");
final String taggroupName = (String)taggroupBean.getProperty("name");
if (taggroupName.equals(taggroup)) {
return tag;
}
}
return null;
}
}