CCM NG: Classes for Applications Administration UI
git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3692 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
01befa0c74
commit
1bd5963ec3
|
|
@ -0,0 +1,219 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.bebop;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||||
|
import com.arsdigita.bebop.table.TableModel;
|
||||||
|
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||||
|
import com.arsdigita.bebop.util.GlobalizationUtil;
|
||||||
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Displays a list of label-value pairs that
|
||||||
|
* represent the properties of some object. For example, a
|
||||||
|
* typical <code>PropertySheet</code> may look like this:
|
||||||
|
* <p>
|
||||||
|
* <table cellpadding=4 cellspacing=0 border=0>
|
||||||
|
* <tr><th>First Name:</th><td>Stanislav</td></tr>
|
||||||
|
* <tr><th>Last Name:</th><td>Freidin</td></tr>
|
||||||
|
* <tr><th>Mission:</th><td>Sleep</td></tr>
|
||||||
|
* </table>
|
||||||
|
* <p>
|
||||||
|
* This class relies on the {@link PropertySheetModelBuilder} to
|
||||||
|
* supply it with the right {@link PropertySheetModel} during
|
||||||
|
* each request. It is up to the user to provide the right
|
||||||
|
* builder.
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* @author Stanislav Freidin
|
||||||
|
* @version $Id: PropertySheet.java 287 2005-02-22 00:29:02Z sskracic $
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class PropertySheet extends Table {
|
||||||
|
|
||||||
|
|
||||||
|
private PropertySheetModelBuilder m_builder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new <code>PropertySheet</code>.
|
||||||
|
*
|
||||||
|
* @param modelBuilder the property sheet model builder
|
||||||
|
* that is responsible for building the property
|
||||||
|
* sheet model
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PropertySheet(PropertySheetModelBuilder modelBuilder) {
|
||||||
|
super(new PSTMBAdapter(modelBuilder), new Object[]{"Label", "Value"});
|
||||||
|
super.setHeader(null);
|
||||||
|
|
||||||
|
super.getColumn(0).setCellRenderer(new GlobalizedLabelCellRenderer(Label.BOLD));
|
||||||
|
super.getColumn(1).setCellRenderer(new StringLabelCellRenderer(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new <code>PropertySheet</code> and sets the output
|
||||||
|
* escape value.
|
||||||
|
*
|
||||||
|
* @param modelBuilder the property sheet model builder
|
||||||
|
* that is responsible for building the property
|
||||||
|
* sheet model
|
||||||
|
* @param valueOutputEscape the value of the label-value
|
||||||
|
* pair's output-escaping
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public PropertySheet(PropertySheetModelBuilder modelBuilder, boolean valueOutputEscape) {
|
||||||
|
super(new PSTMBAdapter(modelBuilder), new Object[]{"Label", "Value"});
|
||||||
|
super.setHeader(null);
|
||||||
|
|
||||||
|
super.getColumn(0).setCellRenderer(new GlobalizedLabelCellRenderer(Label.BOLD));
|
||||||
|
super.getColumn(1).setCellRenderer(new StringLabelCellRenderer(valueOutputEscape));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link PropertySheetModelBuilder}.
|
||||||
|
* @return the {@link PropertySheetModelBuilder}.
|
||||||
|
*/
|
||||||
|
public PropertySheetModelBuilder getPropertySheetModelBuilder() {
|
||||||
|
return m_builder;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert a PropertySheetModelBuilder to a TableModelBuilder
|
||||||
|
private static class PSTMBAdapter
|
||||||
|
extends LockableImpl implements TableModelBuilder {
|
||||||
|
|
||||||
|
private PropertySheetModelBuilder m_builder;
|
||||||
|
|
||||||
|
public PSTMBAdapter(PropertySheetModelBuilder b) {
|
||||||
|
m_builder = b;
|
||||||
|
}
|
||||||
|
|
||||||
|
public TableModel makeModel(Table t, PageState s) {
|
||||||
|
return new TableModelAdapter(
|
||||||
|
m_builder.makeModel((PropertySheet)t, s)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void lock() {
|
||||||
|
m_builder.lock();
|
||||||
|
super.lock();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wraps a PropertySheetModel
|
||||||
|
private static class TableModelAdapter implements TableModel {
|
||||||
|
|
||||||
|
private PropertySheetModel m_model;
|
||||||
|
private int m_row;
|
||||||
|
|
||||||
|
public TableModelAdapter(PropertySheetModel model) {
|
||||||
|
m_model = model;
|
||||||
|
m_row = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getColumnCount() { return 2; }
|
||||||
|
|
||||||
|
public boolean nextRow() {
|
||||||
|
m_row++;
|
||||||
|
return m_model.nextRow();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getElementAt(int columnIndex) {
|
||||||
|
if(columnIndex == 0) {
|
||||||
|
return m_model.getGlobalizedLabel();
|
||||||
|
} else {
|
||||||
|
return m_model.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getKeyAt(int columnIndex) {
|
||||||
|
return new Integer(m_row);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PropertySheetModel getPSModel() {
|
||||||
|
return m_model;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// Renders strings as labels
|
||||||
|
public static class StringLabelCellRenderer implements TableCellRenderer {
|
||||||
|
|
||||||
|
private String m_weight;
|
||||||
|
private boolean m_outputEscape = false;
|
||||||
|
|
||||||
|
public StringLabelCellRenderer(String weight) {
|
||||||
|
m_weight = weight;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StringLabelCellRenderer(boolean outputEscape) {
|
||||||
|
m_outputEscape = outputEscape;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Component getComponent(Table table, PageState state, Object value,
|
||||||
|
boolean isSelected, Object key,
|
||||||
|
int row, int column) {
|
||||||
|
Label t = getLabel(value);
|
||||||
|
//t.setOutputEscaping(false);
|
||||||
|
t.setOutputEscaping(m_outputEscape);
|
||||||
|
if(m_weight != null) {
|
||||||
|
t.setFontWeight(m_weight);
|
||||||
|
}
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Label getLabel(Object value) {
|
||||||
|
return new Label((String)value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Renders strings as labels
|
||||||
|
public static class GlobalizedLabelCellRenderer extends StringLabelCellRenderer {
|
||||||
|
|
||||||
|
public GlobalizedLabelCellRenderer(String weight) {
|
||||||
|
super(weight);
|
||||||
|
}
|
||||||
|
|
||||||
|
public GlobalizedLabelCellRenderer(boolean outputEscape) {
|
||||||
|
super(outputEscape);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Label getLabel(Object value) {
|
||||||
|
return new Label((GlobalizedMessage)value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An empty {@link PropertySheetModel}.
|
||||||
|
*/
|
||||||
|
public static final PropertySheetModel EMPTY_MODEL =
|
||||||
|
new PropertySheetModel() {
|
||||||
|
public boolean nextRow() { return false; }
|
||||||
|
public String getLabel() {
|
||||||
|
throw new IllegalStateException("The model is empty");
|
||||||
|
}
|
||||||
|
public GlobalizedMessage getGlobalizedLabel() {
|
||||||
|
throw new IllegalStateException((String) GlobalizationUtil.globalize("bebop.the_model_is_empty").localize());
|
||||||
|
}
|
||||||
|
public String getValue() {
|
||||||
|
throw new IllegalStateException("The model is empty");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.bebop;
|
||||||
|
|
||||||
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An abstraction that the
|
||||||
|
* {@link PropertySheet} class uses to display a
|
||||||
|
* 2-column table of label-value pairs.
|
||||||
|
*
|
||||||
|
* @author Stanislav Freidin
|
||||||
|
* @version $Id: PropertySheetModel.java 287 2005-02-22 00:29:02Z sskracic $
|
||||||
|
* @see PropertySheetModelBuilder
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface PropertySheetModel {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Advances to the next property, if possible.
|
||||||
|
*
|
||||||
|
* @return <code>false</code> if there are no more properties;
|
||||||
|
* <code>true</code> otherwise.
|
||||||
|
*/
|
||||||
|
boolean nextRow();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the label for the current property.
|
||||||
|
*
|
||||||
|
* @return the current label.
|
||||||
|
* @deprecated use getGlobalizedLabel() instead
|
||||||
|
*/
|
||||||
|
String getLabel();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the GlobalizedMessage for the current property
|
||||||
|
* @return the current GlobalizedMessage
|
||||||
|
*/
|
||||||
|
GlobalizedMessage getGlobalizedLabel();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the string representation of the current property.
|
||||||
|
*
|
||||||
|
* @return the current value formatted as a string.
|
||||||
|
*/
|
||||||
|
String getValue();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,45 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2001-2004 Red Hat Inc. All Rights Reserved.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.bebop;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.util.Lockable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new {@link PropertySheetModel} for the {@link PropertySheet}.
|
||||||
|
* The model will be used to get a list of properties at runtime.
|
||||||
|
*
|
||||||
|
* @author Stanislav Freidin
|
||||||
|
* @version $Id: PropertySheetModelBuilder.java 287 2005-02-22 00:29:02Z sskracic $
|
||||||
|
* @see PropertySheetModel
|
||||||
|
*/
|
||||||
|
|
||||||
|
public interface PropertySheetModelBuilder extends Lockable {
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructs a new {@link PropertySheetModel}.
|
||||||
|
*
|
||||||
|
* @param sheet the {@link PropertySheet}
|
||||||
|
* @param state the page state
|
||||||
|
* @return a {@link PropertySheetModel}.
|
||||||
|
*/
|
||||||
|
PropertySheetModel makeModel(PropertySheet sheet, PageState state);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -224,13 +224,13 @@ public class AdminServlet extends BaseApplicationServlet implements
|
||||||
/*
|
/*
|
||||||
* Create application administration panel
|
* Create application administration panel
|
||||||
*/
|
*/
|
||||||
// ToDo tabbedPane.addTab(APPLICATIONS_TAB_TITLE,
|
tabbedPane.addTab(APPLICATIONS_TAB_TITLE,
|
||||||
// ToDo new ApplicationsAdministrationTab());
|
new ApplicationsAdministrationTab());
|
||||||
|
|
||||||
// browsePane.setTabbedPane(tabbedPane);
|
// browsePane.setTabbedPane(tabbedPane);
|
||||||
// browsePane.setGroupAdministrationTab(groupAdminTab);
|
// browsePane.setGroupAdministrationTab(groupAdminTab);
|
||||||
//Add System information tab
|
//Add System information tab
|
||||||
// ToDo tabbedPane.addTab(SYSINFO_TAB_TITLE, new SystemInformationTab());
|
tabbedPane.addTab(SYSINFO_TAB_TITLE, new SystemInformationTab());
|
||||||
|
|
||||||
page.add(tabbedPane);
|
page.add(tabbedPane);
|
||||||
page.lock();
|
page.lock();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010 Jens Pelzetter, ScientificCMS.org team
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin;
|
||||||
|
|
||||||
|
import com.arsdigita.ui.admin.applications.ApplicationManager;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper class for managing the implementations of the {@link ApplicationManager} interface
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationManagers.java 2294 2013-08-05 18:39:46Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationManagers {
|
||||||
|
|
||||||
|
private Map<String, ApplicationManager<?>> appManagers = new HashMap<String, ApplicationManager<?>>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The one and only instance of this class. The pattern used here ensures that
|
||||||
|
* the instance is created at the first access, but not earlier.
|
||||||
|
*/
|
||||||
|
private static class Instance {
|
||||||
|
private static final ApplicationManagers INSTANCE = new ApplicationManagers();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Private constructor to ensure that no instances of this class can be created.
|
||||||
|
*/
|
||||||
|
private ApplicationManagers() {
|
||||||
|
//Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The instance of this class.
|
||||||
|
*/
|
||||||
|
public static ApplicationManagers getInstance() {
|
||||||
|
return Instance.INSTANCE;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void register(final ApplicationManager<?> appManager) {
|
||||||
|
getInstance().registerApplicationManager(appManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void registerApplicationManager(final ApplicationManager<?> appManager) {
|
||||||
|
appManagers.put(appManager.getApplication().getName(), appManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Map<String, ApplicationManager<?>> getApplicationManagers() {
|
||||||
|
return Collections.unmodifiableMap(appManagers);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected ApplicationManager<?> getApplicationManager(final String appClassName) {
|
||||||
|
return appManagers.get(appClassName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,261 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.BoxPanel;
|
||||||
|
import com.arsdigita.bebop.Form;
|
||||||
|
import com.arsdigita.bebop.Label;
|
||||||
|
import com.arsdigita.bebop.Page;
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.SimpleContainer;
|
||||||
|
import com.arsdigita.bebop.Tree;
|
||||||
|
import com.arsdigita.bebop.event.ChangeEvent;
|
||||||
|
import com.arsdigita.bebop.event.ChangeListener;
|
||||||
|
import com.arsdigita.toolbox.ui.LayoutPanel;
|
||||||
|
import com.arsdigita.ui.admin.applications.ApplicationInstanceAwareContainer;
|
||||||
|
import com.arsdigita.ui.admin.applications.ApplicationInstancePane;
|
||||||
|
import com.arsdigita.ui.admin.applications.ApplicationManager;
|
||||||
|
import com.arsdigita.ui.admin.applications.BaseApplicationPane;
|
||||||
|
import com.arsdigita.ui.admin.applications.MultiInstanceApplicationPane;
|
||||||
|
import com.arsdigita.ui.admin.applications.SingletonApplicationPane;
|
||||||
|
import com.arsdigita.ui.admin.applications.tree.ApplicationTreeModelBuilder;
|
||||||
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.libreccm.cdi.utils.CdiLookupException;
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.libreccm.web.ApplicationRepository;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A tab for managing CcmApplication and application instances.
|
||||||
|
*
|
||||||
|
* @author pb
|
||||||
|
* @author Jens Pelzetter
|
||||||
|
*/
|
||||||
|
public class ApplicationsAdministrationTab extends LayoutPanel implements
|
||||||
|
AdminConstants {
|
||||||
|
|
||||||
|
private final Tree applicationTree;
|
||||||
|
private final Map<String, BaseApplicationPane> appPanes
|
||||||
|
= new HashMap<>();
|
||||||
|
private final Map<String, ApplicationInstancePane> instancePanes
|
||||||
|
= new HashMap<>();
|
||||||
|
private final BoxPanel appPanel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*/
|
||||||
|
public ApplicationsAdministrationTab() {
|
||||||
|
|
||||||
|
super();
|
||||||
|
|
||||||
|
setClassAttr("sidebarNavPanel");
|
||||||
|
setAttribute("navbar-title", "Sitemap");
|
||||||
|
|
||||||
|
applicationTree = new Tree(new ApplicationTreeModelBuilder());
|
||||||
|
applicationTree.addChangeListener(new TreeStateChangeListener());
|
||||||
|
|
||||||
|
setClassAttr("navbar");
|
||||||
|
|
||||||
|
setLeft(applicationTree);
|
||||||
|
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final org.libreccm.web.ApplicationManager appManager;
|
||||||
|
try {
|
||||||
|
appManager = cdiUtil.findBean(
|
||||||
|
org.libreccm.web.ApplicationManager.class);
|
||||||
|
} catch (CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
final Collection<ApplicationType> applicationTypes = appManager.
|
||||||
|
getApplicationTypes().values();
|
||||||
|
|
||||||
|
final Map<String, ApplicationManager<?>> appManagers
|
||||||
|
= ApplicationManagers.
|
||||||
|
getInstance().
|
||||||
|
getApplicationManagers();
|
||||||
|
|
||||||
|
for (ApplicationType appType : applicationTypes) {
|
||||||
|
if (appType.singleton()) {
|
||||||
|
createSingletonAppPane(appType, appManagers);
|
||||||
|
} else {
|
||||||
|
createAppPane(appType, appManagers);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
appPanel = new BoxPanel();
|
||||||
|
appPanel.setClassAttr("main");
|
||||||
|
for (Map.Entry<String, BaseApplicationPane> entry : appPanes.entrySet()) {
|
||||||
|
appPanel.add(entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Map.Entry<String, ApplicationInstancePane> entry : instancePanes.
|
||||||
|
entrySet()) {
|
||||||
|
appPanel.add(entry.getValue());
|
||||||
|
}
|
||||||
|
|
||||||
|
//setRight(appPanel);
|
||||||
|
setBody(appPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createSingletonAppPane(final ApplicationType applicationType,
|
||||||
|
final Map<String, ApplicationManager<?>> appManagers) {
|
||||||
|
final String appObjectType = applicationType.name();
|
||||||
|
|
||||||
|
final ApplicationManager<?> manager = appManagers.get(appObjectType);
|
||||||
|
final SingletonApplicationPane pane;
|
||||||
|
if (manager == null) {
|
||||||
|
pane = new SingletonApplicationPane(applicationType, null);
|
||||||
|
} else {
|
||||||
|
pane = new SingletonApplicationPane(
|
||||||
|
applicationType, appManagers.get(appObjectType).
|
||||||
|
getApplicationAdminForm());
|
||||||
|
}
|
||||||
|
appPanes.put(appObjectType, pane);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings({"rawtypes", "unchecked"})
|
||||||
|
private void createAppPane(
|
||||||
|
final ApplicationType applicationType,
|
||||||
|
final Map<String, ApplicationManager<?>> appManagers) {
|
||||||
|
final ApplicationManager<?> appManager = appManagers.get(
|
||||||
|
applicationType.name());
|
||||||
|
final Form createForm;
|
||||||
|
if (appManager == null) {
|
||||||
|
createForm = null;
|
||||||
|
} else {
|
||||||
|
createForm = appManager.getApplicationCreateForm();
|
||||||
|
}
|
||||||
|
|
||||||
|
final MultiInstanceApplicationPane<?> appPane = new MultiInstanceApplicationPane(
|
||||||
|
applicationType, createForm);
|
||||||
|
appPanes.put(applicationType.name(), appPane);
|
||||||
|
createInstancePane(applicationType, appManagers);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void createInstancePane(
|
||||||
|
final ApplicationType applicationType,
|
||||||
|
final Map<String, ApplicationManager<?>> managementForms) {
|
||||||
|
final ApplicationManager<?> manager = managementForms.get(
|
||||||
|
applicationType.name());
|
||||||
|
final ApplicationInstancePane instPane;
|
||||||
|
if (manager == null) {
|
||||||
|
instPane = new ApplicationInstancePane(new Placeholder());
|
||||||
|
} else {
|
||||||
|
instPane = new ApplicationInstancePane(managementForms.get(
|
||||||
|
applicationType.name()).
|
||||||
|
getApplicationAdminForm());
|
||||||
|
}
|
||||||
|
|
||||||
|
instancePanes.put(applicationType.name(), instPane);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register(final Page page) {
|
||||||
|
super.register(page);
|
||||||
|
|
||||||
|
for (Map.Entry<String, BaseApplicationPane> entry : appPanes.entrySet()) {
|
||||||
|
page.setVisibleDefault(entry.getValue(), false);
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, ApplicationInstancePane> entry : instancePanes.
|
||||||
|
entrySet()) {
|
||||||
|
page.setVisibleDefault(entry.getValue(), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setPaneVisible(final SimpleContainer pane,
|
||||||
|
final PageState state) {
|
||||||
|
for (Map.Entry<String, BaseApplicationPane> entry : appPanes.entrySet()) {
|
||||||
|
entry.getValue().setVisible(state, false);
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, ApplicationInstancePane> entry : instancePanes.
|
||||||
|
entrySet()) {
|
||||||
|
entry.getValue().setVisible(state, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
pane.setVisible(state, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class TreeStateChangeListener implements ChangeListener {
|
||||||
|
|
||||||
|
public TreeStateChangeListener() {
|
||||||
|
//Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void stateChanged(final ChangeEvent event) {
|
||||||
|
final PageState state = event.getPageState();
|
||||||
|
|
||||||
|
final String selectedKey = (String) applicationTree.getSelectedKey(
|
||||||
|
state);
|
||||||
|
if (selectedKey != null) {
|
||||||
|
if (selectedKey.contains(".")) {
|
||||||
|
// Selected key is a classname and therefore the key of an ApplicationPane
|
||||||
|
final BaseApplicationPane pane = appPanes.get(selectedKey);
|
||||||
|
if (pane != null) {
|
||||||
|
setPaneVisible(pane, state);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Selected key is the name of a instance pane
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationRepository appRepo;
|
||||||
|
try {
|
||||||
|
appRepo = cdiUtil.findBean(ApplicationRepository.class);
|
||||||
|
} catch (CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
final CcmApplication application = appRepo
|
||||||
|
.retrieveApplicationForPath(selectedKey);
|
||||||
|
|
||||||
|
final ApplicationInstancePane pane;
|
||||||
|
if (application != null) {
|
||||||
|
pane = instancePanes.get(application.getClass().
|
||||||
|
getName());
|
||||||
|
if (pane != null) {
|
||||||
|
pane.setApplication(application);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
pane = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pane != null) {
|
||||||
|
setPaneVisible(pane, state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class Placeholder extends ApplicationInstanceAwareContainer {
|
||||||
|
|
||||||
|
public Placeholder() {
|
||||||
|
super();
|
||||||
|
final Label label = new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.placeholder"));
|
||||||
|
add(label);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,288 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/package com.arsdigita.ui.admin;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.Label;
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.PropertySheet;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModel;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModelBuilder;
|
||||||
|
import com.arsdigita.bebop.SegmentedPanel;
|
||||||
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
|
import com.arsdigita.toolbox.ui.LayoutPanel;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
import com.arsdigita.util.SystemInformation;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Properties;
|
||||||
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
import javax.xml.parsers.SAXParserFactory;
|
||||||
|
import javax.xml.transform.TransformerConfigurationException;
|
||||||
|
import javax.xml.transform.TransformerFactory;
|
||||||
|
import org.xml.sax.SAXException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: SystemInformationTab.java 2923 2014-10-27 18:55:26Z jensp $
|
||||||
|
*/
|
||||||
|
public class SystemInformationTab extends LayoutPanel implements AdminConstants {
|
||||||
|
|
||||||
|
public SystemInformationTab() {
|
||||||
|
super();
|
||||||
|
|
||||||
|
final SegmentedPanel panel = new SegmentedPanel();
|
||||||
|
|
||||||
|
panel.addSegment(new Label(GlobalizationUtil.globalize("ui.admin.sysinfo.appinfo")),
|
||||||
|
new PropertySheet(new CCMSysInfoPropertySheetModelBuilder()));
|
||||||
|
|
||||||
|
panel.addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.sysinfo.java_system_properties")),
|
||||||
|
new PropertySheet(new JavaSystemPropertiesSheetModelBuilder()));
|
||||||
|
|
||||||
|
panel.addSegment(new Label(GlobalizationUtil.globalize("ui.admin.sysinfo.xml_config")),
|
||||||
|
new PropertySheet(new XMLConfigSheetModelBuilder()));
|
||||||
|
|
||||||
|
setRight(panel);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class CCMSysInfoPropertySheetModelBuilder
|
||||||
|
extends LockableImpl
|
||||||
|
implements PropertySheetModelBuilder {
|
||||||
|
|
||||||
|
public CCMSysInfoPropertySheetModelBuilder() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertySheetModel makeModel(final PropertySheet sheet, final PageState state) {
|
||||||
|
return new CCMSysInfoPropertySheetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class CCMSysInfoPropertySheetModel implements PropertySheetModel {
|
||||||
|
|
||||||
|
private final SystemInformation sysInfo;
|
||||||
|
private final Iterator<Map.Entry<String, String>> sysInfoIterator;
|
||||||
|
private Map.Entry<String, String> currentProperty;
|
||||||
|
|
||||||
|
public CCMSysInfoPropertySheetModel() {
|
||||||
|
sysInfo = SystemInformation.getInstance();
|
||||||
|
sysInfoIterator = sysInfo.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
final boolean result = sysInfoIterator.hasNext();
|
||||||
|
if (result) {
|
||||||
|
currentProperty = sysInfoIterator.next();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
if (currentProperty == null) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
return currentProperty.getKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GlobalizedMessage getGlobalizedLabel() {
|
||||||
|
return GlobalizationUtil.globalize(currentProperty.getKey());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
return currentProperty.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class JavaSystemPropertiesSheetModelBuilder
|
||||||
|
extends LockableImpl
|
||||||
|
implements PropertySheetModelBuilder {
|
||||||
|
|
||||||
|
public JavaSystemPropertiesSheetModelBuilder() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertySheetModel makeModel(final PropertySheet sheet, final PageState state) {
|
||||||
|
return new JavaSystemPropertiesSheetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class JavaSystemPropertiesSheetModel implements PropertySheetModel {
|
||||||
|
|
||||||
|
private final Properties systemProperties;
|
||||||
|
private final Enumeration<?> enumeration;
|
||||||
|
private Object currentElement;
|
||||||
|
|
||||||
|
public JavaSystemPropertiesSheetModel() {
|
||||||
|
systemProperties = System.getProperties();
|
||||||
|
enumeration = systemProperties.propertyNames();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
final boolean result = enumeration.hasMoreElements();
|
||||||
|
if (result) {
|
||||||
|
currentElement = enumeration.nextElement();
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
return currentElement.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GlobalizedMessage getGlobalizedLabel() {
|
||||||
|
return GlobalizationUtil.globalize(currentElement.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
return systemProperties.getProperty(currentElement.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class XMLConfigSheetModelBuilder
|
||||||
|
extends LockableImpl
|
||||||
|
implements PropertySheetModelBuilder {
|
||||||
|
|
||||||
|
public XMLConfigSheetModelBuilder() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertySheetModel makeModel(final PropertySheet sheet, final PageState state) {
|
||||||
|
return new XMLConfigSheetModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class XMLConfigSheetModel implements PropertySheetModel {
|
||||||
|
|
||||||
|
private static final int TRANSFORMER_FACTORY_INDEX = 0;
|
||||||
|
private static final int TRANSFORMER_INDEX = 1;
|
||||||
|
private static final int DOCUMENT_BUILDER_FACTORY_INDEX = 2;
|
||||||
|
private static final int DOCUMENT_BUILDER_INDEX = 3;
|
||||||
|
private static final int SAX_PARSER_FACTORY_INDEX = 4;
|
||||||
|
private static final int SAX_PARSER_INDEX = 5;
|
||||||
|
private int currentIndex = -1;
|
||||||
|
|
||||||
|
public XMLConfigSheetModel() {
|
||||||
|
//Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
currentIndex++;
|
||||||
|
return currentIndex <= SAX_PARSER_INDEX;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case TRANSFORMER_FACTORY_INDEX:
|
||||||
|
return "XML Transformer Factory";
|
||||||
|
case TRANSFORMER_INDEX:
|
||||||
|
return "XML Transformer";
|
||||||
|
case DOCUMENT_BUILDER_FACTORY_INDEX:
|
||||||
|
return "XML Document Builder Factory";
|
||||||
|
case DOCUMENT_BUILDER_INDEX:
|
||||||
|
return "XML Document Builder";
|
||||||
|
case SAX_PARSER_FACTORY_INDEX:
|
||||||
|
return "SAX Parser Factory";
|
||||||
|
case SAX_PARSER_INDEX:
|
||||||
|
return "SAX Parser";
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GlobalizedMessage getGlobalizedLabel() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case TRANSFORMER_FACTORY_INDEX:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.sysinfo.xml_transformer_factory");
|
||||||
|
case TRANSFORMER_INDEX:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.sysinfo.xml_transformer");
|
||||||
|
case DOCUMENT_BUILDER_FACTORY_INDEX:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.sysinfo.xml_document_builder_factory");
|
||||||
|
case DOCUMENT_BUILDER_INDEX:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.sysinfo.xml_document_builder");
|
||||||
|
case SAX_PARSER_FACTORY_INDEX:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.sysinfo.sax_parser_factory");
|
||||||
|
case SAX_PARSER_INDEX:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.sysinfo.sax_parser");
|
||||||
|
default:
|
||||||
|
return GlobalizationUtil.globalize("unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case TRANSFORMER_FACTORY_INDEX:
|
||||||
|
return TransformerFactory.newInstance().getClass().getName();
|
||||||
|
case TRANSFORMER_INDEX:
|
||||||
|
try {
|
||||||
|
return TransformerFactory.newInstance().newTransformer().getClass().getName();
|
||||||
|
} catch(TransformerConfigurationException ex) {
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
case DOCUMENT_BUILDER_FACTORY_INDEX:
|
||||||
|
return DocumentBuilderFactory.newInstance().getClass().getName();
|
||||||
|
case DOCUMENT_BUILDER_INDEX:
|
||||||
|
try{
|
||||||
|
return DocumentBuilderFactory.newInstance().newDocumentBuilder().getClass()
|
||||||
|
.getName();
|
||||||
|
} catch(ParserConfigurationException ex) {
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
case SAX_PARSER_FACTORY_INDEX:
|
||||||
|
return SAXParserFactory.newInstance().getClass().getName();
|
||||||
|
case SAX_PARSER_INDEX:
|
||||||
|
try {
|
||||||
|
return SAXParserFactory.newInstance().newSAXParser().getClass().getName();
|
||||||
|
} catch(ParserConfigurationException ex) {
|
||||||
|
return "???";
|
||||||
|
} catch(SAXException ex) {
|
||||||
|
return "???";
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -64,20 +64,20 @@ class UserAdministrationTab extends LayoutPanel {
|
||||||
setLeft(sections);
|
setLeft(sections);
|
||||||
|
|
||||||
final UserBrowsePane browsePane = new UserBrowsePane();
|
final UserBrowsePane browsePane = new UserBrowsePane();
|
||||||
// ToDo final UserSummarySection summarySection = new UserSummarySection(this, browsePane);
|
// final UserSummarySection summarySection = new UserSummarySection(this, browsePane);
|
||||||
// ToDo final UserSearchSection searchSection = new UserSearchSection(this, browsePane);
|
// final UserSearchSection searchSection = new UserSearchSection(this, browsePane);
|
||||||
// ToDo final UserCreateSection createSection = new UserCreateSection(this);
|
// final UserCreateSection createSection = new UserCreateSection(this);
|
||||||
|
//
|
||||||
browsePane.setTabbedPane(parent);
|
// browsePane.setTabbedPane(parent);
|
||||||
browsePane.setGroupAdministrationTab(groupAdminTab);
|
// browsePane.setGroupAdministrationTab(groupAdminTab);
|
||||||
|
//
|
||||||
final BoxPanel body = new BoxPanel();
|
// final BoxPanel body = new BoxPanel();
|
||||||
// ToDo addSection(USER_TAB_SUMMARY, summarySection, body);
|
// addSection(USER_TAB_SUMMARY, summarySection, body);
|
||||||
addSection(USER_TAB_BROWSE, browsePane, body);
|
// addSection(USER_TAB_BROWSE, browsePane, body);
|
||||||
// ToDo addSection(USER_TAB_SEARCH, searchSection, body);
|
// addSection(USER_TAB_SEARCH, searchSection, body);
|
||||||
// ToDo addSection(USER_TAB_CREATE_USER, createSection, body);
|
// addSection(USER_TAB_CREATE_USER, createSection, body);
|
||||||
|
//
|
||||||
setBody(body);
|
// setBody(body);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PropertySheetModel;
|
||||||
|
import com.arsdigita.ui.admin.GlobalizationUtil;
|
||||||
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
import java.util.List;
|
||||||
|
import org.libreccm.cdi.utils.CdiLookupException;
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.libreccm.web.ApplicationRepository;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A property sheet model for displaying informations about an
|
||||||
|
* {@link ApplicationType} using a {@link PropertySheet}.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationInfoPropertySheetModel.java 2220 2013-06-19
|
||||||
|
* 15:26:58Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationInfoPropertySheetModel implements PropertySheetModel {
|
||||||
|
|
||||||
|
private static final int APP_TITLE = 0;
|
||||||
|
private static final int APP_CLASS = 1;
|
||||||
|
private static final int APP_SINGLETON = 2;
|
||||||
|
private static final int APP_DESC = 3;
|
||||||
|
private static final int SINGLETON_PATH = 4;
|
||||||
|
private final ApplicationType applicationType;
|
||||||
|
private int currentIndex = -1;
|
||||||
|
|
||||||
|
public ApplicationInfoPropertySheetModel(
|
||||||
|
final ApplicationType applicationType) {
|
||||||
|
this.applicationType = applicationType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
if (applicationType.singleton() && currentIndex < SINGLETON_PATH) {
|
||||||
|
currentIndex++;
|
||||||
|
return true;
|
||||||
|
} else if (!applicationType.singleton() && currentIndex < APP_DESC) {
|
||||||
|
currentIndex++;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
currentIndex = -1;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLabel() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case APP_TITLE:
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.title.label").
|
||||||
|
localize();
|
||||||
|
case APP_CLASS:
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.app_class.label").
|
||||||
|
localize();
|
||||||
|
case APP_SINGLETON:
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.singleton.label").
|
||||||
|
localize();
|
||||||
|
case APP_DESC:
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.desc.label").
|
||||||
|
localize();
|
||||||
|
case SINGLETON_PATH:
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label").
|
||||||
|
localize();
|
||||||
|
default:
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public GlobalizedMessage getGlobalizedLabel() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case APP_TITLE:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.title.label");
|
||||||
|
case APP_CLASS:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.app_class.label");
|
||||||
|
case APP_SINGLETON:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.singleton.label");
|
||||||
|
case APP_DESC:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.desc.label");
|
||||||
|
case SINGLETON_PATH:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.singleton_instance.path.label");
|
||||||
|
default:
|
||||||
|
return GlobalizationUtil.globalize("unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case APP_TITLE:
|
||||||
|
return applicationType.name();
|
||||||
|
case APP_CLASS:
|
||||||
|
return applicationType.name();
|
||||||
|
case APP_SINGLETON:
|
||||||
|
if (applicationType.singleton()) {
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.singleton.yes").
|
||||||
|
localize();
|
||||||
|
} else {
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.singleton.no").
|
||||||
|
localize();
|
||||||
|
}
|
||||||
|
case APP_DESC:
|
||||||
|
return applicationType.description();
|
||||||
|
case SINGLETON_PATH:
|
||||||
|
final String path;
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationRepository appRepo;
|
||||||
|
try {
|
||||||
|
appRepo = cdiUtil.findBean(ApplicationRepository.class);
|
||||||
|
} catch (CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
final List<CcmApplication> instances
|
||||||
|
= appRepo.findByType(
|
||||||
|
applicationType.name());
|
||||||
|
if (instances.isEmpty()) {
|
||||||
|
path = "";
|
||||||
|
} else {
|
||||||
|
path = instances.get(0).getPrimaryUrl();
|
||||||
|
}
|
||||||
|
|
||||||
|
return path;
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.PropertySheet;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModel;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModelBuilder;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link PropertySheetModelBuilder} implementation for the the {@link ApplicationInfoPropertySheetModel}.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationInfoPropertySheetModelBuilder.java 2219 2013-06-19 08:16:11Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationInfoPropertySheetModelBuilder
|
||||||
|
extends LockableImpl implements PropertySheetModelBuilder {
|
||||||
|
|
||||||
|
private final ApplicationType applicationType;
|
||||||
|
|
||||||
|
public ApplicationInfoPropertySheetModelBuilder(
|
||||||
|
final ApplicationType applicationType) {
|
||||||
|
super();
|
||||||
|
this.applicationType = applicationType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertySheetModel makeModel(final PropertySheet sheet,
|
||||||
|
final PageState state) {
|
||||||
|
return new ApplicationInfoPropertySheetModel(applicationType);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.SimpleContainer;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationInstanceAwareContainer.java 2234 2013-06-29 12:41:57Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationInstanceAwareContainer extends SimpleContainer {
|
||||||
|
|
||||||
|
private CcmApplication appInstance;
|
||||||
|
|
||||||
|
public CcmApplication getAppInstance() {
|
||||||
|
return appInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAppInstance(final CcmApplication appInstance) {
|
||||||
|
this.appInstance = appInstance;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,90 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.Label;
|
||||||
|
import com.arsdigita.bebop.PropertySheet;
|
||||||
|
import com.arsdigita.bebop.SegmentedPanel;
|
||||||
|
import com.arsdigita.bebop.event.PrintEvent;
|
||||||
|
import com.arsdigita.bebop.event.PrintListener;
|
||||||
|
import com.arsdigita.ui.admin.GlobalizationUtil;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This pane shows informations about a specific instance of a multi instance application, like
|
||||||
|
* title, parent application (if any) and the path. Also it contains a form for editing settings
|
||||||
|
* specific to the instance.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class ApplicationInstancePane extends SegmentedPanel {
|
||||||
|
|
||||||
|
private CcmApplication application;
|
||||||
|
private final ApplicationInstanceAwareContainer appAdminPane;
|
||||||
|
private final ApplicationInstancePropertySheetModelBuilder modelBuilder;
|
||||||
|
|
||||||
|
public ApplicationInstancePane(
|
||||||
|
final ApplicationInstanceAwareContainer appAdminPane) {
|
||||||
|
|
||||||
|
super();
|
||||||
|
this.appAdminPane = appAdminPane;
|
||||||
|
|
||||||
|
modelBuilder = new ApplicationInstancePropertySheetModelBuilder();
|
||||||
|
final PropertySheet appInstInfoPanel = new PropertySheet(modelBuilder);
|
||||||
|
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInstancePane.info.heading")),
|
||||||
|
appInstInfoPanel);
|
||||||
|
|
||||||
|
if (appAdminPane == null) {
|
||||||
|
|
||||||
|
final Label noAdminPaneLabel = new Label();
|
||||||
|
noAdminPaneLabel.addPrintListener(new PrintListener() {
|
||||||
|
@Override
|
||||||
|
public void prepare(final PrintEvent event) {
|
||||||
|
final Label target = (Label) event.getTarget();
|
||||||
|
|
||||||
|
target.setLabel(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.MultiInstancePane.manage.no_instance_admin_pane_found",
|
||||||
|
new String[]{application.getApplicationType()}));
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.MultiInstanceApplicationPane.manage.heading")),
|
||||||
|
noAdminPaneLabel);
|
||||||
|
} else {
|
||||||
|
//appAdminPane.setAppInstance(appInstance);
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInstancePane.manage.heading")),
|
||||||
|
appAdminPane);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApplication(final CcmApplication application) {
|
||||||
|
this.application = application;
|
||||||
|
appAdminPane.setAppInstance(application);
|
||||||
|
modelBuilder.setApplication(application);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PropertySheet;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModel;
|
||||||
|
import com.arsdigita.globalization.GlobalizedMessage;
|
||||||
|
import com.arsdigita.ui.admin.GlobalizationUtil;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link PropertySheetModel} implementation for displaying informations about an instance of an application
|
||||||
|
* using a {@link PropertySheet}.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationInstancePropertySheetModel.java 2923 2014-10-27 18:55:26Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationInstancePropertySheetModel implements PropertySheetModel {
|
||||||
|
|
||||||
|
private static final int INST_TITLE = 0;
|
||||||
|
private static final int INST_PARENT = 1;
|
||||||
|
private static final int INST_PATH = 2;
|
||||||
|
private static final int INST_DESC = 3;
|
||||||
|
private final CcmApplication application;
|
||||||
|
private int currentIndex = -1;
|
||||||
|
|
||||||
|
|
||||||
|
public ApplicationInstancePropertySheetModel(final CcmApplication application) {
|
||||||
|
this.application = application;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
currentIndex++;
|
||||||
|
return currentIndex <= INST_DESC;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLabel() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case INST_TITLE:
|
||||||
|
return (String) GlobalizationUtil.globalize("ui.admin.applications.ApplicationInstancePane.title.label").
|
||||||
|
localize();
|
||||||
|
case INST_PARENT:
|
||||||
|
return (String) GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInstancePane.parent_app.label").localize();
|
||||||
|
case INST_PATH:
|
||||||
|
return (String) GlobalizationUtil.globalize("ui.admin.applications.ApplicationInstancePane.path.label").
|
||||||
|
localize();
|
||||||
|
case INST_DESC:
|
||||||
|
return (String) GlobalizationUtil.globalize("ui.admin.applications.ApplicationInstancePane.desc.label").
|
||||||
|
localize();
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public GlobalizedMessage getGlobalizedLabel() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case INST_TITLE:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.applications.ApplicationInstancePane.title.label");
|
||||||
|
case INST_PARENT:
|
||||||
|
return GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInstancePane.parent_app.label");
|
||||||
|
case INST_PATH:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.applications.ApplicationInstancePane.path.label");
|
||||||
|
case INST_DESC:
|
||||||
|
return GlobalizationUtil.globalize("ui.admin.applications.ApplicationInstancePane.desc.label");
|
||||||
|
default:
|
||||||
|
return GlobalizationUtil.globalize("unknown");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getValue() {
|
||||||
|
switch (currentIndex) {
|
||||||
|
case INST_TITLE:
|
||||||
|
return application.getTitle().getValue();
|
||||||
|
case INST_PARENT:
|
||||||
|
if (application.getParent() == null) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return application.getParent().getTitle().getValue();
|
||||||
|
}
|
||||||
|
case INST_PATH:
|
||||||
|
return application.getPrimaryUrl();
|
||||||
|
case INST_DESC:
|
||||||
|
return application.getDescription().getValue();
|
||||||
|
default:
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.PropertySheet;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModel;
|
||||||
|
import com.arsdigita.bebop.PropertySheetModelBuilder;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link PropertySheetModelBuilder} implementation for the {@link ApplicationInstancePropertySheetModel}.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationInstancePropertySheetModelBuilder.java 2293 2013-08-05 11:00:18Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationInstancePropertySheetModelBuilder
|
||||||
|
extends LockableImpl implements PropertySheetModelBuilder {
|
||||||
|
|
||||||
|
private CcmApplication application;
|
||||||
|
|
||||||
|
public ApplicationInstancePropertySheetModelBuilder() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PropertySheetModel makeModel(final PropertySheet sheet, final PageState state) {
|
||||||
|
return new ApplicationInstancePropertySheetModel(application);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setApplication(final CcmApplication application) {
|
||||||
|
this.application = application;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,81 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.Form;
|
||||||
|
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
|
||||||
|
import java.util.ServiceLoader;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Implementations of this class are used by the new
|
||||||
|
* {@link ApplicationsAdministrationTab} to get the forms for editing the
|
||||||
|
* configuration of an application and for creating new instances of an
|
||||||
|
* application.
|
||||||
|
*
|
||||||
|
* The {@link ApplicationsAdministrationTab} uses the {@link ServiceLoader}
|
||||||
|
* from the Java Standard Library to find all implementations of this interface.
|
||||||
|
* To make implementations of this interface known add an file named
|
||||||
|
* {@code com.arsdigita.ui.admin.applications.ApplicationManager} to the
|
||||||
|
* {@code META-INF/services} directory of the module which provides the
|
||||||
|
* application. In this file add a line with the full qualified class name
|
||||||
|
* of each implementations of this interface provided by the module.
|
||||||
|
*
|
||||||
|
* There a two abstract classes to help you with implementing this class.
|
||||||
|
* {@link AbstractSingletonApplicationManager} is suitable for singleton
|
||||||
|
* applications. {@link AbstractApplicationManager} is for multi-instance
|
||||||
|
* applications.
|
||||||
|
*
|
||||||
|
* @param <T> Type of the application for which this ApplicationManager
|
||||||
|
* provides the administration forms.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationManager.java 2275 2013-07-26 14:20:28Z jensp $
|
||||||
|
*/
|
||||||
|
public interface ApplicationManager<T extends CcmApplication> {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to determine the Applications class for which this
|
||||||
|
* manager provides the administration forms.
|
||||||
|
*
|
||||||
|
* @return The class of the application for which this
|
||||||
|
* manager provides the administration forms.
|
||||||
|
*/
|
||||||
|
Class<T> getApplication();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a pane with administration forms for the application or for an
|
||||||
|
* instance of the application if the application is not a singleton.
|
||||||
|
*
|
||||||
|
* @return A container containing one or more forms for managing instances
|
||||||
|
* of an application.
|
||||||
|
*/
|
||||||
|
ApplicationInstanceAwareContainer getApplicationAdminForm();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Provides a form for creating new instances of applications. For
|
||||||
|
* singleton applications an implementation of this method will return
|
||||||
|
* {@code null}.
|
||||||
|
*
|
||||||
|
* @return A form for creating new instances of applications or
|
||||||
|
* {@code null} if the is a singleton.
|
||||||
|
*/
|
||||||
|
Form getApplicationCreateForm();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,47 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.Label;
|
||||||
|
import com.arsdigita.bebop.PropertySheet;
|
||||||
|
import com.arsdigita.bebop.SegmentedPanel;
|
||||||
|
import com.arsdigita.ui.admin.GlobalizationUtil;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Basic application pane containing the parts common for singleton and multi instance applications types. Shows
|
||||||
|
* informations about a specific application type.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class BaseApplicationPane extends SegmentedPanel {
|
||||||
|
|
||||||
|
public BaseApplicationPane(final ApplicationType applicationType) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
final PropertySheet appInfoPanel = new PropertySheet(
|
||||||
|
new ApplicationInfoPropertySheetModelBuilder(
|
||||||
|
applicationType));
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applications.ApplicationInfoSection.heading")),
|
||||||
|
appInfoPanel);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,228 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.Form;
|
||||||
|
import com.arsdigita.bebop.Label;
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.Table;
|
||||||
|
import com.arsdigita.bebop.table.TableColumn;
|
||||||
|
import com.arsdigita.bebop.table.TableModel;
|
||||||
|
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||||
|
import com.arsdigita.ui.admin.GlobalizationUtil;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import org.libreccm.cdi.utils.CdiLookupException;
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.libreccm.web.ApplicationRepository;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pane for multi instance applications. Additional to the data provided by
|
||||||
|
* {@link BaseApplicationPane} it shows a table of all instances of the
|
||||||
|
* application type and a form for creating new instances of the application
|
||||||
|
* type.
|
||||||
|
*
|
||||||
|
* @param <T>
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class MultiInstanceApplicationPane<T extends CcmApplication>
|
||||||
|
extends BaseApplicationPane {
|
||||||
|
|
||||||
|
private final static int COL_TITLE = 0;
|
||||||
|
private final static int COL_URL = 1;
|
||||||
|
private final static int COL_DESC = 2;
|
||||||
|
|
||||||
|
public MultiInstanceApplicationPane(final ApplicationType applicationType,
|
||||||
|
final Form createForm) {
|
||||||
|
super(applicationType);
|
||||||
|
|
||||||
|
//final ApplicationCollection applications = Application.retrieveAllApplications(applicationType.
|
||||||
|
// getApplicationObjectType());
|
||||||
|
//applications.rewind();
|
||||||
|
final Table table = new Table();
|
||||||
|
table.getColumnModel().add(
|
||||||
|
new TableColumn(COL_TITLE,
|
||||||
|
new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_title.header"))));
|
||||||
|
table.getColumnModel().add(
|
||||||
|
new TableColumn(COL_URL,
|
||||||
|
new Label(GlobalizationUtil.
|
||||||
|
globalize(
|
||||||
|
"ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_url.header"))));
|
||||||
|
table.getColumnModel().add(
|
||||||
|
new TableColumn(COL_DESC,
|
||||||
|
new Label(GlobalizationUtil.
|
||||||
|
globalize(
|
||||||
|
"ui.admin.applicationsMultiInstanceApplicationPane.instances.table.col_desc.header"))));
|
||||||
|
|
||||||
|
//table.setModelBuilder(new ApplicationInstancesTableModelBuilder(applications));
|
||||||
|
table.setModelBuilder(new ApplicationInstancesTableModelBuilder(
|
||||||
|
applicationType.name()));
|
||||||
|
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.MultiInstanceApplicationPane.instances")),
|
||||||
|
table);
|
||||||
|
|
||||||
|
if (createForm == null) {
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.MultiInstanceApplicationPane.manage_instances.heading")),
|
||||||
|
new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.MultiInstancePane.manage.no_create_form_found",
|
||||||
|
new String[]{applicationType.name()})));
|
||||||
|
} else {
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.MultiInstanceApplicationPane.create_instance")),
|
||||||
|
createForm);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ApplicationInstancesTableModelBuilder extends LockableImpl
|
||||||
|
implements TableModelBuilder {
|
||||||
|
|
||||||
|
//private final ApplicationCollection applications;
|
||||||
|
private final String appType;
|
||||||
|
|
||||||
|
//public ApplicationInstancesTableModelBuilder(final ApplicationCollection applications) {
|
||||||
|
// super();
|
||||||
|
//
|
||||||
|
// this.applications = applications;
|
||||||
|
//}
|
||||||
|
public ApplicationInstancesTableModelBuilder(final String appType) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
//this.applications = Application.retrieveAllApplications(appType);
|
||||||
|
this.appType = appType;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TableModel makeModel(final Table table, final PageState state) {
|
||||||
|
return new ApplicationInstancesTableModel(table, appType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class ApplicationInstancesTableModel implements TableModel {
|
||||||
|
|
||||||
|
private final Table table;
|
||||||
|
//private final ApplicationCollection applications;
|
||||||
|
private final List<AppData> appData = new ArrayList<>();
|
||||||
|
private int currentIndex = -1;
|
||||||
|
|
||||||
|
//public ApplicationInstancesTableModel(final Table table, final ApplicationCollection applications) {
|
||||||
|
// this.table = table;
|
||||||
|
// this.applications = applications;
|
||||||
|
//}
|
||||||
|
public ApplicationInstancesTableModel(final Table table,
|
||||||
|
final String appType) {
|
||||||
|
this.table = table;
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationRepository appRepo;
|
||||||
|
try {
|
||||||
|
appRepo = cdiUtil.findBean(ApplicationRepository.class);
|
||||||
|
} catch (CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
final List<CcmApplication> applications = appRepo.
|
||||||
|
findByType(appType);
|
||||||
|
for (CcmApplication application : applications) {
|
||||||
|
addAppData(application);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addAppData(final CcmApplication application) {
|
||||||
|
appData.add(new AppData(application.getTitle().getValue(),
|
||||||
|
application.getDescription().getValue(),
|
||||||
|
application.getPrimaryUrl()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getColumnCount() {
|
||||||
|
return table.getColumnModel().size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean nextRow() {
|
||||||
|
currentIndex++;
|
||||||
|
return currentIndex < appData.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getElementAt(final int columnIndex) {
|
||||||
|
switch (columnIndex) {
|
||||||
|
case COL_TITLE:
|
||||||
|
//return applications.getApplication().getTitle();
|
||||||
|
return appData.get(currentIndex).getTitle();
|
||||||
|
case COL_DESC:
|
||||||
|
//return applications.getApplication().getDescription();
|
||||||
|
return appData.get(currentIndex).getDescription();
|
||||||
|
case COL_URL:
|
||||||
|
//return applications.getApplication().getPath();
|
||||||
|
return appData.get(currentIndex).getPath();
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getKeyAt(final int columnIndex) {
|
||||||
|
//if (SessionManager.getSession().getTransactionContext().inTxn()) {
|
||||||
|
// SessionManager.getSession().getTransactionContext().commitTxn();
|
||||||
|
//}
|
||||||
|
//return applications.getApplication().getPath();
|
||||||
|
return appData.get(currentIndex).getPath();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AppData {
|
||||||
|
|
||||||
|
private final String title;
|
||||||
|
private final String description;
|
||||||
|
private final String path;
|
||||||
|
|
||||||
|
public AppData() {
|
||||||
|
title = "";
|
||||||
|
description = "";
|
||||||
|
path = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
public AppData(final String title, final String description,
|
||||||
|
final String path) {
|
||||||
|
this.title = title;
|
||||||
|
this.description = description;
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.Label;
|
||||||
|
import com.arsdigita.bebop.SimpleContainer;
|
||||||
|
import com.arsdigita.ui.admin.GlobalizationUtil;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Pane for managing singleton applications. Shows a form to edit application specific settings.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id$
|
||||||
|
*/
|
||||||
|
public class SingletonApplicationPane extends BaseApplicationPane {
|
||||||
|
|
||||||
|
public SingletonApplicationPane(final ApplicationType applicationType, final SimpleContainer appAdminPane) {
|
||||||
|
super(applicationType);
|
||||||
|
|
||||||
|
if (appAdminPane == null) {
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.SingletonApplicationPane.manage.heading")),
|
||||||
|
new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.SingletonApplicationPane.manage.no_admin_pane_found",
|
||||||
|
new String[]{applicationType.name()})));
|
||||||
|
} else {
|
||||||
|
addSegment(new Label(GlobalizationUtil.globalize(
|
||||||
|
"ui.admin.SingletonApplicationPane.manage.heading")),
|
||||||
|
appAdminPane);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications.tree;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.tree.TreeNode;
|
||||||
|
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tree Node for the application tree representing an instance of a application.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationInstanceTreeNode.java 2282 2013-08-01 10:45:42Z jensp $
|
||||||
|
*
|
||||||
|
* @see ApplicationTreeModel
|
||||||
|
* @see ApplicationTreeModelBuilder
|
||||||
|
* @see ApplicationTypeTreeNode
|
||||||
|
* @see ApplicationsAdministrationTab
|
||||||
|
* @see TreeNode
|
||||||
|
*/
|
||||||
|
public class ApplicationInstanceTreeNode implements TreeNode {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The application instance represented by this {@code TreeNode}
|
||||||
|
*/
|
||||||
|
//private final Application application;
|
||||||
|
private final String path;
|
||||||
|
private final String title;
|
||||||
|
private final String appType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor
|
||||||
|
*
|
||||||
|
* @param application The application instance to represent by this {@code TreeNode}
|
||||||
|
*/
|
||||||
|
public ApplicationInstanceTreeNode(final CcmApplication application) {
|
||||||
|
//this.application = application;
|
||||||
|
path = application.getPrimaryUrl();
|
||||||
|
title = application.getTitle().getValue();
|
||||||
|
appType = application.getClass().getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getPath() {
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTitle() {
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getAppType() {
|
||||||
|
return appType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the key for this {@link TreeNode}.
|
||||||
|
*
|
||||||
|
* @return The path of the application instance.
|
||||||
|
* @see TreeNode#getKey()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object getKey() {
|
||||||
|
//return application.getPath();
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Data to show in the tree for this node.
|
||||||
|
*
|
||||||
|
* @return The title of the application instance
|
||||||
|
* @see TreeNode#getElement()
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public Object getElement() {
|
||||||
|
//return application.getTitle();
|
||||||
|
return title;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,209 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications.tree;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.tree.TreeModel;
|
||||||
|
import com.arsdigita.bebop.tree.TreeNode;
|
||||||
|
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
|
||||||
|
import com.arsdigita.util.UncheckedWrapperException;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import org.libreccm.cdi.utils.CdiLookupException;
|
||||||
|
import org.libreccm.cdi.utils.CdiUtil;
|
||||||
|
import org.libreccm.web.ApplicationManager;
|
||||||
|
import org.libreccm.web.ApplicationRepository;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
import org.libreccm.web.CcmApplication;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link TreeModel} for the tree of applications in {@link ApplicationsAdministrationTab}. The tree consists of two
|
||||||
|
* different types of nodes: Nodes for {@link ApplicationTypes} and nodes for {@link Application} instances.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationTreeModel.java 2406 2013-10-31 19:52:22Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationTreeModel implements TreeModel {
|
||||||
|
|
||||||
|
public ApplicationTreeModel() {
|
||||||
|
//Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeNode getRoot(final PageState state) {
|
||||||
|
return new RootTreeNode();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasChildren(final TreeNode node, final PageState state) {
|
||||||
|
if (node instanceof RootTreeNode) {
|
||||||
|
return true;
|
||||||
|
} else if (node instanceof ApplicationTypeTreeNode) {
|
||||||
|
final ApplicationTypeTreeNode typeTreeNode = (ApplicationTypeTreeNode) node;
|
||||||
|
|
||||||
|
//if (typeTreeNode.getApplicationType().isSingleton()) {
|
||||||
|
if (typeTreeNode.isSingleton()) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
//return !retrieveApplicationInstances(typeTreeNode.getApplicationType()).isEmpty();
|
||||||
|
//return !retrieveApplicationInstances(typeTreeNode.getApplicationType()).isEmpty();
|
||||||
|
return !retrieveApplicationInstances(typeTreeNode.getObjecType()).isEmpty();
|
||||||
|
}
|
||||||
|
} else if (node instanceof ApplicationInstanceTreeNode) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"The ApplicationTreeModel can only work with ApplicationTypeTreeNodes and"
|
||||||
|
+ "ApplicationInstanceTreeNodes.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Iterator getChildren(final TreeNode node, final PageState state) {
|
||||||
|
if (node instanceof RootTreeNode) {
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationManager appManager;
|
||||||
|
try {
|
||||||
|
appManager = cdiUtil.findBean(ApplicationManager.class);
|
||||||
|
} catch(CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
final Collection<ApplicationType> appTypes = appManager.getApplicationTypes().values();
|
||||||
|
|
||||||
|
return new AppTypesIterator(appTypes);
|
||||||
|
} else if (node instanceof ApplicationTypeTreeNode) {
|
||||||
|
final ApplicationTypeTreeNode typeTreeNode = (ApplicationTypeTreeNode) node;
|
||||||
|
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationRepository appRepo;
|
||||||
|
try {
|
||||||
|
appRepo = cdiUtil.findBean(ApplicationRepository.class);
|
||||||
|
} catch(CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
final List<CcmApplication> applications = appRepo.findByType(
|
||||||
|
typeTreeNode.getObjecType());
|
||||||
|
|
||||||
|
return new AppIterator(applications);
|
||||||
|
} else if (node instanceof ApplicationInstanceTreeNode) {
|
||||||
|
return null;
|
||||||
|
} else {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"The ApplicationTreeModel can only work with ApplicationTypeTreeNodes and"
|
||||||
|
+ "ApplicationInstanceTreeNodes.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<CcmApplication> retrieveApplicationInstances(
|
||||||
|
final ApplicationType applicationType) {
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationRepository appRepo;
|
||||||
|
try {
|
||||||
|
appRepo = cdiUtil.findBean(ApplicationRepository.class);
|
||||||
|
} catch(CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return appRepo.findByType(applicationType.name());
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<CcmApplication> retrieveApplicationInstances(
|
||||||
|
final String appObjectType) {
|
||||||
|
final CdiUtil cdiUtil = new CdiUtil();
|
||||||
|
final ApplicationRepository appRepo;
|
||||||
|
try {
|
||||||
|
appRepo = cdiUtil.findBean(ApplicationRepository.class);
|
||||||
|
} catch(CdiLookupException ex) {
|
||||||
|
throw new UncheckedWrapperException(ex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return appRepo.findByType(appObjectType);
|
||||||
|
}
|
||||||
|
|
||||||
|
private class RootTreeNode implements TreeNode {
|
||||||
|
|
||||||
|
public RootTreeNode() {
|
||||||
|
//Nothing
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getKey() {
|
||||||
|
return "-1";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object getElement() {
|
||||||
|
return "/";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AppTypesIterator implements Iterator<ApplicationTypeTreeNode> {
|
||||||
|
|
||||||
|
private final Iterator<ApplicationType> appTypes;
|
||||||
|
|
||||||
|
public AppTypesIterator(final Collection<ApplicationType> appTypes) {
|
||||||
|
this.appTypes = appTypes.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return appTypes.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationTypeTreeNode next() {
|
||||||
|
return new ApplicationTypeTreeNode(appTypes.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
throw new UnsupportedOperationException("Not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private class AppIterator implements Iterator<ApplicationInstanceTreeNode> {
|
||||||
|
|
||||||
|
private final Iterator<CcmApplication> applications;
|
||||||
|
|
||||||
|
public AppIterator(final Collection<CcmApplication> applications) {
|
||||||
|
this.applications = applications.iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean hasNext() {
|
||||||
|
return applications.hasNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ApplicationInstanceTreeNode next() {
|
||||||
|
return new ApplicationInstanceTreeNode(applications.next());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void remove() {
|
||||||
|
throw new UnsupportedOperationException("Not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications.tree;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.PageState;
|
||||||
|
import com.arsdigita.bebop.Tree;
|
||||||
|
import com.arsdigita.bebop.tree.TreeModel;
|
||||||
|
import com.arsdigita.bebop.tree.TreeModelBuilder;
|
||||||
|
import com.arsdigita.ui.admin.ApplicationsAdministrationTab;
|
||||||
|
import com.arsdigita.util.LockableImpl;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The {@link TreeModelBuilder} creating the {@link TreeModel} for the
|
||||||
|
* applications tree used in {@link ApplicationsAdministrationTab}.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationTreeModelBuilder.java 2294 2013-08-05 18:39:46Z
|
||||||
|
* jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationTreeModelBuilder extends LockableImpl
|
||||||
|
implements TreeModelBuilder {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TreeModel makeModel(final Tree tree, final PageState state) {
|
||||||
|
tree.expand("-1", state);
|
||||||
|
return new ApplicationTreeModel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,73 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2013 Jens Pelzetter
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public License
|
||||||
|
* as published by the Free Software Foundation; either version 2.1 of
|
||||||
|
* the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library 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
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package com.arsdigita.ui.admin.applications.tree;
|
||||||
|
|
||||||
|
import com.arsdigita.bebop.tree.TreeNode;
|
||||||
|
import java.math.BigDecimal;
|
||||||
|
import org.libreccm.web.ApplicationType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tree Node implementation for the Application Tree in the Application admin tab.
|
||||||
|
*
|
||||||
|
* @author Jens Pelzetter <jens@jp-digital.de>
|
||||||
|
* @version $Id: ApplicationTypeTreeNode.java 2282 2013-08-01 10:45:42Z jensp $
|
||||||
|
*/
|
||||||
|
public class ApplicationTypeTreeNode implements TreeNode {
|
||||||
|
|
||||||
|
private final String name;
|
||||||
|
private final String objectType;
|
||||||
|
private final boolean singleton;
|
||||||
|
private final String description;
|
||||||
|
// Needed:
|
||||||
|
// isSingleton
|
||||||
|
// getObjectType
|
||||||
|
|
||||||
|
public ApplicationTypeTreeNode(final ApplicationType applicationType) {
|
||||||
|
//this.applicationType = applicationType;
|
||||||
|
name = applicationType.name();
|
||||||
|
objectType = applicationType.name();
|
||||||
|
singleton = applicationType.singleton();
|
||||||
|
description = applicationType.description();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getObjecType() {
|
||||||
|
return objectType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSingleton() {
|
||||||
|
return singleton;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDescription() {
|
||||||
|
return description;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getKey() {
|
||||||
|
//return applicationType.getApplicationObjectType();
|
||||||
|
return objectType;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object getElement() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -209,8 +209,10 @@
|
||||||
</plugins>
|
</plugins>
|
||||||
|
|
||||||
<resources>
|
<resources>
|
||||||
|
<resource>
|
||||||
<directory>src/main/resources</directory>
|
<directory>src/main/resources</directory>
|
||||||
<filtering>true</filtering>
|
<filtering>true</filtering>
|
||||||
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
|
||||||
</build>
|
</build>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue