use of org.apereo.portal.layout.LayoutStructure in project uPortal by Jasig.
the class RDBMUserLayoutStore method getPersonalUserLayout.
protected Document getPersonalUserLayout(final IPerson person, final IUserProfile profile) {
final LocaleManager localeManager = profile.getLocaleManager();
return jdbcOperations.execute(new ConnectionCallback<Document>() {
@Override
public Document doInConnection(Connection con) throws SQLException, DataAccessException {
ResultSet rs;
int userId = person.getID();
final int realUserId = userId;
Document doc = DocumentFactory.getThreadDocument();
Element root = doc.createElement("layout");
final Statement stmt = con.createStatement();
// A separate statement is needed so as not to interfere with ResultSet
// of statements used for queries
Statement insertStmt = con.createStatement();
try {
long startTime = System.currentTimeMillis();
// eventually, we need to fix template layout implementations so you can
// just do this:
// int layoutId=profile.getLayoutId();
// but for now:
int layoutId = getLayoutID(userId, profile.getProfileId());
if (layoutId == 0) {
// First time, grab the default layout for this user
final Tuple<Integer, Integer> userLayoutIds = transactionOperations.execute(new TransactionCallback<Tuple<Integer, Integer>>() {
@Override
public Tuple<Integer, Integer> doInTransaction(TransactionStatus status) {
return jdbcOperations.execute(new ConnectionCallback<Tuple<Integer, Integer>>() {
@Override
public Tuple<Integer, Integer> doInConnection(Connection con) throws SQLException, DataAccessException {
int newLayoutId;
int newUserId;
String sQuery = "SELECT USER_DFLT_USR_ID, USER_DFLT_LAY_ID FROM UP_USER WHERE USER_ID=" + realUserId;
logger.debug("getUserLayout(): {}", sQuery);
ResultSet rs = stmt.executeQuery(sQuery);
try {
if (rs.next()) {
newUserId = rs.getInt(1);
newLayoutId = rs.getInt(2);
} else {
final String msg = "Unable to find default user for USER_ID=" + realUserId;
throw new SQLException(msg);
}
} finally {
rs.close();
}
// Make sure the next struct
// id is set in case the
// user adds a channel
sQuery = "SELECT NEXT_STRUCT_ID FROM UP_USER WHERE USER_ID=" + newUserId;
logger.debug("getUserLayout(): {}", sQuery);
int nextStructId;
rs = stmt.executeQuery(sQuery);
try {
if (rs.next()) {
nextStructId = rs.getInt(1);
} else {
final String msg = "Unable to find NEXT_STRUCT_ID for USER_ID=" + realUserId;
throw new SQLException(msg);
}
} finally {
rs.close();
}
int realNextStructId = 0;
if (realUserId != newUserId) {
// But never make the
// existing value
// SMALLER, change it
// only to make it
// LARGER
// (so, get existing
// value)
sQuery = "SELECT NEXT_STRUCT_ID FROM UP_USER WHERE USER_ID=" + realUserId;
logger.debug("getUserLayout(): {}", sQuery);
rs = stmt.executeQuery(sQuery);
try {
if (rs.next()) {
realNextStructId = rs.getInt(1);
} else {
final String msg = "Unable to find NEXT_STRUCT_ID for USER_ID=" + realUserId;
throw new SQLException(msg);
}
} finally {
rs.close();
}
}
if (nextStructId > realNextStructId) {
sQuery = "UPDATE UP_USER SET NEXT_STRUCT_ID=" + nextStructId + " WHERE USER_ID=" + realUserId;
logger.debug("getUserLayout(): {}", sQuery);
stmt.executeUpdate(sQuery);
}
return new Tuple<>(newUserId, newLayoutId);
}
});
}
});
userId = userLayoutIds.first;
layoutId = userLayoutIds.second;
}
int firstStructId;
// Flags to enable a default layout lookup if it's needed
boolean foundLayout;
boolean triedDefault = false;
// once.
do {
String sQuery = "SELECT INIT_STRUCT_ID FROM UP_USER_LAYOUT WHERE USER_ID=" + userId + " AND LAYOUT_ID = " + layoutId;
logger.debug("getUserLayout(): {}", sQuery);
rs = stmt.executeQuery(sQuery);
try {
if (rs.next()) {
firstStructId = rs.getInt(1);
} else {
throw new RuntimeException("getUserLayout(): No INIT_STRUCT_ID in UP_USER_LAYOUT for USER_ID: " + userId + " and LAYOUT_ID: " + layoutId);
}
} finally {
rs.close();
}
String sql;
if (localeManagerFactory.isLocaleAware()) {
// This needs to be changed to get the localized strings
sql = "SELECT ULS.STRUCT_ID,ULS.NEXT_STRUCT_ID,ULS.CHLD_STRUCT_ID,ULS.CHAN_ID,ULS.NAME,ULS.TYPE,ULS.HIDDEN," + "ULS.UNREMOVABLE,ULS.IMMUTABLE";
} else {
sql = "SELECT ULS.STRUCT_ID,ULS.NEXT_STRUCT_ID,ULS.CHLD_STRUCT_ID,ULS.CHAN_ID,ULS.NAME,ULS.TYPE,ULS.HIDDEN," + "ULS.UNREMOVABLE,ULS.IMMUTABLE";
}
if (databaseMetadata.supportsOuterJoins()) {
sql += ",USP.STRUCT_PARM_NM,USP.STRUCT_PARM_VAL FROM " + databaseMetadata.getJoinQuery().getQuery("layout");
} else {
sql += " FROM UP_LAYOUT_STRUCT ULS WHERE ";
}
sql += " ULS.USER_ID=" + userId + " AND ULS.LAYOUT_ID=" + layoutId + " ORDER BY ULS.STRUCT_ID";
logger.debug("getUserLayout(): {}", sql);
rs = stmt.executeQuery(sql);
// check for rows in the result set
foundLayout = rs.next();
if (!foundLayout && !triedDefault && userId == realUserId) {
// If we didn't find any rows and we haven't tried the default
// user yet
triedDefault = true;
rs.close();
// Get the default user ID and layout ID
sQuery = "SELECT USER_DFLT_USR_ID, USER_DFLT_LAY_ID FROM UP_USER WHERE USER_ID=" + userId;
logger.debug("getUserLayout(): {}", sQuery);
rs = stmt.executeQuery(sQuery);
try {
rs.next();
userId = rs.getInt(1);
layoutId = rs.getInt(2);
} finally {
rs.close();
}
} else {
// We tried the default or actually found a layout
break;
}
} while (!foundLayout);
HashMap layoutStructure = new HashMap();
StringBuffer structChanIds = new StringBuffer();
try {
int lastStructId = 0;
LayoutStructure ls = null;
String sepChar = "";
if (foundLayout) {
int structId = rs.getInt(1);
// -1 back
if (rs.wasNull()) {
structId = 0;
}
readLayout: while (true) {
int nextId = rs.getInt(2);
if (rs.wasNull()) {
nextId = 0;
}
int childId = rs.getInt(3);
if (rs.wasNull()) {
childId = 0;
}
int chanId = rs.getInt(4);
if (rs.wasNull()) {
chanId = 0;
}
String temp5 = rs.getString(// Some JDBC drivers require columns
5);
// accessed in order
String temp6 = rs.getString(// Access 5 and 6 now, save till needed.
6);
// uPortal i18n
int name_index, value_index;
if (localeManagerFactory.isLocaleAware()) {
List<Locale> locales = localeManager.getLocales();
String locale = locales.get(0).toString();
ls = new LayoutStructure(structId, nextId, childId, chanId, rs.getString(7), rs.getString(8), rs.getString(9), locale);
name_index = 10;
value_index = 11;
} else {
ls = new LayoutStructure(structId, nextId, childId, chanId, rs.getString(7), rs.getString(8), rs.getString(9));
name_index = 10;
value_index = 11;
}
layoutStructure.put(new Integer(structId), ls);
lastStructId = structId;
if (!ls.isChannel()) {
ls.addFolderData(temp5, // Plug in saved column values
temp6);
}
if (databaseMetadata.supportsOuterJoins()) {
do {
String name = rs.getString(name_index);
String value = // Oracle JDBC
rs.getString(value_index);
// this for longs
if (name != null) {
// may not be there because of
// the join
ls.addParameter(name, value);
}
if (!rs.next()) {
break readLayout;
}
structId = rs.getInt(1);
if (rs.wasNull()) {
structId = 0;
}
} while (structId == lastStructId);
} else {
// parameters
if (ls.isChannel()) {
structChanIds.append(sepChar + ls.getChanId());
sepChar = ",";
}
if (rs.next()) {
structId = rs.getInt(1);
if (rs.wasNull()) {
structId = 0;
}
} else {
break readLayout;
}
}
}
// while
}
} finally {
rs.close();
}
if (!databaseMetadata.supportsOuterJoins() && structChanIds.length() > 0) {
// Pick up structure parameters
// first, get the struct ids for the channels
String sql = "SELECT STRUCT_ID FROM UP_LAYOUT_STRUCT WHERE USER_ID=" + userId + " AND LAYOUT_ID=" + layoutId + " AND CHAN_ID IN (" + structChanIds.toString() + ") ORDER BY STRUCT_ID";
logger.debug("getUserLayout(): {}", sql);
StringBuffer structIdsSB = new StringBuffer("");
String sep = "";
rs = stmt.executeQuery(sql);
try {
// for
while (rs.next()) {
structIdsSB.append(sep + rs.getString(1));
sep = ",";
}
// while
} finally {
rs.close();
}
// be a good doobie
sql = "SELECT STRUCT_ID, STRUCT_PARM_NM,STRUCT_PARM_VAL FROM UP_LAYOUT_PARAM WHERE USER_ID=" + userId + " AND LAYOUT_ID=" + layoutId + " AND STRUCT_ID IN (" + structIdsSB.toString() + ") ORDER BY STRUCT_ID";
logger.debug("getUserLayout(): {}", sql);
rs = stmt.executeQuery(sql);
try {
if (rs.next()) {
int structId = rs.getInt(1);
readParm: while (true) {
LayoutStructure ls = (LayoutStructure) layoutStructure.get(new Integer(structId));
int lastStructId = structId;
do {
ls.addParameter(rs.getString(2), rs.getString(3));
if (!rs.next()) {
break readParm;
}
} while ((structId = rs.getInt(1)) == lastStructId);
}
}
} finally {
rs.close();
}
}
if (layoutStructure.size() > 0) {
// We have a layout to work with
createLayout(layoutStructure, doc, root, firstStructId);
layoutStructure.clear();
if (logger.isDebugEnabled()) {
long stopTime = System.currentTimeMillis();
long timeTook = stopTime - startTime;
logger.debug("getUserLayout(): Layout document for user {} took {} milliseconds to create", userId, timeTook);
}
doc.appendChild(root);
}
} finally {
stmt.close();
insertStmt.close();
}
return doc;
}
});
}
use of org.apereo.portal.layout.LayoutStructure in project uPortal by Jasig.
the class RDBMUserLayoutStore method createLayout.
/**
* Create a layout
*
* @param layoutStructure
* @param doc
* @param root
* @param structId
* @exception java.sql.SQLException
*/
protected final void createLayout(HashMap layoutStructure, Document doc, Element root, int structId) throws java.sql.SQLException {
while (structId != 0) {
LayoutStructure ls = (LayoutStructure) layoutStructure.get(new Integer(structId));
// replaced with call to method in containing class to allow overriding
// by subclasses of RDBMUserLayoutStore.
// Element structure = ls.getStructureDocument(doc);
Element structure = getStructure(doc, ls);
root.appendChild(structure);
String id = structure.getAttribute("ID");
if (id != null && !id.equals("")) {
structure.setIdAttribute("ID", true);
}
createLayout(layoutStructure, doc, structure, ls.getChildId());
structId = ls.getNextId();
}
}
Aggregations