aboutsummaryrefslogtreecommitdiffstats
path: root/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin
diff options
context:
space:
mode:
Diffstat (limited to 'winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin')
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AbstractAdminResource.java45
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AdminTopResource.java57
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/NamespacesResource.java253
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/RepositoryAdminResource.java112
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/AbstractTypesManager.java204
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/ConstraintTypesManager.java25
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanLanguagesManager.java29
-rw-r--r--winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanTypesManager.java28
8 files changed, 753 insertions, 0 deletions
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AbstractAdminResource.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AbstractAdminResource.java
new file mode 100644
index 0000000..cd4e20e
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AbstractAdminResource.java
@@ -0,0 +1,45 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.core.Response;
+
+import org.apache.commons.configuration.Configuration;
+import org.eclipse.winery.repository.backend.BackendUtils;
+import org.eclipse.winery.repository.backend.Repository;
+import org.eclipse.winery.repository.datatypes.ids.admin.AdminId;
+
+/**
+ * Instance of one admin resource
+ *
+ * Offers a configuration object to store data
+ */
+public abstract class AbstractAdminResource {
+
+ protected final AdminId id;
+ protected Configuration configuration;
+
+
+ /**
+ * @param id the id of the element rendered by this resource
+ */
+ public AbstractAdminResource(AdminId id) {
+ this.id = id;
+ this.configuration = Repository.INSTANCE.getConfiguration(id);
+ }
+
+ @DELETE
+ public Response onDelete() {
+ return BackendUtils.delete(this.id);
+ }
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AdminTopResource.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AdminTopResource.java
new file mode 100644
index 0000000..7e4a662
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/AdminTopResource.java
@@ -0,0 +1,57 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+
+import org.eclipse.winery.repository.resources.admin.types.ConstraintTypesManager;
+import org.eclipse.winery.repository.resources.admin.types.PlanLanguagesManager;
+import org.eclipse.winery.repository.resources.admin.types.PlanTypesManager;
+
+import com.sun.jersey.api.view.Viewable;
+
+public class AdminTopResource {
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public Viewable getHTML() {
+ return new Viewable("/jsp/admin/adminindex.jsp", this);
+ }
+
+ @Path("namespaces/")
+ public NamespacesResource getNamespacesResource() {
+ return NamespacesResource.INSTANCE;
+ }
+
+ @Path("repository/")
+ public RepositoryAdminResource getRepositoryAdminResource() {
+ return new RepositoryAdminResource();
+ }
+
+ @Path("planlanguages/")
+ public PlanLanguagesManager getPlanLanguagesResource() {
+ return PlanLanguagesManager.INSTANCE;
+ }
+
+ @Path("plantypes/")
+ public PlanTypesManager getPlanTypesResource() {
+ return PlanTypesManager.INSTANCE;
+ }
+
+ @Path("constrainttypes/")
+ public ConstraintTypesManager getConstraintTypesManager() {
+ return ConstraintTypesManager.INSTANCE;
+ }
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/NamespacesResource.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/NamespacesResource.java
new file mode 100644
index 0000000..f8fb9f1
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/NamespacesResource.java
@@ -0,0 +1,253 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin;
+
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.TreeSet;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.winery.common.Util;
+import org.eclipse.winery.common.ids.Namespace;
+import org.eclipse.winery.repository.Utils;
+import org.eclipse.winery.repository.backend.Repository;
+import org.eclipse.winery.repository.datatypes.ids.admin.NamespacesId;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.sun.jersey.api.view.Viewable;
+
+/**
+ * Manages prefixes for the namespaces
+ */
+public class NamespacesResource extends AbstractAdminResource {
+
+ private static final Logger logger = LoggerFactory.getLogger(NamespacesResource.class);
+
+ public final static NamespacesResource INSTANCE = new NamespacesResource();
+
+ private Integer nsCount = 0;
+
+
+ private NamespacesResource() {
+ super(new NamespacesId());
+
+ // globally set prefixes
+ // if that behavior is not desired, the code has to be moved to "generatePrefix" which checks for existence, ...
+ this.configuration.setProperty("http://www.w3.org/2001/XMLSchema", "xsd");
+ this.configuration.setProperty("http://www.w3.org/XML/1998/namespace", "xmlns");
+ this.configuration.setProperty(org.eclipse.winery.common.constants.Namespaces.TOSCA_NAMESPACE, "tosca");
+ this.configuration.setProperty(org.eclipse.winery.common.constants.Namespaces.TOSCA_WINERY_EXTENSIONS_NAMESPACE, "winery");
+ }
+
+ private Collection<String> getAllPrefixes() {
+ Iterator<String> keys = this.configuration.getKeys();
+ HashSet<String> res = new HashSet<String>();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ String prefix = this.configuration.getString(key);
+ res.add(prefix);
+ }
+ return res;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public Response getHTML() {
+ Viewable viewable = new Viewable("/jsp/admin/namespaces.jsp", this);
+ return Response.ok().entity(viewable).build();
+ }
+
+ /**
+ * Sets / overwrites prefix/namespace mapping
+ *
+ * In case the prefix is already bound to another namespace, BAD_REQUEST is
+ * returned.
+ */
+ @POST
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ public Response addNamespace(@FormParam("namespace") String namespace, @FormParam("nsPrefix") String prefix) {
+ if (StringUtils.isEmpty(namespace)) {
+ return Response.status(Status.BAD_REQUEST).entity("namespace must be given.").build();
+ }
+ if (StringUtils.isEmpty(prefix)) {
+ return Response.status(Status.BAD_REQUEST).entity("prefix must be given.").build();
+ }
+ namespace = Util.URLdecode(namespace);
+ prefix = Util.URLdecode(prefix);
+ Collection<String> allPrefixes = this.getAllPrefixes();
+ if (allPrefixes.contains(prefix)) {
+ if (NamespacesResource.getPrefix(namespace).equals(prefix)) {
+ return Response.notModified().build();
+ } else {
+ // the requested prefix is already bound to a different namespace
+ return Response.status(Status.BAD_REQUEST).entity("prefix already bound to a different namespace.").build();
+ }
+ }
+ this.configuration.setProperty(namespace, prefix);
+ return Response.noContent().build();
+ }
+
+ /**
+ * Deletes given namespace from the repository
+ *
+ * @param URI to delete. The namespace is URLencoded.
+ * @return
+ */
+ @DELETE
+ @Path("{namespace}")
+ public Response onDelete(@PathParam("namespace") String URI) {
+ Response res;
+ URI = Util.URLdecode(URI);
+ if (this.configuration.containsKey(URI)) {
+ this.configuration.clearProperty(URI);
+ res = Response.noContent().build();
+ } else {
+ res = Response.status(Status.NOT_FOUND).build();
+ }
+ return res;
+ }
+
+ /**
+ * SIDEFFECT: URI is added to list of known namespaces if it did not exist
+ * before
+ */
+ public static String getPrefix(Namespace namespace) {
+ String ns = namespace.getDecoded();
+ return NamespacesResource.getPrefix(ns);
+ }
+
+ @Path("{namespace}")
+ @GET
+ @Produces(MediaType.TEXT_PLAIN)
+ public String getPrefixForEncodedNamespace(@PathParam("namespace") String URI) {
+ URI = Util.URLdecode(URI);
+ return NamespacesResource.getPrefix(URI);
+ }
+
+ /**
+ * SIDEFFECT: URI is added to list of known namespaces if it did not exist
+ * before
+ */
+ public static String getPrefix(String namespace) {
+ if (namespace == null) {
+ throw new IllegalArgumentException("Namespace must not be null");
+ }
+ String prefix = NamespacesResource.INSTANCE.configuration.getString(namespace);
+ if (prefix == null) {
+ prefix = NamespacesResource.generatePrefix(namespace);
+ NamespacesResource.INSTANCE.configuration.setProperty(namespace, prefix);
+ }
+ return prefix;
+ }
+
+ private static String generatePrefix(String namespace) {
+ String prefix = null;
+ Collection<String> allPrefixes = NamespacesResource.INSTANCE.getAllPrefixes();
+
+ // TODO: generate prefix using URI (and not "arbitrary" prefix)
+ do {
+ prefix = String.format("ns%d", NamespacesResource.INSTANCE.nsCount);
+ NamespacesResource.INSTANCE.nsCount++;
+ } while (allPrefixes.contains(prefix));
+ return prefix;
+ }
+
+ /**
+ * Returns the list of all namespaces registered with his manager. It could
+ * be incomplete, if entries have been added manually to the repository
+ *
+ * @return all namespaces registered with this manager.
+ */
+ private HashSet<Namespace> getRegisteredNamespaces() {
+ HashSet<Namespace> res = new HashSet<Namespace>();
+ Iterator<String> keys = this.configuration.getKeys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ Namespace ns = new Namespace(key, false);
+ res.add(ns);
+ }
+ return res;
+ }
+
+ /**
+ * Returns the list of all namespaces registered with his manager and used
+ * at component instances.
+ */
+ public static Collection<Namespace> getNamespaces() {
+ HashSet<Namespace> res = NamespacesResource.INSTANCE.getRegisteredNamespaces();
+ res.addAll(Repository.INSTANCE.getUsedNamespaces());
+ return res;
+ }
+
+ /**
+ * This method is required because static methods cannot be accessed by EL
+ *
+ * @return see getNamespaces()
+ */
+ public Collection<Namespace> getNamespacesForJSP() {
+ return NamespacesResource.getNamespaces();
+ }
+
+ /**
+ * Returns the list of all namespaces registered with his manager and used
+ * at component instances.
+ *
+ * @return a JSON list containing the non-encoded URIs of each known
+ * namespace
+ */
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public String getNamespacesAsJSONlist() {
+ Collection<Namespace> namespaces = NamespacesResource.getNamespaces();
+
+ // We now have all namespaces
+ // We need to convert from Namespace to String
+
+ TreeSet<String> stringNamespaces = new TreeSet<String>();
+ for (Namespace ns : namespaces) {
+ stringNamespaces.add(ns.getDecoded());
+ }
+
+ String res;
+ try {
+ res = Utils.mapper.writeValueAsString(stringNamespaces);
+ } catch (JsonProcessingException e) {
+ NamespacesResource.logger.error(e.getMessage(), e);
+ res = "[]";
+ }
+ return res;
+ }
+
+ /**
+ * Checks whether a prefix is registered for a namespace
+ *
+ * Used at CSARImporter
+ */
+ public boolean getIsPrefixKnownForNamespace(String namespace) {
+ return this.configuration.containsKey(namespace);
+ }
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/RepositoryAdminResource.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/RepositoryAdminResource.java
new file mode 100644
index 0000000..408704d
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/RepositoryAdminResource.java
@@ -0,0 +1,112 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.StreamingOutput;
+
+import org.eclipse.winery.repository.Prefs;
+import org.eclipse.winery.repository.backend.IRepositoryAdministration;
+import org.eclipse.winery.repository.backend.Repository;
+import org.eclipse.winery.repository.backend.filebased.GitBasedRepository;
+import org.restdoc.annotations.RestDoc;
+import org.restdoc.annotations.RestDocParam;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.jersey.api.view.Viewable;
+import com.sun.jersey.core.header.FormDataContentDisposition;
+import com.sun.jersey.multipart.FormDataParam;
+
+public class RepositoryAdminResource {
+
+ private static final Logger logger = LoggerFactory.getLogger(RepositoryAdminResource.class);
+
+
+ // @formatter:off
+ @GET
+ @Produces(MediaType.TEXT_HTML) // we cannot add MimeTypes.MIMETYPE_ZIP as dumpRepository also produces that mimetype
+ @RestDoc(methodDescription = "Returns the repository admin page and implements administration utility")
+ public Response onGet(
+ @QueryParam(value = "dump") @RestDocParam(description = "If given, a dump of the repository is sent") String dump,
+ @QueryParam(value = "reset") @RestDocParam(description = "Resets the repository to the last &ldquo;official&rdquo; known state") String reset,
+ @QueryParam(value = "commit") @RestDocParam(description = "Commits the current state to the repository and pushes it upstream") String commit
+ ) {
+ // @formatter:on
+ if (dump != null) {
+ return this.dumpRepository();
+ } else if (reset != null) {
+ try {
+ ((GitBasedRepository) Prefs.INSTANCE.getRepository()).cleanAndResetHard();
+ } catch (Exception e) {
+ Response res;
+ res = Response.serverError().entity(e.getMessage()).build();
+ return res;
+ }
+ return Response.noContent().build();
+ } else if (commit != null) {
+ try {
+ ((GitBasedRepository) Prefs.INSTANCE.getRepository()).addCommitPush();
+ } catch (Exception e) {
+ Response res;
+ res = Response.serverError().entity(e.getMessage()).build();
+ return res;
+ }
+ return Response.noContent().build();
+ } else {
+ Viewable viewable = new Viewable("/jsp/admin/repository.jsp", this);
+ return Response.ok().entity(viewable).build();
+ }
+ }
+
+ /**
+ * Imports the given ZIP
+ */
+ @POST
+ @Consumes(MediaType.MULTIPART_FORM_DATA)
+ public Response importRepositoryDump(@FormDataParam("file") InputStream uploadedInputStream, @FormDataParam("file") FormDataContentDisposition fileDetail) {
+ ((IRepositoryAdministration) Repository.INSTANCE).doImport(uploadedInputStream);
+ return Response.noContent().build();
+ }
+
+ @DELETE
+ public void deleteRepositoryData() {
+ ((IRepositoryAdministration) Repository.INSTANCE).doClear();
+ }
+
+ @GET
+ @Produces(org.eclipse.winery.common.constants.MimeTypes.MIMETYPE_ZIP)
+ public Response dumpRepository() {
+ StreamingOutput so = new StreamingOutput() {
+
+ @Override
+ public void write(OutputStream output) throws IOException, WebApplicationException {
+ ((IRepositoryAdministration) Repository.INSTANCE).doDump(output);
+ }
+ };
+ StringBuilder sb = new StringBuilder();
+ sb.append("attachment;filename=\"repository.zip\"");
+ return Response.ok().header("Content-Disposition", sb.toString()).type(org.eclipse.winery.common.constants.MimeTypes.MIMETYPE_ZIP).entity(so).build();
+ }
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/AbstractTypesManager.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/AbstractTypesManager.java
new file mode 100644
index 0000000..bf3c024
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/AbstractTypesManager.java
@@ -0,0 +1,204 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin.types;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+import javax.ws.rs.DELETE;
+import javax.ws.rs.FormParam;
+import javax.ws.rs.GET;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
+import javax.ws.rs.core.UriInfo;
+
+import org.apache.commons.lang3.StringUtils;
+import org.eclipse.winery.common.Util;
+import org.eclipse.winery.repository.datatypes.TypeWithShortName;
+import org.eclipse.winery.repository.datatypes.ids.admin.TypesId;
+import org.eclipse.winery.repository.datatypes.select2.Select2DataItem;
+import org.eclipse.winery.repository.resources.admin.AbstractAdminResource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.jersey.api.view.Viewable;
+
+/**
+ * Handles longname/shortname by using properties
+ *
+ * FIXME: This class does NOT support dynamic reloading of the underlying
+ * Configuration instance
+ *
+ */
+public abstract class AbstractTypesManager extends AbstractAdminResource {
+
+ @Context
+ private UriInfo uriInfo;
+
+ protected static final Logger logger = LoggerFactory.getLogger(AbstractTypesManager.class);
+
+ // hashes from a long type string to the type object holding complete type data
+ private final HashMap<String, TypeWithShortName> hashTypeStringToType;
+
+
+ public AbstractTypesManager(TypesId id) {
+ super(id);
+ // now, this.configuration is filled with stored data
+
+ // copy over information from configuration to internal data structure
+ this.hashTypeStringToType = new HashMap<String, TypeWithShortName>();
+ Iterator<String> keys = this.configuration.getKeys();
+ while (keys.hasNext()) {
+ String key = keys.next();
+ String value = this.configuration.getString(key);
+ TypeWithShortName typeInfo = new TypeWithShortName(key, value);
+ this.hashTypeStringToType.put(key, typeInfo);
+ }
+ }
+
+ protected void addData(String longName, String shortName) {
+ TypeWithShortName t = new TypeWithShortName(longName, shortName);
+ this.addData(t);
+ }
+
+ /**
+ * Adds data to the internal data structure WITHOUT persisting it
+ *
+ * More or less a quick hack to enable adding default types without
+ * persisting them in the storage
+ *
+ * @param t the type to add
+ */
+ private void addData(TypeWithShortName t) {
+ this.hashTypeStringToType.put(t.getType(), t);
+ }
+
+ public synchronized void addTypeWithShortName(TypeWithShortName type) {
+ this.addData(type);
+ this.configuration.setProperty(type.getType(), type.getShortName());
+ }
+
+ /**
+ * Removes a type. Will not remove a type added by "addData"
+ */
+ @DELETE
+ @Path("{type}")
+ public Response removeTypeWithResponse(@PathParam("type") String type) {
+ type = Util.URLdecode(type);
+ if (this.configuration.containsKey(type)) {
+ this.hashTypeStringToType.remove(type);
+ this.configuration.clearProperty(type);
+ return Response.noContent().build();
+ } else if (this.hashTypeStringToType.containsKey(type)) {
+ // predefined types may not be deleted
+ // this branch is hit at types added via addData (e.g., predefined plantypes)
+ return Response.status(Status.FORBIDDEN).build();
+ } else {
+ return Response.status(Status.NOT_FOUND).build();
+ }
+ }
+
+ /**
+ * Returns a sorted list of all available types
+ */
+ public Collection<TypeWithShortName> getTypes() {
+ Collection<TypeWithShortName> res = new TreeSet<TypeWithShortName>(this.hashTypeStringToType.values());
+ return res;
+ }
+
+ @GET
+ @Produces(MediaType.APPLICATION_JSON)
+ public Object getTypesAsJSONArrayList(@QueryParam("select2") String select2) {
+ if (select2 == null) {
+ return this.getTypes();
+ } else {
+ // select2 mode
+ SortedSet<Select2DataItem> res = new TreeSet<>();
+ for (TypeWithShortName t : this.getTypes()) {
+ Select2DataItem item = new Select2DataItem(t.getType(), t.getShortName());
+ res.add(item);
+ }
+ return res;
+ }
+ }
+
+ /**
+ * <b>SIDEEFFECT:</b> If there currently isn't any short type name, it is
+ * created
+ */
+ public TypeWithShortName getTypeWithShortName(String typeString) {
+ TypeWithShortName t = this.hashTypeStringToType.get(typeString);
+ if (t == null) {
+ String shortName = this.getShortName(typeString);
+ t = new TypeWithShortName(typeString, shortName);
+ this.addTypeWithShortName(t);
+ }
+ return t;
+ }
+
+ /**
+ * <b>SIDEEFFECT:</b> If there currently isn't any short type name, it is
+ * created
+ */
+ public String getShortName(String typeString) {
+ TypeWithShortName type = this.hashTypeStringToType.get(typeString);
+ String res;
+ if (type == null) {
+ // happens if artifact type is not registered in artifacttypes.list
+ // (DATAFILENAME)
+ res = typeString;
+ } else {
+ res = type.getShortName();
+ }
+ return res;
+ }
+
+ @GET
+ @Produces(MediaType.TEXT_HTML)
+ public Viewable getHTML(@Context UriInfo uriInfo) {
+ this.uriInfo = uriInfo;
+ return new Viewable("/jsp/admin/types/types.jsp", this);
+ }
+
+ @POST
+ public Response updateTypeMapping(@FormParam("shortname") String shortName, @FormParam("type") String type) {
+ if (StringUtils.isEmpty(shortName)) {
+ return Response.status(Status.BAD_REQUEST).entity("shortName has to be given").build();
+ }
+ if (StringUtils.isEmpty(type)) {
+ return Response.status(Status.BAD_REQUEST).entity("type has to be given").build();
+ }
+ shortName = Util.URLdecode(shortName);
+ type = Util.URLdecode(type);
+ TypeWithShortName tws = new TypeWithShortName(type, shortName);
+ this.addTypeWithShortName(tws);
+ return Response.noContent().build();
+ }
+
+ /**
+ * Required by types.jsp
+ */
+ public String getURL() {
+ return this.uriInfo.getAbsolutePath().toString();
+ }
+
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/ConstraintTypesManager.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/ConstraintTypesManager.java
new file mode 100644
index 0000000..d8a9c0e
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/ConstraintTypesManager.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin.types;
+
+import org.eclipse.winery.repository.datatypes.ids.admin.ConstraintTypesId;
+
+public class ConstraintTypesManager extends AbstractTypesManager {
+
+ public final static ConstraintTypesManager INSTANCE = new ConstraintTypesManager();
+
+
+ private ConstraintTypesManager() {
+ super(new ConstraintTypesId());
+ }
+
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanLanguagesManager.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanLanguagesManager.java
new file mode 100644
index 0000000..e5b35b9
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanLanguagesManager.java
@@ -0,0 +1,29 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin.types;
+
+import org.eclipse.winery.repository.datatypes.ids.admin.PlanLanguagesId;
+
+public class PlanLanguagesManager extends AbstractTypesManager {
+
+ public final static PlanLanguagesManager INSTANCE = new PlanLanguagesManager();
+
+
+ private PlanLanguagesManager() {
+ super(new PlanLanguagesId());
+ // add data without rendering in the plan languages file
+ this.addData(org.eclipse.winery.common.constants.Namespaces.URI_BPEL20_EXECUTABLE, "BPEL 2.0 (executable)");
+ this.addData(org.eclipse.winery.common.constants.Namespaces.URI_BPMN20_MODEL, "BPMN 2.0");
+ this.addData(org.eclipse.winery.common.constants.Namespaces.URI_BPMN4TOSCA_20, "BPMN4TOSCA 2.0");
+ }
+
+}
diff --git a/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanTypesManager.java b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanTypesManager.java
new file mode 100644
index 0000000..de6e7ba
--- /dev/null
+++ b/winery/org.eclipse.winery.repository/src/main/java/org/eclipse/winery/repository/resources/admin/types/PlanTypesManager.java
@@ -0,0 +1,28 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 University of Stuttgart.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * and the Apache License 2.0 which both accompany this distribution,
+ * and are available at http://www.eclipse.org/legal/epl-v10.html
+ * and http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Contributors:
+ * Oliver Kopp - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.winery.repository.resources.admin.types;
+
+import org.eclipse.winery.repository.datatypes.ids.admin.PlanTypesId;
+
+public class PlanTypesManager extends AbstractTypesManager {
+
+ public final static PlanTypesManager INSTANCE = new PlanTypesManager();
+
+
+ private PlanTypesManager() {
+ super(new PlanTypesId());
+ // add data without rendering in the plan types file
+ this.addData(org.eclipse.winery.repository.Constants.TOSCA_PLANTYPE_BUILD_PLAN, "Build Plan");
+ this.addData(org.eclipse.winery.repository.Constants.TOSCA_PLANTYPE_TERMINATION_PLAN, "Termination Plan");
+ }
+
+}