* 'master' of https://git.pmease.com/p/robin/commons:
  Print more meaningful information when git access URL is incorrect.
  Upgrade to JDK7.
  Fix various comparator implementation to conform to Comparator contract.
  Remove JGit servlet.
  GitServlet implementation.

Conflicts:
	gitop.web/src/main/java/com/pmease/gitop/web/HomePage.html
	gitop.web/src/main/java/com/pmease/gitop/web/WicketConfig.java
This commit is contained in:
steve 2013-09-26 20:40:26 +08:00
commit ff5dd3cfa0
65 changed files with 755 additions and 281 deletions

View File

@ -44,9 +44,6 @@ public class Bootstrap {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static void main(String[] args) { public static void main(String[] args) {
// Avoid the problem that some sorting does not work for JDK7
System.setProperty("java.util.Arrays.useLegacyMergeSort", "true");
File sandboxDir = new File("target/sandbox"); File sandboxDir = new File("target/sandbox");
if (sandboxDir.exists()) { if (sandboxDir.exists()) {
Map<String, File> systemClasspath = (Map<String, File>) BootstrapUtils Map<String, File> systemClasspath = (Map<String, File>) BootstrapUtils
@ -151,12 +148,10 @@ public class Bootstrap {
@Override @Override
public int compare(File file1, File file2) { public int compare(File file1, File file2) {
if (file1.isDirectory()) Boolean result1 = file1.isDirectory() || file1.getName().startsWith("com.pmease");
return -1; Boolean result2 = file2.isDirectory() || file2.getName().startsWith("com.pmease");
else if (file1.getName().startsWith("com.pmease"))
return -1; return result2.compareTo(result1);
else
return 1;
} }
}); });

View File

@ -37,7 +37,7 @@
<dependency> <dependency>
<groupId>org.hibernate</groupId> <groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId> <artifactId>hibernate-validator</artifactId>
<version>5.0.0.Final</version> <version>5.0.1.Final</version>
</dependency> </dependency>
</dependencies> </dependencies>

View File

@ -19,6 +19,7 @@ public abstract class AbstractEditContext implements EditContext {
this.bean = bean; this.bean = bean;
} }
@Override
public Serializable getBean() { public Serializable getBean() {
return bean; return bean;
} }

View File

@ -6,6 +6,8 @@ import java.util.Map;
public interface EditContext extends Serializable { public interface EditContext extends Serializable {
Serializable getBean();
void validate(); void validate();
List<ValidationError> getValidationErrors(boolean recursive); List<ValidationError> getValidationErrors(boolean recursive);

View File

@ -33,16 +33,21 @@
<artifactId>commons.loader</artifactId> <artifactId>commons.loader</artifactId>
<version>1.0.29</version> <version>1.0.29</version>
</dependency> </dependency>
<!-- dependency> <dependency>
<groupId>org.eclipse.jgit</groupId> <groupId>org.eclipse.jgit</groupId>
<artifactId>org.eclipse.jgit</artifactId> <artifactId>org.eclipse.jgit.http.server</artifactId>
<version>3.0.0.201306101825-r</version> <version>3.0.0.201306101825-r</version>
</dependency--> </dependency>
<dependency> <dependency>
<groupId>com.pmease</groupId> <groupId>com.pmease</groupId>
<artifactId>commons.util</artifactId> <artifactId>commons.util</artifactId>
<version>1.0.29</version> <version>1.0.29</version>
</dependency> </dependency>
<dependency>
<groupId>com.pmease</groupId>
<artifactId>commons.jetty</artifactId>
<version>1.0.29</version>
</dependency>
</dependencies> </dependencies>
<repositories> <repositories>

View File

@ -0,0 +1,32 @@
package com.pmease.commons.git;
import java.io.OutputStream;
import com.google.common.base.Preconditions;
import com.pmease.commons.util.execution.Commandline;
import com.pmease.commons.util.execution.LineConsumer;
public class AdvertiseReceiveRefsCommand extends GitCommand<Git> {
private OutputStream output;
public AdvertiseReceiveRefsCommand(Git git) {
super(git);
}
public AdvertiseReceiveRefsCommand output(OutputStream output) {
this.output = output;
return this;
}
@Override
public Git call() {
Preconditions.checkNotNull(output);
Commandline cmd = git().cmd();
cmd.addArgs("receive-pack", "--stateless-rpc", "--advertise-refs", ".");
cmd.execute(output, new LineConsumer.ErrorLogger(), null).checkReturnCode();
return git();
}
}

View File

@ -0,0 +1,32 @@
package com.pmease.commons.git;
import java.io.OutputStream;
import com.google.common.base.Preconditions;
import com.pmease.commons.util.execution.Commandline;
import com.pmease.commons.util.execution.LineConsumer;
public class AdvertiseUploadRefsCommand extends GitCommand<Git> {
private OutputStream output;
public AdvertiseUploadRefsCommand(Git git) {
super(git);
}
public AdvertiseUploadRefsCommand output(OutputStream output) {
this.output = output;
return this;
}
@Override
public Git call() {
Preconditions.checkNotNull(output);
Commandline cmd = git().cmd();
cmd.addArgs("upload-pack", "--stateless-rpc", "--advertise-refs", ".");
cmd.execute(output, new LineConsumer.ErrorLogger(), null).checkReturnCode();
return git();
}
}

View File

@ -19,6 +19,22 @@ public class Git {
this.repoDir = repoDir; this.repoDir = repoDir;
} }
public UploadCommand upload() {
return new UploadCommand(this);
}
public ReceiveCommand receive() {
return new ReceiveCommand(this);
}
public AdvertiseUploadRefsCommand advertiseUploadRefs() {
return new AdvertiseUploadRefsCommand(this);
}
public AdvertiseReceiveRefsCommand advertiseReceiveRefs() {
return new AdvertiseReceiveRefsCommand(this);
}
public InitCommand init() { public InitCommand init() {
return new InitCommand(this); return new InitCommand(this);
} }

View File

@ -0,0 +1,42 @@
package com.pmease.commons.git;
import java.io.InputStream;
import java.io.OutputStream;
import com.google.common.base.Preconditions;
import com.pmease.commons.util.execution.Commandline;
import com.pmease.commons.util.execution.LineConsumer;
public class ReceiveCommand extends GitCommand<Git> {
private InputStream input;
private OutputStream output;
public ReceiveCommand(Git git) {
super(git);
}
public ReceiveCommand input(InputStream input) {
this.input = input;
return this;
}
public ReceiveCommand output(OutputStream output) {
this.output = output;
return this;
}
@Override
public Git call() {
Preconditions.checkNotNull(input);
Preconditions.checkNotNull(output);
Commandline cmd = git().cmd();
cmd.addArgs("receive-pack", "--stateless-rpc", ".");
cmd.execute(output, new LineConsumer.ErrorLogger(), input).checkReturnCode();
return git();
}
}

View File

@ -0,0 +1,42 @@
package com.pmease.commons.git;
import java.io.InputStream;
import java.io.OutputStream;
import com.google.common.base.Preconditions;
import com.pmease.commons.util.execution.Commandline;
import com.pmease.commons.util.execution.LineConsumer;
public class UploadCommand extends GitCommand<Git> {
private InputStream input;
private OutputStream output;
public UploadCommand(Git git) {
super(git);
}
public UploadCommand input(InputStream input) {
this.input = input;
return this;
}
public UploadCommand output(OutputStream output) {
this.output = output;
return this;
}
@Override
public Git call() {
Preconditions.checkNotNull(input);
Preconditions.checkNotNull(output);
Commandline cmd = git().cmd();
cmd.addArgs("upload-pack", "--stateless-rpc", ".");
cmd.execute(output, new LineConsumer.ErrorLogger(), input).checkReturnCode();
return git();
}
}

View File

@ -6,7 +6,7 @@ import java.util.Collection;
import org.junit.Assert; import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import com.pmease.commons.util.EasySet; import com.google.common.collect.Sets;
import com.pmease.commons.util.FileUtils; import com.pmease.commons.util.FileUtils;
public class ListChangedFilesCommandTest extends GitCommandTest { public class ListChangedFilesCommandTest extends GitCommandTest {
@ -37,7 +37,7 @@ public class ListChangedFilesCommandTest extends GitCommandTest {
Collection<String> changedFiles = git.findChangedFiles().fromRev("HEAD~4").toRev("HEAD").call(); Collection<String> changedFiles = git.findChangedFiles().fromRev("HEAD~4").toRev("HEAD").call();
Assert.assertTrue(changedFiles.containsAll(EasySet.of("a", "b", "c", "d"))); Assert.assertTrue(changedFiles.containsAll(Sets.newHashSet("a", "b", "c", "d")));
} }
} }

View File

@ -101,7 +101,7 @@
</repositories> </repositories>
<properties> <properties>
<moduleClass>com.pmease.commons.hibernate.HibernateModule</moduleClass> <moduleClass>com.pmease.commons.hibernate.HibernateModule</moduleClass>
<hibernateVersion>4.2.0.Final</hibernateVersion> <hibernateVersion>4.2.5.Final</hibernateVersion>
<bonecpVersion>0.8.0-rc1</bonecpVersion> <bonecpVersion>0.8.0-rc1</bonecpVersion>
</properties> </properties>
<version>1.0.30</version> <version>1.0.30</version>

View File

@ -16,5 +16,4 @@ import java.lang.annotation.RetentionPolicy;
@Target({ElementType.METHOD}) @Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
public @interface Sessional { public @interface Sessional {
boolean transactional() default false;
} }

View File

@ -2,6 +2,8 @@ package com.pmease.commons.hibernate.dao;
import java.util.List; import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order; import org.hibernate.criterion.Order;
@ -10,7 +12,7 @@ import com.google.inject.Inject;
import com.pmease.commons.hibernate.AbstractEntity; import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.commons.util.ReflectionUtils; import com.pmease.commons.util.ReflectionUtils;
public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T> { public abstract class AbstractGenericDao<T extends AbstractEntity> implements GenericDao<T> {
private GeneralDao generalDao; private GeneralDao generalDao;
@ -18,9 +20,9 @@ public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Inject @Inject
public DefaultGenericDao(GeneralDao generalDao) { public AbstractGenericDao(GeneralDao generalDao) {
this.generalDao = generalDao; this.generalDao = generalDao;
List<Class<?>> typeArguments = ReflectionUtils.getTypeArguments(DefaultGenericDao.class, getClass()); List<Class<?>> typeArguments = ReflectionUtils.getTypeArguments(AbstractGenericDao.class, getClass());
entityClass = ((Class<T>) typeArguments.get(0)); entityClass = ((Class<T>) typeArguments.get(0));
} }
@ -44,11 +46,6 @@ public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T
generalDao.delete(entity); generalDao.delete(entity);
} }
@Override
public void deleteById(Long entityId) {
generalDao.deleteById(entityClass, entityId);
}
@Override @Override
public int count(Criterion[] criterions) { public int count(Criterion[] criterions) {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(entityClass); DetachedCriteria detachedCriteria = DetachedCriteria.forClass(entityClass);
@ -105,4 +102,14 @@ public class DefaultGenericDao<T extends AbstractEntity> implements GenericDao<T
return (T) generalDao.find(detachedCriteria); return (T) generalDao.find(detachedCriteria);
} }
@Override
public Session getSession() {
return generalDao.getSession();
}
@Override
public Criteria createCriteria() {
return getSession().createCriteria(entityClass);
}
} }

