blob: 6f5ead11a16454f722e7af489e3c6e1820d15a3f [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.web.user.record;
import static org.apache.openmeetings.util.OmFileHelper.getMp4Recording;
import static org.apache.openmeetings.web.app.Application.getBean;
import static org.apache.openmeetings.web.app.WebSession.getUserId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import org.apache.openmeetings.db.dao.record.FlvRecordingDao;
import org.apache.openmeetings.db.dao.user.UserDao;
import org.apache.openmeetings.db.entity.record.FlvRecording;
import org.apache.openmeetings.db.entity.user.Organisation_Users;
import org.apache.openmeetings.web.app.WebSession;
import org.apache.openmeetings.web.common.AddFolderDialog;
import org.apache.openmeetings.web.common.ConfirmableAjaxLink;
import org.apache.openmeetings.web.common.UserPanel;
import org.apache.wicket.Component;
import org.apache.wicket.ajax.AjaxEventBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.ajax.markup.html.AjaxEditableLabel;
import org.apache.wicket.extensions.markup.html.repeater.tree.DefaultNestedTree;
import org.apache.wicket.extensions.markup.html.repeater.tree.ITreeProvider;
import org.apache.wicket.extensions.markup.html.repeater.tree.content.Folder;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.repeater.ReuseIfModelsEqualStrategy;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
public class RecordingsPanel extends UserPanel {
private static final long serialVersionUID = 1321258690447136958L;
private final WebMarkupContainer trees = new WebMarkupContainer("trees");
private final VideoPlayer video = new VideoPlayer("video");
private final VideoInfo info = new VideoInfo("info");
private final RecordingTree myTree;
private final IModel<FlvRecording> rm = new CompoundPropertyModel<FlvRecording>(new FlvRecording());
private RecordingTree selected;
public RecordingsPanel(String id) {
super(id);
rm.getObject().setFlvRecordingId(-3);
rm.getObject().setOwnerId(getUserId());
final AddFolderDialog addFolder = new AddFolderDialog("addFolder", WebSession.getString(712)) {
private static final long serialVersionUID = 1L;
@Override
protected void onSubmit(AjaxRequestTarget target) {
FlvRecording f = new FlvRecording();
f.setFileName(getModelObject());
f.setInsertedBy(getUserId());
f.setInserted(new Date());
f.setIsFolder(true);
f.setIsImage(false);
f.setIsPresentation(false);
f.setIsRecording(true);
long parentId = rm.getObject().getFlvRecordingId();
f.setParentFileExplorerItemId(parentId > 0 ? parentId : 0);
f.setOwnerId(rm.getObject().getOwnerId());
getBean(FlvRecordingDao.class).updateFlvRecording(f);
target.add(trees);
}
};
add(addFolder);
add(new WebMarkupContainer("create").add(new AjaxEventBehavior("onclick") {
private static final long serialVersionUID = -110084769805785972L;
@Override
protected void onEvent(AjaxRequestTarget target) {
addFolder.open(target);
}
}));
add(new WebMarkupContainer("refresh").add(new AjaxEventBehavior("onclick") {
private static final long serialVersionUID = -110084769805785972L;
@Override
protected void onEvent(AjaxRequestTarget target) {
target.add(trees);
for (FlvRecording r : myTree.getModelObject()) {
myTree.expand(r);
}
}
}));
add(new ConfirmableAjaxLink("trash", 713) {
private static final long serialVersionUID = 4145757350556878550L;
@Override
public void onClick(AjaxRequestTarget target) {
long id = rm.getObject().getFlvRecordingId();
if (id > 0) {
getBean(FlvRecordingDao.class).deleteFlvRecording(id);
}
target.add(trees);
}
});
add(trees
.add(myTree = new RecordingTree("myrecordings", new MyRecordingTreeProvider()))
.add(new RecordingTree("publicrecordings", new PublicRecordingTreeProvider()))
.setOutputMarkupId(true)
);
add(new Label("homeSize", ""));
add(new Label("publicSize", ""));
add(video, info);
}
//FIXME need to be generalized to use as Room files explorer
class RecordingTree extends DefaultNestedTree<FlvRecording> {
private static final long serialVersionUID = 2527395034256868022L;
public RecordingTree(String id, ITreeProvider<FlvRecording> tp) {
super(id, tp);
setItemReuseStrategy(new ReuseIfModelsEqualStrategy());
}
@Override
protected Component newContentComponent(String id, IModel<FlvRecording> node) {
return new Folder<FlvRecording>(id, this, node) {
private static final long serialVersionUID = 1020976220467419084L;
@Override
protected Component newLabelComponent(String id, final IModel<FlvRecording> lm) {
FlvRecording r = lm.getObject();
if (r.getIsFolder() != null && r.getIsFolder()) {
return new AjaxEditableLabel<String>(id, newLabelModel(lm)) {
private static final long serialVersionUID = -6631089550858911148L;
@Override
protected void onSubmit(AjaxRequestTarget target) {
super.onSubmit(target);
FlvRecording r = getModelObject();
r.setFileName(getEditor().getModelObject());
getBean(FlvRecordingDao.class).updateFlvRecording(r);
}
@Override
public void onEdit(AjaxRequestTarget target) {
if (isSelected()) {
super.onEdit(target);
}
}
};
} else {
return super.newLabelComponent(id, lm);
}
}
@Override
protected boolean isSelected() {
return getModelObject().getFlvRecordingId() == rm.getObject().getFlvRecordingId();
}
@Override
protected boolean isClickable() {
return true;
}
@Override
protected void onClick(AjaxRequestTarget target) {
FlvRecording r = getModelObject();
FlvRecording _prev = rm.getObject();
if (r.getFlvRecordingId() > 0) {
rm.setObject(r);
}
if (selected != null && _prev != null) {
selected.updateBranch(_prev, target);
selected.updateNode(_prev, target);
}
selected = RecordingTree.this;
if (r.getIsFolder() == null || r.getIsFolder()) {
if (getState(r) == State.COLLAPSED) {
super.onClick(target);
}
updateBranch(r, target);
} else {
video.update(target, r);
info.update(target, r);
updateNode(r, target);
}
}
@Override
protected String getOtherStyleClass(FlvRecording t) {
String style;
if (t.getFlvRecordingId() == -2) {
style = "my-recordings om-icon";
} else if (t.getFlvRecordingId() == -1) {
style = "public-recordings om-icon";
} else {
style = t.getIsFolder() ? super.getOtherStyleClass(t)
: (getMp4Recording(t.getFileHash()).exists() ? "recording om-icon" : "broken-recording om-icon");
}
if (isSelected()) {
style += " selected";
}
return style;
}
@Override
protected String getOpenStyleClass() {
String style;
FlvRecording r = getModelObject();
if (r.getFlvRecordingId() == -2) {
style = "my-recordings om-icon";
} else if (r.getFlvRecordingId() == -1) {
style = "public-recordings om-icon";
} else {
style = super.getOpenStyleClass();
}
return style;
}
@Override
protected String getClosedStyleClass() {
String style;
FlvRecording r = getModelObject();
if (r.getFlvRecordingId() == -2) {
style = "my-recordings om-icon";
} else if (r.getFlvRecordingId() == -1) {
style = "public-recordings om-icon";
} else {
style = super.getClosedStyleClass();
}
return style;
}
@Override
protected IModel<String> newLabelModel(IModel<FlvRecording> model) {
return Model.of(model.getObject().getFileName());
}
};
}
}
class MyRecordingTreeProvider extends RecordingTreeProvider {
private static final long serialVersionUID = -4463900798616753927L;
public Iterator<? extends FlvRecording> getRoots() {
FlvRecording r = new FlvRecording();
r.setFlvRecordingId(-2);
r.setFileName(WebSession.getString(860));
r.setOwnerId(getUserId());
return Arrays.asList(r).iterator();
}
public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
if (node.getFlvRecordingId() < 0) {
return getBean(FlvRecordingDao.class).getFlvRecordingRootByOwner(getUserId()).iterator();
} else {
return super.getChildren(node);
}
}
}
class PublicRecordingTreeProvider extends RecordingTreeProvider {
private static final long serialVersionUID = 5502610991599632079L;
public Iterator<? extends FlvRecording> getRoots() {
FlvRecording r = new FlvRecording();
r.setFlvRecordingId(-1);
r.setFileName(WebSession.getString(861));
return Arrays.asList(r).iterator();
}
public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
if (node.getFlvRecordingId() < 0) {
List<FlvRecording> roots = new ArrayList<FlvRecording>();
for (Organisation_Users ou : getBean(UserDao.class).get(getUserId()).getOrganisation_users()) {
roots.addAll(getBean(FlvRecordingDao.class).getFlvRecordingRootByPublic(ou.getOrganisation().getOrganisation_id()));
}
return roots.iterator();
} else {
return super.getChildren(node);
}
}
}
abstract class RecordingTreeProvider implements ITreeProvider<FlvRecording> {
private static final long serialVersionUID = -3149843028275612342L;
public void detach() {
// TODO LDM should be used
}
public boolean hasChildren(FlvRecording node) {
return node.getFlvRecordingId() < 0 || node.getIsFolder();
}
public Iterator<? extends FlvRecording> getChildren(FlvRecording node) {
return getBean(FlvRecordingDao.class).getFlvRecordingByParent(node.getFlvRecordingId()).iterator();
}
public IModel<FlvRecording> model(FlvRecording object) {
// TODO LDM should be used
return Model.of(object);
}
}
}