adds dependency in org.libreccm.core.user
adds currently finished refactored classes of docrepo git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@3735 8810af33-2d31-482b-a856-94f89814c4dfpull/2/head
parent
9e9662592f
commit
d64753007b
|
|
@ -38,7 +38,13 @@
|
|||
<type>jar</type>
|
||||
<scope>provided</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
<dependency>
|
||||
<groupId>org.libreccm</groupId>
|
||||
<artifactId>ccm-docrepo</artifactId>
|
||||
<version>${project.parent.version}</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
<groupId>org.hibernate</groupId>
|
||||
<artifactId>hibernate-entitymanager</artifactId>
|
||||
|
|
@ -173,7 +179,7 @@
|
|||
<artifactId>h2</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
|
||||
</dependencies>
|
||||
|
||||
<build>
|
||||
|
|
|
|||
|
|
@ -18,9 +18,9 @@
|
|||
*/
|
||||
package com.arsdigita.bebop;
|
||||
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import javax.servlet.http.HttpServletRequest;
|
||||
|
||||
/**
|
||||
* A variable whose value is local to each request. Objects that need to store
|
||||
|
|
@ -67,7 +67,7 @@ public class RequestLocal {
|
|||
// way
|
||||
private Map getMap(HttpServletRequest request) {
|
||||
// This lock is paranoid. We can remove it if we know that only one
|
||||
// thread will be touching a request object at a time. (Seems likely,
|
||||
// thread will be touching a request object at a time. (Seems likely,
|
||||
// but, like I said, I'm paranoid.)
|
||||
synchronized (request) {
|
||||
Map result = (Map)request.getAttribute(ATTRIBUTE_KEY);
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ public class Submit extends Widget {
|
|||
*
|
||||
* @param name the button's name
|
||||
* @param label the label displayed on the button
|
||||
* @deprecated use Submit(name, GlobalizedMessage instead
|
||||
* @deprecated use Submit(name, GlobalizedMessage) instead
|
||||
*/
|
||||
public Submit(String name, String label) {
|
||||
super(name);
|
||||
|
|
@ -207,7 +207,7 @@ public class Submit extends Widget {
|
|||
* Return <code>true</code> if the user clicked on this submit button to
|
||||
* submit the form in which the button is contained.
|
||||
*
|
||||
* @param state the state of the current request
|
||||
* @param ps the state of the current request
|
||||
* @return <code>true</code> if the user clicked this button to submit
|
||||
* the enclosing form.
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -18,37 +18,36 @@
|
|||
*/
|
||||
package org.libreccm.core;
|
||||
|
||||
import static org.libreccm.core.CoreConstants.*;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Objects;
|
||||
import org.hibernate.validator.constraints.NotBlank;
|
||||
import org.libreccm.docrepo.Repository;
|
||||
import org.libreccm.docrepo.Resource;
|
||||
|
||||
import javax.persistence.AssociationOverride;
|
||||
import javax.persistence.CollectionTable;
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.ElementCollection;
|
||||
import javax.persistence.Embedded;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.JoinTable;
|
||||
import javax.persistence.Table;
|
||||
|
||||
import org.hibernate.validator.constraints.NotBlank;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import javax.persistence.CollectionTable;
|
||||
import javax.persistence.ElementCollection;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.NamedQueries;
|
||||
import javax.persistence.NamedQuery;
|
||||
import javax.persistence.OneToMany;
|
||||
import javax.persistence.Table;
|
||||
import javax.validation.constraints.Size;
|
||||
import javax.xml.bind.annotation.XmlElement;
|
||||
import javax.xml.bind.annotation.XmlElementWrapper;
|
||||
import javax.xml.bind.annotation.XmlRootElement;
|
||||
import javax.xml.bind.annotation.XmlTransient;
|
||||
import java.io.Serializable;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
import static org.libreccm.core.CoreConstants.CORE_XML_NS;
|
||||
import static org.libreccm.core.CoreConstants.DB_SCHEMA;
|
||||
|
||||
/**
|
||||
* The {@code User} entity stores the name and the password of a user along with
|
||||
|
|
@ -183,6 +182,25 @@ public class User extends Subject implements Serializable {
|
|||
@XmlElement(name = "group-membership", namespace = CORE_XML_NS)
|
||||
private List<GroupMembership> groupMemberships;
|
||||
|
||||
/**
|
||||
* The {@link Resource}s created by this {@code User}.
|
||||
*/
|
||||
@OneToMany(mappedBy = "creationUser")
|
||||
private List<Resource> createdResources;
|
||||
|
||||
/**
|
||||
* The {@link Resource}s modified by this {@code User}.
|
||||
*/
|
||||
@OneToMany(mappedBy = "lastModifiedUser")
|
||||
private List<Resource> modifiedResources;
|
||||
|
||||
/**
|
||||
* The {@link Repository}s owned by this {@code User}.
|
||||
*/
|
||||
@OneToMany(mappedBy = "owner")
|
||||
private List<Repository> repositories;
|
||||
|
||||
|
||||
public User() {
|
||||
super();
|
||||
|
||||
|
|
@ -310,6 +328,30 @@ public class User extends Subject implements Serializable {
|
|||
groupMemberships.remove(groupMembership);
|
||||
}
|
||||
|
||||
public List<Resource> getCreatedResources() {
|
||||
return createdResources;
|
||||
}
|
||||
|
||||
public void setCreatedResources(List<Resource> createdResources) {
|
||||
this.createdResources = createdResources;
|
||||
}
|
||||
|
||||
public List<Resource> getModifiedResources() {
|
||||
return modifiedResources;
|
||||
}
|
||||
|
||||
public void setModifiedResources(List<Resource> modifiedResources) {
|
||||
this.modifiedResources = modifiedResources;
|
||||
}
|
||||
|
||||
public List<Repository> getRepositories() {
|
||||
return repositories;
|
||||
}
|
||||
|
||||
public void setRepositories(List<Repository> repositories) {
|
||||
this.repositories = repositories;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int hash = super.hashCode();
|
||||
|
|
|
|||
|
|
@ -0,0 +1,451 @@
|
|||
/*
|
||||
* Copyright (C) 2003-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.docrepo.ui;
|
||||
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.Container;
|
||||
import com.arsdigita.bebop.DimensionalNavbar;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Link;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.bebop.parameters.IntegerParameter;
|
||||
import com.arsdigita.docrepo.util.GlobalizationUtil;
|
||||
import com.arsdigita.util.Assert;
|
||||
import com.arsdigita.web.Web;
|
||||
import com.arsdigita.xml.Element;
|
||||
import org.libreccm.web.CcmApplication;
|
||||
|
||||
/**
|
||||
* <p>BasePage class</p>
|
||||
*
|
||||
* @author <a href="mailto:jparsons@arsdigita.com">Jim Parsons</a>
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
public class BasePage extends Page {
|
||||
|
||||
private final Container globalContainer;
|
||||
private final Container headerContainer;
|
||||
private final Container bodyContainer;
|
||||
private final Container footerContainer;
|
||||
|
||||
private IntegerParameter selected = new IntegerParameter("m");
|
||||
|
||||
// Todo: add strings to package properties
|
||||
public static final String DOC_GLOBAL_ELEMENT = "docs:global";
|
||||
public static final String DOC_HEADER_ELEMENT = "docs:header";
|
||||
public static final String DOC_BODY_ELEMENT = "docs:body";
|
||||
public static final String DOC_FOOTER_ELEMENT = "docs:footer";
|
||||
public static final String DOC_XML_NS = "http://www.redhat.com/docs/1.0";
|
||||
|
||||
// There are 2 views: user and admin. view determines which context
|
||||
// bar and view link to show.
|
||||
private String view;
|
||||
private Link viewLink;
|
||||
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public BasePage() {
|
||||
this(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overloaded constructor.
|
||||
*
|
||||
* @param view A String that specifies which application view to
|
||||
* show. Valid values: "user", "admin" and "null". If view is
|
||||
* "null", there will be no right-hand navigation link. Note -
|
||||
* We've decided not to have the right-hand navigation link at
|
||||
* all. Instead, you should create tabs. So, once the
|
||||
* applications are migrated, view will always be null and we can
|
||||
* remove view altogether.
|
||||
*/
|
||||
public BasePage(String view) {
|
||||
super(new Label(), new SimpleContainer());
|
||||
|
||||
setClassAttr("DOCS");
|
||||
|
||||
m_panel = new Panel();
|
||||
|
||||
addGlobalStateParam(selected);
|
||||
|
||||
globalContainer = new SimpleContainer(DOC_GLOBAL_ELEMENT, DOC_XML_NS);
|
||||
headerContainer = new SimpleContainer(DOC_HEADER_ELEMENT, DOC_XML_NS);
|
||||
bodyContainer = new SimpleContainer(DOC_BODY_ELEMENT, DOC_XML_NS);
|
||||
footerContainer = new SimpleContainer(DOC_FOOTER_ELEMENT, DOC_XML_NS);
|
||||
|
||||
super.add(globalContainer);
|
||||
super.add(headerContainer);
|
||||
super.add(bodyContainer);
|
||||
super.add(footerContainer);
|
||||
|
||||
this.view = view;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for the global container.
|
||||
*
|
||||
* @return The global container.
|
||||
*/
|
||||
public Container getGlobal() {
|
||||
return globalContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for the header container.
|
||||
*
|
||||
* @return The header container.
|
||||
*/
|
||||
public Container getHeader() {
|
||||
return headerContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for the body container.
|
||||
*
|
||||
* @return The body container.
|
||||
*/
|
||||
public Container getBody() {
|
||||
return bodyContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Getter for the footer container.
|
||||
*
|
||||
* @return The footer container.
|
||||
*/
|
||||
public Container getFooter() {
|
||||
return footerContainer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Locks the page and all its components against further modifications.
|
||||
*
|
||||
* <p>Locking a page helps in finding mistakes that result from modifying a
|
||||
* page's structure.</P>
|
||||
*/
|
||||
@Override
|
||||
public void lock() {
|
||||
buildPage();
|
||||
|
||||
super.lock();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the page.
|
||||
*
|
||||
* Only the PortalPage.lock() should invoke this method, though users
|
||||
* of this class may sometimes want to <em>override</em> this method.
|
||||
*
|
||||
* Todo: resolvable or deletable?
|
||||
* Context Bar temporarily deactivated until the functionality to create
|
||||
* multiple repositories (table docs_mounted) is restored. Because
|
||||
* currently there is only one repository mounted there is no relevant
|
||||
* context
|
||||
*/
|
||||
protected final void buildPage() {
|
||||
buildTitle();
|
||||
//buildContextBar();
|
||||
buildGlobal(getGlobal());
|
||||
buildHeader(getHeader());
|
||||
buildBody(getBody());
|
||||
buildFooter(getFooter());
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the title.
|
||||
*/
|
||||
protected void buildTitle() {
|
||||
/**
|
||||
* Internal class.
|
||||
*/
|
||||
class ApplicationAdminLabelPrinter implements PrintListener {
|
||||
public void prepare(PrintEvent e) {
|
||||
Label targetLabel = (Label)e.getTarget();
|
||||
|
||||
CcmApplication application = Web.getWebContext().getApplication();
|
||||
|
||||
Assert.exists(application, CcmApplication.class);
|
||||
|
||||
targetLabel.setLabel(application.getTitle() + " Administration");
|
||||
}
|
||||
}
|
||||
|
||||
if (view != null && view.equals("admin")) {
|
||||
setTitle(new Label(new ApplicationAdminLabelPrinter()));
|
||||
} else {
|
||||
setTitle(new Label(new CurrentApplicationLabelPrinter()));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the context bar.
|
||||
*
|
||||
* Todo: unused method.. delete?
|
||||
*/
|
||||
protected void buildContextBar() {
|
||||
DimensionalNavbar navbar = new DimensionalNavbar();
|
||||
|
||||
navbar.setClassAttr("portalNavbar");
|
||||
navbar.add(new Link(new ParentApplicationLinkPrinter()));
|
||||
navbar.add(new Link(new CurrentApplicationLinkPrinter()));
|
||||
|
||||
getHeader().add(navbar);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds by default the global container in the base page.
|
||||
*
|
||||
* @param global The global container.
|
||||
*/
|
||||
protected void buildGlobal(Container global) {
|
||||
Link link = new Link(new Label(GlobalizationUtil.globalize("ui.workspace.sign_out")), "/register/logout");
|
||||
|
||||
link.setClassAttr("signoutLink");
|
||||
getGlobal().add(link);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds by default the header container in the base page.
|
||||
*
|
||||
* @param header The header container.
|
||||
*/
|
||||
protected void buildHeader(Container header) {
|
||||
if (view != null) {
|
||||
if (view.equals("user")) {
|
||||
viewLink = new Link(new Label(GlobalizationUtil.globalize("ui.view.admin")), "./admin/index.jsp") {
|
||||
public boolean isVisible(PageState ps) {
|
||||
return userIsAdmin(ps);
|
||||
}};
|
||||
} else if (view.equals("admin")) {
|
||||
viewLink = new Link( new Label(GlobalizationUtil.globalize("ui.view.user")), "../index.jsp");
|
||||
}
|
||||
}
|
||||
|
||||
if (viewLink != null) {
|
||||
viewLink.setClassAttr("portalControl");
|
||||
|
||||
header.add(viewLink);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the body container in the base page. By default
|
||||
* nothing.
|
||||
*
|
||||
* @param body The body container.
|
||||
*/
|
||||
protected void buildBody(Container body) {}
|
||||
|
||||
/**
|
||||
* Builds the footer container in the base page. By default
|
||||
* nothing.
|
||||
*
|
||||
* @param footer The body container.
|
||||
*/
|
||||
protected void buildFooter(Container footer) {}
|
||||
|
||||
|
||||
/**
|
||||
* Represents a panel as a simple container.
|
||||
*/
|
||||
private class Panel extends SimpleContainer {
|
||||
@Override
|
||||
public void generateXML(PageState ps, Element p) {
|
||||
Component selected = getSelected(ps);
|
||||
if (selected == null) {
|
||||
super.generateXML(ps, p);
|
||||
} else {
|
||||
SimpleContainer fakeBody = new SimpleContainer(DOC_BODY_ELEMENT, DOC_XML_NS);
|
||||
fakeBody.add(selected);
|
||||
|
||||
Element parent = generateParent(p);
|
||||
|
||||
headerContainer.generateXML(ps, parent);
|
||||
footerContainer.generateXML(ps, parent);
|
||||
fakeBody.generateXML(ps, parent);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the selected component by the given page state.
|
||||
*
|
||||
* @param ps The given page state.
|
||||
* @return The slected component.
|
||||
*/
|
||||
private Component getSelected(PageState ps) {
|
||||
Integer stateIndex = (Integer) ps.getValue(selected);
|
||||
Component c = null;
|
||||
if (stateIndex != null) {
|
||||
c = getComponent(stateIndex);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the selected component by a given page state and component.
|
||||
*
|
||||
* @param ps The page state.
|
||||
* @param c The component being selected.
|
||||
*/
|
||||
private void setSelected(PageState ps, Component c) {
|
||||
if (c == null) {
|
||||
ps.setValue(selected, null);
|
||||
} else {
|
||||
ps.setValue(selected, stateIndex(c));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Makes the given component the only visible component between
|
||||
* the header and footer of this page.
|
||||
*
|
||||
* @param ps The page state.
|
||||
* @param c The given component.
|
||||
*/
|
||||
public void goModal(PageState ps, Component c) {
|
||||
Component oldc = getSelected(ps);
|
||||
if (oldc != null) {
|
||||
oldc.setVisible(ps, false);
|
||||
}
|
||||
c.setVisible(ps, true);
|
||||
setSelected(ps, c);
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the currently selected modal component if it has been set.
|
||||
*
|
||||
* @param ps The page state to be cleared.
|
||||
*/
|
||||
public void goUnmodal(PageState ps) {
|
||||
Component oldc = getSelected(ps);
|
||||
if (oldc != null) {
|
||||
oldc.setVisible(ps, false);
|
||||
}
|
||||
setSelected(ps, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks on the permission level, weather the user is admin by the
|
||||
* given page state.
|
||||
*
|
||||
* @param ps The given page state
|
||||
* @return true if the user is admin, false otherwise.
|
||||
*
|
||||
* Todo: does not need param, can be changed
|
||||
* Todo: Usage of Permission classes don't work
|
||||
|
||||
*/
|
||||
private boolean userIsAdmin(PageState ps) {
|
||||
// PermissionDescriptor permDescriptor =
|
||||
// new PermissionDescriptor(PrivilegeDescriptor.ADMIN,
|
||||
// Web.getWebContext().getApplication(),
|
||||
// Kernel.getContext().getParty());
|
||||
// return PermissionService.checkPermission(permDescriptor);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a component to the body.
|
||||
*
|
||||
* @param pc the component to be added
|
||||
*/
|
||||
@Override
|
||||
public void add(Component pc) {
|
||||
Assert.isUnlocked(this);
|
||||
bodyContainer.add(pc);
|
||||
}
|
||||
|
||||
/**
|
||||
* Class.
|
||||
*/
|
||||
protected class CurrentApplicationLinkPrinter implements PrintListener {
|
||||
public CurrentApplicationLinkPrinter() {
|
||||
// Empty
|
||||
}
|
||||
|
||||
public void prepare(PrintEvent e) {
|
||||
Link link = (Link) e.getTarget();
|
||||
//PageState pageState = e.getPageState();
|
||||
|
||||
CcmApplication app = Web.getWebContext().getApplication();
|
||||
|
||||
Assert.exists(app, CcmApplication.class);
|
||||
|
||||
link.setChild(new Label(app.getTitle().toString()));
|
||||
link.setTarget(app.getPrimaryUrl());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class.
|
||||
*/
|
||||
protected class ParentApplicationLinkPrinter implements PrintListener {
|
||||
public ParentApplicationLinkPrinter() {
|
||||
// Empty
|
||||
}
|
||||
|
||||
public void prepare(PrintEvent e) {
|
||||
Link link = (Link) e.getTarget();
|
||||
//PageState pageState = e.getPageState();
|
||||
|
||||
CcmApplication app = Web.getWebContext().getApplication();
|
||||
|
||||
Assert.exists(app, CcmApplication.class);
|
||||
|
||||
CcmApplication parent = (CcmApplication) app.getParent();
|
||||
if (parent != null ) {
|
||||
link.setChild(new Label(parent.getTitle().toString()));
|
||||
link.setTarget(parent.getPrimaryUrl());
|
||||
} else {
|
||||
link.setChild(new Label("/"));
|
||||
link.setTarget(com.arsdigita.web.URL.root().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Class.
|
||||
*/
|
||||
protected class CurrentApplicationLabelPrinter implements PrintListener {
|
||||
|
||||
public CurrentApplicationLabelPrinter() {
|
||||
// Empty
|
||||
}
|
||||
|
||||
public void prepare(PrintEvent e) {
|
||||
Label label = (Label) e.getTarget();
|
||||
//PageState pageState = e.getPageState();
|
||||
|
||||
CcmApplication app = Web.getWebContext().getApplication();
|
||||
|
||||
Assert.exists(app, CcmApplication.class);
|
||||
|
||||
label.setLabel(app.getTitle().toString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,474 @@
|
|||
/*
|
||||
* 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.docrepo.ui;
|
||||
|
||||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.Container;
|
||||
import com.arsdigita.bebop.GridPanel;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Link;
|
||||
import com.arsdigita.bebop.List;
|
||||
import com.arsdigita.bebop.ModalContainer;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
import com.arsdigita.bebop.SegmentedPanel;
|
||||
import com.arsdigita.bebop.SimpleComponent;
|
||||
import com.arsdigita.bebop.SimpleContainer;
|
||||
import com.arsdigita.bebop.Tree;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.ChangeEvent;
|
||||
import com.arsdigita.bebop.event.ChangeListener;
|
||||
import com.arsdigita.bebop.event.RequestEvent;
|
||||
import com.arsdigita.bebop.event.RequestListener;
|
||||
import com.arsdigita.bebop.list.ListCellRenderer;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.xml.Element;
|
||||
import org.libreccm.cdi.utils.CdiLookupException;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.docrepo.File;
|
||||
import org.libreccm.docrepo.Resource;
|
||||
import org.libreccm.docrepo.ResourceRepository;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* User Interface component of the Document Repository application which
|
||||
* which serves as entry-point and navigation tool of the repositories
|
||||
* that a user has subscribed too.
|
||||
* The tree of all subscribed repositories is on the left side, the full
|
||||
* listing of the currently selected directory is on the right side.
|
||||
*
|
||||
* @author <a href="mailto:StefanDeusch@computer.org">Stefan Deusch</a>
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
public class BrowsePane extends ModalContainer implements Constants, ChangeListener, RequestListener {
|
||||
|
||||
//private static final Logger logger = Logger.getLogger(BrowsePane.class);
|
||||
|
||||
private Component m_folderContent;
|
||||
private Component m_destinationFolderPanel;
|
||||
private Component m_newFileForm;
|
||||
private Component m_newFolderForm;
|
||||
private Component m_errorMsgPanel;
|
||||
private DestinationFolderForm m_destinationFolderForm;
|
||||
private ErrorMessageLabel m_errorMsgLabel;
|
||||
private Container m_segmentPanelBrowseContainer;
|
||||
|
||||
private Tree m_tree;
|
||||
|
||||
private BigDecimalParameter m_rootFolderIdParam = new BigDecimalParameter(ROOTFOLDER_ID_PARAM_NAME);
|
||||
private BigDecimalParameter m_selFolderIdParam = new BigDecimalParameter(SEL_FOLDER_ID_PARAM_NAME);
|
||||
private BigDecimalParameter m_fileIdParam = new BigDecimalParameter(FILE_ID_PARAM_NAME);
|
||||
private StringParameter m_rootAddDocParam= new StringParameter(ROOT_ADD_DOC_PARAM_NAME);
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
public BrowsePane() {
|
||||
m_segmentPanelBrowseContainer = new BoxPanel();
|
||||
m_segmentPanelBrowseContainer.setClassAttr("sidebarNavPanel");
|
||||
|
||||
BoxPanel leftSide = new BoxPanel();
|
||||
leftSide.setClassAttr("navbar");
|
||||
m_tree = new SuperTree(new RepositoriesSuperTreeModel());
|
||||
m_tree.addChangeListener(this);
|
||||
leftSide.add(m_tree);
|
||||
|
||||
m_segmentPanelBrowseContainer.add(leftSide);
|
||||
|
||||
// Create all panels on the right side.
|
||||
SegmentedPanel rightSide = new SegmentedPanel();
|
||||
rightSide.setClassAttr("segmentPanel");
|
||||
m_folderContent = makeContentPanel(rightSide);
|
||||
m_segmentPanelBrowseContainer.add(rightSide);
|
||||
|
||||
// Add all forms and panels to the container
|
||||
m_newFileForm = makeFileUploadForm();
|
||||
m_segmentPanelBrowseContainer.add(m_newFileForm);
|
||||
|
||||
m_newFolderForm = makeFolderCreateForm();
|
||||
m_segmentPanelBrowseContainer.add(m_newFolderForm);
|
||||
|
||||
m_destinationFolderPanel = makeExpandFolderPanel();
|
||||
m_segmentPanelBrowseContainer.add(m_destinationFolderPanel);
|
||||
|
||||
m_errorMsgPanel = makeErrorMsgPanel();
|
||||
m_segmentPanelBrowseContainer.add(m_errorMsgPanel);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the page the fist time.
|
||||
*
|
||||
* @param page The page to be registered.
|
||||
*/
|
||||
@Override
|
||||
public void register(Page page) {
|
||||
page.addGlobalStateParam(m_rootFolderIdParam);
|
||||
page.addGlobalStateParam(m_selFolderIdParam);
|
||||
page.addGlobalStateParam(m_rootAddDocParam);
|
||||
page.addGlobalStateParam(m_fileIdParam);
|
||||
|
||||
page.addRequestListener(this);
|
||||
|
||||
super.register(page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a folder is selected in the page state and consequently
|
||||
* hides or shows the Folder Contents or the Folder Action panels.
|
||||
*
|
||||
* @param event The request event.
|
||||
*/
|
||||
public void pageRequested(RequestEvent event) {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
Long fileId = ((BigDecimal) state.getValue(m_fileIdParam)).longValue();
|
||||
|
||||
boolean display = false;
|
||||
String key = (String) m_tree.getSelectedKey(state);
|
||||
|
||||
// start out with root folder selected and open
|
||||
if (key == null) {
|
||||
key = Utils.getRootFolder(state).getID().toString();
|
||||
m_tree.setSelectedKey(state, key);
|
||||
display = true;
|
||||
}
|
||||
|
||||
// need this only when coming from 1-file page
|
||||
if (fileId != null) {
|
||||
final CdiUtil cdiUtil = new CdiUtil();
|
||||
final ResourceRepository resourceRepository;
|
||||
try {
|
||||
resourceRepository = cdiUtil.findBean(ResourceRepository.class);
|
||||
File file = (File) resourceRepository.findById(fileId);
|
||||
Resource parent = file.getParent();
|
||||
key = Long.toString(parent.getObjectId());
|
||||
|
||||
while (!parent.isRoot()) {
|
||||
parent = parent.getParent();
|
||||
String nextKey = Long.toString(parent.getObjectId());
|
||||
m_tree.expand(nextKey, state);
|
||||
}
|
||||
|
||||
// to display this file's folder in the table
|
||||
m_tree.setSelectedKey(state, key);
|
||||
|
||||
// now wipe out file param to avoid trouble elsewhere
|
||||
state.setValue(m_fileIdParam, null);
|
||||
} catch (CdiLookupException e) {
|
||||
throw new IllegalStateException(String.format(
|
||||
"Failed to retrieve file %d from the database.", fileId));
|
||||
}
|
||||
}
|
||||
|
||||
// finally expand selected folder
|
||||
m_tree.expand(key, state);
|
||||
|
||||
if (display) {
|
||||
if( "t".equalsIgnoreCase(((String)state.getValue(m_rootAddDocParam)))) {
|
||||
// Entry hook to display FileUpload Form for Root folder
|
||||
displayFileUpload(state);
|
||||
} else {
|
||||
displayFolderContentPanel(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper method to communicate selected folder ID to sub components.
|
||||
* Return only non-null after tree has been displayed at least once.
|
||||
*
|
||||
* @param state The page state.
|
||||
*
|
||||
* @return The folder id.
|
||||
*/
|
||||
public BigDecimal getFolderID(PageState state) {
|
||||
return new BigDecimal((String) m_tree.getSelectedKey(state));
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of the change listener, clicking on the folder
|
||||
* loads the directory on the right side.
|
||||
*
|
||||
* @param event The change event. e.g. clicking.
|
||||
*/
|
||||
public void stateChanged(ChangeEvent event) {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
// Display folder on the right side corresponding to the key
|
||||
displayFolderContentPanel(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Build a panel to display the Folder content of the selected Folder
|
||||
* and add it as a segment to the passed Segmented Panel
|
||||
*
|
||||
* @param segmentPanel The segment panel.
|
||||
*
|
||||
* @return The segment panel with the added segment as a component.
|
||||
*/
|
||||
private Component makeContentPanel(SegmentedPanel segmentPanel) {
|
||||
|
||||
Label folder_info_header = new Label
|
||||
(new GlobalizedMessage("ui.folder.content.header", BUNDLE_NAME));
|
||||
folder_info_header.addPrintListener(
|
||||
new FolderNamePrintListener(m_tree));
|
||||
|
||||
ActionLink newFileLink = new ActionLink(new Label(FOLDER_NEW_FILE_LINK));
|
||||
newFileLink.setClassAttr("actionLink");
|
||||
|
||||
ActionLink newFolderLink =
|
||||
new ActionLink(new Label(FOLDER_NEW_FOLDER_LINK));
|
||||
newFolderLink.setClassAttr("actionLink");
|
||||
|
||||
newFileLink.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
displayFileUpload(e.getPageState());
|
||||
}
|
||||
});
|
||||
|
||||
newFolderLink.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
displayFolderCreate(e.getPageState());
|
||||
}
|
||||
});
|
||||
|
||||
GridPanel folderGrid = new GridPanel(1);
|
||||
SimpleContainer pane = new SimpleContainer();
|
||||
pane.add(newFileLink);
|
||||
pane.add(new Label(" "));
|
||||
pane.add(newFolderLink);
|
||||
folderGrid.add(pane, GridPanel.RIGHT | GridPanel.BOTTOM);
|
||||
folderGrid.add(new FolderContentsTableForm(this, m_tree),
|
||||
GridPanel.LEFT | GridPanel.BOTTOM);
|
||||
|
||||
return segmentPanel.addSegment(folder_info_header,
|
||||
folderGrid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the file upload form.
|
||||
*
|
||||
* @return A component with the build file upload form.
|
||||
*/
|
||||
private Component makeFileUploadForm() {
|
||||
GridPanel gridPanel = new GridPanel(1);
|
||||
|
||||
Label fileUploadFormHeaderLabel = new Label(new GlobalizedMessage("ui.file.upload.header", BUNDLE_NAME));
|
||||
fileUploadFormHeaderLabel.addPrintListener(new FolderNamePrintListener(m_tree));
|
||||
|
||||
gridPanel.add(fileUploadFormHeaderLabel);
|
||||
gridPanel.add(new FileUploadForm(this, m_tree));
|
||||
|
||||
return gridPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the folder create form.
|
||||
*
|
||||
* @return A component with the build folder create form.
|
||||
*/
|
||||
private Component makeFolderCreateForm() {
|
||||
GridPanel gridPanel = new GridPanel(1);
|
||||
Label folderCreateFormHeaderLabel = new Label(new GlobalizedMessage("ui.folder.create.header", BUNDLE_NAME));
|
||||
folderCreateFormHeaderLabel.addPrintListener(new FolderNamePrintListener(m_tree));
|
||||
|
||||
gridPanel.add(folderCreateFormHeaderLabel);
|
||||
gridPanel.add(new FolderCreateForm(this, m_tree));
|
||||
|
||||
return gridPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the destination folders tree.
|
||||
*
|
||||
* @return A component with the destination folder tree.
|
||||
*/
|
||||
private Component makeExpandFolderPanel() {
|
||||
GridPanel gridPanel = new GridPanel(1);
|
||||
m_destinationFolderForm = new DestinationFolderForm(this);
|
||||
|
||||
gridPanel.add(DESTINATION_FOLDER_PANEL_HEADER);
|
||||
gridPanel.add(m_destinationFolderForm);
|
||||
|
||||
return gridPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the panel to display error messages when copy/move failed.
|
||||
*
|
||||
* @return A component with the panel to display error messages.
|
||||
*/
|
||||
private Component makeErrorMsgPanel() {
|
||||
ColumnPanel columnPanel = new ColumnPanel(1);
|
||||
m_errorMsgLabel = new ErrorMessageLabel();
|
||||
columnPanel.add(m_errorMsgLabel);
|
||||
|
||||
ActionLink link = new ActionLink(ACTION_ERROR_CONTINUE);
|
||||
link.setClassAttr("actionLink");
|
||||
link.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
displayFolderContentPanel(e.getPageState());
|
||||
}
|
||||
});
|
||||
|
||||
columnPanel.add(link);
|
||||
return columnPanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the file upload form.
|
||||
*
|
||||
* @param state The page state
|
||||
*/
|
||||
public void displayFileUpload(PageState state) {
|
||||
m_newFileForm.setVisible(state, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the folder create form.
|
||||
*
|
||||
* @param state The page state
|
||||
*/
|
||||
public void displayFolderCreate(PageState state) {
|
||||
m_newFolderForm.setVisible(state, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the folder content panel.
|
||||
*
|
||||
* @param state The page state
|
||||
*/
|
||||
public void displayFolderContentPanel(PageState state) {
|
||||
m_segmentPanelBrowseContainer.setVisible(state, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the folder destination panel.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param resourceList A list of resources
|
||||
* @param isMove Weather its moved or copied
|
||||
*/
|
||||
public void displayDestinationFolderPanel(PageState state,
|
||||
Object[] resourceList,
|
||||
boolean isMove) {
|
||||
|
||||
m_destinationFolderPanel.setVisible(state, true);
|
||||
m_destinationFolderForm.setResourceList(state, resourceList);
|
||||
if (isMove) {
|
||||
m_destinationFolderForm.setMove(state);
|
||||
} else {
|
||||
m_destinationFolderForm.setCopy(state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Display the error message panel.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param action The file operation
|
||||
* @param list The list of messages
|
||||
*/
|
||||
public void displayErrorMsgPanel(PageState state,
|
||||
String action,
|
||||
ArrayList list) {
|
||||
|
||||
m_errorMsgLabel.setMessages(state, action, list);
|
||||
|
||||
m_errorMsgPanel.setVisible(state, true);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Error message panel that allows to set customized error
|
||||
* messages without showing a tomcat stacktrace.
|
||||
*/
|
||||
private static class ErrorMessageLabel extends SimpleComponent implements Constants {
|
||||
|
||||
private RequestLocal m_msgs;
|
||||
private RequestLocal m_action;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*/
|
||||
public ErrorMessageLabel() {
|
||||
m_msgs = new RequestLocal();
|
||||
m_action = new RequestLocal();
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Set list of file/folder that could not be delete/move/copy.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param action The file operation (action, move, copy)
|
||||
* @param msgs The list of messages
|
||||
*/
|
||||
public void setMessages(PageState state,
|
||||
String action,
|
||||
ArrayList msgs) {
|
||||
m_action.set(state, action);
|
||||
m_msgs.set(state, msgs);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateXML(PageState state, Element parent) {
|
||||
Element element = parent.newChildElement("docs:error-label",
|
||||
DOCS_XML_NS);
|
||||
element.addAttribute("action", (String) m_action.get(state));
|
||||
|
||||
ArrayList list = (ArrayList) m_msgs.get(state);
|
||||
|
||||
if (list != null) {
|
||||
for (Object aList : list) {
|
||||
Element item = element.newChildElement("docs:item", DOCS_XML_NS);
|
||||
item.addAttribute("name", ((String) aList));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Table Cell Renderer that provides clickable Links to follow
|
||||
* directory links .
|
||||
*
|
||||
* Todo: inner private class never used..
|
||||
*/
|
||||
private static class DirLinkRenderer implements ListCellRenderer {
|
||||
|
||||
public Component getComponent(List list, PageState state,
|
||||
Object value, String key,
|
||||
int index, boolean isSelected) {
|
||||
|
||||
Link link = new Link((String)value,
|
||||
"?" + SEL_FOLDER_ID_PARAM.getName() +
|
||||
"=" + key);
|
||||
return link;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Copyright (C) 2002-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.docrepo.ui;
|
||||
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
/**
|
||||
* Customized Cancel button that takes you 1 level back in
|
||||
* the browser history.
|
||||
*
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
public class CancelButton extends Submit {
|
||||
public CancelButton(GlobalizedMessage label) {
|
||||
super(label);
|
||||
setOnClick("history.go(-1); return false;");
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,394 @@
|
|||
/*
|
||||
* 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.docrepo.ui;
|
||||
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.parameters.BigDecimalParameter;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
/**
|
||||
* Variously used constant objects used in Document Repository UI
|
||||
*
|
||||
* Todo: refactor this whole fucking class. Totally idiotic.
|
||||
*
|
||||
* @author <a href="mailto:StefanDeusch@computer.org">Stefan Deusch</a>
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
|
||||
public interface Constants {
|
||||
|
||||
// PDL vars
|
||||
String FOLDER_ID = "folderID";
|
||||
String IS_LOCKED = "isLocked";
|
||||
String IS_MOUNTED = "isMounted";
|
||||
String LAST_MODIFIED = "lastModified";
|
||||
String MODIFYING_USER = "modifyingUser";
|
||||
String MIME_TYPE_LABEL = "mimeTypeDescription";
|
||||
String NAME = "name";
|
||||
String ABS_PATH = "absPath";
|
||||
String NUM_FILES = "numFiles";
|
||||
String REPOSITORY_ID = "repositoryID";
|
||||
String RESOURCE_ID = "resourceID";
|
||||
String SIZE = "size";
|
||||
String TYPE = "mimeType";
|
||||
String IS_FOLDER = "isFolder";
|
||||
|
||||
// PDL queries
|
||||
String GET_ALL_TREES = "com.arsdigita.docrepo.getAllTreesView";
|
||||
String GET_REPOSITORIES = "com.arsdigita.docrepo.getRepositoriesView";
|
||||
String GET_REPOSITORIES_ROOTS = "com.arsdigita.docrepo.getRepositoryRoots";
|
||||
String GET_CHILDREN = "com.arsdigita.docrepo.getChildren";
|
||||
|
||||
// PDL associations
|
||||
String FILES = "files";
|
||||
String FOLDERS = "folders";
|
||||
|
||||
/**
|
||||
* The XML namespace.
|
||||
*/
|
||||
String DOCS_XML_NS = "http://www.arsdigita.com/docs-ui/1.0";
|
||||
|
||||
/**
|
||||
* Globalization resource
|
||||
*/
|
||||
String BUNDLE_NAME = "com.arsdigita.docrepo.DRResources";
|
||||
|
||||
/**
|
||||
* Global state parameters.
|
||||
*/
|
||||
String ROOTFOLDER_ID_PARAM_NAME = "r_id";
|
||||
BigDecimalParameter ROOTFOLDER_ID_PARAM = new BigDecimalParameter(ROOTFOLDER_ID_PARAM_NAME);
|
||||
|
||||
String SEL_FOLDER_ID_PARAM_NAME = "f_id";
|
||||
BigDecimalParameter SEL_FOLDER_ID_PARAM = new BigDecimalParameter(SEL_FOLDER_ID_PARAM_NAME);
|
||||
|
||||
String FILE_ID_PARAM_NAME = "d_id";
|
||||
BigDecimalParameter FILE_ID_PARAM = new BigDecimalParameter(FILE_ID_PARAM_NAME);
|
||||
|
||||
/**
|
||||
* DM Index page title
|
||||
*/
|
||||
Label PAGE_TITLE_LABEL = new Label
|
||||
(new GlobalizedMessage("ui.page.title", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* DM File Info Page
|
||||
*/
|
||||
Label FILE_INFO_LABEL = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.title", BUNDLE_NAME));
|
||||
|
||||
// File Info Navigational Tabs
|
||||
Label FILE_INFO_PROPERTIES_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.properties.title", BUNDLE_NAME));
|
||||
|
||||
Label FILE_INFO_HISTORY_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.history.title", BUNDLE_NAME));
|
||||
|
||||
Label FILE_INFO_COMMENTS_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.comments.title", BUNDLE_NAME));
|
||||
|
||||
Label FILE_INFO_LINKS_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.links.title", BUNDLE_NAME));
|
||||
|
||||
Label GO_BACK_LABEL = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.goback.label", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* Navigational dimensional bar
|
||||
*/
|
||||
Label MY_WORKSPACE_LABEL = new Label
|
||||
(new GlobalizedMessage("ui.workspace.title", BUNDLE_NAME));
|
||||
|
||||
Label SIGN_OUT_LABEL = new Label
|
||||
(new GlobalizedMessage("ui.nav.signout", BUNDLE_NAME));
|
||||
|
||||
Label HELP_LABEL = new Label
|
||||
(new GlobalizedMessage("ui.nav.help", BUNDLE_NAME));
|
||||
|
||||
|
||||
/**
|
||||
* Page navigational tabs
|
||||
*/
|
||||
Label WS_BROWSE_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.workspace.browse.title", BUNDLE_NAME));
|
||||
|
||||
Label WS_SEARCH_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.workspace.search.title", BUNDLE_NAME));
|
||||
|
||||
Label WS_REPOSITORIES_TITLE = new Label
|
||||
(new GlobalizedMessage("ui.workspace.repositories.title", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* One Folder content
|
||||
*/
|
||||
Label FOLDER_INFORMATION_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.folder.content.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* Repositories
|
||||
*/
|
||||
Label REPOSITORIES_INFORMATION_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.repositories.content.header", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage REPOSITORY_RECENTDOCS_EMPTY
|
||||
= new GlobalizedMessage("ui.repositories.recentDocs.empty", BUNDLE_NAME);
|
||||
|
||||
/**
|
||||
* File Uplaod Form
|
||||
*/
|
||||
Label FILE_UPLOAD_FORM_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.file.upload.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* Folder Create Form
|
||||
*/
|
||||
Label FOLDER_CREATE_FORM_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.folder.create.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* File Properties
|
||||
*/
|
||||
Label FILE_PROPERTIES_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.properties.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* File Edit Panel
|
||||
*/
|
||||
Label FILE_EDIT_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.edit.header", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage FILE_EDIT_ACTION_DESCRIPTION =
|
||||
new GlobalizedMessage("ui.fileinfo.edit.action.description", BUNDLE_NAME);
|
||||
|
||||
/**
|
||||
* File Upload Panel
|
||||
*/
|
||||
Label FILE_UPLOAD_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.upload.header", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage FILE_UPLOAD_INITIAL_TRANSACTION_DESCRIPTION =
|
||||
new GlobalizedMessage("ui.fileinfo.upload.initialversion.description", BUNDLE_NAME);
|
||||
|
||||
/**
|
||||
* File Download Panel
|
||||
*/
|
||||
Label FILE_DOWNLOAD_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.download.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* File-Send-to-Colleague Form
|
||||
*/
|
||||
Label FILE_SEND_COLLEAGUE_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.sendcolleague.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* File-Delete Form
|
||||
*/
|
||||
Label FILE_DELETE_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.delete.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* File Action Panel
|
||||
*/
|
||||
Label FILE_ACTION_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.actions.header", BUNDLE_NAME));
|
||||
|
||||
/**
|
||||
* File Revision History Panel
|
||||
*/
|
||||
|
||||
Label FILE_REVISION_HISTORY_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.history.header", BUNDLE_NAME));
|
||||
|
||||
|
||||
/**
|
||||
* File Feedback Panel
|
||||
*/
|
||||
|
||||
Label FILE_FEEDBACK_HEADER = new Label
|
||||
(new GlobalizedMessage("ui.fileinfo.feedback.header", BUNDLE_NAME));
|
||||
|
||||
|
||||
/**
|
||||
* Action Panel Constants
|
||||
*/
|
||||
Label DESTINATION_FOLDER_PANEL_HEADER = new Label(
|
||||
new GlobalizedMessage("ui.folder.destination.list.header", BUNDLE_NAME));
|
||||
|
||||
Label FOLDER_EMPTY_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.folder.empty", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage FOLDER_NEW_FOLDER_LINK =
|
||||
new GlobalizedMessage("ui.action.newfolder", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FOLDER_NEW_FILE_LINK =
|
||||
new GlobalizedMessage("ui.action.newfile", BUNDLE_NAME);
|
||||
|
||||
Label ACTION_CUT_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.action.edit.cut", BUNDLE_NAME));
|
||||
|
||||
Label ACTION_COPY_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.action.edit.copy", BUNDLE_NAME));
|
||||
|
||||
Label ACTION_DELETE_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.action.edit.delete", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage ACTION_DELETE_CONFIRM =
|
||||
new GlobalizedMessage("ui.action.confirm.delete", BUNDLE_NAME);
|
||||
|
||||
Label ACTION_ERROR_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.action.error", BUNDLE_NAME));
|
||||
|
||||
Label ACTION_ERROR_CONTINUE = new Label(
|
||||
new GlobalizedMessage("ui.action.error.continue", BUNDLE_NAME));
|
||||
|
||||
String ACTION_CUT_VALUE = "resource-cut";
|
||||
String ACTION_COPY_VALUE = "resource-copy";
|
||||
String ACTION_DELETE_VALUE = "resource-delete";
|
||||
|
||||
GlobalizedMessage ACTION_DELETE_SUBMIT =
|
||||
new GlobalizedMessage("ui.action.submit.delete", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage ACTION_COPY_SUBMIT =
|
||||
new GlobalizedMessage("ui.action.submit.copy", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage ACTION_MOVE_SUBMIT =
|
||||
new GlobalizedMessage("ui.action.submit.move", BUNDLE_NAME);
|
||||
|
||||
|
||||
/**
|
||||
* Portlet Panel Constants
|
||||
*/
|
||||
GlobalizedMessage ROOT_ADD_RESOURCE_LINK =
|
||||
new GlobalizedMessage("ui.action.portlet.newresource", BUNDLE_NAME);
|
||||
|
||||
String ROOT_ADD_DOC_PARAM_NAME = "root_add_doc";
|
||||
StringParameter ROOT_ADD_DOC_PARAM =
|
||||
new StringParameter(ROOT_ADD_DOC_PARAM_NAME);
|
||||
|
||||
|
||||
/**
|
||||
* File Action Panel Constants
|
||||
*/
|
||||
GlobalizedMessage FILE_EDIT_LINK =
|
||||
new GlobalizedMessage("ui.fileinfo.edit.link", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_NEW_VERSION_LINK =
|
||||
new GlobalizedMessage("ui.fileinfo.newversion.link", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_DOWNLOAD_LINK =
|
||||
new GlobalizedMessage("ui.fileinfo.download.link", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_SEND_COLLEAGUE_LINK =
|
||||
new GlobalizedMessage("ui.fileinfo.sendcolleague.link", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_DELETE_LINK =
|
||||
new GlobalizedMessage("ui.fileinfo.delete.link", BUNDLE_NAME);
|
||||
|
||||
|
||||
/**
|
||||
* Error messages
|
||||
*/
|
||||
GlobalizedMessage FOLDER_PARENTNOTFOUND_ERROR =
|
||||
new GlobalizedMessage("ui.error.parentnotfound", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage RESOURCE_EXISTS_ERROR =
|
||||
new GlobalizedMessage("ui.error.resourceexists", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage EMAIL_INVALID_ERROR =
|
||||
new GlobalizedMessage("ui.email.formatinvalid", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage DIFFERENT_MIMETYPE_ERROR =
|
||||
new GlobalizedMessage("ui.error.mimetype", BUNDLE_NAME);
|
||||
|
||||
|
||||
/**
|
||||
* FILE DELETE link
|
||||
*/
|
||||
GlobalizedMessage FILE_DELETE_CONFIRM =
|
||||
new GlobalizedMessage("ui.file.confirm.delete", BUNDLE_NAME);
|
||||
|
||||
// Labels for Files
|
||||
GlobalizedMessage FILE_NAME =
|
||||
new GlobalizedMessage("ui.file.name", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_NAME_REQUIRED =
|
||||
new GlobalizedMessage("ui.file.name.required", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_UPLOAD_ADD_FILE =
|
||||
new GlobalizedMessage("ui.file.upload", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_SOURCE =
|
||||
new GlobalizedMessage("ui.file.source", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_DESCRIPTION =
|
||||
new GlobalizedMessage("ui.file.description", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_VERSION_DESCRIPTION =
|
||||
new GlobalizedMessage("ui.file.version.description", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_KEYWORDS =
|
||||
new GlobalizedMessage("ui.file.keywords", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_SAVE =
|
||||
new GlobalizedMessage("ui.file.save", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage FILE_SUBMIT =
|
||||
new GlobalizedMessage("ui.file.submit", BUNDLE_NAME);
|
||||
|
||||
GlobalizedMessage CANCEL =
|
||||
new GlobalizedMessage("ui.action.cancel", BUNDLE_NAME);
|
||||
|
||||
/**
|
||||
* Folder parameters
|
||||
*/
|
||||
String FOLDER_NAME = "folder-name";
|
||||
String FOLDER_DESCRIPTION = "folder-description";
|
||||
|
||||
Label FOLDER_NAME_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.folder.name", BUNDLE_NAME));
|
||||
|
||||
Label FOLDER_DESCRIPTION_LABEL = new Label(
|
||||
new GlobalizedMessage("ui.folder.description", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage FOLDER_SAVE =
|
||||
new GlobalizedMessage("ui.folder.save", BUNDLE_NAME);
|
||||
|
||||
/**
|
||||
* Repsitories Selection Form
|
||||
*/
|
||||
GlobalizedMessage REPOSITORIES_MOUNTED_SAVE =
|
||||
new GlobalizedMessage("ui.repositories.mounted.save", BUNDLE_NAME);
|
||||
|
||||
/**
|
||||
* Send to colleague form variables.
|
||||
*/
|
||||
Label SEND_FRIEND_FORM_EMAIL_SUBJECT = new Label(
|
||||
new GlobalizedMessage("ui.send.friend.email.subject", BUNDLE_NAME));
|
||||
|
||||
Label SEND_FRIEND_FORM_EMAIL_LIST = new Label(
|
||||
new GlobalizedMessage("ui.send.friend.email.list", BUNDLE_NAME));
|
||||
|
||||
Label SEND_FRIEND_FORM_DESCRIPTION = new Label(
|
||||
new GlobalizedMessage("ui.send.friend.description", BUNDLE_NAME));
|
||||
|
||||
GlobalizedMessage SEND_FRIEND_FORM_SUBMIT =
|
||||
new GlobalizedMessage("ui.send.friend.submit", BUNDLE_NAME);
|
||||
}
|
||||
|
|
@ -0,0 +1,357 @@
|
|||
/*
|
||||
* 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.docrepo.ui;
|
||||
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.form.Hidden;
|
||||
import com.arsdigita.bebop.form.RadioGroup;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.parameters.ArrayParameter;
|
||||
import com.arsdigita.docrepo.util.GlobalizationUtil;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.web.Web;
|
||||
import com.arsdigita.xml.Element;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiLookupException;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.docrepo.Folder;
|
||||
import org.libreccm.docrepo.Repository;
|
||||
import org.libreccm.docrepo.Resource;
|
||||
import org.libreccm.docrepo.ResourceManager;
|
||||
import org.libreccm.docrepo.ResourceRepository;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Intermediate form of the "Move-to" and "Copy-to" process.
|
||||
* It shows the folder tree of the repositories expanded
|
||||
* with checkboxes next to it.
|
||||
*
|
||||
* @author <a href="mailto:ddao@arsdigita.com">David Dao</a>
|
||||
* @author <a href="mailto:stefan@arsdigita.com">Stefan Deusch</a>
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
public class DestinationFolderForm extends Form implements FormInitListener,
|
||||
FormProcessListener, Constants {
|
||||
|
||||
private static final Logger log = Logger.getLogger(DestinationFolderForm.class);
|
||||
|
||||
private Hidden m_resourceList;
|
||||
private ExpandedFolderTree m_radioGroup;
|
||||
|
||||
private Submit m_copySubmit;
|
||||
private Submit m_moveSubmit;
|
||||
private BrowsePane m_parent;
|
||||
|
||||
/**
|
||||
* Constructor. Creates a destination folder form.
|
||||
*
|
||||
* @param parent The parent of the destination folder form
|
||||
*/
|
||||
public DestinationFolderForm(BrowsePane parent) {
|
||||
super("Destination-Folder", new ColumnPanel(1));
|
||||
m_parent = parent;
|
||||
m_resourceList = new Hidden(new ArrayParameter("resourceList"));
|
||||
add(m_resourceList);
|
||||
|
||||
m_radioGroup = new ExpandedFolderTree();
|
||||
add(m_radioGroup);
|
||||
|
||||
m_copySubmit = new Submit(GlobalizationUtil.globalize(
|
||||
"ui.action.submit.copy"));
|
||||
add(m_copySubmit);
|
||||
m_moveSubmit = new Submit(GlobalizationUtil.globalize(
|
||||
"ui.action.submit.copy"));
|
||||
add(m_moveSubmit);
|
||||
|
||||
addInitListener(this);
|
||||
addProcessListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>Adds a DOM subtree representing this component under the given
|
||||
* parent node. Uses the request values stored in <code>state</code>.</p>
|
||||
*
|
||||
* @param ps represents the current request
|
||||
* @param elt the node under which the DOM subtree should be added
|
||||
*/
|
||||
@Override
|
||||
public void generateXML(PageState ps, Element elt) {
|
||||
doSubmit(ps);
|
||||
super.generateXML(ps, elt);
|
||||
}
|
||||
|
||||
/**
|
||||
* Does a submit on a given page state.
|
||||
*
|
||||
* @param ps The page state
|
||||
*/
|
||||
private void doSubmit(PageState ps) {
|
||||
Object[] list = (Object[]) m_resourceList.getValue(ps);
|
||||
ArrayList l = new ArrayList();
|
||||
for (int i = 0; i < list.length; i++) {
|
||||
l.add(list[i]);
|
||||
}
|
||||
m_radioGroup.setSources(ps, l);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets a resource list with the given list of objects.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param list The list of objects
|
||||
*/
|
||||
public void setResourceList(PageState state, Object[] list) {
|
||||
m_resourceList.setValue(state, list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the copy submit to the page state.
|
||||
*
|
||||
* @param state The page state
|
||||
*/
|
||||
public void setCopy(PageState state) {
|
||||
state.setVisible(m_moveSubmit, false);
|
||||
state.setVisible(m_copySubmit, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the move submit to the page state.
|
||||
*
|
||||
* @param state The page state
|
||||
*/
|
||||
public void setMove(PageState state) {
|
||||
state.setVisible(m_moveSubmit, true);
|
||||
state.setVisible(m_copySubmit, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the destination folder form, when triggered by an event.
|
||||
* Todo: fix usage of class Kernel
|
||||
*
|
||||
* @param event The section event to be triggered
|
||||
*/
|
||||
public void init(FormSectionEvent event) {
|
||||
// if ( Kernel.getContext().getParty() == null ) {
|
||||
// Util.redirectToLoginPage(event.getPageState());
|
||||
// }
|
||||
}
|
||||
|
||||
/**
|
||||
* Processes the destination folder form after it has been triggered.
|
||||
*
|
||||
* @param event The section event to be triggered
|
||||
* @throws FormProcessException
|
||||
*/
|
||||
public void process(FormSectionEvent event) throws FormProcessException {
|
||||
PageState state = event.getPageState();
|
||||
|
||||
boolean isCopy = true;
|
||||
boolean isError = false;
|
||||
|
||||
ArrayList errorList = new ArrayList();
|
||||
if (m_moveSubmit.isSelected(state)) {
|
||||
isCopy = false;
|
||||
}
|
||||
|
||||
Long folderId = Long.valueOf((String) m_radioGroup.getValue(state));
|
||||
if (folderId == null) {
|
||||
throw new FormProcessException(GlobalizationUtil.globalize(
|
||||
"ui.folder.choose_destination"));
|
||||
}
|
||||
|
||||
final CdiUtil cdiUtil = new CdiUtil();
|
||||
final ResourceRepository resourceRepository;
|
||||
final ResourceManager resourceManager;
|
||||
try {
|
||||
resourceRepository = cdiUtil.findBean(ResourceRepository.class);
|
||||
resourceManager = cdiUtil.findBean(ResourceManager.class);
|
||||
|
||||
Folder folder = (Folder) resourceRepository.findById(folderId);
|
||||
if (folder == null) {
|
||||
log.error(String.format("Couldn't find folder %d in the " +
|
||||
"database.", folderId));
|
||||
}
|
||||
|
||||
String[] resourceStrings = (String[]) m_resourceList.getValue(state);
|
||||
for (String resourceString : resourceStrings) {
|
||||
Long resourceId = Long.valueOf(resourceString);
|
||||
|
||||
Resource resource = resourceRepository.findById(resourceId);
|
||||
if (resource == null) {
|
||||
log.debug(String.format("Couldn't find selected resource " +
|
||||
"%d in the database.", resourceId));
|
||||
errorList.add(resourceString);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Knowledge, weather its a folder or a file is not necessary
|
||||
if (isCopy) {
|
||||
resourceManager.copyToFolder(resource, folder);
|
||||
} else {
|
||||
resource.setParent(folder);
|
||||
resourceRepository.save(resource);
|
||||
}
|
||||
}
|
||||
} catch (CdiLookupException ex) {
|
||||
log.error("Failed to find bean for either ResourceRepository or " +
|
||||
"ResourceManager", ex);
|
||||
isError = true;
|
||||
}
|
||||
|
||||
if (isError) {
|
||||
String action = isCopy ? "copy" : "move";
|
||||
m_parent.displayErrorMsgPanel(state, action, errorList);
|
||||
} else {
|
||||
m_parent.displayFolderContentPanel(state);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an expanded tree of all repositories and folder for given user.
|
||||
* Each folder has a checkbox to be selected as destination folder. The
|
||||
* parent folder is not selectable. This class should not be use
|
||||
* outside of document repository.
|
||||
*/
|
||||
private class ExpandedFolderTree extends RadioGroup {
|
||||
|
||||
// Exclusion list of folders.
|
||||
private RequestLocal m_srcResources;
|
||||
|
||||
/**
|
||||
* Constructor of inner private class.
|
||||
*/
|
||||
public ExpandedFolderTree() {
|
||||
super("resourceID");
|
||||
m_srcResources = new RequestLocal();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets sources to the exclusion list of folders.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param list A list of sources
|
||||
*/
|
||||
public void setSources(PageState state, ArrayList list) {
|
||||
m_srcResources.set(state, list);
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates xml for the destination folder form. Therefore retrieving
|
||||
* a list of all folders in a certain repository for Copy and Move
|
||||
* operations.
|
||||
*
|
||||
* Todo: what does this method?
|
||||
* Todo: rewrite for ccm_ng
|
||||
*
|
||||
* @param state The page state
|
||||
* @param parent The element
|
||||
*/
|
||||
@Override
|
||||
public void generateXML(PageState state, Element parent) {
|
||||
Element treeElement = parent.newChildElement("bebop:tree", BEBOP_XML_NS);
|
||||
|
||||
// Todo: notwendig?
|
||||
Folder sourceFolder = null;
|
||||
Long sourceFolderId = (m_parent.getFolderID(state)).longValue();
|
||||
|
||||
final CdiUtil cdiUtil = new CdiUtil();
|
||||
final ResourceRepository resourceRepository;
|
||||
try {
|
||||
resourceRepository = cdiUtil.findBean(ResourceRepository.class);
|
||||
sourceFolder = (Folder) resourceRepository.findById
|
||||
(sourceFolderId);
|
||||
} catch (CdiLookupException ex) {
|
||||
log.error("Failed to find bean for the ResourceRepository", ex);
|
||||
}
|
||||
|
||||
if (sourceFolder != null) {
|
||||
HashMap map = new HashMap();
|
||||
map.put(new Long("-1"), treeElement);
|
||||
|
||||
// Todo: beibehalten?
|
||||
Repository repository = (Repository) Web.getWebContext().getApplication();
|
||||
|
||||
Folder rootFolder = repository.getRootFolder();
|
||||
// Todo: Method getSubFolders?
|
||||
List<Resource> resources = rootFolder.getImmediateChildren();
|
||||
|
||||
for (Resource resource : resources) {
|
||||
if (resource.isFolder()) {
|
||||
Long parentId = resource.getParent().getObjectId();
|
||||
Long resourceId = resource.getObjectId();
|
||||
|
||||
Element parentElement = (Element) map.get(parentId);
|
||||
|
||||
if (parentElement != null) {
|
||||
boolean isSelectable = resource.equals(sourceFolder);
|
||||
map.put(resourceId, createNode(state, parentElement,
|
||||
isSelectable, (Folder) resource));
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
log.error(String.format("Couldn't find the source folder %d " +
|
||||
"in the database", sourceFolderId));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new element node with given folder.
|
||||
*
|
||||
* @param state The page state
|
||||
* @param parent The elements parent
|
||||
* @param makeSelectable If new element needs to be selectable
|
||||
* @param folder The folder
|
||||
*
|
||||
* @return The new element node
|
||||
*/
|
||||
private Element createNode(PageState state, Element parent,
|
||||
boolean makeSelectable, Folder folder) {
|
||||
|
||||
Element element = parent.newChildElement("bebop:t_node", BEBOP_XML_NS);
|
||||
|
||||
element.addAttribute("indentStart", "t");
|
||||
element.addAttribute("indentClose", "t");
|
||||
if (makeSelectable) {
|
||||
element.addAttribute("resourceID", String.valueOf(
|
||||
folder.getObjectId()));
|
||||
element.addAttribute("radioGroup", "t");
|
||||
element.addAttribute("radioGroupName", getName());
|
||||
} else {
|
||||
element.addAttribute("radioGroup", "f");
|
||||
}
|
||||
|
||||
Label label = new Label(new GlobalizedMessage(folder.getName()));
|
||||
label.generateXML(state, element);
|
||||
|
||||
return element;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
* 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.docrepo.ui;
|
||||
|
||||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.ColumnPanel;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Link;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.RequestLocal;
|
||||
import com.arsdigita.bebop.event.ActionEvent;
|
||||
import com.arsdigita.bebop.event.ActionListener;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.dispatcher.DispatcherHelper;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.web.Web;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiLookupException;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.docrepo.File;
|
||||
import org.libreccm.docrepo.ResourceRepository;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
||||
/**
|
||||
* This component shows the meta data of a file with links to administrative
|
||||
* actions on it.
|
||||
*
|
||||
* @author <a href="mailto:StefanDeusch@computer.org">Stefan Deusch</a>
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
public class FileActionPane extends ColumnPanel implements Constants {
|
||||
|
||||
private static final Logger log = Logger.getLogger(FileActionPane.class);
|
||||
|
||||
private FileInfoPropertiesPane m_parent;
|
||||
private RequestLocal m_fileData;
|
||||
private Link m_download;
|
||||
private ActionLink m_newVersion;
|
||||
private ActionLink m_email;
|
||||
private ActionLink m_delete;
|
||||
|
||||
/**
|
||||
* Constructor. Initializes the action pane for the given info properties.
|
||||
*
|
||||
* @param parent The info property pane
|
||||
*/
|
||||
public FileActionPane(FileInfoPropertiesPane parent) {
|
||||
super(1);
|
||||
|
||||
m_parent = parent;
|
||||
|
||||
m_fileData = new RequestLocal() {
|
||||
protected Object initialValue(PageState state) {
|
||||
File file = null;
|
||||
Long fileId = (Long) state.getValue
|
||||
(FILE_ID_PARAM);
|
||||
|
||||
final CdiUtil cdiUtil = new CdiUtil();
|
||||
final ResourceRepository resourceRepository;
|
||||
try {
|
||||
resourceRepository = cdiUtil.findBean(ResourceRepository.class);
|
||||
file = (File) resourceRepository.findById(fileId);
|
||||
if (file == null) {
|
||||
log.error(String.format("Couldn't find the file %d in" +
|
||||
" the database", fileId));
|
||||
}
|
||||
} catch(CdiLookupException ex) {
|
||||
log.error("Failed to find bean for the " +
|
||||
"ResourceRepository", ex);
|
||||
}
|
||||
return file;
|
||||
}
|
||||
};
|
||||
|
||||
m_newVersion = addActionLink(FILE_NEW_VERSION_LINK);
|
||||
|
||||
PrintListener printListener = new PrintListener() {
|
||||
public void prepare(PrintEvent event) {
|
||||
Link link = (Link) event.getTarget();
|
||||
PageState state = event.getPageState();
|
||||
File file = getFile(state);
|
||||
link.setTarget(String.format("download/%s?%s=%d", file.getName(),
|
||||
FILE_ID_PARAM.getName(), file.getObjectId()));
|
||||
}
|
||||
};
|
||||
|
||||
m_download = new Link(new Label(FILE_DOWNLOAD_LINK),
|
||||
printListener);
|
||||
m_download.setClassAttr("actionLink");
|
||||
add(m_download);
|
||||
|
||||
m_email = addActionLink(FILE_SEND_COLLEAGUE_LINK);
|
||||
m_delete = addActionLink(FILE_DELETE_LINK);
|
||||
|
||||
m_newVersion.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
m_parent.displayUploadForm(e.getPageState());
|
||||
}
|
||||
});
|
||||
|
||||
m_email.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
m_parent.displaySendColleagueForm(e.getPageState());
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
m_delete.addActionListener(new DeleteListener());
|
||||
m_delete.setConfirmation(FILE_DELETE_CONFIRM);
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds the action link to this file action pane.
|
||||
*
|
||||
* @param msg Label of the action link
|
||||
*
|
||||
* @return The action link
|
||||
*/
|
||||
private ActionLink addActionLink(GlobalizedMessage msg) {
|
||||
ActionLink actionlink = new ActionLink(new Label(msg));
|
||||
actionlink.setClassAttr("actionLink");
|
||||
this.add(actionlink);
|
||||
return actionlink;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return file initialized in RequestLocal
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return The initialized file
|
||||
*/
|
||||
private File getFile(PageState state) {
|
||||
return (File) m_fileData.get(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Private inner class. DeleteListener of a file.
|
||||
*/
|
||||
private final class DeleteListener implements ActionListener {
|
||||
|
||||
/**
|
||||
* Method get triggered, if the delete action has been perfomed.
|
||||
*
|
||||
* @param event The delete event
|
||||
*/
|
||||
public void actionPerformed(ActionEvent event) {
|
||||
PageState state = event.getPageState();
|
||||
final File file = getFile(state);
|
||||
Long parentFolderId = file.getParent().getObjectId();
|
||||
|
||||
final CdiUtil cdiUtil = new CdiUtil();
|
||||
final ResourceRepository resourceRepository;
|
||||
try {
|
||||
resourceRepository = cdiUtil.findBean(ResourceRepository.class);
|
||||
|
||||
// Todo: replace KernelExcursion
|
||||
// KernelExcursion ex = new KernelExcursion() {
|
||||
// protected void excurse() {
|
||||
// setEffectiveParty(Kernel.getSystemParty());
|
||||
// resourceRepository.delete(file);
|
||||
// }
|
||||
// };
|
||||
// ex.run();
|
||||
|
||||
} catch (CdiLookupException ex) {
|
||||
log.error("Failed to find bean for the ResourceRepository.", ex);
|
||||
}
|
||||
|
||||
try {
|
||||
String appURI = getRedirectURI(state);
|
||||
|
||||
DispatcherHelper.sendRedirect(state.getRequest(),
|
||||
state.getResponse(), String.format("%s?%s=%d",
|
||||
appURI, SEL_FOLDER_ID_PARAM.getName(),
|
||||
parentFolderId));
|
||||
} catch(IOException iox) {
|
||||
log.error("Failed to send the url for the redirect.", iox);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the redirecting uri through a given page state.
|
||||
*
|
||||
* @param state The page state
|
||||
*
|
||||
* @return The new uri
|
||||
*/
|
||||
private String getRedirectURI(PageState state) {
|
||||
String appURI = state.getRequestURI();
|
||||
log.debug(String.format("Original app URI: %s", appURI));
|
||||
int idx = appURI.indexOf("/file/");
|
||||
appURI = appURI.substring(0, idx);
|
||||
|
||||
final String servletPath = Web.getConfig().getDispatcherServletPath();
|
||||
if (appURI.startsWith(servletPath)) {
|
||||
appURI = appURI.substring(servletPath.length());
|
||||
}
|
||||
|
||||
log.debug(String.format("New URI: %s", appURI));
|
||||
return appURI;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,43 @@
|
|||
/*
|
||||
* Copyright (C) 2002-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.docrepo.util;
|
||||
|
||||
import com.arsdigita.globalization.Globalized;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
|
||||
/**
|
||||
* <p>Contains methods to simplify globalizing keys</p>
|
||||
*
|
||||
* @author <a href="mailto:sarnold@redhat.com">sarnold@redhat.com</a>
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
*/
|
||||
|
||||
public class GlobalizationUtil implements Globalized {
|
||||
|
||||
private static final String BUNDLE_NAME = "com.arsdigita.docrepo.Resources";
|
||||
|
||||
public static GlobalizedMessage globalize(String key) {
|
||||
return new GlobalizedMessage(key, BUNDLE_NAME);
|
||||
}
|
||||
|
||||
public static GlobalizedMessage globalize(String key, Object[] args) {
|
||||
return new GlobalizedMessage(key, BUNDLE_NAME, args);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -64,7 +64,7 @@ public class BlobObject implements Serializable {
|
|||
private byte[] content;
|
||||
|
||||
/**
|
||||
* The {@link Resource} assigned to the {@code BlobObject}.
|
||||
* The {@link Resource} the {@code BlobObject} was assigned to.
|
||||
*/
|
||||
@OneToOne(mappedBy = "content")
|
||||
@NotEmpty
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
package org.libreccm.docrepo;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
/**
|
||||
|
|
@ -34,10 +35,28 @@ public class Folder extends Resource {
|
|||
|
||||
private static final long serialVersionUID = 1561466556458872622L;
|
||||
|
||||
/**
|
||||
* The {@link Repository} this {@code Folder} is assigned to as root.
|
||||
*/
|
||||
@OneToOne(mappedBy = "rootFolder")
|
||||
private Repository repository;
|
||||
|
||||
/**
|
||||
* Constructor calls the super-class-constructor of {@link Resource}.
|
||||
*/
|
||||
public Folder() {
|
||||
super();
|
||||
}
|
||||
|
||||
//> Begin GETTER & SETTER
|
||||
|
||||
public Repository getRepository() {
|
||||
return repository;
|
||||
}
|
||||
|
||||
public void setRepository(Repository repository) {
|
||||
this.repository = repository;
|
||||
}
|
||||
|
||||
//< End GETTER & SETTER
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,15 +18,19 @@
|
|||
*/
|
||||
package org.libreccm.docrepo;
|
||||
|
||||
import org.libreccm.core.User;
|
||||
import org.libreccm.web.CcmApplication;
|
||||
|
||||
import javax.persistence.Column;
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.JoinColumn;
|
||||
import javax.persistence.ManyToOne;
|
||||
import javax.persistence.OneToOne;
|
||||
import javax.persistence.Table;
|
||||
|
||||
/**
|
||||
* Entity class of a repository for documents. Instances will be persisted into the
|
||||
* database. Instance variables are inherited from {@link CcmApplication}.
|
||||
* Entity class of a repository for documents. Instances will be persisted into
|
||||
* the database. Instance variables are inherited from {@link CcmApplication}.
|
||||
*
|
||||
* @author <a href="mailto:tosmers@uni-bremen.de">Tobias Osmers</a>
|
||||
* @version 01/10/2015
|
||||
|
|
@ -38,16 +42,24 @@ public class Repository extends CcmApplication {
|
|||
private static final long serialVersionUID = 6673243021462798036L;
|
||||
|
||||
/**
|
||||
* The root of the repository.
|
||||
* Name des {@code Repository}s.
|
||||
*/
|
||||
@Column(name = "ROOT_ID")
|
||||
private long rootId;
|
||||
@Column(name = "NAME")
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* The owner of the repository.
|
||||
* The root of the {@code Repository}.
|
||||
*/
|
||||
@Column(name = "OWNER_ID")
|
||||
private long ownerId;
|
||||
@OneToOne
|
||||
@JoinColumn(name = "ROOT_FOLDER")
|
||||
private Folder rootFolder;
|
||||
|
||||
/**
|
||||
* The owner of the {@code Repository}.
|
||||
*/
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "OWNER")
|
||||
private User owner;
|
||||
|
||||
/**
|
||||
* Constructor calls the super-class-constructor of {@link CcmApplication}.
|
||||
|
|
@ -58,20 +70,28 @@ public class Repository extends CcmApplication {
|
|||
|
||||
//> Begin GETTER & SETTER
|
||||
|
||||
public long getRootId() {
|
||||
return rootId;
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setRootId(long rootId) {
|
||||
this.rootId = rootId;
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public long getOwnerId() {
|
||||
return ownerId;
|
||||
public Folder getRootFolder() {
|
||||
return rootFolder;
|
||||
}
|
||||
|
||||
public void setOwnerId(long ownerId) {
|
||||
this.ownerId = ownerId;
|
||||
public void setRootFolder(Folder root_folder) {
|
||||
this.rootFolder = root_folder;
|
||||
}
|
||||
|
||||
public User getOwner() {
|
||||
return owner;
|
||||
}
|
||||
|
||||
public void setOwner(User owner) {
|
||||
this.owner = owner;
|
||||
}
|
||||
|
||||
//< End GETTER & SETTER
|
||||
|
|
|
|||
|
|
@ -291,4 +291,8 @@ public abstract class Resource extends CcmObject {
|
|||
}
|
||||
|
||||
//< End GETTER & SETTER
|
||||
|
||||
public boolean isRoot() {
|
||||
return isFolder() && getParent() == null;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -18,6 +18,8 @@
|
|||
*/
|
||||
package org.libreccm.docrepo;
|
||||
|
||||
import org.apache.log4j.Logger;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
|
||||
|
|
@ -29,11 +31,26 @@ import javax.inject.Inject;
|
|||
*/
|
||||
@RequestScoped
|
||||
public class ResourceManager {
|
||||
private static final Logger log = Logger.getLogger(ResourceManager.class);
|
||||
|
||||
@Inject
|
||||
private transient ResourceRepository resourceRepository;
|
||||
|
||||
public void copyToFolder(Resource original, Folder folder) {
|
||||
Resource copy = original.isFolder() ? new Folder() : new File();
|
||||
copy.setName(original.getName());
|
||||
copy.setDescription(original.getDescription());
|
||||
copy.setIsFolder(original.isFolder());
|
||||
copy.setPath(String.format("%s/%s", folder.getPath(), copy.getName()));
|
||||
copy.setMimeType(original.getMimeType());
|
||||
copy.setSize(original.getSize());
|
||||
copy.setContent(original.getContent());
|
||||
|
||||
copy.setParent(folder);
|
||||
copy.setImmediateChildren(original.getImmediateChildren());
|
||||
|
||||
resourceRepository.save(copy);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,76 @@
|
|||
ui.action.edit.copy=Copy
|
||||
ui.action.edit.cut=Cut
|
||||
ui.action.edit.delete=Delete
|
||||
ui.action.error=The following error(s) occured:
|
||||
ui.action.error.continue=Continue
|
||||
ui.action.submit.delete=Delete
|
||||
ui.action.confirm.delete='Do you really want to delete the selected files and folders?'
|
||||
ui.action.submit.copy=Copy to ...
|
||||
ui.action.submit.move=Move to ...
|
||||
ui.action.newfile=New Document
|
||||
ui.action.newfolder=New Folder
|
||||
ui.action.cancel=Cancel
|
||||
ui.email.formatinvalid=Did not send document to following e-mail addresses because of invalid format
|
||||
ui.error.parentnotfound=Could not find parent folder. The parent folder may have just been deleted.
|
||||
ui.error.resourceexists=Resource already exists
|
||||
ui.error.mimetype=The new version cannot have a different MIME type than the original file!
|
||||
ui.file.description=Description: (opt.)
|
||||
ui.file.keywords=Keywords:
|
||||
ui.file.upload=Upload File: (*)
|
||||
ui.file.name=Name: (opt.)
|
||||
ui.file.name.required=Name: (*)
|
||||
ui.file.save=Save
|
||||
ui.file.submit=Upload
|
||||
ui.file.source=Source:
|
||||
ui.file.version.description=Version Description: (*)
|
||||
ui.file.upload.header=Upload File into Folder
|
||||
ui.file.confirm.delete=Do you really want to delete this file?
|
||||
ui.fileinfo.goback.label=Return to
|
||||
ui.fileinfo.actions.header=Actions
|
||||
ui.fileinfo.comments.title=Feedback
|
||||
ui.fileinfo.delete.header=Delete Document
|
||||
ui.fileinfo.delete.link=Delete
|
||||
ui.fileinfo.download.header=Download Document
|
||||
ui.fileinfo.download.link=Download
|
||||
ui.fileinfo.edit.action.description=Changed name/description
|
||||
ui.fileinfo.edit.header=Document Properties
|
||||
ui.fileinfo.edit.link=Edit
|
||||
ui.fileinfo.feedback.header=Comments and Ratings
|
||||
ui.fileinfo.history.header=Revision History
|
||||
ui.fileinfo.history.title=History
|
||||
ui.fileinfo.links.title=Links
|
||||
ui.fileinfo.newversion.link=Upload new revision
|
||||
ui.fileinfo.properties.header=Document Properties
|
||||
ui.fileinfo.properties.title=Properties
|
||||
ui.fileinfo.sendcolleague.header=E-mail Document
|
||||
ui.fileinfo.sendcolleague.link=Send to a Colleague
|
||||
ui.fileinfo.title=File Info
|
||||
ui.fileinfo.upload.header=Upload New Version
|
||||
ui.folder.empty=This folder is empty
|
||||
ui.folder.name=Name: (*)
|
||||
ui.folder.description=Description: (opt.)
|
||||
ui.folder.save=Create
|
||||
ui.folder.content.header=Contents of
|
||||
ui.folder.create.header=Create New Folder in
|
||||
ui.folder.destination.list.header=Destination folder
|
||||
ui.nav.help=Help
|
||||
ui.nav.signout=Sign Out
|
||||
ui.repositories.content.header=Available Document Repositories
|
||||
ui.repositories.mounted.save=Update
|
||||
ui.repositories.recentDocs.empty=There are no recently edited documents.
|
||||
ui.send.friend.description=Personal Message:
|
||||
ui.send.friend.email.list=Send to:
|
||||
ui.send.friend.email.subject=Subject
|
||||
ui.send.friend.submit=Send
|
||||
ui.page.title=Document Manager
|
||||
ui.workspace.browse.title=Browse
|
||||
ui.workspace.repositories.title=Repositories
|
||||
ui.workspace.search.title=Search
|
||||
ui.workspace.title=Workspace
|
||||
ui.fileinfo.upload.initialversion.description=Initial version
|
||||
ui.action.portlet.newresource=New Document
|
||||
ui.folder.name_not_unique=A folder with this name already exists
|
||||
ui.workspace.sign_out=Sign out
|
||||
ui.view.admin=View of the Admin
|
||||
ui.view.user=The view of the User
|
||||
ui.folder.choose_destination=Please choose a destination
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
ui.action.edit.copy=Kopieren
|
||||
ui.action.edit.cut=Ausschneiden
|
||||
ui.action.edit.delete=Löschen
|
||||
ui.action.error=Folgende(r) Fehler trat(en) auf:
|
||||
ui.action.error.continue=Fortfahren
|
||||
ui.action.submit.delete=L\u00f6schen
|
||||
ui.action.confirm.delete='Sollen die ausgew\u00e4hlten Dateien und Ordner tats\u00e4chlich gel\u00f6scht werden?'
|
||||
ui.action.submit.copy=Kopieren nach ...
|
||||
ui.action.submit.move=Verschieben nach ...
|
||||
ui.action.newfile=Neues Dokument
|
||||
ui.action.newfolder=Neuer Ordner
|
||||
ui.action.cancel=Abbrechen
|
||||
ui.email.formatinvalid=Das Dokument konte aufgrund eines ung\u00fcltigen Formates nicht an die folgende E-Mail Adresse versandt werden
|
||||
ui.error.parentnotfound=Could not find parent folder. The parent folder may have just been deleted.
|
||||
ui.error.resourceexists=Resource already exists
|
||||
ui.error.mimetype=The new version cannot have a different MIME type than the original file!
|
||||
ui.file.description=Beschreibung: (opt.)
|
||||
ui.file.keywords=Keywords:
|
||||
ui.file.upload=Datgei hochladen: (*)
|
||||
ui.file.name=Name: (opt.)
|
||||
ui.file.name.required=Name: (*)
|
||||
ui.file.save=Sichern
|
||||
ui.file.submit=Upload
|
||||
ui.file.source=Quelle:
|
||||
ui.file.version.description=Version Description: (*)
|
||||
ui.file.upload.header=Upload File into Folder
|
||||
ui.file.confirm.delete=Do you really want to delete this file?
|
||||
ui.fileinfo.goback.label=Return to
|
||||
ui.fileinfo.actions.header=Actions
|
||||
ui.fileinfo.comments.title=Feedback
|
||||
ui.fileinfo.delete.header=Delete Document
|
||||
ui.fileinfo.delete.link=Delete
|
||||
ui.fileinfo.download.header=Download Document
|
||||
ui.fileinfo.download.link=Download
|
||||
ui.fileinfo.edit.action.description=Changed name/description
|
||||
ui.fileinfo.edit.header=Document Properties
|
||||
ui.fileinfo.edit.link=Edit
|
||||
ui.fileinfo.feedback.header=Comments and Ratings
|
||||
ui.fileinfo.history.header=Revision History
|
||||
ui.fileinfo.history.title=History
|
||||
ui.fileinfo.links.title=Links
|
||||
ui.fileinfo.newversion.link=Upload new revision
|
||||
ui.fileinfo.properties.header=Document Properties
|
||||
ui.fileinfo.properties.title=Properties
|
||||
ui.fileinfo.sendcolleague.header=E-mail Document
|
||||
ui.fileinfo.sendcolleague.link=Send to a Colleague
|
||||
ui.fileinfo.title=File Info
|
||||
ui.fileinfo.upload.header=Upload New Version
|
||||
ui.folder.empty=This folder is empty
|
||||
ui.folder.name=Name: (*)
|
||||
ui.folder.description=Description: (opt.)
|
||||
ui.folder.save=Create
|
||||
ui.folder.content.header=Contents of
|
||||
ui.folder.create.header=Create New Folder in
|
||||
ui.folder.destination.list.header=Destination folder
|
||||
ui.nav.help=Help
|
||||
ui.nav.signout=Sign Out
|
||||
ui.repositories.content.header=Available Document Repositories
|
||||
ui.repositories.mounted.save=Update
|
||||
ui.repositories.recentDocs.empty=There are no recently edited documents.
|
||||
ui.send.friend.description=Personal Message:
|
||||
ui.send.friend.email.list=Send to:
|
||||
ui.send.friend.email.subject=Subject
|
||||
ui.send.friend.submit=Send
|
||||
ui.page.title=Document Manager
|
||||
ui.workspace.browse.title=Browse
|
||||
ui.workspace.repositories.title=Repositories
|
||||
ui.workspace.search.title=Search
|
||||
ui.workspace.title=Workspace
|
||||
ui.fileinfo.upload.initialversion.description=Initial version
|
||||
ui.action.portlet.newresource=New Document
|
||||
ui.folder.name_not_unique=Ein Ordner mit diesem Namen existiert bereits
|
||||
ui.workspace.sign_out=Abmelden
|
||||
ui.view.admin=Ansicht des Admin
|
||||
ui.view.user=Die Ansicht des Benutzers
|
||||
ui.folder.choose_destination=Bitte w\u00e4hle ein Ziel
|
||||
|
|
@ -0,0 +1,76 @@
|
|||
ui.action.edit.copy=Copy
|
||||
ui.action.edit.cut=Cut
|
||||
ui.action.edit.delete=Delete
|
||||
ui.action.error=The following error(s) occured:
|
||||
ui.action.error.continue=Continue
|
||||
ui.action.submit.delete=Delete
|
||||
ui.action.confirm.delete='Do you really want to delete the selected files and folders?'
|
||||
ui.action.submit.copy=Copy to ...
|
||||
ui.action.submit.move=Move to ...
|
||||
ui.action.newfile=New Document
|
||||
ui.action.newfolder=New Folder
|
||||
ui.action.cancel=Cancel
|
||||
ui.email.formatinvalid=Did not send document to following e-mail addresses because of invalid format
|
||||
ui.error.parentnotfound=Could not find parent folder. The parent folder may have just been deleted.
|
||||
ui.error.resourceexists=Resource already exists
|
||||
ui.error.mimetype=The new version cannot have a different MIME type than the original file!
|
||||
ui.file.description=Description: (opt.)
|
||||
ui.file.keywords=Keywords:
|
||||
ui.file.upload=Upload File: (*)
|
||||
ui.file.name=Name: (opt.)
|
||||
ui.file.name.required=Name: (*)
|
||||
ui.file.save=Save
|
||||
ui.file.submit=Upload
|
||||
ui.file.source=Source:
|
||||
ui.file.version.description=Version Description: (*)
|
||||
ui.file.upload.header=Upload File into Folder
|
||||
ui.file.confirm.delete=Do you really want to delete this file?
|
||||
ui.fileinfo.goback.label=Return to
|
||||
ui.fileinfo.actions.header=Actions
|
||||
ui.fileinfo.comments.title=Feedback
|
||||
ui.fileinfo.delete.header=Delete Document
|
||||
ui.fileinfo.delete.link=Delete
|
||||
ui.fileinfo.download.header=Download Document
|
||||
ui.fileinfo.download.link=Download
|
||||
ui.fileinfo.edit.action.description=Changed name/description
|
||||
ui.fileinfo.edit.header=Document Properties
|
||||
ui.fileinfo.edit.link=Edit
|
||||
ui.fileinfo.feedback.header=Comments and Ratings
|
||||
ui.fileinfo.history.header=Revision History
|
||||
ui.fileinfo.history.title=History
|
||||
ui.fileinfo.links.title=Links
|
||||
ui.fileinfo.newversion.link=Upload new revision
|
||||
ui.fileinfo.properties.header=Document Properties
|
||||
ui.fileinfo.properties.title=Properties
|
||||
ui.fileinfo.sendcolleague.header=E-mail Document
|
||||
ui.fileinfo.sendcolleague.link=Send to a Colleague
|
||||
ui.fileinfo.title=File Info
|
||||
ui.fileinfo.upload.header=Upload New Version
|
||||
ui.folder.empty=This folder is empty
|
||||
ui.folder.name=Name: (*)
|
||||
ui.folder.description=Description: (opt.)
|
||||
ui.folder.save=Create
|
||||
ui.folder.content.header=Contents of
|
||||
ui.folder.create.header=Create New Folder in
|
||||
ui.folder.destination.list.header=Destination folder
|
||||
ui.nav.help=Help
|
||||
ui.nav.signout=Sign Out
|
||||
ui.repositories.content.header=Available Document Repositories
|
||||
ui.repositories.mounted.save=Update
|
||||
ui.repositories.recentDocs.empty=There are no recently edited documents.
|
||||
ui.send.friend.description=Personal Message:
|
||||
ui.send.friend.email.list=Send to:
|
||||
ui.send.friend.email.subject=Subject
|
||||
ui.send.friend.submit=Send
|
||||
ui.page.title=Document Manager
|
||||
ui.workspace.browse.title=Browse
|
||||
ui.workspace.repositories.title=Repositories
|
||||
ui.workspace.search.title=Search
|
||||
ui.workspace.title=Workspace
|
||||
ui.fileinfo.upload.initialversion.description=Initial version
|
||||
ui.action.portlet.newresource=New Document
|
||||
ui.folder.name_not_unique=A folder with this name already exists
|
||||
ui.workspace.sign_out=Sign out
|
||||
ui.view.admin=View of the Admin
|
||||
ui.view.user=The view of the User
|
||||
ui.folder.choose_destination=Please choose a destination
|
||||
Loading…
Reference in New Issue