View File

@ -56,19 +56,13 @@ public class DefaultGeneralDao implements GeneralDao, Serializable {
getSession().delete(entity); getSession().delete(entity);
} }
private Session getSession() { @Override
public Session getSession() {
return sessionProvider.get(); return sessionProvider.get();
} }
@Transactional
@Override
public <T extends AbstractEntity> void deleteById(Class<T> entityClass, Long entityId) {
T entity = load(unproxy(entityClass), entityId);
delete(entity);
}
protected <T extends AbstractEntity> Class<T> unproxy(Class<T> entityClass) { protected <T extends AbstractEntity> Class<T> unproxy(Class<T> entityClass) {
//cm will be null if entityClass is not registered with Hibernate or when //class meta data will be null if entityClass is not registered with Hibernate or when
//it is a Hibernate proxy class (e.x. test.googlecode.genericdao.model.Person_$$_javassist_5). //it is a Hibernate proxy class (e.x. test.googlecode.genericdao.model.Person_$$_javassist_5).
//So if a class is not recognized, we will look at superclasses to see if //So if a class is not recognized, we will look at superclasses to see if
//it is a proxy. //it is a proxy.

View File

@ -3,6 +3,7 @@ package com.pmease.commons.hibernate.dao;
import java.util.List; import java.util.List;
import org.hibernate.HibernateException; import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.DetachedCriteria;
import com.pmease.commons.hibernate.AbstractEntity; import com.pmease.commons.hibernate.AbstractEntity;
@ -56,16 +57,6 @@ public interface GeneralDao {
* the entity to be deleted * the entity to be deleted
*/ */
void delete(AbstractEntity entity); void delete(AbstractEntity entity);
/**
* Delete entity of specified class and identifier without actually loading the entity.
*
* @param entityClass
* class of the entity
* @param entityId
* identifier of the entity
*/
<T extends AbstractEntity> void deleteById(Class<T> entityClass, Long entityId);
/** /**
* Query with specified criteria. * Query with specified criteria.
@ -98,5 +89,6 @@ public interface GeneralDao {
* number of entities matching specified {@link DetachedCriteria} * number of entities matching specified {@link DetachedCriteria}
*/ */
<T extends AbstractEntity> int count(DetachedCriteria detachedCriteria); <T extends AbstractEntity> int count(DetachedCriteria detachedCriteria);
Session getSession();
} }

View File

@ -4,6 +4,8 @@ import java.util.List;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order; import org.hibernate.criterion.Order;
@ -50,16 +52,6 @@ public interface GenericDao<T extends AbstractEntity> {
*/ */
public void delete(T entity); public void delete(T entity);
/**
* Delete entity of specified identifier without actually loading the entity.
*
* @param entityClass
* class of the entity
* @param entityId
* identifier of the entity
*/
void deleteById(Long entityId);
/** /**
* Search entity with specified criterions and orders. * Search entity with specified criterions and orders.
* *
@ -122,5 +114,9 @@ public interface GenericDao<T extends AbstractEntity> {
* number of entities matching specified criterions * number of entities matching specified criterions
*/ */
int count(@Nullable Criterion[] criterions); int count(@Nullable Criterion[] criterions);
Session getSession();
Criteria createCriteria();
} }

View File

@ -1,74 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
<modelVersion>4.0.0</modelVersion> xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent> <modelVersion>4.0.0</modelVersion>
<artifactId>parent.general</artifactId> <parent>
<groupId>com.pmease</groupId> <artifactId>parent.general</artifactId>
<version>1.0.28</version> <groupId>com.pmease</groupId>
</parent> <version>1.0.28</version>
<artifactId>commons.jetty</artifactId> </parent>
<build> <artifactId>commons.jetty</artifactId>
<plugins> <build>
<plugin> <plugins>
<groupId>com.pmease</groupId> <plugin>
<artifactId>plugin.maven</artifactId> <groupId>com.pmease</groupId>
</plugin> <artifactId>plugin.maven</artifactId>
<plugin> </plugin>
<artifactId>maven-source-plugin</artifactId> <plugin>
</plugin> <artifactId>maven-source-plugin</artifactId>
<plugin> </plugin>
<artifactId>maven-javadoc-plugin</artifactId> <plugin>
</plugin> <artifactId>maven-javadoc-plugin</artifactId>
</plugins> </plugin>
</build> </plugins>
<dependencies> </build>
<dependency> <dependencies>
<groupId>com.pmease</groupId> <dependency>
<artifactId>commons.loader</artifactId> <groupId>com.pmease</groupId>
<version>1.0.29</version> <artifactId>commons.loader</artifactId>
</dependency> <version>1.0.29</version>
<dependency> </dependency>
<groupId>org.eclipse.jetty</groupId> <dependency>
<artifactId>jetty-server</artifactId> <groupId>org.eclipse.jetty</groupId>
<version>${jettyVersion}</version> <artifactId>jetty-server</artifactId>
</dependency> <version>${jettyVersion}</version>
<dependency> </dependency>
<groupId>org.eclipse.jetty</groupId> <dependency>
<artifactId>jetty-servlets</artifactId> <groupId>org.eclipse.jetty</groupId>
<version>${jettyVersion}</version> <artifactId>jetty-servlets</artifactId>
</dependency> <version>${jettyVersion}</version>
<dependency> </dependency>
<groupId>org.eclipse.jetty</groupId> <dependency>
<artifactId>jetty-servlet</artifactId> <groupId>org.eclipse.jetty</groupId>
<version>${jettyVersion}</version> <artifactId>jetty-servlet</artifactId>
</dependency> <version>${jettyVersion}</version>
<dependency> </dependency>
<groupId>org.eclipse.jetty</groupId> <dependency>
<artifactId>jetty-websocket</artifactId> <groupId>org.eclipse.jetty</groupId>
<version>${jettyVersion}</version> <artifactId>jetty-websocket</artifactId>
</dependency> <version>${jettyVersion}</version>
</dependencies> </dependency>
<repositories> </dependencies>
<repository> <repositories>
<id>pmeaseRepo</id> <repository>
<name>PMEase Repository</name> <id>pmeaseRepo</id>
<releases> <name>PMEase Repository</name>
<enabled>true</enabled> <releases>
<updatePolicy>never</updatePolicy> <enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy> <updatePolicy>never</updatePolicy>
</releases> <checksumPolicy>fail</checksumPolicy>
<snapshots> </releases>
<enabled>true</enabled> <snapshots>
<updatePolicy>always</updatePolicy> <enabled>true</enabled>
<checksumPolicy>fail</checksumPolicy> <updatePolicy>always</updatePolicy>
</snapshots> <checksumPolicy>fail</checksumPolicy>
<url>http://artifact.pmease.com/</url> </snapshots>
</repository> <url>http://artifact.pmease.com/</url>
</repositories> </repository>
<properties> </repositories>
<moduleClass>com.pmease.commons.jetty.JettyModule</moduleClass> <properties>
<jettyVersion>8.1.10.v20130312</jettyVersion> <moduleClass>com.pmease.commons.jetty.JettyModule</moduleClass>
</properties> <jettyVersion>8.1.10.v20130312</jettyVersion>
<version>1.0.29</version> </properties>
<version>1.0.29</version>
</project> </project>

