From 57bcc158fb689a331603e5480a8764d7eeca6029 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Fri, 16 Mar 2012 19:40:34 +0100 Subject: [PATCH] implement RepositoryConverter --- .../sonia/scm/orientdb/AbstractConverter.java | 197 ++++++++++++++++++ .../orientdb/PermissionConverter.java | 130 ++++++++++++ .../orientdb/RepositoryConverter.java | 168 +++++++++++++++ 3 files changed, 495 insertions(+) create mode 100644 scm-dao-orientdb/src/main/java/sonia/scm/orientdb/AbstractConverter.java create mode 100644 scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/PermissionConverter.java create mode 100644 scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/RepositoryConverter.java diff --git a/scm-dao-orientdb/src/main/java/sonia/scm/orientdb/AbstractConverter.java b/scm-dao-orientdb/src/main/java/sonia/scm/orientdb/AbstractConverter.java new file mode 100644 index 0000000000..11683627f6 --- /dev/null +++ b/scm-dao-orientdb/src/main/java/sonia/scm/orientdb/AbstractConverter.java @@ -0,0 +1,197 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.orientdb; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.orientechnologies.orient.core.metadata.schema.OType; +import com.orientechnologies.orient.core.record.impl.ODocument; + +import sonia.scm.ModelObject; +import sonia.scm.PropertiesAware; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.List; + +/** + * + * @author Sebastian Sdorra + */ +public abstract class AbstractConverter +{ + + /** Field description */ + public static final String FIELD_ID = "id"; + + /** Field description */ + public static final String FIELD_LASTMODIFIED = "lastModified"; + + /** Field description */ + public static final String FIELD_PROPERTIES = "properties"; + + /** Field description */ + public static final String FIELD_TYPE = "type"; + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param doc + * @param name + * @param value + */ + protected void appendField(ODocument doc, String name, Object value) + { + appendField(doc, name, value, null); + } + + /** + * Method description + * + * + * @param doc + * @param name + * @param value + * @param type + */ + protected void appendField(ODocument doc, String name, Object value, + OType type) + { + if (value != null) + { + if (type != null) + { + doc.field(name, value, type); + } + else + { + doc.field(name, value); + } + } + else if (doc.containsField(name)) + { + doc.removeField(name); + } + } + + /** + * Method description + * + * + * @param doc + * @param name + * @param converter + * @param list + * @param + */ + protected void appendListField(ODocument doc, String name, + Converter converter, List list) + { + List docs = OrientDBUtil.transformToDocuments(converter, list); + + appendField(doc, name, docs, OType.EMBEDDEDLIST); + } + + /** + * Method description + * + * + * @param doc + * @param model + */ + protected void appendModelObjectFields(ODocument doc, ModelObject model) + { + appendField(doc, FIELD_ID, model.getId()); + appendField(doc, FIELD_TYPE, model.getType()); + appendField(doc, FIELD_LASTMODIFIED, model.getLastModified(), OType.LONG); + } + + /** + * Method description + * + * + * @param doc + * @param object + */ + protected void appendPropertiesField(ODocument doc, PropertiesAware object) + { + appendField(doc, FIELD_PROPERTIES, object.getProperties(), + OType.EMBEDDEDMAP); + } + + //~--- get methods ---------------------------------------------------------- + + /** + * Method description + * + * + * @param doc + * @param name + * + * @return + */ + protected Boolean getBooleanField(ODocument doc, String name) + { + return doc.field(name); + } + + /** + * Method description + * + * + * @param doc + * @param name + * + * @return + */ + protected Long getLongField(ODocument doc, String name) + { + return doc.field(name); + } + + /** + * Method description + * + * + * @param doc + * @param name + * + * @return + */ + protected String getStringField(ODocument doc, String name) + { + return doc.field(name); + } +} diff --git a/scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/PermissionConverter.java b/scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/PermissionConverter.java new file mode 100644 index 0000000000..56884a34b6 --- /dev/null +++ b/scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/PermissionConverter.java @@ -0,0 +1,130 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository.orientdb; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.orientechnologies.orient.core.metadata.schema.OType; +import com.orientechnologies.orient.core.record.impl.ODocument; + +import sonia.scm.orientdb.AbstractConverter; +import sonia.scm.orientdb.Converter; +import sonia.scm.repository.Permission; +import sonia.scm.repository.PermissionType; + +/** + * + * @author Sebastian Sdorra + */ +public class PermissionConverter extends AbstractConverter + implements Converter +{ + + /** Field description */ + public static final String DOCUMENT_CLASS = "Permission"; + + /** Field description */ + public static final String FIELD_GROUP = "group"; + + /** Field description */ + public static final String FIELD_NAME = "name"; + + /** Field description */ + public static final PermissionConverter INSTANCE = new PermissionConverter(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param doc + * @param permission + * + * @return + */ + @Override + public ODocument convert(ODocument doc, Permission permission) + { + appendField(doc, FIELD_NAME, permission.getName()); + appendField(doc, FIELD_TYPE, permission.getType().toString()); + appendField(doc, FIELD_GROUP, permission.isGroupPermission(), + OType.BOOLEAN); + + return doc; + } + + /** + * Method description + * + * + * @param permission + * + * @return + */ + @Override + public ODocument convert(Permission permission) + { + ODocument doc = new ODocument(DOCUMENT_CLASS); + + convert(doc, permission); + + return doc; + } + + /** + * Method description + * + * + * @param doc + * + * @return + */ + @Override + public Permission convert(ODocument doc) + { + Permission permission = new Permission(); + + permission.setName(getStringField(doc, FIELD_NAME)); + + String typeString = doc.field(FIELD_TYPE); + + if (typeString != null) + { + permission.setType(PermissionType.valueOf(typeString)); + } + + permission.setGroupPermission(getBooleanField(doc, FIELD_GROUP)); + + return permission; + } +} diff --git a/scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/RepositoryConverter.java b/scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/RepositoryConverter.java new file mode 100644 index 0000000000..f24ade312d --- /dev/null +++ b/scm-dao-orientdb/src/main/java/sonia/scm/repository/orientdb/RepositoryConverter.java @@ -0,0 +1,168 @@ +/** + * Copyright (c) 2010, Sebastian Sdorra All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. 2. Redistributions in + * binary form must reproduce the above copyright notice, this list of + * conditions and the following disclaimer in the documentation and/or other + * materials provided with the distribution. 3. Neither the name of SCM-Manager; + * nor the names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * http://bitbucket.org/sdorra/scm-manager + * + */ + + + +package sonia.scm.repository.orientdb; + +//~--- non-JDK imports -------------------------------------------------------- + +import com.orientechnologies.orient.core.metadata.schema.OType; +import com.orientechnologies.orient.core.record.impl.ODocument; + +import sonia.scm.orientdb.AbstractConverter; +import sonia.scm.orientdb.Converter; +import sonia.scm.orientdb.OrientDBUtil; +import sonia.scm.repository.Repository; + +//~--- JDK imports ------------------------------------------------------------ + +import java.util.List; +import java.util.Map; + +/** + * + * @author Sebastian Sdorra + */ +public class RepositoryConverter extends AbstractConverter + implements Converter +{ + + /** Field description */ + public static final String DOCUMENT_CLASS = "Repository"; + + /** Field description */ + public static final String FIELD_CONTACT = "contact"; + + /** Field description */ + public static final String FIELD_CREATIONDATE = "creationDate"; + + /** Field description */ + public static final String FIELD_DESCRIPTION = "description"; + + /** Field description */ + public static final String FIELD_NAME = "name"; + + /** Field description */ + public static final String FIELD_PERMISSIONS = "permissions"; + + /** Field description */ + public static final String FIELD_PUBLIC = "public"; + + /** Field description */ + public static final String INDEX_ID = "RepositoryId"; + + /** Field description */ + public static final String INDEX_TYPEANDNAME = "RepositoryTypeAndName"; + + /** Field description */ + public static final RepositoryConverter INSTANCE = new RepositoryConverter(); + + //~--- methods -------------------------------------------------------------- + + /** + * Method description + * + * + * @param doc + * @param repository + * + * @return + */ + @Override + public ODocument convert(ODocument doc, Repository repository) + { + appendModelObjectFields(doc, repository); + appendField(doc, FIELD_NAME, repository.getName()); + appendField(doc, FIELD_CONTACT, repository.getContact()); + appendField(doc, FIELD_DESCRIPTION, repository.getDescription()); + appendField(doc, FIELD_PUBLIC, repository.isPublicReadable(), + OType.BOOLEAN); + appendField(doc, FIELD_CREATIONDATE, repository.getCreationDate(), + OType.LONG); + appendPropertiesField(doc, repository); + appendListField(doc, FIELD_PERMISSIONS, PermissionConverter.INSTANCE, + repository.getPermissions()); + + return doc; + } + + /** + * Method description + * + * + * @param repository + * + * @return + */ + @Override + public ODocument convert(Repository repository) + { + ODocument doc = new ODocument(DOCUMENT_CLASS); + + convert(doc, repository); + + return doc; + } + + /** + * Method description + * + * + * @param doc + * + * @return + */ + @Override + public Repository convert(ODocument doc) + { + Repository repository = new Repository(); + + repository.setId(getStringField(doc, FIELD_ID)); + repository.setType(getStringField(doc, FIELD_TYPE)); + repository.setName(getStringField(doc, FIELD_NAME)); + repository.setContact(getStringField(doc, FIELD_CONTACT)); + repository.setDescription(getStringField(doc, FIELD_DESCRIPTION)); + repository.setPublicReadable(getBooleanField(doc, FIELD_PUBLIC)); + repository.setLastModified(getLongField(doc, FIELD_LASTMODIFIED)); + repository.setCreationDate(getLongField(doc, FIELD_CREATIONDATE)); + + Map properties = doc.field(FIELD_PROPERTIES); + + repository.setProperties(properties); + + List permissions = doc.field(FIELD_PERMISSIONS); + + repository.setPermissions( + OrientDBUtil.transformToItems( + PermissionConverter.INSTANCE, permissions)); + + return repository; + } +}