/* * Copyright Ericsson AB 2011-2014. All Rights Reserved. * * The contents of this file are subject to the Lesser GNU Public License, * (the "License"), either version 2.1 of the License, or * (at your option) any later version.; you may not use this file except in * compliance with the License. You should have received a copy of the * License along with this software. If not, it can be * retrieved online at https://www.gnu.org/licenses/lgpl.html. Moreover * it could also be requested from Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO * WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. * EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR * OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY KIND, * EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE * LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, * YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. * * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR * REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU FOR * DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL * DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE LIBRARY * (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED * INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE * OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH * HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. * */ package com.ericsson.deviceaccess.spi.impl.genericdevice; import com.ericsson.common.util.serialization.Format; import com.ericsson.common.util.serialization.SerializationException; import com.ericsson.common.util.serialization.SerializationUtil; import com.ericsson.common.util.serialization.View; import com.ericsson.deviceaccess.api.Constants; import com.ericsson.deviceaccess.api.genericdevice.GDAccessPermission.Type; import com.ericsson.deviceaccess.api.genericdevice.GDAction; import com.ericsson.deviceaccess.api.genericdevice.GDActionContext; import com.ericsson.deviceaccess.api.genericdevice.GDActionResult; import com.ericsson.deviceaccess.api.genericdevice.GDException; import com.ericsson.deviceaccess.api.genericdevice.GDProperties; import com.ericsson.deviceaccess.api.genericdevice.GDPropertyMetadata; import com.ericsson.deviceaccess.spi.genericdevice.GDAccessSecurity; import com.ericsson.deviceaccess.spi.impl.MetadataUtil; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class GDActionImpl extends GDAction.Stub implements GDAction { private String path; protected String name; private final Map<String, GDPropertyMetadata> argumentsMetadata; private final Map<String, GDPropertyMetadata> resultMetadata; /** * Creates action with metadata for arguments and result. * * @param name * @param argumentsMetadata a Map name:String -> * metadata:{@link GDPropertyMetadata} * @param resultMetadata a Map name:String -> * metadata:{@link GDPropertyMetadata} */ public GDActionImpl(String name, Iterable<? extends GDPropertyMetadata> argumentsMetadata, Iterable<? extends GDPropertyMetadata> resultMetadata) { this.name = name; this.resultMetadata = new HashMap<>(); if (resultMetadata != null) { resultMetadata.forEach(metadata -> this.resultMetadata.put(metadata.getName(), metadata)); } this.argumentsMetadata = new HashMap<>(); if (argumentsMetadata != null) { argumentsMetadata.forEach(metadata -> this.argumentsMetadata.put(metadata.getName(), metadata)); } } /** * {@inheritDoc} */ @Override public String getName() { GDAccessSecurity.checkPermission(getClass(), Type.GET); return name; } /** * {@inheritDoc} */ @Override public void execute(GDActionContext sac) throws GDException { GDAccessSecurity.checkPermission(getClass(), Type.EXECUTE); } /** * {@inheritDoc} */ @Override public final GDActionResult execute(GDProperties arguments) throws GDException { GDAccessSecurity.checkPermission(getClass(), Type.EXECUTE); GDActionContextImpl context = new GDActionContextImpl(getVerifiedArguments(arguments), createResult()); execute(context); return context.getResult(); } private GDProperties getVerifiedArguments(GDProperties input) { GDProperties output = createArguments(); if (input == null) { return output; } output.getProperties().forEach((key, data) -> { Object value = data.currentValue; if (!input.hasProperty(key)) { return; } if (value instanceof String) { output.setStringValue(key, (String) value); } else if (value instanceof Integer) { output.setIntValue(key, (Integer) value); } else if (value instanceof Float) { output.setFloatValue(key, (Float) value); } else if (value instanceof Long) { output.setLongValue(key, (Long) value); } }); MetadataUtil.INSTANCE.verifyPropertiesAgainstMetadata(output, argumentsMetadata); return output; } /** * {@inheritDoc} */ @Override public Map<String, GDPropertyMetadata> getResultMetadata() { return Collections.unmodifiableMap(resultMetadata); } /** * {@inheritDoc} */ @Override public Map<String, GDPropertyMetadata> getArgumentsMetadata() { return Collections.unmodifiableMap(argumentsMetadata); } /** * {@inheritDoc} */ @Override public GDProperties createArguments() { return new GDPropertiesImpl(argumentsMetadata.values()); } /** * {@inheritDoc} * * @return */ public GDProperties createResult() { return new GDPropertiesImpl(resultMetadata.values()); } /** * {@inheritDoc} */ @Override public GDActionContext createActionContext() { return new GDActionContextImpl(createArguments(), createResult()); } /** * {@inheritDoc} */ @Override public String getPath(boolean isAbsolute) { return path + "/action/" + this.getName(); } /** * {@inheritDoc} */ @Override public String getPath() { GDAccessSecurity.checkPermission(getClass(), Type.GET); return path + "/action/" + this.getName(); } @Override public void updatePath(String path) { GDAccessSecurity.checkPermission(getClass(), Type.SET); this.path = path; } @Override public String serialize(Format format) throws GDException { GDAccessSecurity.checkPermission(getClass(), Type.GET); try { return SerializationUtil.execute(format, mapper -> mapper.writerWithView(View.ID.Ignore.class).writeValueAsString(this)); } catch (SerializationException ex) { throw new GDException(ex.getMessage(), ex); } } @Override public String getSerializedNode(String path, Format format) throws GDException { GDAccessSecurity.checkPermission(getClass(), Type.GET); try { return SerializationUtil.serializeAccordingPath(format, path, Constants.PATH_DELIMITER, this); } catch (SerializationException ex) { throw new GDException(404, ex.getMessage(), ex); } } }