View File

@ -15,8 +15,8 @@ import org.apache.shiro.authz.Permission;
import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection; import org.apache.shiro.subject.PrincipalCollection;
import com.google.common.collect.Sets;
import com.google.inject.Inject; import com.google.inject.Inject;
import com.pmease.commons.util.EasySet;
public abstract class AbstractRealm extends AuthorizingRealm { public abstract class AbstractRealm extends AuthorizingRealm {
@ -44,7 +44,7 @@ public abstract class AbstractRealm extends AuthorizingRealm {
@Override @Override
public Collection<Permission> getObjectPermissions() { public Collection<Permission> getObjectPermissions() {
return EasySet.of((Permission)getUserById(userId)); return Sets.newHashSet((Permission)getUserById(userId));
} }
}; };
} }

View File

@ -12,7 +12,6 @@ import org.apache.shiro.subject.Subject;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.pmease.commons.hibernate.AbstractEntity; import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.commons.loader.AppLoader;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@MappedSuperclass @MappedSuperclass
@ -55,14 +54,10 @@ public abstract class AbstractUser extends AbstractEntity implements Authenticat
return new Subject.Builder().principals(principals).buildSubject(); return new Subject.Builder().principals(principals).buildSubject();
} }
public static AbstractUser getCurrent() { public static Long getCurrentId() {
Object principal = SecurityUtils.getSubject().getPrincipal(); Object principal = SecurityUtils.getSubject().getPrincipal();
Preconditions.checkNotNull(principal); Preconditions.checkNotNull(principal);
Long userId = (Long) principal; return (Long) principal;
if (userId != 0L)
return AppLoader.getInstance(AbstractRealm.class).getUserById(userId);
else
return null;
} }
} }

View File

@ -34,26 +34,33 @@ public class ClassUtils extends org.apache.commons.lang3.ClassUtils {
.getCodeSource().getLocation().getFile()); .getCodeSource().getLocation().getFile());
if (location.isFile()) { if (location.isFile()) {
String packagePath = packageLocator.getPackage().getName().replace('.', '/') + "/"; String packagePath = packageLocator.getPackage().getName().replace('.', '/') + "/";
JarFile jarFile; JarFile jarFile = null;
try { try {
jarFile = new JarFile(location); jarFile = new JarFile(location);
Enumeration<JarEntry> entries = jarFile.entries();
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().startsWith(packagePath) && entry.getName().endsWith(".class")) {
String className = entry.getName().replace('/', '.');
className = StringUtils.substringBeforeLast(className, ".");
Class<T> clazz;
try {
clazz = (Class<T>) superClass.getClassLoader().loadClass(className);
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
if (superClass.isAssignableFrom(clazz) && clazz != superClass)
classes.add(clazz);
}
}
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} } finally {
Enumeration<JarEntry> entries = jarFile.entries(); if (jarFile != null) {
while (entries.hasMoreElements()) {
JarEntry entry = entries.nextElement();
if (entry.getName().startsWith(packagePath) && entry.getName().endsWith(".class")) {
String className = entry.getName().replace('/', '.');
className = StringUtils.substringBeforeLast(className, ".");
Class<T> clazz;
try { try {
clazz = (Class<T>) superClass.getClassLoader().loadClass(className); jarFile.close();
} catch (ClassNotFoundException e) { } catch (IOException e) {
throw new RuntimeException(e);
} }
if (superClass.isAssignableFrom(clazz) && clazz != superClass)
classes.add(clazz);
} }
} }
} else { } else {

View File

@ -1,15 +0,0 @@
package com.pmease.commons.util;
import java.util.ArrayList;
import java.util.List;
public class EasyList {
public static <T> List<T> of(T...objects) {
List<T> list = new ArrayList<T>();
for (int i=0; i<objects.length; i++)
list.add(objects[i]);
return list;
}
}

View File

@ -1,15 +0,0 @@
package com.pmease.commons.util;
import java.util.HashSet;
import java.util.Set;
public class EasySet {
public static <T> Set<T> of(T...objects) {
Set<T> set = new HashSet<T>();
for (int i=0; i<objects.length; i++)
set.add(objects[i]);
return set;
}
}

View File

@ -202,4 +202,23 @@ public class FileUtils extends org.apache.commons.io.FileUtils {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
public static void createDir(File dir) {
if (!dir.exists()) {
if (!dir.mkdirs())
throw new GeneralException("Unable to create directory: " + dir.getAbsolutePath());
}
}
public static void cleanDir(File dir) {
if (dir.exists()) {
try {
org.apache.commons.io.FileUtils.cleanDirectory(dir);
} catch (IOException e) {
throw new RuntimeException(e);
}
} else {
createDir(dir);
}
}
} }

View File

