blob: c79d2bcf04522ad3b00da754212a4f677a8e02e6 [file] [log] [blame]
// Copyright 2004, 2005 The Apache Software Foundation
//
// Licensed 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.tapestry.vlib.pages.admin;
import java.rmi.RemoteException;
import java.util.Iterator;
import java.util.Set;
import javax.ejb.FinderException;
import javax.ejb.RemoveException;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.HiveMind;
import org.apache.tapestry.annotations.InjectComponent;
import org.apache.tapestry.annotations.Message;
import org.apache.tapestry.annotations.Meta;
import org.apache.tapestry.event.PageBeginRenderListener;
import org.apache.tapestry.event.PageDetachListener;
import org.apache.tapestry.event.PageEvent;
import org.apache.tapestry.form.IFormComponent;
import org.apache.tapestry.util.DefaultPrimaryKeyConverter;
import org.apache.tapestry.vlib.Visit;
import org.apache.tapestry.vlib.VlibPage;
import org.apache.tapestry.vlib.ejb.Person;
import org.apache.tapestry.vlib.services.RemoteCallback;
/**
* Allows editting of the users. Simple flags about the user can be changed;
* additionally, the user can have their password reset (to a random value,
* which is mailed to them), or the user can be out-right deleted.
*
* @author Howard Lewis Ship
*/
@Meta( { "page-type=EditUsers", "admin-page=true" })
public abstract class EditUsers extends VlibPage implements
PageBeginRenderListener, PageDetachListener
{
private UserConverter _userConverter;
public abstract String getPassword();
public abstract void setPassword(String password);
public abstract void setUser(Person person);
public abstract Person getUser();
@Message
public abstract String outOfDate();
@Message
public abstract String readFailure();
@Message
public abstract String needPassword();
@Message
public abstract String updateFailure();
@Message
public abstract String usersUpdated();
@InjectComponent("password")
public abstract IFormComponent getPasswordField();
/**
*
* @author hls
*/
public class UserConverter extends DefaultPrimaryKeyConverter
{
private Set _resetPasswordValues;
public void clear()
{
_resetPasswordValues = null;
super.clear();
}
public void setResetPassword(boolean resetPassword)
{
_resetPasswordValues = updateValueSetForLastValue(
_resetPasswordValues, resetPassword);
}
public boolean isResetPassword()
{
return checkValueSetForLastValue(_resetPasswordValues);
}
public Set getResetPasswordValues()
{
return createUnmodifiableSet(_resetPasswordValues);
}
}
public UserConverter getUserConverter()
{
if (_userConverter == null) _userConverter = new UserConverter();
return _userConverter;
}
public void pageBeginRender(PageEvent event)
{
readUsers();
}
public void pageDetached(PageEvent event)
{
_userConverter = null;
}
private void readUsers()
{
Visit visit = getVisitState();
Integer userId = visit.getUserId();
RemoteCallback<Person[]> callback = new RemoteCallback()
{
public Person[] doRemote()
throws RemoteException
{
return getOperations().getPersons();
}
};
Person[] users = getRemoteTemplate().execute(callback, readFailure());
UserConverter converter = getUserConverter();
converter.clear();
for(int i = 0; i < users.length; i++)
{
Integer id = users[i].getId();
// Skip the current user; you aren't allowed to edit yourself
if (id.equals(userId)) continue;
converter.add(id, users[i]);
}
}
/**
* Invoked when the form is submitted.
*/
public void updateUsers()
{
Visit visit = getVisitState();
UserConverter converter = getUserConverter();
final Person[] updates = (Person[]) converter.getValues().toArray(
new Person[0]);
final Integer[] deletedIds = extractIds(converter.getDeletedValues());
final Integer[] resetPasswordIds = extractIds(converter
.getResetPasswordValues());
final String password = getPassword();
setPassword(null);
if (HiveMind.isBlank(password) && resetPasswordIds.length > 0)
{
getValidationDelegate().record(getPasswordField(), needPassword());
return;
}
final Integer adminId = visit.getUserId();
RemoteCallback callback = new RemoteCallback()
{
public Object doRemote()
throws RemoteException
{
try
{
getOperations().updatePersons(updates, resetPasswordIds,
password, deletedIds, adminId);
}
catch (RemoveException ex)
{
throw new ApplicationRuntimeException(ex);
}
catch (FinderException ex)
{
throw new ApplicationRuntimeException(ex);
}
return null;
}
};
getRemoteTemplate().execute(callback, updateFailure());
setMessage(usersUpdated());
}
private Integer[] extractIds(Set valueSet)
{
int count = valueSet.size();
Integer[] result = new Integer[count];
Iterator i = valueSet.iterator();
int index = 0;
while(i.hasNext())
{
Person person = (Person) i.next();
result[index++] = person.getId();
}
return result;
}
}