/* * Copyright (C) 2013 Intel Corporation * All rights reserved. */ package com.intel.mtwilson.configuration.v2.resource; import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.intel.mtwilson.configuration.v2.resource.*; import com.intel.mtwilson.configuration.v2.model.Configuration; import com.intel.mtwilson.configuration.v2.model.ConfigurationFilterCriteria; import com.intel.mtwilson.configuration.v2.model.ConfigurationCollection; import com.intel.mtwilson.jaxrs2.NoLinks; import com.intel.mtwilson.jaxrs2.server.resource.AbstractResource; import com.intel.dcsg.cpg.io.UUID; import com.intel.mtwilson.My; import com.intel.mtwilson.launcher.ws.ext.V2; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.regex.Pattern; //import javax.ejb.Stateless; import javax.ws.rs.Path; import javax.ws.rs.WebApplicationException; import org.apache.commons.beanutils.PropertyUtils; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.authz.annotation.RequiresPermissions; /** * * @author jbuhacoff */ @V2 //@Stateless @Path("/configurations_unused") public class ConfigurationResource extends AbstractResource<Configuration,ConfigurationCollection,ConfigurationFilterCriteria,NoLinks<Configuration>> { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ConfigurationResource.class); private static final Pattern xmlTagName = Pattern.compile("(?:^[a-z].*)"); @RequiresPermissions("configurations:search") @Override protected ConfigurationCollection search(ConfigurationFilterCriteria criteria) { ConfigurationCollection configurations = new ConfigurationCollection(); Configuration configuration = retrieve("local"); configurations.getConfigurations().add(configuration); return configurations; } @RequiresPermissions("configurations:retrieve") @Override protected Configuration retrieve(String id) { Configuration configuration = null; if( "local".equals(id) ) { // get mtwilson.properties etc. configuration = new Configuration(); configuration.setName("local"); try { org.apache.commons.configuration.Configuration conf = My.configuration().getConfiguration(); Iterator<String> it = conf.getKeys(); while(it.hasNext()) { String key = it.next(); String value = conf.getString(key); if( !xmlTagName.matcher(value).matches() ) { log.debug("Skipping poperty {}", key); continue; } configuration.getProperties().put(key, value); } } catch(Exception e) { throw new WebApplicationException("Cannot load configuration"); } } else if( "my".equals(id) ) { try { configuration = new Configuration(); configuration.setName("my"); // find all the properties in MyConfiguration that are either String, Boolean, or String[] PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy namingStrategy = new PropertyNamingStrategy.LowerCaseWithUnderscoresStrategy(); // Map<String,Object> result = new HashMap<>(); Map<String,Object> attrs = PropertyUtils.describe(My.configuration());// throws IllegalAccessException, InvocationTargetException, NoSuchMethodException for(Map.Entry<String,Object> attr : attrs.entrySet()) { String translatedKey = namingStrategy.translate(attr.getKey()); // there are attributes we skip, like "class" from getClass() if( attr.getKey().equals("class") ) { continue; } // for now allow only String, Boolean, and String[] properties Object a1 = PropertyUtils.getSimpleProperty(My.configuration(), attr.getKey()); if( a1 == null ) { configuration.getProperties().put(translatedKey, null); } else if( a1 instanceof String ) { configuration.getProperties().put(translatedKey, (String)a1); } else if( a1 instanceof Boolean ) { configuration.getProperties().put(translatedKey, (String)a1.toString()); } else if( a1 instanceof String[] ) { configuration.getProperties().put(translatedKey, StringUtils.join((String[])a1)); } } } catch(Exception e) { throw new WebApplicationException("Cannot load configuration"); } } else if( "cluster".equals(id) ) { // load from database ... } else { // assume uuid or other name so find out which it is so we can use the right query if( UUID.isValid(id) ) { // query by uuid } else { // query by name } } return configuration; } @RequiresPermissions("configurations:create") @Override protected void create(Configuration item) { // store it... } @RequiresPermissions("configurations:store") @Override protected void store(Configuration item) { // store it... } @RequiresPermissions("configurations:delete") @Override protected void delete(String id) { } /* @Override protected RpcFilterCriteria createFilterCriteriaWithId(String id) { RpcFilterCriteria criteria = new RpcFilterCriteria(); criteria.id = UUID.valueOf(id); return criteria; } */ @Override protected ConfigurationCollection createEmptyCollection() { return new ConfigurationCollection(); } }