@ -3,6 +3,7 @@ package com.pmease.commons.util.execution;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -32,7 +33,7 @@ public class Commandline {
private File workingDir; private File workingDir;
private Map<String, String> environment = new HashMap<String, String>(); private Map<String, String> environment = new HashMap<String, String>();
public Commandline(String command) { public Commandline(String command) {
String[] parts = StringUtils.parseQuoteTokens(command); String[] parts = StringUtils.parseQuoteTokens(command);
Preconditions.checkArgument(parts.length != 0, "Argument 'command' is invalid."); Preconditions.checkArgument(parts.length != 0, "Argument 'command' is invalid.");
@ -105,8 +106,8 @@ public class Commandline {
return this; return this;
} }
public ExecuteResult execute(OutputStream stdoutConsumer, LineConsumer stderrConsumer) { public ExecuteResult execute(OutputStream stdout, LineConsumer stderr) {
return execute(stdoutConsumer, stderrConsumer, null); return execute(stdout, stderr, null);
} }
private ProcessBuilder createProcessBuilder() { private ProcessBuilder createProcessBuilder() {
@ -148,39 +149,34 @@ public class Commandline {
return processBuilder; return processBuilder;
} }
public ExecuteResult execute(OutputStream stdoutConsumer, final LineConsumer stderrConsumer, public ExecuteResult execute(OutputStream stdout, final LineConsumer stderr, @Nullable InputStream stdin) {
@Nullable byte[] stdinBytes) {
Process process; Process process;
try { try {
ProcessBuilder processBuilder = createProcessBuilder(); ProcessBuilder processBuilder = createProcessBuilder();
process = processBuilder.redirectErrorStream(stderrConsumer == null).start(); process = processBuilder.redirectErrorStream(stderr == null).start();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
ByteArrayInputStream inputStream = null;
if (stdinBytes != null && stdinBytes.length != 0)
inputStream = new ByteArrayInputStream(stdinBytes);
final StringBuffer errorMessage = new StringBuffer(); final StringBuffer errorMessage = new StringBuffer();
OutputStream errorMessageCollector = null; OutputStream errorMessageCollector = null;
if (stderrConsumer != null) { if (stderr != null) {
errorMessageCollector = new LineConsumer(stderrConsumer.getEncoding()) { errorMessageCollector = new LineConsumer(stderr.getEncoding()) {
@Override @Override
public void consume(String line) { public void consume(String line) {
if (errorMessage.length() != 0) if (errorMessage.length() != 0)
errorMessage.append("\n"); errorMessage.append("\n");
errorMessage.append(line); errorMessage.append(line);
stderrConsumer.consume(line); stderr.consume(line);
} }
}; };
} }
ProcessStreamPumper streamPumper = ProcessStreamPumper.pump(process, stdoutConsumer, ProcessStreamPumper streamPumper = ProcessStreamPumper.pump(process, stdout,
errorMessageCollector, inputStream); errorMessageCollector, stdin);
ExecuteResult result = new ExecuteResult(this); ExecuteResult result = new ExecuteResult(this);

View File

@ -1,5 +1,7 @@
package com.pmease.commons.util.execution; package com.pmease.commons.util.execution;
import com.pmease.commons.util.GeneralException;
public class ExecuteResult { public class ExecuteResult {
private int returnCode; private int returnCode;
@ -34,11 +36,11 @@ public class ExecuteResult {
*/ */
public RuntimeException buildException() { public RuntimeException buildException() {
if (errorMessage != null) { if (errorMessage != null) {
throw new RuntimeException("Failed to run command: " + commandDescription + throw new GeneralException("Failed to run command: " + commandDescription +
"\nCommand return code: " + getReturnCode() + "\nCommand return code: " + getReturnCode() +
"\nCommand error output: " + errorMessage); "\nCommand error output: " + errorMessage);
} else { } else {
throw new RuntimeException("Failed to run command: " + commandDescription + throw new GeneralException("Failed to run command: " + commandDescription +
"\nCommand return code: " + getReturnCode()); "\nCommand return code: " + getReturnCode());
} }

View File

@ -12,7 +12,7 @@ import org.slf4j.LoggerFactory;
public class ProcessStreamPumper { public class ProcessStreamPumper {
private static final int BUFFER_SIZE = 64000; private static final int BUFFER_SIZE = 64*1024;
private static final Logger logger = LoggerFactory.getLogger(ProcessStreamPumper.class); private static final Logger logger = LoggerFactory.getLogger(ProcessStreamPumper.class);
@ -22,20 +22,20 @@ public class ProcessStreamPumper {
private final Future<?> stdinPumper; private final Future<?> stdinPumper;
private final OutputStream stdoutStream; private final OutputStream stdout;
private final OutputStream stderrStream; private final OutputStream stderr;
private ProcessStreamPumper(Process process, @Nullable OutputStream stdoutStream, private ProcessStreamPumper(Process process, @Nullable OutputStream stdout,
@Nullable OutputStream stderrStream, @Nullable InputStream stdinStream) { @Nullable OutputStream stderr, @Nullable InputStream stdin) {
this.stdoutStream = stdoutStream; this.stdout = stdout;
this.stderrStream = stderrStream; this.stderr = stderr;
stdoutPumper = createPump(process.getInputStream(), stdoutStream, false); stdoutPumper = createPump(process.getInputStream(), stdout, false);
stderrPumper = createPump(process.getErrorStream(), stderrStream, false); stderrPumper = createPump(process.getErrorStream(), stderr, false);
if (stdinStream != null) if (stdin != null)
stdinPumper = createPump(stdinStream, process.getOutputStream(), true); stdinPumper = createPump(stdin, process.getOutputStream(), true);
else else
stdinPumper = null; stdinPumper = null;
} }
@ -45,7 +45,7 @@ public class ProcessStreamPumper {
return new ProcessStreamPumper(process, stdoutStream, stderrStream, stdinStream); return new ProcessStreamPumper(process, stdoutStream, stderrStream, stdinStream);
} }
public void waitFor() { public void waitFor() {
while (!stdoutPumper.isDone() || !stderrPumper.isDone() || while (!stdoutPumper.isDone() || !stderrPumper.isDone() ||
(stdinPumper != null && !stdinPumper.isDone())) { (stdinPumper != null && !stdinPumper.isDone())) {
try { try {
@ -53,16 +53,16 @@ public class ProcessStreamPumper {
} catch (InterruptedException e) { } catch (InterruptedException e) {
} }
} }
if (stdoutStream != null) { if (stdout != null) {
try { try {
stdoutStream.flush(); stdout.flush();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
if (stderrStream != null) { if (stderr != null) {
try { try {
stderrStream.flush(); stderr.flush();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
@ -76,12 +76,14 @@ public class ProcessStreamPumper {
public void run() { public void run() {
byte[] buf = new byte[BUFFER_SIZE]; byte[] buf = new byte[BUFFER_SIZE];
try { try {
int length; int length;
while ((length = input.read(buf)) > 0) { while ((length = input.read(buf)) > 0) {
if (output != null) if (output != null) {
output.write(buf, 0, length); output.write(buf, 0, length);
//output.flush();
}
} }
if (closeWhenExhausted && output!=null) { if (closeWhenExhausted && output!=null) {

View File

@ -9,6 +9,8 @@ import java.util.Collection;
import org.junit.Test; import org.junit.Test;
import com.google.common.collect.Lists;
public class PathUtilsTest { public class PathUtilsTest {
@Test @Test
@ -23,15 +25,15 @@ public class PathUtilsTest {
@Test @Test
public void shouldMatchLongest() { public void shouldMatchLongest() {
Collection<String> basePaths = EasyList.of("/path1/path2", "/path1/path2/path3"); Collection<String> basePaths = Lists.newArrayList("/path1/path2", "/path1/path2/path3");
assertEquals(matchLongest(basePaths, "/path1/path2/path3/path4"), "/path1/path2/path3"); assertEquals(matchLongest(basePaths, "/path1/path2/path3/path4"), "/path1/path2/path3");
assertNull(matchLongest(basePaths, "/path1/path23")); assertNull(matchLongest(basePaths, "/path1/path23"));
assertNull(matchLongest(basePaths, "/path1/path3")); assertNull(matchLongest(basePaths, "/path1/path3"));
basePaths = EasyList.of("/path1/path2", "/path1\\"); basePaths = Lists.newArrayList("/path1/path2", "/path1\\");
assertEquals(matchLongest(basePaths, "path1\\path234"), "/path1\\"); assertEquals(matchLongest(basePaths, "path1\\path234"), "/path1\\");
basePaths = EasyList.of("/asset1/asset2", "/asset1"); basePaths = Lists.newArrayList("/asset1/asset2", "/asset1");
assertEquals(matchLongest(basePaths, "/asset1/asset2/test.html"), "/asset1/asset2"); assertEquals(matchLongest(basePaths, "/asset1/asset2/test.html"), "/asset1/asset2");
} }

View File

@ -5,7 +5,7 @@ import org.apache.wicket.markup.head.HeaderItem;
import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference;
import com.pmease.commons.util.EasyList; import com.google.common.collect.Lists;
import com.pmease.commons.wicket.asset.bootstrap.BootstrapHeaderItem; import com.pmease.commons.wicket.asset.bootstrap.BootstrapHeaderItem;
/** /**
@ -31,7 +31,7 @@ public class CommonResourceReference extends JavaScriptResourceReference {
@Override @Override
public Iterable<? extends HeaderItem> getDependencies() { public Iterable<? extends HeaderItem> getDependencies() {
return EasyList.of( return Lists.newArrayList(
BootstrapHeaderItem.get(), BootstrapHeaderItem.get(),
CssHeaderItem.forReference(new CssResourceReference(CommonResourceReference.class, "common.css"))); CssHeaderItem.forReference(new CssResourceReference(CommonResourceReference.class, "common.css")));
} }

View File

@ -5,7 +5,7 @@ import org.apache.wicket.markup.head.HeaderItem;
import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference;
import com.pmease.commons.util.EasyList; import com.google.common.collect.Lists;
import com.pmease.commons.wicket.asset.JQueryHeaderItem; import com.pmease.commons.wicket.asset.JQueryHeaderItem;
public class BootstrapResourceReference extends JavaScriptResourceReference { public class BootstrapResourceReference extends JavaScriptResourceReference {
@ -28,6 +28,6 @@ public class BootstrapResourceReference extends JavaScriptResourceReference {
HeaderItem stylesheet = CssHeaderItem.forReference( HeaderItem stylesheet = CssHeaderItem.forReference(
new CssResourceReference(BootstrapResourceReference.class, "css/bootstrap.css")); new CssResourceReference(BootstrapResourceReference.class, "css/bootstrap.css"));
return EasyList.of(jquery, stylesheet); return Lists.newArrayList(jquery, stylesheet);
} }
} }

View File

@ -1,6 +1,5 @@
package com.pmease.commons.wicket.component.tabbable; package com.pmease.commons.wicket.component.tabbable;
import org.apache.wicket.Page;
import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
@ -12,9 +11,9 @@ public class PageTab implements Tab {
private final IModel<String> titleModel; private final IModel<String> titleModel;
private final Class<? extends Page>[] pageClasses; private final Class<?>[] pageClasses;
public PageTab(IModel<String> titleModel, Class<? extends Page>...pageClasses) { public PageTab(IModel<String> titleModel, Class<?>...pageClasses) {
Preconditions.checkArgument(pageClasses.length > 0, "At least one page class has to be provided."); Preconditions.checkArgument(pageClasses.length > 0, "At least one page class has to be provided.");
this.titleModel = titleModel; this.titleModel = titleModel;
@ -25,7 +24,7 @@ public class PageTab implements Tab {
return titleModel; return titleModel;
} }
protected final Class<? extends Page>[] getPageClasses() { protected final Class<?>[] getPageClasses() {
return pageClasses; return pageClasses;
} }
@ -44,7 +43,7 @@ public class PageTab implements Tab {
@Override @Override
public boolean isActive(ListItem<Tab> item) { public boolean isActive(ListItem<Tab> item) {
for (Class<? extends Page> pageClass: pageClasses) { for (Class<?> pageClass: pageClasses) {
if (pageClass.isAssignableFrom(item.getPage().getClass())) if (pageClass.isAssignableFrom(item.getPage().getClass()))
return true; return true;
} }

View File

@ -10,10 +10,11 @@ public class PageTabComponent extends Panel {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
public PageTabComponent(String id, PageTab tab) { public PageTabComponent(String id, PageTab tab) {
super(id); super(id);
Link<?> pageLink = newLink("link", tab.getPageClasses()[0]); Link<?> pageLink = newLink("link", (Class<? extends Page>) tab.getPageClasses()[0]);
add(pageLink); add(pageLink);
pageLink.add(new Label("label", tab.getTitleModel())); pageLink.add(new Label("label", tab.getTitleModel()));
} }

View File

@ -5,7 +5,7 @@ import org.apache.wicket.markup.head.HeaderItem;
import org.apache.wicket.request.resource.CssResourceReference; import org.apache.wicket.request.resource.CssResourceReference;
import org.apache.wicket.request.resource.JavaScriptResourceReference; import org.apache.wicket.request.resource.JavaScriptResourceReference;
import com.pmease.commons.util.EasyList; import com.google.common.collect.Lists;
import com.pmease.commons.wicket.asset.bootstrap.BootstrapHeaderItem; import com.pmease.commons.wicket.asset.bootstrap.BootstrapHeaderItem;
public class EditableResourceReference extends JavaScriptResourceReference { public class EditableResourceReference extends JavaScriptResourceReference {
@ -24,7 +24,7 @@ public class EditableResourceReference extends JavaScriptResourceReference {
@Override @Override
public Iterable<? extends HeaderItem> getDependencies() { public Iterable<? extends HeaderItem> getDependencies() {
return EasyList.of( return Lists.newArrayList(
BootstrapHeaderItem.get(), BootstrapHeaderItem.get(),
CssHeaderItem.forReference(new CssResourceReference(EditableResourceReference.class, "editable.css"))); CssHeaderItem.forReference(new CssResourceReference(EditableResourceReference.class, "editable.css")));
} }

View File

@ -8,9 +8,9 @@ import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
import com.google.common.collect.Lists;
import com.pmease.commons.editable.EditContext; import com.pmease.commons.editable.EditContext;
import com.pmease.commons.editable.PropertyEditContext; import com.pmease.commons.editable.PropertyEditContext;
import com.pmease.commons.util.EasyList;
import com.pmease.commons.wicket.editable.EditableResourceBehavior; import com.pmease.commons.wicket.editable.EditableResourceBehavior;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@ -48,7 +48,7 @@ public class NullableBooleanPropertyEditContext extends PropertyEditContext {
setPropertyValue(null); setPropertyValue(null);
} }
}, EasyList.of("yes", "no")) { }, Lists.newArrayList("yes", "no")) {
@Override @Override
protected void onComponentTag(ComponentTag tag) { protected void onComponentTag(ComponentTag tag) {

View File

@ -0,0 +1,144 @@
package com.pmease.gitop.core;
import java.io.IOException;
import javax.inject.Inject;
import javax.inject.Singleton;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jgit.http.server.ServletUtils;
import org.eclipse.jgit.transport.PacketLineOut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.pmease.commons.git.Git;
import com.pmease.gitop.core.manager.RepositoryManager;
import com.pmease.gitop.core.model.Repository;
@Singleton
@SuppressWarnings("serial")
public class GitServlet extends HttpServlet {
private static final Logger logger = LoggerFactory.getLogger(GitServlet.class);
private static final String INFO_REFS = "info/refs";
private final RepositoryManager repositoryManager;
@Inject
public GitServlet(RepositoryManager repositoryManager) {
this.repositoryManager = repositoryManager;
}
private Repository getRepository(HttpServletRequest request, HttpServletResponse response, String repoInfo)
throws IOException {
repoInfo = StringUtils.stripStart(StringUtils.stripEnd(repoInfo, "/"), "/");
String ownerName = StringUtils.substringBefore(repoInfo, "/");
String repositoryName = StringUtils.substringAfter(repoInfo, "/");
if (StringUtils.isBlank(ownerName) || StringUtils.isBlank(repositoryName)) {
String url = request.getRequestURL().toString();
String urlRoot = url.substring(0, url.length()-request.getPathInfo().length());
String message = "Expecting url of format " + urlRoot + "/<owner name>/<repository name>";
logger.error("Error serving git request: " + message);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
return null;
}
Repository repository = repositoryManager.find(ownerName, repositoryName);
if (repository == null) {
String message = "Unable to find repository '" + repositoryName + "' owned by '" + ownerName + "'.";
logger.error("Error serving git request: " + message);
response.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
return null;
}
return repository;
}
private void doNotCache(HttpServletResponse response) {
response.setHeader("Expires", "Fri, 01 Jan 1980 00:00:00 GMT");
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache, max-age=0, must-revalidate");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pathInfo = StringUtils.stripStart(req.getPathInfo(), "/");
String service = StringUtils.substringAfterLast(pathInfo, "/");
String repoInfo = StringUtils.substringBeforeLast(pathInfo, "/");
Repository repository = getRepository(req, resp, repoInfo);
if (repository != null) {
doNotCache(resp);
resp.setHeader("Content-Type", "application/x-" + service + "-result");
Git git = new Git(repositoryManager.locateStorage(repository));
try {
if (service.contains("upload")) {
git.upload().input(ServletUtils.getInputStream(req)).output(resp.getOutputStream()).call();
} else if (service.contains("receive")) {
git.receive().input(ServletUtils.getInputStream(req)).output(resp.getOutputStream()).call();
} else {
String message = "Invalid service name '" + service + "'.";
logger.error("Error serving git request: " + message);
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
}
} catch (Exception e) {
logger.error("Error serving git request.", e);
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String pathInfo = StringUtils.stripStart(req.getPathInfo(), "/");
if (!pathInfo.endsWith(INFO_REFS)) {
String message = "Invalid refs request url: " + req.getRequestURL();
logger.error("Error serving git request: " + message);
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
return;
}
String repoInfo = pathInfo.substring(0, pathInfo.length() - INFO_REFS.length());
Repository repository = getRepository(req, resp, repoInfo);
if (repository != null) {
doNotCache(resp);
String service = req.getParameter("service");
resp.setHeader("Content-Type", "application/x-" + service + "-advertisement");
PacketLineOut pack = new PacketLineOut(resp.getOutputStream());
pack.setFlushOnEnd(false);
pack.writeString("# service=" + service + "\n");
pack.end();
Git git = new Git(repositoryManager.locateStorage(repository));
try {
if (service.contains("upload")) {
git.advertiseUploadRefs().output(resp.getOutputStream()).call();
} else if (service.contains("receive")) {
git.advertiseReceiveRefs().output(resp.getOutputStream()).call();
} else {
String message = "Invalid service name '" + service + "'.";
logger.error("Error serving git request: " + message);
resp.sendError(HttpServletResponse.SC_BAD_REQUEST, message);
}
} catch (Exception e) {
logger.error("Error serving git request.", e);
resp.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, e.getMessage());
}
}
}
}

View File

@ -0,0 +1,25 @@
package com.pmease.gitop.core;
import javax.inject.Inject;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import com.pmease.commons.jetty.ServletContextConfigurator;
public class GitServletContextConfigurator implements ServletContextConfigurator {
private final GitServlet gitServlet;
@Inject
public GitServletContextConfigurator(GitServlet gitServlet) {
this.gitServlet = gitServlet;
}
@Override
public void configure(ServletContextHandler context) {
ServletHolder servletHolder = new ServletHolder(gitServlet);
context.addServlet(servletHolder, "/git/*");
}
}

View File

@ -8,6 +8,7 @@ import org.hibernate.cfg.NamingStrategy;
import com.pmease.commons.hibernate.AbstractEntity; import com.pmease.commons.hibernate.AbstractEntity;
import com.pmease.commons.hibernate.ModelProvider; import com.pmease.commons.hibernate.ModelProvider;
import com.pmease.commons.hibernate.PrefixedNamingStrategy; import com.pmease.commons.hibernate.PrefixedNamingStrategy;
import com.pmease.commons.jetty.ServletContextConfigurator;
import com.pmease.commons.loader.AbstractPlugin; import com.pmease.commons.loader.AbstractPlugin;
import com.pmease.commons.loader.AbstractPluginModule; import com.pmease.commons.loader.AbstractPluginModule;
import com.pmease.commons.shiro.AbstractRealm; import com.pmease.commons.shiro.AbstractRealm;
@ -41,6 +42,7 @@ public class GitopModule extends AbstractPluginModule {
}); });
contribute(ServletContextConfigurator.class, GitServletContextConfigurator.class);
} }
@Override @Override

View File

@ -1,7 +1,7 @@
package com.pmease.gitop.core.gatekeeper; package com.pmease.gitop.core.gatekeeper;
import com.google.common.collect.Sets;
import com.pmease.commons.editable.annotation.Editable; import com.pmease.commons.editable.annotation.Editable;
import com.pmease.commons.util.EasySet;
import com.pmease.gitop.core.model.MergeRequest; import com.pmease.gitop.core.model.MergeRequest;
import com.pmease.gitop.core.model.User; import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.model.Vote; import com.pmease.gitop.core.model.Vote;
@ -17,7 +17,7 @@ public class ApprovedByRepositoryOwner extends AbstractGateKeeper {
Vote.Result result = repositoryOwner.checkVoteSince(request.getBaseUpdate()); Vote.Result result = repositoryOwner.checkVoteSince(request.getBaseUpdate());
if (result == null) { if (result == null) {
request.inviteToVote(EasySet.of(repositoryOwner), 1); request.inviteToVote(Sets.newHashSet(repositoryOwner), 1);
return pending("To be approved by user '" + repositoryOwner.getName() + "'."); return pending("To be approved by user '" + repositoryOwner.getName() + "'.");
} else if (result.isAccept()) { } else if (result.isAccept()) {
return accept("Approved by user '" + repositoryOwner.getName() + "'."); return accept("Approved by user '" + repositoryOwner.getName() + "'.");

View File

@ -2,9 +2,9 @@ package com.pmease.gitop.core.gatekeeper;
import javax.validation.constraints.NotNull; import javax.validation.constraints.NotNull;
import com.google.common.collect.Sets;
import com.pmease.commons.editable.annotation.Editable; import com.pmease.commons.editable.annotation.Editable;
import com.pmease.commons.loader.AppLoader; import com.pmease.commons.loader.AppLoader;
import com.pmease.commons.util.EasySet;
import com.pmease.gitop.core.manager.UserManager; import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.MergeRequest; import com.pmease.gitop.core.model.MergeRequest;
import com.pmease.gitop.core.model.User; import com.pmease.gitop.core.model.User;
@ -33,7 +33,7 @@ public class ApprovedBySpecifiedUser extends AbstractGateKeeper {
Vote.Result result = user.checkVoteSince(request.getBaseUpdate()); Vote.Result result = user.checkVoteSince(request.getBaseUpdate());
if (result == null) { if (result == null) {
request.inviteToVote(EasySet.of(user), 1); request.inviteToVote(Sets.newHashSet(user), 1);
return pending("To be approved by user '" + user.getName() + "'."); return pending("To be approved by user '" + user.getName() + "'.");
} else if (result.isAccept()) { } else if (result.isAccept()) {
return accept("Approved by user '" + user.getName() + "'."); return accept("Approved by user '" + user.getName() + "'.");

View File

@ -2,7 +2,7 @@ package com.pmease.gitop.core.gatekeeper;
import java.util.List; import java.util.List;
import com.pmease.commons.util.EasyList; import com.google.common.collect.Lists;
public abstract class CheckResult { public abstract class CheckResult {
@ -13,7 +13,7 @@ public abstract class CheckResult {
} }
public CheckResult(String reason) { public CheckResult(String reason) {
this.reasons = EasyList.of(reason); this.reasons = Lists.newArrayList(reason);
} }
public List<String> getReasons() { public List<String> getReasons() {

View File

@ -13,5 +13,7 @@ public interface RepositoryManager extends GenericDao<Repository> {
File locateStorage(Repository repository); File locateStorage(Repository repository);
Repository find(String ownerName, String repositoryName);
Collection<Repository> findPublic(); Collection<Repository> findPublic();
} }

View File

@ -7,7 +7,7 @@ import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import com.pmease.commons.hibernate.Sessional; import com.pmease.commons.hibernate.Sessional;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.commons.util.namedentity.EntityLoader; import com.pmease.commons.util.namedentity.EntityLoader;
import com.pmease.commons.util.namedentity.NamedEntity; import com.pmease.commons.util.namedentity.NamedEntity;
@ -16,7 +16,7 @@ import com.pmease.gitop.core.model.Branch;
import com.pmease.gitop.core.model.Repository; import com.pmease.gitop.core.model.Repository;
@Singleton @Singleton
public class DefaultBranchManager extends DefaultGenericDao<Branch> implements BranchManager { public class DefaultBranchManager extends AbstractGenericDao<Branch> implements BranchManager {
@Inject @Inject
public DefaultBranchManager(GeneralDao generalDao) { public DefaultBranchManager(GeneralDao generalDao) {

View File

@ -9,7 +9,7 @@ import org.hibernate.criterion.Restrictions;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.pmease.commons.hibernate.Sessional; import com.pmease.commons.hibernate.Sessional;
import com.pmease.commons.hibernate.Transactional; import com.pmease.commons.hibernate.Transactional;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.ConfigManager; import com.pmease.gitop.core.manager.ConfigManager;
import com.pmease.gitop.core.model.Config; import com.pmease.gitop.core.model.Config;
@ -18,7 +18,7 @@ import com.pmease.gitop.core.setting.MailSetting;
import com.pmease.gitop.core.setting.StorageSetting; import com.pmease.gitop.core.setting.StorageSetting;
@Singleton @Singleton
public class DefaultConfigManager extends DefaultGenericDao<Config> implements ConfigManager { public class DefaultConfigManager extends AbstractGenericDao<Config> implements ConfigManager {
@Inject @Inject
public DefaultConfigManager(GeneralDao generalDao) { public DefaultConfigManager(GeneralDao generalDao) {

View File

@ -3,13 +3,13 @@ package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.MergeRequestManager; import com.pmease.gitop.core.manager.MergeRequestManager;
import com.pmease.gitop.core.model.MergeRequest; import com.pmease.gitop.core.model.MergeRequest;
@Singleton @Singleton
public class DefaultMergeRequestManager extends DefaultGenericDao<MergeRequest> implements MergeRequestManager { public class DefaultMergeRequestManager extends AbstractGenericDao<MergeRequest> implements MergeRequestManager {
@Inject @Inject
public DefaultMergeRequestManager(GeneralDao generalDao) { public DefaultMergeRequestManager(GeneralDao generalDao) {

View File

@ -3,13 +3,13 @@ package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.MergeRequestUpdateManager; import com.pmease.gitop.core.manager.MergeRequestUpdateManager;
import com.pmease.gitop.core.model.MergeRequestUpdate; import com.pmease.gitop.core.model.MergeRequestUpdate;
@Singleton @Singleton
public class DefaultMergeRequestUpdateManager extends DefaultGenericDao<MergeRequestUpdate> public class DefaultMergeRequestUpdateManager extends AbstractGenericDao<MergeRequestUpdate>
implements MergeRequestUpdateManager { implements MergeRequestUpdateManager {
@Inject @Inject

View File

@ -3,14 +3,14 @@ package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.RepositoryAuthorizationByIndividualManager; import com.pmease.gitop.core.manager.RepositoryAuthorizationByIndividualManager;
import com.pmease.gitop.core.model.RepositoryAuthorizationByIndividual; import com.pmease.gitop.core.model.RepositoryAuthorizationByIndividual;
@Singleton @Singleton
public class DefaultRepositoryAuthorizationByIndividualManager public class DefaultRepositoryAuthorizationByIndividualManager
extends DefaultGenericDao<RepositoryAuthorizationByIndividual> extends AbstractGenericDao<RepositoryAuthorizationByIndividual>
implements RepositoryAuthorizationByIndividualManager { implements RepositoryAuthorizationByIndividualManager {
@Inject @Inject

View File

@ -3,13 +3,13 @@ package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.RepositoryAuthorizationByTeamManager; import com.pmease.gitop.core.manager.RepositoryAuthorizationByTeamManager;
import com.pmease.gitop.core.model.RepositoryAuthorizationByTeam; import com.pmease.gitop.core.model.RepositoryAuthorizationByTeam;
@Singleton @Singleton
public class DefaultRepositoryAuthorizationByTeamManager extends DefaultGenericDao<RepositoryAuthorizationByTeam> public class DefaultRepositoryAuthorizationByTeamManager extends AbstractGenericDao<RepositoryAuthorizationByTeam>
implements RepositoryAuthorizationByTeamManager { implements RepositoryAuthorizationByTeamManager {
@Inject @Inject

View File

@ -6,26 +6,57 @@ import java.util.Collection;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.git.Git;
import com.pmease.commons.hibernate.Transactional;
import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.commons.util.FileUtils;
import com.pmease.gitop.core.manager.ConfigManager;
import com.pmease.gitop.core.manager.RepositoryManager; import com.pmease.gitop.core.manager.RepositoryManager;
import com.pmease.gitop.core.model.Repository; import com.pmease.gitop.core.model.Repository;
@Singleton @Singleton
public class DefaultRepositoryManager extends DefaultGenericDao<Repository> implements RepositoryManager { public class DefaultRepositoryManager extends AbstractGenericDao<Repository> implements RepositoryManager {
private ConfigManager configManager;
@Inject @Inject
public DefaultRepositoryManager(GeneralDao generalDao) { public DefaultRepositoryManager(GeneralDao generalDao, ConfigManager configManager) {
super(generalDao); super(generalDao);
this.configManager = configManager;
}
@Transactional
@Override
public void save(Repository entity) {
if (entity.isNew()) {
super.save(entity);
File gitDir = locateStorage(entity);
FileUtils.cleanDir(gitDir);
new Git(gitDir).init().bare(true).call();
} else {
super.save(entity);
}
}
@Transactional
@Override
public void delete(Repository entity) {
super.delete(entity);
FileUtils.deleteDir(locateStorage(entity));
} }
@Override @Override
public File locateStorage(Repository repository) { public File locateStorage(Repository repository) {
//TODO: repository storage return new File(configManager.getStorageSetting().getRepoStorageDir(), repository.getId().toString());
return null;
} }
@Override @Override
@ -33,4 +64,15 @@ public class DefaultRepositoryManager extends DefaultGenericDao<Repository> impl
return query(new Criterion[]{Restrictions.eq("publiclyAccessible", true)}); return query(new Criterion[]{Restrictions.eq("publiclyAccessible", true)});
} }
@Override
public Repository find(String ownerName, String repositoryName) {
Criteria criteria = createCriteria();
criteria.add(Restrictions.eq("name", repositoryName));
criteria.createAlias("owner", "owner");
criteria.add(Restrictions.eq("owner.name", ownerName));
criteria.setMaxResults(1);
return (Repository) criteria.uniqueResult();
}
} }

View File

@ -6,13 +6,13 @@ import javax.inject.Singleton;
import org.hibernate.Session; import org.hibernate.Session;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.RoleManager; import com.pmease.gitop.core.manager.RoleManager;
import com.pmease.gitop.core.model.Role; import com.pmease.gitop.core.model.Role;
@Singleton @Singleton
public class DefaultRoleManager extends DefaultGenericDao<Role> implements RoleManager { public class DefaultRoleManager extends AbstractGenericDao<Role> implements RoleManager {
@Inject @Inject
public DefaultRoleManager(GeneralDao generalDao, Provider<Session> sessionProvider) { public DefaultRoleManager(GeneralDao generalDao, Provider<Session> sessionProvider) {

View File

@ -7,7 +7,7 @@ import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import com.pmease.commons.hibernate.Sessional; import com.pmease.commons.hibernate.Sessional;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.commons.util.namedentity.EntityLoader; import com.pmease.commons.util.namedentity.EntityLoader;
import com.pmease.commons.util.namedentity.NamedEntity; import com.pmease.commons.util.namedentity.NamedEntity;
@ -16,7 +16,7 @@ import com.pmease.gitop.core.model.Team;
import com.pmease.gitop.core.model.User; import com.pmease.gitop.core.model.User;
@Singleton @Singleton
public class DefaultTeamManager extends DefaultGenericDao<Team> implements TeamManager { public class DefaultTeamManager extends AbstractGenericDao<Team> implements TeamManager {
@Inject @Inject
public DefaultTeamManager(GeneralDao generalDao) { public DefaultTeamManager(GeneralDao generalDao) {

View File

@ -3,14 +3,14 @@ package com.pmease.gitop.core.manager.impl;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Singleton; import javax.inject.Singleton;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.UserAuthorizationByIndividualManager; import com.pmease.gitop.core.manager.UserAuthorizationByIndividualManager;
import com.pmease.gitop.core.model.UserAuthorizationByIndividual; import com.pmease.gitop.core.model.UserAuthorizationByIndividual;
@Singleton @Singleton
public class DefaultUserAuthorizationByIndividualManager public class DefaultUserAuthorizationByIndividualManager
extends DefaultGenericDao<UserAuthorizationByIndividual> extends AbstractGenericDao<UserAuthorizationByIndividual>
implements UserAuthorizationByIndividualManager { implements UserAuthorizationByIndividualManager {
@Inject @Inject

View File

@ -9,7 +9,7 @@ import org.hibernate.criterion.Restrictions;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.pmease.commons.hibernate.Sessional; import com.pmease.commons.hibernate.Sessional;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.commons.util.namedentity.EntityLoader; import com.pmease.commons.util.namedentity.EntityLoader;
import com.pmease.commons.util.namedentity.NamedEntity; import com.pmease.commons.util.namedentity.NamedEntity;
@ -17,7 +17,7 @@ import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.User; import com.pmease.gitop.core.model.User;
@Singleton @Singleton
public class DefaultUserManager extends DefaultGenericDao<User> implements UserManager { public class DefaultUserManager extends AbstractGenericDao<User> implements UserManager {
private volatile Long rootUserId; private volatile Long rootUserId;

View File

@ -7,7 +7,7 @@ import org.hibernate.criterion.Restrictions;
import com.pmease.commons.hibernate.Sessional; import com.pmease.commons.hibernate.Sessional;
import com.pmease.commons.hibernate.Transactional; import com.pmease.commons.hibernate.Transactional;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.VoteInvitationManager; import com.pmease.gitop.core.manager.VoteInvitationManager;
import com.pmease.gitop.core.model.MergeRequest; import com.pmease.gitop.core.model.MergeRequest;
@ -15,7 +15,7 @@ import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.model.VoteInvitation; import com.pmease.gitop.core.model.VoteInvitation;
@Singleton @Singleton
public class DefaultVoteInvitationManager extends DefaultGenericDao<VoteInvitation> implements VoteInvitationManager { public class DefaultVoteInvitationManager extends AbstractGenericDao<VoteInvitation> implements VoteInvitationManager {
public DefaultVoteInvitationManager(GeneralDao generalDao) { public DefaultVoteInvitationManager(GeneralDao generalDao) {
super(generalDao); super(generalDao);

View File

@ -6,7 +6,7 @@ import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Restrictions; import org.hibernate.criterion.Restrictions;
import com.pmease.commons.hibernate.Sessional; import com.pmease.commons.hibernate.Sessional;
import com.pmease.commons.hibernate.dao.DefaultGenericDao; import com.pmease.commons.hibernate.dao.AbstractGenericDao;
import com.pmease.commons.hibernate.dao.GeneralDao; import com.pmease.commons.hibernate.dao.GeneralDao;
import com.pmease.gitop.core.manager.VoteManager; import com.pmease.gitop.core.manager.VoteManager;
import com.pmease.gitop.core.model.MergeRequestUpdate; import com.pmease.gitop.core.model.MergeRequestUpdate;
@ -14,7 +14,7 @@ import com.pmease.gitop.core.model.User;
import com.pmease.gitop.core.model.Vote; import com.pmease.gitop.core.model.Vote;
@Singleton @Singleton
public class DefaultVoteManager extends DefaultGenericDao<Vote> implements VoteManager { public class DefaultVoteManager extends AbstractGenericDao<Vote> implements VoteManager {
public DefaultVoteManager(GeneralDao generalDao) { public DefaultVoteManager(GeneralDao generalDao) {
super(generalDao); super(generalDao);

View File

@ -44,7 +44,6 @@ public class Repository extends AbstractEntity implements UserBelonging {
private boolean publiclyAccessible; private boolean publiclyAccessible;
@Column(nullable=false)
private RepositoryOperation defaultAuthorizedOperation; private RepositoryOperation defaultAuthorizedOperation;
private GateKeeper gateKeeper; private GateKeeper gateKeeper;

View File

@ -13,6 +13,7 @@ import org.hibernate.validator.constraints.NotEmpty;
import com.pmease.commons.editable.annotation.Editable; import com.pmease.commons.editable.annotation.Editable;
import com.pmease.commons.editable.annotation.Password; import com.pmease.commons.editable.annotation.Password;
import com.pmease.commons.loader.AppLoader;
import com.pmease.commons.shiro.AbstractUser; import com.pmease.commons.shiro.AbstractUser;
import com.pmease.gitop.core.Gitop; import com.pmease.gitop.core.Gitop;
import com.pmease.gitop.core.manager.RepositoryManager; import com.pmease.gitop.core.manager.RepositoryManager;
@ -40,7 +41,11 @@ public class User extends AbstractUser implements ProtectedObject {
@Column(nullable=false) @Column(nullable=false)
private String email; private String email;
private String description; @Column
private String displayName;
@Column
private String avatarUrl;
@OneToMany(mappedBy="user") @OneToMany(mappedBy="user")
private Collection<TeamMembership> teamMemberships = new ArrayList<TeamMembership>(); private Collection<TeamMembership> teamMemberships = new ArrayList<TeamMembership>();
@ -102,12 +107,20 @@ public class User extends AbstractUser implements ProtectedObject {
} }
@Editable @Editable
public String getDescription() { public String getDisplayName() {
return description; return displayName;
} }
public void setDescription(String description) { public void setDisplayName(String displayName) {
this.description = description; this.displayName = displayName;
}
public String getAvatarUrl() {
return avatarUrl;
}
public void setAvatarUrl(String avatarUrl) {
this.avatarUrl = avatarUrl;
} }
public Collection<TeamMembership> getTeamMemberships() { public Collection<TeamMembership> getTeamMemberships() {
@ -228,7 +241,15 @@ public class User extends AbstractUser implements ProtectedObject {
} }
public static User getCurrent() { public static User getCurrent() {
return (User) AbstractUser.getCurrent(); Long userId = getCurrentId();
if (userId != 0L) {
return AppLoader.getInstance(UserManager.class).load(userId);
} else {
User user = new User();
user.setId(userId);
user.setName("Anonymous");
return user;
}
} }
@Override @Override

View File

@ -0,0 +1,2 @@
<wicket:extend>
</wicket:extend>

View File

@ -0,0 +1,8 @@
<wicket:extend>
<div style="margin: 100px 200px;">
<form wicket:id="form">
<div wicket:id="editor"></div>
<input type="submit" value="Save" class="btn btn-primary"></input>
</form>
</div>
</wicket:extend>

View File

@ -0,0 +1,47 @@
package com.pmease.gitop.web;
import org.apache.wicket.markup.html.form.Form;
import com.pmease.commons.editable.EditContext;
import com.pmease.commons.wicket.editable.EditHelper;
import com.pmease.gitop.core.Gitop;
import com.pmease.gitop.core.manager.RepositoryManager;
import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.Repository;
import com.pmease.gitop.web.page.BasePage;
@SuppressWarnings("serial")
public class TestPage extends BasePage {
@Override
protected void onInitialize() {
super.onInitialize();
final EditContext editContext = EditHelper.getContext(new Repository());
Form<?> form = new Form<Void>("form") {
@Override
protected void onSubmit() {
super.onSubmit();
editContext.validate();
if (!editContext.hasValidationError(true)) {
Repository repository = (Repository) editContext.getBean();
repository.setOwner(Gitop.getInstance(UserManager.class).getRootUser());
Gitop.getInstance(RepositoryManager.class).save(repository);
}
}
};
form.add(EditHelper.renderForEdit(editContext, "editor"));
add(form);
}
@Override
protected String getPageTitle() {
return "Test page used by Robin";
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

View File

@ -63,7 +63,7 @@ public class RegisterPage extends AbstractLayoutPage {
form.add(new TextFieldElement<String>( form.add(new TextFieldElement<String>(
"displayname", "Display Name", "displayname", "Display Name",
new PropertyModel<String>(model, "fullName")) new PropertyModel<String>(model, "displayName"))
.add(new PropertyValidator<String>())); .add(new PropertyValidator<String>()));
PasswordFieldElement passField = (PasswordFieldElement) PasswordFieldElement passField = (PasswordFieldElement)

View File

@ -1,10 +1,18 @@
package com.pmease.gitop.web.page.account.setting.profile; package com.pmease.gitop.web.page.account.setting.profile;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.form.AjaxButton;
import org.apache.wicket.bean.validation.PropertyValidator;
import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel; import org.apache.wicket.model.IModel;
import org.apache.wicket.model.PropertyModel;
import com.pmease.commons.loader.AppLoader;
import com.pmease.gitop.core.manager.UserManager;
import com.pmease.gitop.core.model.User;
import com.pmease.gitop.web.common.form.FeedbackPanel; import com.pmease.gitop.web.common.form.FeedbackPanel;
import com.pmease.gitop.web.common.form.textfield.TextFieldElement; import com.pmease.gitop.web.common.form.textfield.TextFieldElement;
import com.pmease.gitop.web.model.UserModel;
import com.pmease.gitop.web.page.account.setting.AccountSettingPage; import com.pmease.gitop.web.page.account.setting.AccountSettingPage;
@SuppressWarnings("serial") @SuppressWarnings("serial")
@ -24,19 +32,44 @@ public class AccountProfilePage extends AccountSettingPage {
protected void onInitialize() { protected void onInitialize() {
super.onInitialize(); super.onInitialize();
add(new ProfileForm("form", new UserModel(getAccount())));
} }
private class ProfileForm extends Form<Void> { private class ProfileForm extends Form<User> {
public ProfileForm(String id, IModel<Void> model) { public ProfileForm(String id, IModel<User> model) {
super(id, model); super(id, model);
} }
@Override @Override
protected void onInitialize() { protected void onInitialize() {
super.onInitialize(); super.onInitialize();
@SuppressWarnings("unchecked")
final IModel<User> model = (IModel<User>) getDefaultModel();
add(new FeedbackPanel("feedback", this)); add(new FeedbackPanel("feedback", this));
add(new TextFieldElement<String>("displayName", "Display Name")) add(new TextFieldElement<String>("displayName", "Display Name",
new PropertyModel<String>(model, "displayName"))
.add(new PropertyValidator<String>()));
add(new TextFieldElement<String>("email", "Email Address",
new PropertyModel<String>(model, "email"))
.add(new PropertyValidator<String>()));
add(new AjaxButton("submit", this) {
@Override
protected void onError(AjaxRequestTarget target, Form<?> form) {
target.add(form);
}
@Override
protected void onSubmit(AjaxRequestTarget target, Form<?> form) {
User user = model.getObject();
AppLoader.getInstance(UserManager.class).save(user);
form.success("Your profile has been updated");
target.add(form);
}
});
} }
} }
} }

View File

@ -93,8 +93,8 @@
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>1.6</source> <source>1.7</source>
<target>1.6</target> <target>1.7</target>
</configuration> </configuration>
</plugin> </plugin>
<plugin> <plugin>

View File

@ -40,8 +40,8 @@
<plugin> <plugin>
<artifactId>maven-compiler-plugin</artifactId> <artifactId>maven-compiler-plugin</artifactId>
<configuration> <configuration>
<source>1.6</source> <source>1.7</source>
<target>1.6</target> <target>1.7</target>
</configuration> </configuration>
</plugin> </plugin>
</plugins> </plugins>