Request request = ContextHelper.getRequest(this.componentContext);
try {
String profileID = "global";
String copletID = request.getParameter(PortalManagerImpl.REQ_PARAMETER_COPLET);
SessionContext context = this.getContext(true);
Map configuration = this.getConfiguration();
DocumentFragment copletsFragment = (DocumentFragment)context.getAttribute(ATTRIBUTE_ADMIN_COPLETS);
String command = request.getParameter(PortalManagerImpl.REQ_PARAMETER_ADMIN_COPLETS);
if (command != null && copletsFragment != null) {
try {
this.getTransactionManager().startWritingTransaction(context);
// save : save coplets base
// new : new coplet
// delete : use id to delete coplet
// change : change the coplet
// cache : cleans the cache
if (command.equals("delete") && copletID != null) {
Node coplet = DOMUtil.getSingleNode(copletsFragment, "coplets-profile/coplets/coplet[@id='"+copletID+"']", this.xpathProcessor);
if (coplet != null) {
coplet.getParentNode().removeChild(coplet);
}
} else if (command.equals("change") && copletID != null) {
Node coplet = DOMUtil.getSingleNode(copletsFragment, "coplets-profile/coplets/coplet[@id='"+copletID+"']", this.xpathProcessor);
if (coplet != null) {
// now get the information
String value;
value = request.getParameter("portaladmin_title");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.getSingleNode(coplet, "title", this.xpathProcessor), value);
value = request.getParameter("portaladmin_mand");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.getSingleNode(coplet, "configuration/mandatory", this.xpathProcessor), value);
value = request.getParameter("portaladmin_sizable");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.getSingleNode(coplet, "configuration/sizable", this.xpathProcessor), value);
value = request.getParameter("portaladmin_active");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.getSingleNode(coplet, "configuration/active", this.xpathProcessor), value);
value = request.getParameter("portaladmin_handsize");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/handlesSizable", this.xpathProcessor), value);
value = request.getParameter("portaladmin_handpar");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/handlesParameters", this.xpathProcessor), value);
value = request.getParameter("portaladmin_timeout");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/timeout", this.xpathProcessor), value);
value = request.getParameter("portaladmin_customizable");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/customizable", this.xpathProcessor), value);
value = request.getParameter("portaladmin_persistent");
if (value != null) DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/persistent", this.xpathProcessor), value);
String resource = request.getParameter("portaladmin_resource");
if (resource != null) {
Element resourceNode = (Element)DOMUtil.getSingleNode(coplet, "resource", this.xpathProcessor);
resourceNode.getParentNode().removeChild(resourceNode);
resourceNode = coplet.getOwnerDocument().createElementNS(null, "resource");
resourceNode.setAttributeNS(null, "uri", resource);
coplet.appendChild(resourceNode);
}
resource = request.getParameter("portaladmin_cust");
boolean isCustom = DOMUtil.getValueAsBooleanOf(coplet, "configuration/customizable", false, this.xpathProcessor);
if (resource != null && isCustom ) {
Element resourceNode = (Element)DOMUtil.getSingleNode(coplet, "customization", this.xpathProcessor);
if (resourceNode != null) resourceNode.getParentNode().removeChild(resourceNode);
resourceNode = coplet.getOwnerDocument().createElementNS(null, "customization");
resourceNode.setAttributeNS(null, "uri", resource);
coplet.appendChild(resourceNode);
}
if (!isCustom) {
Element resourceNode = (Element)DOMUtil.getSingleNode(coplet, "customization", this.xpathProcessor);
if (resourceNode != null) resourceNode.getParentNode().removeChild(resourceNode);
}
// transformations
value = request.getParameter("portaladmin_newxsl");
if (value != null) {
Element tNode = (Element)DOMUtil.selectSingleNode(coplet, "transformation", this.xpathProcessor);
Element sNode = tNode.getOwnerDocument().createElementNS(null, "stylesheet");
tNode.appendChild(sNode);
sNode.appendChild(sNode.getOwnerDocument().createTextNode(value));
}
// now get all transformation stylesheets, mark
// all stylesheets which should be deleted with
// an attribute delete
Enumeration keys = request.getParameterNames();
Element sNode;
String key;
while (keys.hasMoreElements() ) {
key = (String)keys.nextElement();
if (key.startsWith("portaladmin_xsl_") ) {
value = key.substring(key.lastIndexOf('_')+ 1);
sNode = (Element)DOMUtil.getSingleNode(coplet, "transformation/stylesheet[position()="+value+"]", this.xpathProcessor);
if (sNode != null) {
String xslName = request.getParameter(key);
if (xslName.equals("true") ) xslName = "**STYLESHEET**";
DOMUtil.setValueOfNode(sNode, xslName);
}
} else if (key.startsWith("portaladmin_delxsl_") ) {
value = key.substring(key.lastIndexOf('_')+ 1);
sNode = (Element)DOMUtil.getSingleNode(coplet, "transformation/stylesheet[position()="+value+"]", this.xpathProcessor);
if (sNode != null) {
sNode.setAttributeNS(null, "delete", "true");
}
}
}
NodeList delete = DOMUtil.selectNodeList(coplet, "transformation/stylesheet[@delete]", this.xpathProcessor);
if (delete != null) {
for(int i=0; i < delete.getLength(); i++) {
delete.item(i).getParentNode().removeChild(delete.item(i));
}
}
}
} else if (command.equals("new") ) {
// first we have to invent a new coplet id!
int index = 0;
boolean found = false;
Element coplet;
Element subNode;
while (!found) {
copletID = "S"+index;
coplet = (Element)DOMUtil.getSingleNode(copletsFragment, "coplets-profile/coplets/coplet[@id='"+copletID+"']", this.xpathProcessor);
if (coplet == null) {
found = true;
} else {
index++;
}
}
coplet = copletsFragment.getOwnerDocument().createElementNS(null, "coplet");
coplet.setAttributeNS(null, "id", copletID);
subNode = coplet.getOwnerDocument().createElementNS(null, "resource");
coplet.appendChild(subNode);
subNode.setAttributeNS(null, "uri", "uri_in_sitemap");
String title = request.getParameter("portaladmin_title");
if (title == null || title.trim().length() == 0) title = "**NEW COPLET**";
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/mandatory", this.xpathProcessor), "false");
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/sizable", this.xpathProcessor), "true");
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/active", this.xpathProcessor), "false");
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/handlesParameters", this.xpathProcessor), "true");
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "configuration/handlesSizable", this.xpathProcessor), "false");
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "title", this.xpathProcessor), title);
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "status/visible", this.xpathProcessor), "true");
DOMUtil.setValueOfNode(DOMUtil.selectSingleNode(coplet, "status/size", this.xpathProcessor), "max");
DOMUtil.getSingleNode(copletsFragment, "coplets-profile/coplets", this.xpathProcessor).appendChild(coplet);
} else if (command.equals("save") ) {
SourceParameters pars = new SourceParameters();
pars.setSingleParameterValue("profile", "coplet-base");
RequestState state = this.getRequestState();
pars.setSingleParameterValue("application", state.getApplicationName());
pars.setSingleParameterValue("handler", state.getHandlerName());
String saveResource = (String)configuration.get(PortalConstants.CONF_COPLETBASE_SAVE_RESOURCE);
if (saveResource == null) {
throw new ProcessingException("portal: No save resource defined for type coplet-base.");
} else {
SourceUtil.writeDOM(saveResource,
null,
pars,
copletsFragment,
this.resolver,
"xml");
// now the hardest part, clean up the whole cache
this.cleanUpCache(null, null, configuration);
}
}
} finally {
this.getTransactionManager().stopWritingTransaction(context);
}
}
// general commands
if (command != null && command.equals("cleancache") ) {
this.cleanUpCache(null, null, configuration);
}
String state = request.getParameter(PortalManagerImpl.REQ_PARAMETER_STATE);
if (state == null) {
state = (String)context.getAttribute(ATTRIBUTE_ADMIN_STATE, PortalConstants.STATE_MAIN);
}
// now start producing xml:
AttributesImpl attr = new AttributesImpl();
consumer.startElement("", PortalConstants.ELEMENT_ADMINCONF, PortalConstants.ELEMENT_ADMINCONF, attr);
context.setAttribute(ATTRIBUTE_ADMIN_STATE, state);
consumer.startElement("", PortalConstants.ELEMENT_STATE, PortalConstants.ELEMENT_STATE, attr);
consumer.characters(state.toCharArray(), 0, state.length());
consumer.endElement("", PortalConstants.ELEMENT_STATE, PortalConstants.ELEMENT_STATE);
if (state.equals(PortalConstants.STATE_MAIN) ) {
Document rolesDF = this.getRoles();
Node roles = null;
if (rolesDF != null) roles = DOMUtil.getSingleNode(rolesDF, "roles", this.xpathProcessor);
IncludeXMLConsumer.includeNode(roles, consumer, consumer);
}
if (state.equals(PortalConstants.STATE_MAIN_ROLE) ) {
Document rolesDF = this.getRoles();
Node roles = null;
if (rolesDF != null) roles = DOMUtil.getSingleNode(rolesDF, "roles", this.xpathProcessor);
IncludeXMLConsumer.includeNode(roles, consumer, consumer);
String role = request.getParameter(PortalManagerImpl.REQ_PARAMETER_ROLE);
if (role == null) {
role = (String)context.getAttribute(ATTRIBUTE_ADMIN_ROLE);
}
context.setAttribute(ATTRIBUTE_ADMIN_ROLE, role);
if (role != null) {
XMLUtils.startElement(consumer, "roleusers");
XMLUtils.startElement(consumer, "name");
XMLUtils.data(consumer, role);
XMLUtils.endElement(consumer, "name");
Document userDF = this.getUsers(role, null);
Node users = null;
if (userDF != null) users = DOMUtil.getSingleNode(userDF, "users", this.xpathProcessor);
IncludeXMLConsumer.includeNode(users, consumer, consumer);
XMLUtils.endElement(consumer, "roleusers");
}
}
if (state.equals(PortalConstants.STATE_GLOBAL)) {
profileID = this.getProfileID(PortalManagerImpl.BUILDTYPE_VALUE_GLOBAL, null, null, true);
Map profile = this.retrieveProfile(profileID);
if (profile == null) {
this.createProfile(context, PortalManagerImpl.BUILDTYPE_VALUE_GLOBAL, null, null, true);
profile = this.retrieveProfile(profileID);
}
this.showPortal(consumer, true, context, profile, profileID);
}
if (state.equals(PortalConstants.STATE_ROLE) ) {
String role = request.getParameter(PortalManagerImpl.REQ_PARAMETER_ROLE);
if (role == null) {
role = (String)context.getAttribute(ATTRIBUTE_ADMIN_ROLE);
}
context.setAttribute(ATTRIBUTE_ADMIN_ROLE, role);
if (role != null) {
consumer.startElement("", PortalConstants.ELEMENT_ROLE, PortalConstants.ELEMENT_ROLE, attr);
consumer.characters(role.toCharArray(), 0, role.length());
consumer.endElement("", PortalConstants.ELEMENT_ROLE, PortalConstants.ELEMENT_ROLE);
profileID = this.getProfileID(PortalManagerImpl.BUILDTYPE_VALUE_ROLE, role, null, true);
Map profile = this.retrieveProfile(profileID);
if (profile == null) {
this.createProfile(context, PortalManagerImpl.BUILDTYPE_VALUE_ROLE, role, null, true);
profile = this.retrieveProfile(profileID);
}
this.showPortal(consumer, true, context, profile, profileID);
}
}
if (state.equals(PortalConstants.STATE_USER) ) {
String role = request.getParameter(PortalManagerImpl.REQ_PARAMETER_ROLE);
String id = request.getParameter(PortalManagerImpl.REQ_PARAMETER_ID);
if (role == null) {
role = (String)context.getAttribute(ATTRIBUTE_ADMIN_ROLE);
}
if (id == null) {
id = (String)context.getAttribute(ATTRIBUTE_ADMIN_ID);
}
context.setAttribute(ATTRIBUTE_ADMIN_ID, id);
context.setAttribute(ATTRIBUTE_ADMIN_ROLE, role);
if (role != null && id != null) {
consumer.startElement("", PortalConstants.ELEMENT_ROLE, PortalConstants.ELEMENT_ROLE, attr);
consumer.characters(role.toCharArray(), 0, role.length());
consumer.endElement("", PortalConstants.ELEMENT_ROLE, PortalConstants.ELEMENT_ROLE);
consumer.startElement("", PortalConstants.ELEMENT_ID, PortalConstants.ELEMENT_ID, attr);
consumer.characters(id.toCharArray(), 0, id.length());
consumer.endElement("", PortalConstants.ELEMENT_ID, PortalConstants.ELEMENT_ID);
profileID = this.getProfileID(PortalManagerImpl.BUILDTYPE_VALUE_ID, role, id, true);
Map profile = this.retrieveProfile(profileID);
if (profile == null) {
this.createProfile(context, PortalManagerImpl.BUILDTYPE_VALUE_ID, role, id, true);
profile = this.retrieveProfile(profileID);
}
this.showPortal(consumer, true, context, profile, profileID);
}
}
// one coplet
if (state.equals(PortalConstants.STATE_COPLET) ) {
if (copletsFragment != null && copletID != null) {
Node coplet = DOMUtil.getSingleNode(copletsFragment, "coplets-profile/coplets/coplet[@id='"+copletID+"']", this.xpathProcessor);
if (coplet != null) {
IncludeXMLConsumer.includeNode(coplet, consumer, consumer);
}
} else {
state = PortalConstants.STATE_COPLETS;
}
}
if (state.equals(PortalConstants.STATE_COPLETS) ) {
consumer.startElement("", PortalConstants.ELEMENT_COPLETS, PortalConstants.ELEMENT_COPLETS, attr);
// load the base coplets profile
if (copletsFragment == null) {
SourceParameters pars = new SourceParameters();
RequestState reqstate = this.getRequestState();
pars.setSingleParameterValue("application", reqstate.getApplicationName());
String res = (String)configuration.get(PortalConstants.CONF_COPLETBASE_RESOURCE);
if (res == null) {
throw new ProcessingException("No configuration for portal-coplet base profile found.");
}
copletsFragment = SourceUtil.readDOM(res,
null,
pars,
this.resolver);
context.setAttribute(ATTRIBUTE_ADMIN_COPLETS, copletsFragment);
}
IncludeXMLConsumer.includeNode(DOMUtil.selectSingleNode(copletsFragment,
"coplets-profile", this.xpathProcessor), consumer, consumer);
consumer.endElement("", PortalConstants.ELEMENT_COPLETS, PortalConstants.ELEMENT_COPLETS);
}